[llvm-branch-commits] [clang] e9ca503 - Revert "[clang][bytecode] Stack-allocate bottom function frame (#125253)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jan 31 18:07:31 PST 2025
Author: Jorge Gorbe Moya
Date: 2025-01-31T18:07:28-08:00
New Revision: e9ca5033e880f1f6e28692fb86c0b97a1b9713eb
URL: https://github.com/llvm/llvm-project/commit/e9ca5033e880f1f6e28692fb86c0b97a1b9713eb
DIFF: https://github.com/llvm/llvm-project/commit/e9ca5033e880f1f6e28692fb86c0b97a1b9713eb.diff
LOG: Revert "[clang][bytecode] Stack-allocate bottom function frame (#125253)"
This reverts commit f3549814f8a2e14b61ebe05b94cd216008633fa5.
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;
More information about the llvm-branch-commits
mailing list