diff options
Diffstat (limited to 'clang/lib/AST/Interp/ByteCodeStmtGen.h')
| -rw-r--r-- | clang/lib/AST/Interp/ByteCodeStmtGen.h | 89 | 
1 files changed, 89 insertions, 0 deletions
| diff --git a/clang/lib/AST/Interp/ByteCodeStmtGen.h b/clang/lib/AST/Interp/ByteCodeStmtGen.h new file mode 100644 index 000000000000..d9c0b64ed4b8 --- /dev/null +++ b/clang/lib/AST/Interp/ByteCodeStmtGen.h @@ -0,0 +1,89 @@ +//===--- ByteCodeStmtGen.h - Code generator for expressions -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Defines the constexpr bytecode compiler. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_AST_INTERP_BYTECODESTMTGEN_H +#define LLVM_CLANG_AST_INTERP_BYTECODESTMTGEN_H + +#include "ByteCodeEmitter.h" +#include "ByteCodeExprGen.h" +#include "EvalEmitter.h" +#include "Pointer.h" +#include "PrimType.h" +#include "Record.h" +#include "clang/AST/Decl.h" +#include "clang/AST/Expr.h" +#include "clang/AST/StmtVisitor.h" +#include "llvm/ADT/Optional.h" + +namespace clang { +class QualType; + +namespace interp { +class Function; +class State; + +template <class Emitter> class LoopScope; +template <class Emitter> class SwitchScope; +template <class Emitter> class LabelScope; + +/// Compilation context for statements. +template <class Emitter> +class ByteCodeStmtGen : public ByteCodeExprGen<Emitter> { +  using LabelTy = typename Emitter::LabelTy; +  using AddrTy = typename Emitter::AddrTy; +  using OptLabelTy = llvm::Optional<LabelTy>; +  using CaseMap = llvm::DenseMap<const SwitchCase *, LabelTy>; + +public: +  template<typename... Tys> +  ByteCodeStmtGen(Tys&&... Args) +      : ByteCodeExprGen<Emitter>(std::forward<Tys>(Args)...) {} + +protected: +  bool visitFunc(const FunctionDecl *F) override; + +private: +  friend class LabelScope<Emitter>; +  friend class LoopScope<Emitter>; +  friend class SwitchScope<Emitter>; + +  // Statement visitors. +  bool visitStmt(const Stmt *S); +  bool visitCompoundStmt(const CompoundStmt *S); +  bool visitDeclStmt(const DeclStmt *DS); +  bool visitReturnStmt(const ReturnStmt *RS); +  bool visitIfStmt(const IfStmt *IS); + +  /// Compiles a variable declaration. +  bool visitVarDecl(const VarDecl *VD); + +private: +  /// Type of the expression returned by the function. +  llvm::Optional<PrimType> ReturnType; + +  /// Switch case mapping. +  CaseMap CaseLabels; + +  /// Point to break to. +  OptLabelTy BreakLabel; +  /// Point to continue to. +  OptLabelTy ContinueLabel; +  /// Default case label. +  OptLabelTy DefaultLabel; +}; + +extern template class ByteCodeExprGen<EvalEmitter>; + +} // namespace interp +} // namespace clang + +#endif | 
