Coverage Report

Created: 2020-03-31 06:27

/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 "Context.h"
20
#include "InterpStack.h"
21
#include "clang/AST/APValue.h"
22
#include "llvm/ADT/PointerIntPair.h"
23
24
namespace clang {
25
class ASTContext;
26
class LangOptions;
27
class Stmt;
28
class FunctionDecl;
29
class VarDecl;
30
31
namespace interp {
32
class Function;
33
class Program;
34
class State;
35
enum PrimType : unsigned;
36
37
/// Holds all information required to evaluate constexpr code in a module.
38
class Context {
39
public:
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
0
  ASTContext &getASTContext() const { return Ctx; }
57
  /// Returns the language options.
58
  const LangOptions &getLangOpts() const;
59
  /// Returns the interpreter stack.
60
0
  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
67
private:
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
74
private:
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