1//===--- ByteCodeStmtGen.h - Code generator for expressions -----*- 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 bytecode compiler.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_INTERP_BYTECODESTMTGEN_H
14#define LLVM_CLANG_AST_INTERP_BYTECODESTMTGEN_H
15
16#include "ByteCodeEmitter.h"
17#include "ByteCodeExprGen.h"
18#include "EvalEmitter.h"
19#include "Pointer.h"
20#include "PrimType.h"
21#include "Record.h"
22#include "clang/AST/Decl.h"
23#include "clang/AST/Expr.h"
24#include "clang/AST/StmtVisitor.h"
25#include "llvm/ADT/Optional.h"
26
27namespace clang {
28class QualType;
29
30namespace interp {
31class Function;
32class State;
33
34template <class Emitter> class LoopScope;
35template <class Emitter> class SwitchScope;
36template <class Emitter> class LabelScope;
37
38/// Compilation context for statements.
39template <class Emitter>
40class ByteCodeStmtGen : public ByteCodeExprGen<Emitter> {
41  using LabelTy = typename Emitter::LabelTy;
42  using AddrTy = typename Emitter::AddrTy;
43  using OptLabelTy = llvm::Optional<LabelTy>;
44  using CaseMap = llvm::DenseMap<const SwitchCase *, LabelTy>;
45
46public:
47  template<typename... Tys>
48  ByteCodeStmtGen(Tys&&... Args)
49      : ByteCodeExprGen<Emitter>(std::forward<Tys>(Args)...) {}
50
51protected:
52  bool visitFunc(const FunctionDecl *F) override;
53
54private:
55  friend class LabelScope<Emitter>;
56  friend class LoopScope<Emitter>;
57  friend class SwitchScope<Emitter>;
58
59  // Statement visitors.
60  bool visitStmt(const Stmt *S);
61  bool visitCompoundStmt(const CompoundStmt *S);
62  bool visitDeclStmt(const DeclStmt *DS);
63  bool visitReturnStmt(const ReturnStmt *RS);
64  bool visitIfStmt(const IfStmt *IS);
65
66  /// Compiles a variable declaration.
67  bool visitVarDecl(const VarDecl *VD);
68
69private:
70  /// Type of the expression returned by the function.
71  llvm::Optional<PrimType> ReturnType;
72
73  /// Switch case mapping.
74  CaseMap CaseLabels;
75
76  /// Point to break to.
77  OptLabelTy BreakLabel;
78  /// Point to continue to.
79  OptLabelTy ContinueLabel;
80  /// Default case label.
81  OptLabelTy DefaultLabel;
82};
83
84extern template class ByteCodeExprGen<EvalEmitter>;
85
86} // namespace interp
87} // namespace clang
88
89#endif
90