[clang] c70fa55 - [clang][Interp][NFC] Add cleanup() infrastructure to EvalEmitter
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 5 04:57:39 PDT 2024
Author: Timm Bäder
Date: 2024-06-05T13:57:23+02:00
New Revision: c70fa55bed45fc0cc0063e9f0bf93f163b5a1962
URL: https://github.com/llvm/llvm-project/commit/c70fa55bed45fc0cc0063e9f0bf93f163b5a1962
DIFF: https://github.com/llvm/llvm-project/commit/c70fa55bed45fc0cc0063e9f0bf93f163b5a1962.diff
LOG: [clang][Interp][NFC] Add cleanup() infrastructure to EvalEmitter
Unused for now.
Added:
Modified:
clang/lib/AST/Interp/Context.cpp
clang/lib/AST/Interp/EvalEmitter.cpp
clang/lib/AST/Interp/EvalEmitter.h
clang/lib/AST/Interp/InterpState.cpp
clang/lib/AST/Interp/InterpState.h
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/Context.cpp b/clang/lib/AST/Interp/Context.cpp
index 4ecfa0f9bfd75..b0b22b059b77a 100644
--- a/clang/lib/AST/Interp/Context.cpp
+++ b/clang/lib/AST/Interp/Context.cpp
@@ -46,6 +46,7 @@ bool Context::evaluateAsRValue(State &Parent, const Expr *E, APValue &Result) {
auto Res = C.interpretExpr(E, /*ConvertResultToRValue=*/E->isGLValue());
if (Res.isInvalid()) {
+ C.cleanup();
Stk.clear();
return false;
}
@@ -70,6 +71,7 @@ bool Context::evaluate(State &Parent, const Expr *E, APValue &Result) {
auto Res = C.interpretExpr(E);
if (Res.isInvalid()) {
+ C.cleanup();
Stk.clear();
return false;
}
@@ -97,6 +99,7 @@ bool Context::evaluateAsInitializer(State &Parent, const VarDecl *VD,
(VD->getType()->isRecordType() || VD->getType()->isArrayType());
auto Res = C.interpretDecl(VD, CheckGlobalInitialized);
if (Res.isInvalid()) {
+ C.cleanup();
Stk.clear();
return false;
}
diff --git a/clang/lib/AST/Interp/EvalEmitter.cpp b/clang/lib/AST/Interp/EvalEmitter.cpp
index 388c3612f292b..6d8aa3f20f01f 100644
--- a/clang/lib/AST/Interp/EvalEmitter.cpp
+++ b/clang/lib/AST/Interp/EvalEmitter.cpp
@@ -32,6 +32,11 @@ EvalEmitter::~EvalEmitter() {
}
}
+/// Clean up all our resources. This needs to done in failed evaluations before
+/// we call InterpStack::clear(), because there might be a Pointer on the stack
+/// pointing into a Block in the EvalEmitter.
+void EvalEmitter::cleanup() { S.cleanup(); }
+
EvaluationResult EvalEmitter::interpretExpr(const Expr *E,
bool ConvertResultToRValue) {
S.setEvalLocation(E->getExprLoc());
diff --git a/clang/lib/AST/Interp/EvalEmitter.h b/clang/lib/AST/Interp/EvalEmitter.h
index 116f1d6fc134a..98d6026bbcce4 100644
--- a/clang/lib/AST/Interp/EvalEmitter.h
+++ b/clang/lib/AST/Interp/EvalEmitter.h
@@ -38,6 +38,9 @@ class EvalEmitter : public SourceMapper {
bool ConvertResultToRValue = false);
EvaluationResult interpretDecl(const VarDecl *VD, bool CheckFullyInitialized);
+ /// Clean up all resources.
+ void cleanup();
+
InterpState &getState() { return S; }
protected:
diff --git a/clang/lib/AST/Interp/InterpState.cpp b/clang/lib/AST/Interp/InterpState.cpp
index 2cb87ef07fe58..550bc9f1a84b9 100644
--- a/clang/lib/AST/Interp/InterpState.cpp
+++ b/clang/lib/AST/Interp/InterpState.cpp
@@ -33,6 +33,8 @@ InterpState::~InterpState() {
}
}
+void InterpState::cleanup() {}
+
Frame *InterpState::getCurrentFrame() {
if (Current && Current->Caller)
return Current;
diff --git a/clang/lib/AST/Interp/InterpState.h b/clang/lib/AST/Interp/InterpState.h
index d483c60c58e24..0938a723a76d0 100644
--- a/clang/lib/AST/Interp/InterpState.h
+++ b/clang/lib/AST/Interp/InterpState.h
@@ -39,6 +39,8 @@ class InterpState final : public State, public SourceMapper {
~InterpState();
+ void cleanup();
+
InterpState(const InterpState &) = delete;
InterpState &operator=(const InterpState &) = delete;
More information about the cfe-commits
mailing list