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