5#ifndef INCLUDE_CPPGC_INTERNAL_GC_INFO_H_
6#define INCLUDE_CPPGC_INTERNAL_GC_INFO_H_
21static constexpr GCInfoIndex kMaxGCInfoIndex = 1 << 14;
42#if defined(CPPGC_ENABLE_OBJECT_SECTION_GCINFO)
50extern "C" __attribute__((visibility(
"hidden"))) const GCInfo
51 __start_gc_info_section[] __asm("section$start$__DATA$gc_info_section");
52extern "C" __attribute__((visibility("hidden"))) const GCInfo
53 __stop_gc_info_section[] __asm("section$end$__DATA$gc_info_section");
54#define CPPGC_GC_INFO_SECTION \
55 __attribute__((section("__DATA,gc_info_section"), used))
57extern "C" __attribute__((visibility(
"hidden")))
58const GCInfo __start_gc_info_section[];
59extern "C" __attribute__((visibility("hidden")))
60const GCInfo __stop_gc_info_section[];
61#define CPPGC_GC_INFO_SECTION __attribute__((section("gc_info_section"), used))
66 GCInfoTableSection() =
delete;
68 V8_INLINE static GCInfoIndex Index(
const GCInfo& info) {
69 return &info - __start_gc_info_section + 1;
72 V8_INLINE static const GCInfo& GCInfoFromIndex(GCInfoIndex index) {
75 static_cast<size_t>(index - 1) <
76 static_cast<size_t>(__stop_gc_info_section - __start_gc_info_section));
77 return __start_gc_info_section[index - 1];
88 std::atomic<GCInfoIndex>& registered_index) {
89 return EnsureGCInfoIndexTraitDispatch<T>{}(registered_index);
93 template <typename T, bool = FinalizerTrait<T>::HasFinalizer(),
95 struct EnsureGCInfoIndexTraitDispatch;
108#define DISPATCH(has_finalizer, has_non_hidden_name, function) \
109 template <typename T> \
110 struct EnsureGCInfoIndexTrait::EnsureGCInfoIndexTraitDispatch< \
111 T, has_finalizer, has_non_hidden_name> { \
112 V8_INLINE GCInfoIndex \
113 operator()(std::atomic<GCInfoIndex>& registered_index) { \
122 EnsureGCInfoIndex(registered_index,
127 EnsureGCInfoIndex(registered_index,
131 EnsureGCInfoIndex(registered_index,
135 EnsureGCInfoIndex(registered_index,
146#if defined(CPPGC_ENABLE_OBJECT_SECTION_GCINFO)
147 static const GCInfo gc_info;
149 static_assert(
sizeof(T),
"T must be fully defined");
150 return GCInfoTableSection::Index(gc_info);
154 static_assert(
sizeof(T),
"T must be fully defined");
155 static std::atomic<GCInfoIndex>
157 GCInfoIndex index = registered_index.load(std::memory_order_acquire);
159 index = EnsureGCInfoIndexTrait::EnsureIndex<T>(registered_index);
161 CPPGC_DCHECK(index == registered_index.load(std::memory_order_acquire));
178template <
typename T,
typename ParentMostGarbageCollectedType>
181 std::has_virtual_destructor_v<ParentMostGarbageCollectedType>;
183 std::is_trivially_destructible_v<ParentMostGarbageCollectedType> &&
184 std::is_trivially_destructible_v<T>;
187 ParentMostGarbageCollectedType>::value;
188#ifdef CPPGC_SUPPORTS_OBJECT_NAMES
214 std::conditional_t<
WantToFold(), ParentMostGarbageCollectedType, T>;
217#if defined(CPPGC_ENABLE_OBJECT_SECTION_GCINFO)
static constexpr const char kHiddenName[]
Definition: name-provider.h:31
Definition: name-trait.h:75
#define DISPATCH(has_finalizer, has_non_hidden_name, function)
Definition: gc-info.h:108
#define CPPGC_DCHECK(condition)
Definition: logging.h:36
Definition: allocation.h:47
uint16_t GCInfoIndex
Definition: gc-info.h:20
HeapObjectName(*)(const void *, HeapObjectNameForUnnamedObject) NameCallback
Definition: name-trait.h:135
void(*)(void *) FinalizationCallback
Definition: finalizer-trait.h:15
HeapObjectNameForUnnamedObject
Definition: name-trait.h:62
HeapObjectName GetHiddenName(const void *, HeapObjectNameForUnnamedObject name_retrieval_mode)
Definition: gc-info.h:35
void(*)(Visitor *visitor, const void *object) TraceCallback
Definition: trace-trait.h:37
Definition: trace-trait.h:104
Definition: finalizer-trait.h:66
static constexpr FinalizationCallback kCallback
Definition: finalizer-trait.h:83
Definition: gc-info.h:179
static constexpr bool kBothTypesAreTriviallyDestructible
Definition: gc-info.h:182
static constexpr bool kHasVirtualDestructorAtBase
Definition: gc-info.h:180
static constexpr bool kHasCustomFinalizerDispatchAtBase
Definition: gc-info.h:185
static constexpr bool kWantsDetailedObjectNames
Definition: gc-info.h:191
static constexpr bool WantToFold()
Definition: gc-info.h:199
std::conditional_t< WantToFold(), ParentMostGarbageCollectedType, T > ResultType
Definition: gc-info.h:214
Definition: gc-info.h:145
static GCInfoIndex Index()
Definition: gc-info.h:153
static constexpr void CheckCallbacksAreDefined()
Definition: gc-info.h:167
FinalizationCallback finalize
Definition: gc-info.h:29
TraceCallback trace
Definition: gc-info.h:30
constexpr GCInfo(FinalizationCallback finalize, TraceCallback trace, NameCallback name)
Definition: gc-info.h:25
NameCallback name
Definition: gc-info.h:31
size_t padding
Definition: gc-info.h:32
Definition: finalizer-trait.h:18
Definition: name-trait.h:57
static void Trace(Visitor *visitor, const void *self)
Definition: trace-trait.h:96
#define V8_EXPORT
Definition: v8config.h:867
#define V8_INLINE
Definition: v8config.h:511
#define V8_UNLIKELY(condition)
Definition: v8config.h:670
#define V8_PRESERVE_MOST
Definition: v8config.h:608