12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- //===--- 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 {
- namespace interp {
- 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
|