This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG943ef0642010: [clang][Interp] Check This pointer without creating InterpFrame (authored by tbaeder).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D142617/new/ https://reviews.llvm.org/D142617 Files: clang/lib/AST/Interp/Interp.h clang/lib/AST/Interp/InterpStack.cpp clang/lib/AST/Interp/InterpStack.h Index: clang/lib/AST/Interp/InterpStack.h =================================================================== --- clang/lib/AST/Interp/InterpStack.h +++ clang/lib/AST/Interp/InterpStack.h @@ -64,11 +64,16 @@ /// Returns a reference to the value on the top of the stack. template <typename T> T &peek() const { - return *reinterpret_cast<T *>(peek(aligned_size<T>())); + return *reinterpret_cast<T *>(peekData(aligned_size<T>())); + } + + template <typename T> T &peek(size_t Offset) const { + assert(aligned(Offset)); + return *reinterpret_cast<T *>(peekData(Offset)); } /// Returns a pointer to the top object. - void *top() const { return Chunk ? peek(0) : nullptr; } + void *top() const { return Chunk ? peekData(0) : nullptr; } /// Returns the size of the stack in bytes. size_t size() const { return StackSize; } @@ -90,7 +95,7 @@ /// Grows the stack to accommodate a value and returns a pointer to it. void *grow(size_t Size); /// Returns a pointer from the top of the stack. - void *peek(size_t Size) const; + void *peekData(size_t Size) const; /// Shrinks the stack. void shrink(size_t Size); Index: clang/lib/AST/Interp/InterpStack.cpp =================================================================== --- clang/lib/AST/Interp/InterpStack.cpp +++ clang/lib/AST/Interp/InterpStack.cpp @@ -46,7 +46,7 @@ return Object; } -void *InterpStack::peek(size_t Size) const { +void *InterpStack::peekData(size_t Size) const { assert(Chunk && "Stack is empty!"); StackChunk *Ptr = Chunk; Index: clang/lib/AST/Interp/Interp.h =================================================================== --- clang/lib/AST/Interp/Interp.h +++ clang/lib/AST/Interp/Interp.h @@ -1492,10 +1492,11 @@ } inline bool Call(InterpState &S, CodePtr &PC, const Function *Func) { - auto NewFrame = std::make_unique<InterpFrame>(S, Func, PC); - Pointer ThisPtr; if (Func->hasThisPointer()) { - ThisPtr = NewFrame->getThis(); + size_t ThisOffset = + Func->getArgSize() + (Func->hasRVO() ? primSize(PT_Ptr) : 0); + const Pointer &ThisPtr = S.Stk.peek<Pointer>(ThisOffset); + if (!CheckInvoke(S, PC, ThisPtr)) return false; @@ -1506,6 +1507,7 @@ if (!CheckCallable(S, PC, Func)) return false; + auto NewFrame = std::make_unique<InterpFrame>(S, Func, PC); InterpFrame *FrameBefore = S.Current; S.Current = NewFrame.get();
Index: clang/lib/AST/Interp/InterpStack.h =================================================================== --- clang/lib/AST/Interp/InterpStack.h +++ clang/lib/AST/Interp/InterpStack.h @@ -64,11 +64,16 @@ /// Returns a reference to the value on the top of the stack. template <typename T> T &peek() const { - return *reinterpret_cast<T *>(peek(aligned_size<T>())); + return *reinterpret_cast<T *>(peekData(aligned_size<T>())); + } + + template <typename T> T &peek(size_t Offset) const { + assert(aligned(Offset)); + return *reinterpret_cast<T *>(peekData(Offset)); } /// Returns a pointer to the top object. - void *top() const { return Chunk ? peek(0) : nullptr; } + void *top() const { return Chunk ? peekData(0) : nullptr; } /// Returns the size of the stack in bytes. size_t size() const { return StackSize; } @@ -90,7 +95,7 @@ /// Grows the stack to accommodate a value and returns a pointer to it. void *grow(size_t Size); /// Returns a pointer from the top of the stack. - void *peek(size_t Size) const; + void *peekData(size_t Size) const; /// Shrinks the stack. void shrink(size_t Size); Index: clang/lib/AST/Interp/InterpStack.cpp =================================================================== --- clang/lib/AST/Interp/InterpStack.cpp +++ clang/lib/AST/Interp/InterpStack.cpp @@ -46,7 +46,7 @@ return Object; } -void *InterpStack::peek(size_t Size) const { +void *InterpStack::peekData(size_t Size) const { assert(Chunk && "Stack is empty!"); StackChunk *Ptr = Chunk; Index: clang/lib/AST/Interp/Interp.h =================================================================== --- clang/lib/AST/Interp/Interp.h +++ clang/lib/AST/Interp/Interp.h @@ -1492,10 +1492,11 @@ } inline bool Call(InterpState &S, CodePtr &PC, const Function *Func) { - auto NewFrame = std::make_unique<InterpFrame>(S, Func, PC); - Pointer ThisPtr; if (Func->hasThisPointer()) { - ThisPtr = NewFrame->getThis(); + size_t ThisOffset = + Func->getArgSize() + (Func->hasRVO() ? primSize(PT_Ptr) : 0); + const Pointer &ThisPtr = S.Stk.peek<Pointer>(ThisOffset); + if (!CheckInvoke(S, PC, ThisPtr)) return false; @@ -1506,6 +1507,7 @@ if (!CheckCallable(S, PC, Func)) return false; + auto NewFrame = std::make_unique<InterpFrame>(S, Func, PC); InterpFrame *FrameBefore = S.Current; S.Current = NewFrame.get();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits