1//===--- InterpState.h - Interpreter state for the constexpr VM -*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// Definition of the interpreter state and entry point. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_CLANG_AST_INTERP_INTERPSTATE_H 14#define LLVM_CLANG_AST_INTERP_INTERPSTATE_H 15 16#include "Context.h" 17#include "Function.h" 18#include "InterpStack.h" 19#include "State.h" 20#include "clang/AST/APValue.h" 21#include "clang/AST/ASTDiagnostic.h" 22#include "clang/AST/Expr.h" 23#include "clang/AST/OptionalDiagnostic.h" 24 25namespace clang { 26namespace interp { 27class Context; 28class Function; 29class InterpStack; 30class InterpFrame; 31class SourceMapper; 32 33/// Interpreter context. 34class InterpState final : public State, public SourceMapper { 35public: 36 InterpState(State &Parent, Program &P, InterpStack &Stk, Context &Ctx, 37 SourceMapper *M = nullptr); 38 39 ~InterpState(); 40 41 // Stack frame accessors. 42 Frame *getSplitFrame() { return Parent.getCurrentFrame(); } 43 Frame *getCurrentFrame() override; 44 unsigned getCallStackDepth() override { return CallStackDepth; } 45 const Frame *getBottomFrame() const override { 46 return Parent.getBottomFrame(); 47 } 48 49 // Acces objects from the walker context. 50 Expr::EvalStatus &getEvalStatus() const override { 51 return Parent.getEvalStatus(); 52 } 53 ASTContext &getCtx() const override { return Parent.getCtx(); } 54 55 // Forward status checks and updates to the walker. 56 bool checkingForUndefinedBehavior() const override { 57 return Parent.checkingForUndefinedBehavior(); 58 } 59 bool keepEvaluatingAfterFailure() const override { 60 return Parent.keepEvaluatingAfterFailure(); 61 } 62 bool checkingPotentialConstantExpression() const override { 63 return Parent.checkingPotentialConstantExpression(); 64 } 65 bool noteUndefinedBehavior() override { 66 return Parent.noteUndefinedBehavior(); 67 } 68 bool hasActiveDiagnostic() override { return Parent.hasActiveDiagnostic(); } 69 void setActiveDiagnostic(bool Flag) override { 70 Parent.setActiveDiagnostic(Flag); 71 } 72 void setFoldFailureDiagnostic(bool Flag) override { 73 Parent.setFoldFailureDiagnostic(Flag); 74 } 75 bool hasPriorDiagnostic() override { return Parent.hasPriorDiagnostic(); } 76 77 /// Reports overflow and return true if evaluation should continue. 78 bool reportOverflow(const Expr *E, const llvm::APSInt &Value); 79 80 /// Deallocates a pointer. 81 void deallocate(Block *B); 82 83 /// Delegates source mapping to the mapper. 84 SourceInfo getSource(Function *F, CodePtr PC) const override { 85 return M ? M->getSource(F, PC) : F->getSource(PC); 86 } 87 88private: 89 /// AST Walker state. 90 State &Parent; 91 /// Dead block chain. 92 DeadBlock *DeadBlocks = nullptr; 93 /// Reference to the offset-source mapping. 94 SourceMapper *M; 95 96public: 97 /// Reference to the module containing all bytecode. 98 Program &P; 99 /// Temporary stack. 100 InterpStack &Stk; 101 /// Interpreter Context. 102 Context &Ctx; 103 /// The current frame. 104 InterpFrame *Current = nullptr; 105 /// Call stack depth. 106 unsigned CallStackDepth; 107}; 108 109} // namespace interp 110} // namespace clang 111 112#endif 113