//===-- InterpBlock.h - Allocated blocks for the interpreter -*- 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 classes describing allocated blocks. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_AST_INTERP_BLOCK_H #define LLVM_CLANG_AST_INTERP_BLOCK_H #include "Descriptor.h" #include "clang/AST/ComparisonCategories.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/Expr.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/Support/raw_ostream.h" namespace clang { namespace interp { class Block; class DeadBlock; class InterpState; class Pointer; enum PrimType : unsigned; /// A memory block, either on the stack or in the heap. /// /// The storage described by the block is immediately followed by /// optional metadata, which is followed by the actual data. /// /// Block* rawData() data() /// │ │ │ /// │ │ │ /// ▼ ▼ ▼ /// ┌───────────────┬─────────────────────────┬─────────────────┐ /// │ Block │ Metadata │ Data │ /// │ sizeof(Block) │ Desc->getMetadataSize() │ Desc->getSize() │ /// └───────────────┴─────────────────────────┴─────────────────┘ /// /// Desc->getAllocSize() describes the size after the Block, i.e. /// the data size and the metadata size. /// class Block final { … }; /// Descriptor for a dead block. /// /// Dead blocks are chained in a double-linked list to deallocate them /// whenever pointers become dead. class DeadBlock final { … }; } // namespace interp } // namespace clang #endif