1//===--- Context.h - Context 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// Defines the constexpr execution context. 10// 11// The execution context manages cached bytecode and the global context. 12// It invokes the compiler and interpreter, propagating errors. 13// 14//===----------------------------------------------------------------------===// 15 16#ifndef LLVM_CLANG_AST_INTERP_CONTEXT_H 17#define LLVM_CLANG_AST_INTERP_CONTEXT_H 18 19#include "Context.h" 20#include "InterpStack.h" 21#include "clang/AST/APValue.h" 22#include "llvm/ADT/PointerIntPair.h" 23 24namespace clang { 25class ASTContext; 26class LangOptions; 27class Stmt; 28class FunctionDecl; 29class VarDecl; 30 31namespace interp { 32class Function; 33class Program; 34class State; 35enum PrimType : unsigned; 36 37/// Holds all information required to evaluate constexpr code in a module. 38class Context { 39public: 40 /// Initialises the constexpr VM. 41 Context(ASTContext &Ctx); 42 43 /// Cleans up the constexpr VM. 44 ~Context(); 45 46 /// Checks if a function is a potential constant expression. 47 bool isPotentialConstantExpr(State &Parent, const FunctionDecl *FnDecl); 48 49 /// Evaluates a toplevel expression as an rvalue. 50 bool evaluateAsRValue(State &Parent, const Expr *E, APValue &Result); 51 52 /// Evaluates a toplevel initializer. 53 bool evaluateAsInitializer(State &Parent, const VarDecl *VD, APValue &Result); 54 55 /// Returns the AST context. 56 ASTContext &getASTContext() const { return Ctx; } 57 /// Returns the language options. 58 const LangOptions &getLangOpts() const; 59 /// Returns the interpreter stack. 60 InterpStack &getStack() { return Stk; } 61 /// Returns CHAR_BIT. 62 unsigned getCharBit() const; 63 64 /// Classifies an expression. 65 llvm::Optional<PrimType> classify(QualType T); 66 67private: 68 /// Runs a function. 69 bool Run(State &Parent, Function *Func, APValue &Result); 70 71 /// Checks a result fromt the interpreter. 72 bool Check(State &Parent, llvm::Expected<bool> &&R); 73 74private: 75 /// Current compilation context. 76 ASTContext &Ctx; 77 /// Interpreter stack, shared across invocations. 78 InterpStack Stk; 79 /// Constexpr program. 80 std::unique_ptr<Program> P; 81}; 82 83} // namespace interp 84} // namespace clang 85 86#endif 87