summaryrefslogtreecommitdiff
path: root/src/PowerPC_EABI_Support/Runtime/Src/__init_cpp_exceptions.cpp
blob: ab338f87ba85bf526128f383cc3528974d4a8f5f (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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "__init_cpp_exceptions.h"

#include "NMWException.h"
#include "__ppc_eabi_linker.h"


#if __MWERKS__
#pragma exceptions off
#pragma internal on
#endif

#ifdef __cplusplus
extern "C" {
#endif

extern void __init_cpp_exceptions(void);
extern void __fini_cpp_exceptions(void);

#ifdef __cplusplus
}
#endif

static int fragmentID = -2;

void __init_cpp_exceptions(void) {
    register char *R2;
    if (fragmentID == -2) {
        __asm {
            mr R2, r2
        }
        fragmentID = __register_fragment(_eti_init_info, R2);
    }
}

void __fini_cpp_exceptions(void) {
    if (fragmentID != -2) {
        __unregister_fragment(fragmentID);
        fragmentID = -2;
    }
}

#pragma push
// HACK: When DTK sets all objects to force_active, the linker decides to strip
// these, for some reason. Set them to force_active as well.
#pragma force_active on

#pragma section ".ctors$10"
__declspec(section ".ctors$10") extern void *const __init_cpp_exceptions_reference = __init_cpp_exceptions;
#pragma section ".dtors$10"
__declspec(section ".dtors$10") extern void *const __destroy_global_chain_reference = __destroy_global_chain;
#pragma section ".dtors$15"
__declspec(section ".dtors$15") extern void *const __fini_cpp_exceptions_reference = __fini_cpp_exceptions;

#pragma pop