Coverage Report

Created: 2021-08-24 07:12

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/lib/AST/Interp/Context.h
Line
Count
Source (jump to first uncovered line)
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
0
  ASTContext &getASTContext() const { return Ctx; }
56
  /// Returns the language options.
57
  const LangOptions &getLangOpts() const;
58
  /// Returns the interpreter stack.
59
0
  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