123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- //===--- 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();
- }
- // Access 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 inConstantContext() const { return Parent.InConstantContext; }
- 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(const 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
|