//===--- Descriptor.h - Types for the constexpr VM --------------*- 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 descriptors which characterise allocations. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_AST_INTERP_DESCRIPTOR_H #define LLVM_CLANG_AST_INTERP_DESCRIPTOR_H #include "PrimType.h" #include "clang/AST/Decl.h" #include "clang/AST/Expr.h" namespace clang { namespace interp { class Block; class Record; class SourceInfo; struct InitMap; struct Descriptor; enum PrimType : unsigned; DeclTy; InitMapPtr; /// Invoked whenever a block is created. The constructor method fills in the /// inline descriptors of all fields and array elements. It also initializes /// all the fields which contain non-trivial types. BlockCtorFn; /// Invoked when a block is destroyed. Invokes the destructors of all /// non-trivial nested fields of arrays and records. BlockDtorFn; /// Invoked when a block with pointers referencing it goes out of scope. Such /// blocks are persisted: the move function copies all inline descriptors and /// non-trivial fields, as existing pointers might need to reference those /// descriptors. Data is not copied since it cannot be legally read. BlockMoveFn; enum class GlobalInitState { … }; /// Descriptor used for global variables. struct alignas(void *) GlobalInlineDescriptor { … }; static_assert …; /// Inline descriptor embedded in structures and arrays. /// /// Such descriptors precede all composite array elements and structure fields. /// If the base of a pointer is not zero, the base points to the end of this /// structure. The offset field is used to traverse the pointer chain up /// to the root structure which allocated the object. struct InlineDescriptor { … }; static_assert …; /// Describes a memory block created by an allocation site. struct Descriptor final { … }; /// Bitfield tracking the initialisation status of elements of primitive arrays. struct InitMap final { … }; } // namespace interp } // namespace clang #endif