summaryrefslogtreecommitdiff
path: root/tools/libdol2asm/global_destructor_chain.template.cpp
blob: 050d2111aed26ba6f313ce3ff1fbdfdf056f93d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//
//
//

#include "dol2asm.h"
#include "dolphin/types.h"

struct __destructor_chain {
    __destructor_chain* next;
    void* destructor;
    void* object;
};

#define CALL_DTOR(DTOR, OBJECT, VALUE) (((void (*)(void*, short))(DTOR))((OBJECT), VALUE))
#define CALL_DTOR_ALL(DTOR, OBJECT) CALL_DTOR(DTOR, OBJECT, (-1))

static __destructor_chain* __global_destructor_chain;

extern "C" void __register_global_object(void* object, void* destructor, __destructor_chain* link) {
    link->next = __global_destructor_chain;
    link->destructor = destructor;
    link->object = object;
    __global_destructor_chain = link;
}

extern "C" void __destroy_global_chain() {
    __destructor_chain* gcd;
    while ((gcd = __global_destructor_chain) != NULL) {
        __global_destructor_chain = gcd->next;

        CALL_DTOR_ALL(gcd->destructor, gcd->object);
    }
}

SECTION_DTORS10 extern void* const __destroy_global_chain_reference = (void*)__destroy_global_chain;