1 /* ===-- crtbegin.c - Provide __dso_handle ---------------------------------===
2 *
3 * The LLVM Compiler Infrastructure
4 *
5 * This file is dual licensed under the MIT and the University of Illinois Open
6 * Source Licenses. See LICENSE.TXT for details.
7 *
8 * ===----------------------------------------------------------------------===
9 */
10
11 __attribute__((visibility("hidden")))
12 #ifdef CRT_SHARED
13 void *__dso_handle = &__dso_handle;
14 #else
15 void *__dso_handle = (void *)0;
16 #endif
17
18 static const long __EH_FRAME_LIST__[]
19 __attribute__((section(".eh_frame"), aligned(4), visibility("hidden"))) = {};
20
21 struct object {
22 void *p[8];
23 };
24
25 extern void __register_frame_info(const void *, void *)
26 __attribute__((weak));
27
28 extern void *__deregister_frame_info(const void *) __attribute__((weak));
29 extern void *__deregister_frame_info_bases(const void *) __attribute__((weak));
30
31 #ifndef CRT_HAS_INITFINI_ARRAY
32 typedef void (*fp)(void);
33 static const fp __CTOR_LIST__[]
34 __attribute__((section(".ctors"), aligned(sizeof(fp)), visibility("hidden"), used)) = { (fp)-1 };
35 extern const fp __CTOR_END__[] __attribute__((visibility("hidden")));
36 #endif
37
38 #ifdef CRT_SHARED
39 extern void __cxa_finalize(void *) __attribute__((weak));
40 #endif
41
__do_init()42 static void __attribute__((used)) __do_init() {
43 static _Bool __initialized;
44 if (__builtin_expect(__initialized, 0))
45 return;
46 __initialized = 1;
47
48 static struct object ob;
49 if (__register_frame_info)
50 __register_frame_info(__EH_FRAME_LIST__, &ob);
51
52 #ifndef CRT_HAS_INITFINI_ARRAY
53 unsigned long n = (unsigned long)__CTOR_LIST__[0];
54 if (n == (unsigned long)-1)
55 for (n = 0; __CTOR_LIST__[n + 1] != 0; n++);
56 for (unsigned long i = n; i >= 1; i--)
57 __CTOR_LIST__[i]();
58 #endif
59 }
60
61 #ifndef CRT_HAS_INITFINI_ARRAY
62 static const fp __DTOR_LIST__[]
63 __attribute__((section(".dtors"), aligned(sizeof(fp)), visibility("hidden"), used)) = { (fp)-1 };
64 extern const fp __DTOR_END__[] __attribute__((visibility("hidden")));
65 #endif
66
67 __attribute__((section(".init_array"), used))
68 static void (*__init)(void) = __do_init;
69
__do_fini()70 static void __attribute__((used)) __do_fini() {
71 static _Bool __finalized;
72 if (__builtin_expect(__finalized, 0))
73 return;
74 __finalized = 1;
75
76 #ifdef CRT_SHARED
77 if (__cxa_finalize)
78 __cxa_finalize(__dso_handle);
79 #endif
80
81 if (__deregister_frame_info)
82 __deregister_frame_info(__EH_FRAME_LIST__);
83
84 #ifndef CRT_HAS_INITFINI_ARRAY
85 for (unsigned long i = 1; __DTOR_LIST__[i]; i++)
86 __DTOR_LIST__[i]();
87 #endif
88 }
89
90 __attribute__((section(".fini_array"), used))
91 static void (*__fini)(void) = __do_fini;
92