1 //===--------------------------- cxxabi.h ---------------------------------===//
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 #ifndef __CXXABI_H
11 #define __CXXABI_H
12 
13 /*
14  * This header provides the interface to the C++ ABI as defined at:
15  *       http://www.codesourcery.com/cxx-abi/
16  */
17 
18 #include <stddef.h>
19 #include <stdint.h>
20 
21 #include <__cxxabi_config.h>
22 
23 #define _LIBCPPABI_VERSION 1001
24 #define LIBCXXABI_NORETURN  __attribute__((noreturn))
25 
26 #ifdef __cplusplus
27 
28 namespace std {
29 class type_info; // forward declaration
30 }
31 
32 
33 // runtime routines use C calling conventions, but are in __cxxabiv1 namespace
34 namespace __cxxabiv1 {
35 extern "C"  {
36 
37 // 2.4.2 Allocating the Exception Object
38 extern void * __cxa_allocate_exception(size_t thrown_size) throw();
39 extern void __cxa_free_exception(void * thrown_exception) throw();
40 
41 // 2.4.3 Throwing the Exception Object
42 extern LIBCXXABI_NORETURN void __cxa_throw(void * thrown_exception,
43         std::type_info * tinfo, void (*dest)(void *));
44 
45 // 2.5.3 Exception Handlers
46 extern void * __cxa_get_exception_ptr(void * exceptionObject) throw();
47 extern void * __cxa_begin_catch(void * exceptionObject) throw();
48 extern void __cxa_end_catch();
49 #if LIBCXXABI_ARM_EHABI
50 extern bool __cxa_begin_cleanup(void * exceptionObject) throw();
51 extern void __cxa_end_cleanup();
52 #endif
53 extern std::type_info * __cxa_current_exception_type();
54 
55 // 2.5.4 Rethrowing Exceptions
56 extern LIBCXXABI_NORETURN void __cxa_rethrow();
57 
58 
59 
60 // 2.6 Auxiliary Runtime APIs
61 extern LIBCXXABI_NORETURN void __cxa_bad_cast(void);
62 extern LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
63 extern LIBCXXABI_NORETURN void __cxa_throw_bad_array_new_length(void);
64 
65 
66 
67 // 3.2.6 Pure Virtual Function API
68 extern LIBCXXABI_NORETURN void __cxa_pure_virtual(void);
69 
70 // 3.2.7 Deleted Virtual Function API
71 extern LIBCXXABI_NORETURN void __cxa_deleted_virtual(void);
72 
73 // 3.3.2 One-time Construction API
74 #ifdef __arm__
75 extern int  __cxa_guard_acquire(uint32_t*);
76 extern void __cxa_guard_release(uint32_t*);
77 extern void __cxa_guard_abort(uint32_t*);
78 #else
79 extern int  __cxa_guard_acquire(uint64_t*);
80 extern void __cxa_guard_release(uint64_t*);
81 extern void __cxa_guard_abort(uint64_t*);
82 #endif
83 
84 // 3.3.3 Array Construction and Destruction API
85 extern void* __cxa_vec_new(size_t element_count,
86                            size_t element_size,
87                            size_t padding_size,
88                            void (*constructor)(void*),
89                            void (*destructor)(void*));
90 
91 extern void* __cxa_vec_new2(size_t element_count,
92                             size_t element_size,
93                             size_t padding_size,
94                             void  (*constructor)(void*),
95                             void  (*destructor)(void*),
96                             void* (*alloc)(size_t),
97                             void  (*dealloc)(void*));
98 
99 extern void* __cxa_vec_new3(size_t element_count,
100                             size_t element_size,
101                             size_t padding_size,
102                             void  (*constructor)(void*),
103                             void  (*destructor)(void*),
104                             void* (*alloc)(size_t),
105                             void  (*dealloc)(void*, size_t));
106 
107 extern void __cxa_vec_ctor(void*  array_address,
108                            size_t element_count,
109                            size_t element_size,
110                            void (*constructor)(void*),
111                            void (*destructor)(void*));
112 
113 extern void __cxa_vec_dtor(void*  array_address,
114                            size_t element_count,
115                            size_t element_size,
116                            void (*destructor)(void*));
117 
118 extern void __cxa_vec_cleanup(void* array_address,
119                              size_t element_count,
120                              size_t element_size,
121                              void  (*destructor)(void*));
122 
123 extern void __cxa_vec_delete(void*  array_address,
124                              size_t element_size,
125                              size_t padding_size,
126                              void  (*destructor)(void*));
127 
128 extern void __cxa_vec_delete2(void* array_address,
129                              size_t element_size,
130                              size_t padding_size,
131                              void  (*destructor)(void*),
132                              void  (*dealloc)(void*));
133 
134 extern void __cxa_vec_delete3(void* __array_address,
135                              size_t element_size,
136                              size_t padding_size,
137                              void  (*destructor)(void*),
138                              void  (*dealloc)(void*, size_t));
139 
140 extern void __cxa_vec_cctor(void*  dest_array,
141                             void*  src_array,
142                             size_t element_count,
143                             size_t element_size,
144                             void  (*constructor)(void*, void*),
145                             void  (*destructor)(void*));
146 
147 // 3.3.5.3 Runtime API
148 extern int __cxa_atexit(void (*f)(void*), void* p, void* d);
149 extern int __cxa_finalize(void*);
150 
151 // 3.4 Demangler API
152 extern char* __cxa_demangle(const char* mangled_name,
153                             char*       output_buffer,
154                             size_t*     length,
155                             int*        status);
156 
157 // Apple additions to support C++ 0x exception_ptr class
158 // These are primitives to wrap a smart pointer around an exception object
159 extern void * __cxa_current_primary_exception() throw();
160 extern void __cxa_rethrow_primary_exception(void* primary_exception);
161 extern void __cxa_increment_exception_refcount(void* primary_exception) throw();
162 extern void __cxa_decrement_exception_refcount(void* primary_exception) throw();
163 
164 // Apple addition to support std::uncaught_exception()
165 extern bool __cxa_uncaught_exception() throw();
166 
167 #ifdef __linux__
168 // Linux TLS support. Not yet an official part of the Itanium ABI.
169 // https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables
170 extern int __cxa_thread_atexit(void (*)(void *), void *, void *) throw();
171 #endif
172 
173   } // extern "C"
174 } // namespace __cxxabiv1
175 
176 namespace abi = __cxxabiv1;
177 
178 #endif // __cplusplus
179 
180 #endif // __CXXABI_H
181