diff options
author | Matheus Izvekov <mizvekov@gmail.com> | 2025-03-20 10:30:24 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-20 10:30:24 -0300 |
commit | 9b1f905b483a2b42e4681bbef42b2641f8ccf5ad (patch) | |
tree | bdd4b29db08e95dc264b850e636318ce7524f561 /clang/lib/CodeGen | |
parent | cb1e91c18dd20f6b2d1c38ce93befab87f77ce0f (diff) | |
download | llvm-9b1f905b483a2b42e4681bbef42b2641f8ccf5ad.zip llvm-9b1f905b483a2b42e4681bbef42b2641f8ccf5ad.tar.gz llvm-9b1f905b483a2b42e4681bbef42b2641f8ccf5ad.tar.bz2 |
[clang] improve class type sugar preservation in pointers to members (#130537)
This changes the MemberPointerType representation to use a
NestedNameSpecifier instead of a Type to represent the class.
Since the qualifiers are always parsed as nested names, there was an
impedance mismatch when converting these back and forth into types, and
this led to issues in preserving sugar.
The nested names are indeed a better match for these, as the differences
which a QualType can represent cannot be expressed syntactically, and it
also represents the use case more exactly, being either dependent or
referring to a CXXRecord, unqualified.
This patch also makes the MemberPointerType able to represent sugar for
a {up/downcast}cast conversion of the base class, although for now the
underlying type is canonical, as preserving the sugar up to that point
requires further work.
As usual, includes a few drive-by fixes in order to make use of the
improvements, and removing some duplications, for example
CheckBaseClassAccess is deduplicated from across SemaAccess and
SemaCast.
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGCXXABI.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGPointerAuth.cpp | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGVTables.cpp | 5 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 10 | ||||
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 7 |
6 files changed, 15 insertions, 15 deletions
diff --git a/clang/lib/CodeGen/CGCXXABI.cpp b/clang/lib/CodeGen/CGCXXABI.cpp index 2777c78d..fd35f2a 100644 --- a/clang/lib/CodeGen/CGCXXABI.cpp +++ b/clang/lib/CodeGen/CGCXXABI.cpp @@ -107,7 +107,7 @@ CGCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) { llvm::Constant *CGCXXABI::EmitMemberFunctionPointer(const CXXMethodDecl *MD) { return GetBogusMemberPointer(CGM.getContext().getMemberPointerType( - MD->getType(), MD->getParent()->getTypeForDecl())); + MD->getType(), /*Qualifier=*/nullptr, MD->getParent())); } llvm::Constant *CGCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT, diff --git a/clang/lib/CodeGen/CGPointerAuth.cpp b/clang/lib/CodeGen/CGPointerAuth.cpp index 0c63b9d..4b03230 100644 --- a/clang/lib/CodeGen/CGPointerAuth.cpp +++ b/clang/lib/CodeGen/CGPointerAuth.cpp @@ -394,8 +394,8 @@ llvm::Constant *CodeGenModule::getMemberFunctionPointer(llvm::Constant *Pointer, llvm::Constant *CodeGenModule::getMemberFunctionPointer(const FunctionDecl *FD, llvm::Type *Ty) { QualType FT = FD->getType(); - FT = getContext().getMemberPointerType( - FT, cast<CXXMethodDecl>(FD)->getParent()->getTypeForDecl()); + FT = getContext().getMemberPointerType(FT, /*Qualifier=*/nullptr, + cast<CXXMethodDecl>(FD)->getParent()); return getMemberFunctionPointer(getRawFunctionPointer(FD, Ty), FT); } diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp index c910893..c7b3695 100644 --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -1400,9 +1400,8 @@ void CodeGenModule::EmitVTableTypeMetadata(const CXXRecordDecl *RD, if (Comps[I].getKind() != VTableComponent::CK_FunctionPointer) continue; llvm::Metadata *MD = CreateMetadataIdentifierForVirtualMemPtrType( - Context.getMemberPointerType( - Comps[I].getFunctionDecl()->getType(), - Context.getRecordType(AP.Base).getTypePtr())); + Context.getMemberPointerType(Comps[I].getFunctionDecl()->getType(), + /*Qualifier=*/nullptr, AP.Base)); VTable->addTypeMetadata((ComponentWidth * I).getQuantity(), MD); } } diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index f88d620..e26c6c3 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2667,7 +2667,7 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, for (const CXXRecordDecl *Base : getMostBaseClasses(MD->getParent())) { llvm::Metadata *Id = CreateMetadataIdentifierForType(Context.getMemberPointerType( - MD->getType(), Context.getRecordType(Base).getTypePtr())); + MD->getType(), /*Qualifier=*/nullptr, Base)); F->addTypeMetadata(0, Id); } } diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index a5633f6..77e995b 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -810,9 +810,9 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer( llvm::Value *Bit = Builder.getFalse(); for (const CXXRecordDecl *Base : CGM.getMostBaseClasses(RD)) { llvm::Metadata *MD = CGM.CreateMetadataIdentifierForType( - getContext().getMemberPointerType( - MPT->getPointeeType(), - getContext().getRecordType(Base).getTypePtr())); + getContext().getMemberPointerType(MPT->getPointeeType(), + /*Qualifier=*/nullptr, + Base->getCanonicalDecl())); llvm::Value *TypeId = llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD); @@ -1220,7 +1220,7 @@ llvm::Constant *ItaniumCXXABI::EmitMemberPointer(const APValue &MP, if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD)) { llvm::Constant *Src = BuildMemberPointer(MD, ThisAdjustment); QualType SrcType = getContext().getMemberPointerType( - MD->getType(), MD->getParent()->getTypeForDecl()); + MD->getType(), /*Qualifier=*/nullptr, MD->getParent()); return pointerAuthResignMemberFunctionPointer(Src, MPType, SrcType, CGM); } @@ -5135,7 +5135,7 @@ ItaniumCXXABI::getSignedVirtualMemberFunctionPointer(const CXXMethodDecl *MD) { .getDecl()); llvm::Constant *thunk = getOrCreateVirtualFunctionPointerThunk(origMD); QualType funcType = CGM.getContext().getMemberPointerType( - MD->getType(), MD->getParent()->getTypeForDecl()); + MD->getType(), /*Qualifier=*/nullptr, MD->getParent()); return CGM.getMemberFunctionPointer(thunk, funcType); } diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 5cb742a..40371d9 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -2928,9 +2928,9 @@ llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP, if (!MemberPointerPath.empty()) { const CXXRecordDecl *SrcRD = cast<CXXRecordDecl>(MPD->getDeclContext()); - const Type *SrcRecTy = Ctx.getTypeDeclType(SrcRD).getTypePtr(); const MemberPointerType *SrcTy = - Ctx.getMemberPointerType(DstTy->getPointeeType(), SrcRecTy) + Ctx.getMemberPointerType(DstTy->getPointeeType(), /*Qualifier=*/nullptr, + SrcRD) ->castAs<MemberPointerType>(); bool DerivedMember = MP.isMemberPointerToDerivedMember(); @@ -3945,7 +3945,8 @@ static QualType decomposeTypeForEH(ASTContext &Context, QualType T, // for "int A::*" and separately storing the const qualifier. if (const auto *MPTy = T->getAs<MemberPointerType>()) T = Context.getMemberPointerType(PointeeType.getUnqualifiedType(), - MPTy->getClass()); + MPTy->getQualifier(), + MPTy->getMostRecentCXXRecordDecl()); // Pointer types like "const int * const *" are represented by having RTTI // for "const int **" and separately storing the const qualifier. |