llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) <details> <summary>Changes</summary> We do this is in a few places, so add a helper function for it. --- Full diff: https://github.com/llvm/llvm-project/pull/176875.diff 4 Files Affected: - (modified) clang/lib/AST/ByteCode/Interp.cpp (+3-6) - (modified) clang/lib/AST/ByteCode/Interp.h (+1-4) - (modified) clang/lib/AST/ByteCode/InterpBuiltin.cpp (+4-11) - (modified) clang/lib/AST/ByteCode/Pointer.h (+10) ``````````diff diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index 0205d840fd71e..768e24c038cda 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -1320,8 +1320,7 @@ bool Free(InterpState &S, CodePtr OpPC, bool DeleteIsArrayForm, // Remove base casts. QualType InitialType = Ptr.getType(); - while (Ptr.isBaseClass()) - Ptr = Ptr.getBase(); + Ptr = Ptr.stripBaseCasts(); Source = Ptr.getDeclDesc()->asExpr(); BlockToDelete = Ptr.block(); @@ -1709,8 +1708,7 @@ bool Call(InterpState &S, CodePtr OpPC, const Function *Func, static bool GetDynamicDecl(InterpState &S, CodePtr OpPC, Pointer TypePtr, const CXXRecordDecl *&DynamicDecl) { - while (TypePtr.isBaseClass()) - TypePtr = TypePtr.getBase(); + TypePtr = TypePtr.stripBaseCasts(); QualType DynamicType = TypePtr.getType(); if (TypePtr.isStatic() || TypePtr.isConst()) { @@ -1794,8 +1792,7 @@ bool CallVirt(InterpState &S, CodePtr OpPC, const Function *Func, // If the function we call is further DOWN the hierarchy than the // FieldDesc of our pointer, just go up the hierarchy of this field // the furthest we can go. - while (ThisPtr.isBaseClass()) - ThisPtr = ThisPtr.getBase(); + ThisPtr = ThisPtr.stripBaseCasts(); } } diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index 0eae7848b4fe0..75961126fbce9 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -1908,10 +1908,7 @@ inline bool CheckNull(InterpState &S, CodePtr OpPC) { inline bool VirtBaseHelper(InterpState &S, CodePtr OpPC, const RecordDecl *Decl, const Pointer &Ptr) { - Pointer Base = Ptr; - while (Base.isBaseClass()) - Base = Base.getBase(); - + Pointer Base = Ptr.stripBaseCasts(); const Record::Base *VirtBase = Base.getRecord()->getVirtualBase(Decl); S.Stk.push<Pointer>(Base.atField(VirtBase->Offset)); return true; diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 1b651413f43d7..5d3b6aa77685b 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -1894,13 +1894,8 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC, // Check for overlapping memory regions. if (!Move && Pointer::pointToSameBlock(SrcPtr, DestPtr)) { // Remove base casts. - Pointer SrcP = SrcPtr; - while (SrcP.isBaseClass()) - SrcP = SrcP.getBase(); - - Pointer DestP = DestPtr; - while (DestP.isBaseClass()) - DestP = DestP.getBase(); + Pointer SrcP = SrcPtr.stripBaseCasts(); + Pointer DestP = DestPtr.stripBaseCasts(); unsigned SrcIndex = SrcP.expand().getIndex() * SrcP.elemSize(); unsigned DstIndex = DestP.expand().getIndex() * DestP.elemSize(); @@ -2334,10 +2329,8 @@ static bool interp__builtin_object_size(InterpState &S, CodePtr OpPC, // The "closest surrounding subobject" is NOT a base class, // so strip the base class casts. - if (UseFieldDesc && Ptr.isBaseClass()) { - while (Ptr.isBaseClass()) - Ptr = Ptr.getBase(); - } + if (UseFieldDesc && Ptr.isBaseClass()) + Ptr = Ptr.stripBaseCasts(); const Descriptor *Desc = UseFieldDesc ? Ptr.getFieldDesc() : DeclDesc; assert(Desc); diff --git a/clang/lib/AST/ByteCode/Pointer.h b/clang/lib/AST/ByteCode/Pointer.h index 202508cb71e5a..32e1c3268484e 100644 --- a/clang/lib/AST/ByteCode/Pointer.h +++ b/clang/lib/AST/ByteCode/Pointer.h @@ -751,6 +751,16 @@ class Pointer { getInlineDesc()->LifeState = Lifetime::Started; } + /// Strip base casts from this Pointer. + /// The result is either a root pointer or something + /// that isn't a base class anymore. + [[nodiscard]] Pointer stripBaseCasts() const { + Pointer P = *this; + while (P.isBaseClass()) + P = P.getBase(); + return P; + } + /// Compare two pointers. ComparisonCategoryResult compare(const Pointer &Other) const { if (!hasSameBase(*this, Other)) `````````` </details> https://github.com/llvm/llvm-project/pull/176875 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
