1#include "env.h"
2#include "base_object-inl.h"
3#include "handle_wrap.h"
4#include "util-inl.h"
5#include "req_wrap.h"
6#include "v8abbr.h"
7#include "node_context_data.h"
8
9#define NODEDBG_SYMBOL(Name)  nodedbg_ ## Name
10
11// nodedbg_offset_CLASS__MEMBER__TYPE: Describes the offset to a class member.
12#define NODEDBG_OFFSET(Class, Member, Type) \
13    NODEDBG_SYMBOL(offset_ ## Class ## __ ## Member ## __ ## Type)
14
15// These are the constants describing Node internal structures. Every constant
16// should use the format described above.  These constants are declared as
17// global integers so that they'll be present in the generated node binary. They
18// also need to be declared outside any namespace to avoid C++ name-mangling.
19#define NODE_OFFSET_POSTMORTEM_METADATA(V)                                    \
20  V(BaseObject, persistent_handle_, v8_Persistent_v8_Object,                  \
21    BaseObject::persistent_handle_)                                           \
22  V(Environment, handle_wrap_queue_, Environment_HandleWrapQueue,             \
23    Environment::handle_wrap_queue_)                                          \
24  V(Environment, req_wrap_queue_, Environment_ReqWrapQueue,                   \
25    Environment::req_wrap_queue_)                                             \
26  V(HandleWrap, handle_wrap_queue_, ListNode_HandleWrap,                      \
27    HandleWrap::handle_wrap_queue_)                                           \
28  V(Environment_HandleWrapQueue, head_, ListNode_HandleWrap,                  \
29    Environment::HandleWrapQueue::head_)                                      \
30  V(ListNode_HandleWrap, prev_, uintptr_t, ListNode<HandleWrap>::prev_)       \
31  V(ListNode_HandleWrap, next_, uintptr_t, ListNode<HandleWrap>::next_)       \
32  V(Environment_ReqWrapQueue, head_, ListNode_ReqWrapQueue,                   \
33    Environment::ReqWrapQueue::head_)                                         \
34  V(ListNode_ReqWrap, prev_, uintptr_t, ListNode<ReqWrapBase>::prev_)         \
35  V(ListNode_ReqWrap, next_, uintptr_t, ListNode<ReqWrapBase>::next_)
36
37extern "C" {
38int nodedbg_const_ContextEmbedderIndex__kEnvironment__int;
39int nodedbg_const_BaseObject__kInternalFieldCount__int;
40uintptr_t nodedbg_offset_ExternalString__data__uintptr_t;
41uintptr_t nodedbg_offset_ReqWrap__req_wrap_queue___ListNode_ReqWrapQueue;
42
43#define V(Class, Member, Type, Accessor)                                      \
44  NODE_EXTERN uintptr_t NODEDBG_OFFSET(Class, Member, Type);
45  NODE_OFFSET_POSTMORTEM_METADATA(V)
46#undef V
47}
48
49namespace node {
50
51int GenDebugSymbols() {
52  nodedbg_const_ContextEmbedderIndex__kEnvironment__int =
53      ContextEmbedderIndex::kEnvironment;
54  nodedbg_const_BaseObject__kInternalFieldCount__int =
55      BaseObject::kInternalFieldCount;
56
57  nodedbg_offset_ExternalString__data__uintptr_t = NODE_OFF_EXTSTR_DATA;
58  nodedbg_offset_ReqWrap__req_wrap_queue___ListNode_ReqWrapQueue =
59      OffsetOf<ListNode<ReqWrapBase>, ReqWrap<uv_req_t>>(
60          &ReqWrap<uv_req_t>::req_wrap_queue_);
61
62  #define V(Class, Member, Type, Accessor)                                    \
63    NODEDBG_OFFSET(Class, Member, Type) = OffsetOf(&Accessor);
64    NODE_OFFSET_POSTMORTEM_METADATA(V)
65  #undef V
66
67  return 1;
68}
69
70const int debug_symbols_generated = GenDebugSymbols();
71
72}  // namespace node
73