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
18static const long __EH_FRAME_LIST__[]
19  __attribute__((section(".eh_frame"), aligned(4), visibility("hidden"))) = {};
20
21struct object {
22  void *p[8];
23};
24
25extern void __register_frame_info(const void *, void *)
26  __attribute__((weak));
27
28extern void *__deregister_frame_info(const void *) __attribute__((weak));
29extern void *__deregister_frame_info_bases(const void *) __attribute__((weak));
30
31#ifndef CRT_HAS_INITFINI_ARRAY
32typedef void (*fp)(void);
33static const fp __CTOR_LIST__[]
34  __attribute__((section(".ctors"), aligned(sizeof(fp)), visibility("hidden"), used)) = { (fp)-1 };
35extern const fp __CTOR_END__[] __attribute__((visibility("hidden")));
36#endif
37
38#ifdef CRT_SHARED
39extern void __cxa_finalize(void *) __attribute__((weak));
40#endif
41
42static 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
62static const fp __DTOR_LIST__[]
63  __attribute__((section(".dtors"), aligned(sizeof(fp)), visibility("hidden"), used)) = { (fp)-1 };
64extern const fp __DTOR_END__[] __attribute__((visibility("hidden")));
65#endif
66
67__attribute__((section(".init_array"), used))
68  static void (*__init)(void) = __do_init;
69
70static 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