clang 20.0.0git
Context.h
Go to the documentation of this file.
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
21namespace clang {
22class ASTContext;
23class LangOptions;
24class FunctionDecl;
25class VarDecl;
26class APValue;
27
28namespace interp {
29class Function;
30class Program;
31class State;
32enum PrimType : unsigned;
33
35 unsigned Offset;
36 bool IsPtr;
37};
38
39/// Holds all information required to evaluate constexpr code in a module.
40class Context final {
41public:
42 /// Initialises the constexpr VM.
43 Context(ASTContext &Ctx);
44
45 /// Cleans up the constexpr VM.
46 ~Context();
47
48 /// Checks if a function is a potential constant expression.
50
51 /// Evaluates a toplevel expression as an rvalue.
53
54 /// Like evaluateAsRvalue(), but does no implicit lvalue-to-rvalue conversion.
55 bool evaluate(State &Parent, const Expr *E, APValue &Result,
57
58 /// Evaluates a toplevel initializer.
60
61 /// Returns the AST context.
62 ASTContext &getASTContext() const { return Ctx; }
63 /// Returns the language options.
64 const LangOptions &getLangOpts() const;
65 /// Returns the interpreter stack.
66 InterpStack &getStack() { return Stk; }
67 /// Returns CHAR_BIT.
68 unsigned getCharBit() const;
69 /// Return the floating-point semantics for T.
70 const llvm::fltSemantics &getFloatSemantics(QualType T) const;
71 /// Return the size of T in bits.
72 uint32_t getBitWidth(QualType T) const { return Ctx.getIntWidth(T); }
73
74 /// Classifies a type.
75 std::optional<PrimType> classify(QualType T) const;
76
77 /// Classifies an expression.
78 std::optional<PrimType> classify(const Expr *E) const {
79 assert(E);
80 if (E->isGLValue()) {
81 if (E->getType()->isFunctionType())
82 return PT_FnPtr;
83 return PT_Ptr;
84 }
85
86 return classify(E->getType());
87 }
88
89 const CXXMethodDecl *
90 getOverridingFunction(const CXXRecordDecl *DynamicDecl,
91 const CXXRecordDecl *StaticDecl,
92 const CXXMethodDecl *InitialFunction) const;
93
95
96 /// Returns whether we should create a global variable for the
97 /// given ValueDecl.
98 static bool shouldBeGloballyIndexed(const ValueDecl *VD) {
99 if (const auto *V = dyn_cast<VarDecl>(VD))
100 return V->hasGlobalStorage() || V->isConstexpr();
101
102 return false;
103 }
104
105 /// Returns the program. This is only needed for unittests.
106 Program &getProgram() const { return *P.get(); }
107
108 unsigned collectBaseOffset(const RecordDecl *BaseDecl,
109 const RecordDecl *DerivedDecl) const;
110
111 const Record *getRecord(const RecordDecl *D) const;
112
113 unsigned getEvalID() const { return EvalID; }
114
115private:
116 /// Runs a function.
117 bool Run(State &Parent, const Function *Func);
118
119 /// Current compilation context.
120 ASTContext &Ctx;
121 /// Interpreter stack, shared across invocations.
122 InterpStack Stk;
123 /// Constexpr program.
124 std::unique_ptr<Program> P;
125 /// ID identifying an evaluation.
126 unsigned EvalID = 0;
127};
128
129} // namespace interp
130} // namespace clang
131
132#endif
#define V(N, I)
Definition: ASTContext.h:3443
NodeId Parent
Definition: ASTDiff.cpp:191
const Decl * D
Expr * E
enum clang::sema::@1718::IndirectLocalPathEntry::EntryKind Kind
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:188
unsigned getIntWidth(QualType T) const
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2078
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
This represents one expression.
Definition: Expr.h:110
ConstantExprKind
Definition: Expr.h:748
Represents a function declaration or definition.
Definition: Decl.h:1935
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:499
A (possibly-)qualified type.
Definition: Type.h:929
Represents a struct/union/class.
Definition: Decl.h:4148
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:671
Represents a variable declaration or definition.
Definition: Decl.h:882
Holds all information required to evaluate constexpr code in a module.
Definition: Context.h:40
const LangOptions & getLangOpts() const
Returns the language options.
Definition: Context.cpp:133
~Context()
Cleans up the constexpr VM.
Definition: Context.cpp:26
unsigned getCharBit() const
Returns CHAR_BIT.
Definition: Context.cpp:205
Program & getProgram() const
Returns the program. This is only needed for unittests.
Definition: Context.h:106
bool evaluateAsInitializer(State &Parent, const VarDecl *VD, APValue &Result)
Evaluates a toplevel initializer.
Definition: Context.cpp:101
const llvm::fltSemantics & getFloatSemantics(QualType T) const
Return the floating-point semantics for T.
Definition: Context.cpp:211
static bool shouldBeGloballyIndexed(const ValueDecl *VD)
Returns whether we should create a global variable for the given ValueDecl.
Definition: Context.h:98
unsigned collectBaseOffset(const RecordDecl *BaseDecl, const RecordDecl *DerivedDecl) const
Definition: Context.cpp:289
const Record * getRecord(const RecordDecl *D) const
Definition: Context.cpp:320
std::optional< PrimType > classify(const Expr *E) const
Classifies an expression.
Definition: Context.h:78
ASTContext & getASTContext() const
Returns the AST context.
Definition: Context.h:62
uint32_t getBitWidth(QualType T) const
Return the size of T in bits.
Definition: Context.h:72
bool isPotentialConstantExpr(State &Parent, const FunctionDecl *FnDecl)
Checks if a function is a potential constant expression.
Definition: Context.cpp:28
bool evaluateAsRValue(State &Parent, const Expr *E, APValue &Result)
Evaluates a toplevel expression as an rvalue.
Definition: Context.cpp:43
InterpStack & getStack()
Returns the interpreter stack.
Definition: Context.h:66
const CXXMethodDecl * getOverridingFunction(const CXXRecordDecl *DynamicDecl, const CXXRecordDecl *StaticDecl, const CXXMethodDecl *InitialFunction) const
Definition: Context.cpp:236
bool evaluate(State &Parent, const Expr *E, APValue &Result, ConstantExprKind Kind)
Like evaluateAsRvalue(), but does no implicit lvalue-to-rvalue conversion.
Definition: Context.cpp:72
std::optional< PrimType > classify(QualType T) const
Classifies a type.
Definition: Context.cpp:135
const Function * getOrCreateFunction(const FunctionDecl *FD)
Definition: Context.cpp:272
unsigned getEvalID() const
Definition: Context.h:113
Bytecode function.
Definition: Function.h:81
Stack frame storing temporaries and parameters.
Definition: InterpStack.h:28
The program contains and links the bytecode for all functions.
Definition: Program.h:39
Structure/Class descriptor.
Definition: Record.h:25
Interface for the VM to interact with the AST walker's context.
Definition: State.h:57
PrimType
Enumeration of the primitive types of the VM.
Definition: PrimType.h:34
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
const FunctionProtoType * T