Author: Jorge Gorbe Moya Date: 2025-01-31T20:09:14-08:00 New Revision: 386af4a5c64ab75eaee2448dc38f2e34a40bfed0
URL: https://github.com/llvm/llvm-project/commit/386af4a5c64ab75eaee2448dc38f2e34a40bfed0 DIFF: https://github.com/llvm/llvm-project/commit/386af4a5c64ab75eaee2448dc38f2e34a40bfed0.diff LOG: Revert "[clang][bytecode] Stack-allocate bottom function frame" (#125325) Reverts llvm/llvm-project#125253 It introduced an msan failure. Caught by a buildbot here: https://lab.llvm.org/buildbot/#/builders/164/builds/6922/steps/17/logs/stdio Added: Modified: clang/lib/AST/ByteCode/EvalEmitter.cpp clang/lib/AST/ByteCode/EvalEmitter.h clang/lib/AST/ByteCode/Interp.h clang/lib/AST/ByteCode/InterpFrame.cpp clang/lib/AST/ByteCode/InterpFrame.h clang/lib/AST/ByteCode/InterpState.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/EvalEmitter.cpp b/clang/lib/AST/ByteCode/EvalEmitter.cpp index e857e239560575..8134bbf270363e 100644 --- a/clang/lib/AST/ByteCode/EvalEmitter.cpp +++ b/clang/lib/AST/ByteCode/EvalEmitter.cpp @@ -17,9 +17,10 @@ using namespace clang::interp; EvalEmitter::EvalEmitter(Context &Ctx, Program &P, State &Parent, InterpStack &Stk) - : Ctx(Ctx), P(P), S(Parent, P, Stk, Ctx, this), EvalResult(&Ctx), - BottomFrame(S) { - S.Current = &BottomFrame; + : Ctx(Ctx), P(P), S(Parent, P, Stk, Ctx, this), EvalResult(&Ctx) { + // Create a dummy frame for the interpreter which does not have locals. + S.Current = + new InterpFrame(S, /*Func=*/nullptr, /*Caller=*/nullptr, CodePtr(), 0); } EvalEmitter::~EvalEmitter() { diff --git a/clang/lib/AST/ByteCode/EvalEmitter.h b/clang/lib/AST/ByteCode/EvalEmitter.h index 784553b6c056cf..2cac2ba2ef2212 100644 --- a/clang/lib/AST/ByteCode/EvalEmitter.h +++ b/clang/lib/AST/ByteCode/EvalEmitter.h @@ -122,8 +122,6 @@ class EvalEmitter : public SourceMapper { /// Active block which should be executed. LabelTy ActiveLabel = 0; - InterpFrame BottomFrame; - protected: #define GET_EVAL_PROTO #include "Opcodes.inc" diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index 91a82a25944fb5..063970afec9e35 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -325,11 +325,11 @@ bool Ret(InterpState &S, CodePtr &PC) { if (InterpFrame *Caller = S.Current->Caller) { PC = S.Current->getRetPC(); - InterpFrame::free(S.Current); + delete S.Current; S.Current = Caller; S.Stk.push<T>(Ret); } else { - InterpFrame::free(S.Current); + delete S.Current; S.Current = nullptr; // The topmost frame should come from an EvalEmitter, // which has its own implementation of the Ret<> instruction. diff --git a/clang/lib/AST/ByteCode/InterpFrame.cpp b/clang/lib/AST/ByteCode/InterpFrame.cpp index dff9b211ad198c..48a3db055c6c9b 100644 --- a/clang/lib/AST/ByteCode/InterpFrame.cpp +++ b/clang/lib/AST/ByteCode/InterpFrame.cpp @@ -23,10 +23,6 @@ using namespace clang; using namespace clang::interp; -InterpFrame::InterpFrame(InterpState &S) - : Caller(nullptr), S(S), Depth(0), Func(nullptr), RetPC(CodePtr()), - ArgSize(0), Args(nullptr), FrameOffset(0), IsBottom(true) {} - InterpFrame::InterpFrame(InterpState &S, const Function *Func, InterpFrame *Caller, CodePtr RetPC, unsigned ArgSize) : Caller(Caller), S(S), Depth(Caller ? Caller->Depth + 1 : 0), Func(Func), diff --git a/clang/lib/AST/ByteCode/InterpFrame.h b/clang/lib/AST/ByteCode/InterpFrame.h index 8cabb9cd06fac0..7cfc3ac68b4f3e 100644 --- a/clang/lib/AST/ByteCode/InterpFrame.h +++ b/clang/lib/AST/ByteCode/InterpFrame.h @@ -28,9 +28,6 @@ class InterpFrame final : public Frame { /// The frame of the previous function. InterpFrame *Caller; - /// Bottom Frame. - InterpFrame(InterpState &S); - /// Creates a new frame for a method call. InterpFrame(InterpState &S, const Function *Func, InterpFrame *Caller, CodePtr RetPC, unsigned ArgSize); @@ -45,11 +42,6 @@ class InterpFrame final : public Frame { /// Destroys the frame, killing all live pointers to stack slots. ~InterpFrame(); - static void free(InterpFrame *F) { - if (!F->isBottomFrame()) - delete F; - } - /// Invokes the destructors for a scope. void destroy(unsigned Idx); void initScope(unsigned Idx); @@ -127,8 +119,6 @@ class InterpFrame final : public Frame { bool isStdFunction() const; - bool isBottomFrame() const { return IsBottom; } - void dump() const { dump(llvm::errs(), 0); } void dump(llvm::raw_ostream &OS, unsigned Indent = 0) const; @@ -177,7 +167,6 @@ class InterpFrame final : public Frame { const size_t FrameOffset; /// Mapping from arg offsets to their argument blocks. llvm::DenseMap<unsigned, std::unique_ptr<char[]>> Params; - bool IsBottom = false; }; } // namespace interp diff --git a/clang/lib/AST/ByteCode/InterpState.cpp b/clang/lib/AST/ByteCode/InterpState.cpp index 8aa44e48842e96..287c3bd3bca3a5 100644 --- a/clang/lib/AST/ByteCode/InterpState.cpp +++ b/clang/lib/AST/ByteCode/InterpState.cpp @@ -27,7 +27,7 @@ bool InterpState::inConstantContext() const { } InterpState::~InterpState() { - while (Current && !Current->isBottomFrame()) { + while (Current) { InterpFrame *Next = Current->Caller; delete Current; Current = Next; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits