[clang] [clang] Allow devirtualisation of indirect calls to final virtual methods (PR #165341)
Oliver Hunt via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 27 19:01:22 PDT 2025
================
@@ -1316,7 +1316,17 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
// fast register allocator would be happier...
CXXThisValue = CXXABIThisValue;
}
-
+ if (CGM.getCodeGenOpts().StrictVTablePointers) {
+ const CXXRecordDecl *ThisRecordDecl = MD->getParent();
+ bool IsPolymorphicObject = ThisRecordDecl->isPolymorphic();
+ bool IsStructor = isa<CXXDestructorDecl, CXXConstructorDecl>(MD);
+ bool IsFinal = ThisRecordDecl->isEffectivelyFinal();
+ // We do not care about whether this is a virtual method, because even
+ // if the current method is not virtual, it may be calling another method
+ // that calls a virtual function.
+ if (IsPolymorphicObject && !IsStructor && IsFinal)
+ EmitVTableAssumptionLoads(ThisRecordDecl, LoadCXXThisAddress());
----------------
ojhunt wrote:
good call, will do, and virtual inheritance
https://github.com/llvm/llvm-project/pull/165341
More information about the cfe-commits
mailing list