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
26namespace clang {
27namespace interp {
28
29template <class Emitter> class LoopScope;
30template <class Emitter> class SwitchScope;
31template <class Emitter> class LabelScope;
32
33/// Compilation context for statements.
34template <class Emitter>
35class ByteCodeStmtGen final : public ByteCodeExprGen<Emitter> {
36  using LabelTy = typename Emitter::LabelTy;
37  using AddrTy = typename Emitter::AddrTy;
38  using OptLabelTy = std::optional<LabelTy>;
39  using CaseMap = llvm::DenseMap<const SwitchCase *, LabelTy>;
40
41public:
42  template<typename... Tys>
43  ByteCodeStmtGen(Tys&&... Args)
44      : ByteCodeExprGen<Emitter>(std::forward<Tys>(Args)...) {}
45
46protected:
47  bool visitFunc(const FunctionDecl *F) override;
48
49private:
50  friend class LabelScope<Emitter>;
51  friend class LoopScope<Emitter>;
52  friend class SwitchScope<Emitter>;
53
54  // Statement visitors.
55  bool visitStmt(const Stmt *S);
56  bool visitCompoundStmt(const CompoundStmt *S);
57  bool visitDeclStmt(const DeclStmt *DS);
58  bool visitReturnStmt(const ReturnStmt *RS);
59  bool visitIfStmt(const IfStmt *IS);
60  bool visitWhileStmt(const WhileStmt *S);
61  bool visitDoStmt(const DoStmt *S);
62  bool visitForStmt(const ForStmt *S);
63  bool visitBreakStmt(const BreakStmt *S);
64  bool visitContinueStmt(const ContinueStmt *S);
65
66  /// Type of the expression returned by the function.
67  std::optional<PrimType> ReturnType;
68
69  /// Switch case mapping.
70  CaseMap CaseLabels;
71
72  /// Point to break to.
73  OptLabelTy BreakLabel;
74  /// Point to continue to.
75  OptLabelTy ContinueLabel;
76  /// Default case label.
77  OptLabelTy DefaultLabel;
78};
79
80extern template class ByteCodeExprGen<EvalEmitter>;
81
82} // namespace interp
83} // namespace clang
84
85#endif
86