| //===--- InterpState.h - Interpreter state for the constexpr VM -*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Definition of the interpreter state and entry point. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_CLANG_AST_INTERP_INTERPSTATE_H |
| #define LLVM_CLANG_AST_INTERP_INTERPSTATE_H |
| |
| #include "Context.h" |
| #include "Function.h" |
| #include "InterpStack.h" |
| #include "State.h" |
| #include "clang/AST/APValue.h" |
| #include "clang/AST/ASTDiagnostic.h" |
| #include "clang/AST/Expr.h" |
| #include "clang/AST/OptionalDiagnostic.h" |
| |
| namespace clang { |
| namespace interp { |
| class Context; |
| class Function; |
| class InterpStack; |
| class InterpFrame; |
| class SourceMapper; |
| |
| /// Interpreter context. |
| class InterpState final : public State, public SourceMapper { |
| public: |
| InterpState(State &Parent, Program &P, InterpStack &Stk, Context &Ctx, |
| SourceMapper *M = nullptr); |
| |
| ~InterpState(); |
| |
| // Stack frame accessors. |
| Frame *getSplitFrame() { return Parent.getCurrentFrame(); } |
| Frame *getCurrentFrame() override; |
| unsigned getCallStackDepth() override { return CallStackDepth; } |
| const Frame *getBottomFrame() const override { |
| return Parent.getBottomFrame(); |
| } |
| |
| // Acces objects from the walker context. |
| Expr::EvalStatus &getEvalStatus() const override { |
| return Parent.getEvalStatus(); |
| } |
| ASTContext &getCtx() const override { return Parent.getCtx(); } |
| |
| // Forward status checks and updates to the walker. |
| bool checkingForUndefinedBehavior() const override { |
| return Parent.checkingForUndefinedBehavior(); |
| } |
| bool keepEvaluatingAfterFailure() const override { |
| return Parent.keepEvaluatingAfterFailure(); |
| } |
| bool checkingPotentialConstantExpression() const override { |
| return Parent.checkingPotentialConstantExpression(); |
| } |
| bool noteUndefinedBehavior() override { |
| return Parent.noteUndefinedBehavior(); |
| } |
| bool hasActiveDiagnostic() override { return Parent.hasActiveDiagnostic(); } |
| void setActiveDiagnostic(bool Flag) override { |
| Parent.setActiveDiagnostic(Flag); |
| } |
| void setFoldFailureDiagnostic(bool Flag) override { |
| Parent.setFoldFailureDiagnostic(Flag); |
| } |
| bool hasPriorDiagnostic() override { return Parent.hasPriorDiagnostic(); } |
| |
| /// Reports overflow and return true if evaluation should continue. |
| bool reportOverflow(const Expr *E, const llvm::APSInt &Value); |
| |
| /// Deallocates a pointer. |
| void deallocate(Block *B); |
| |
| /// Delegates source mapping to the mapper. |
| SourceInfo getSource(Function *F, CodePtr PC) const override { |
| return M ? M->getSource(F, PC) : F->getSource(PC); |
| } |
| |
| private: |
| /// AST Walker state. |
| State &Parent; |
| /// Dead block chain. |
| DeadBlock *DeadBlocks = nullptr; |
| /// Reference to the offset-source mapping. |
| SourceMapper *M; |
| |
| public: |
| /// Reference to the module containing all bytecode. |
| Program &P; |
| /// Temporary stack. |
| InterpStack &Stk; |
| /// Interpreter Context. |
| Context &Ctx; |
| /// The current frame. |
| InterpFrame *Current = nullptr; |
| /// Call stack depth. |
| unsigned CallStackDepth; |
| }; |
| |
| } // namespace interp |
| } // namespace clang |
| |
| #endif |