blob: 82a7e74b5538aecbc0d5eb992db469969181978b [file] [log] [blame]
Howard Hinnantd213ffd2011-05-05 15:27:28 +00001//===--------------------------- 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
Howard Hinnant53cf7642012-02-02 20:47:05 +000021#define _LIBCPPABI_VERSION 1001
Nick Kledzikf72cdd52011-08-02 05:01:17 +000022#define LIBCXXABI_NORETURN __attribute__((noreturn))
Marshall Clow4c2acbc2011-06-03 02:04:41 +000023
Nick Kledzik15a69282011-08-02 05:15:26 +000024#ifdef __cplusplus
25
Howard Hinnantd213ffd2011-05-05 15:27:28 +000026namespace std {
Howard Hinnant25f18072011-06-07 19:56:49 +000027 class type_info; // forward declaration
Howard Hinnantd213ffd2011-05-05 15:27:28 +000028}
29
30
31// runtime routines use C calling conventions, but are in __cxxabiv1 namespace
32namespace __cxxabiv1 {
33 extern "C" {
34
35// 2.4.2 Allocating the Exception Object
Howard Hinnantca00a4e2012-01-30 16:02:11 +000036extern void * __cxa_allocate_exception(size_t thrown_size) throw();
37extern void __cxa_free_exception(void * thrown_exception) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000038
39// 2.4.3 Throwing the Exception Object
Marshall Clow703d1482011-07-20 14:27:46 +000040extern LIBCXXABI_NORETURN void __cxa_throw(void * thrown_exception,
41 std::type_info * tinfo, void (*dest)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +000042
43// 2.5.3 Exception Handlers
Howard Hinnantca00a4e2012-01-30 16:02:11 +000044extern void * __cxa_get_exception_ptr(void * exceptionObject) throw();
45extern void * __cxa_begin_catch(void * exceptionObject) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000046extern void __cxa_end_catch();
Logan Chien05d51bc2014-05-10 00:42:10 +000047#if __arm__
48extern bool __cxa_begin_cleanup(void * exceptionObject) throw();
49extern void __cxa_end_cleanup();
50#endif
Howard Hinnantd213ffd2011-05-05 15:27:28 +000051extern std::type_info * __cxa_current_exception_type();
52
53// 2.5.4 Rethrowing Exceptions
Marshall Clow703d1482011-07-20 14:27:46 +000054extern LIBCXXABI_NORETURN void __cxa_rethrow();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000055
56
57
58// 2.6 Auxiliary Runtime APIs
Marshall Clow4c2acbc2011-06-03 02:04:41 +000059extern LIBCXXABI_NORETURN void __cxa_bad_cast(void);
60extern LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
Howard Hinnantd213ffd2011-05-05 15:27:28 +000061
62
63
64// 3.2.6 Pure Virtual Function API
Marshall Clow4c2acbc2011-06-03 02:04:41 +000065extern LIBCXXABI_NORETURN void __cxa_pure_virtual(void);
Howard Hinnantd213ffd2011-05-05 15:27:28 +000066
Howard Hinnant92827182011-05-24 22:01:16 +000067// 3.2.7 Deleted Virtual Function API
Marshall Clow4c2acbc2011-06-03 02:04:41 +000068extern LIBCXXABI_NORETURN void __cxa_deleted_virtual(void);
Howard Hinnant92827182011-05-24 22:01:16 +000069
Howard Hinnantd213ffd2011-05-05 15:27:28 +000070// 3.3.2 One-time Construction API
Howard Hinnantfcd21a12012-03-14 19:30:00 +000071#if __arm__
Nick Lewyckyd8cfd652011-06-07 18:46:10 +000072extern int __cxa_guard_acquire(uint32_t*);
73extern void __cxa_guard_release(uint32_t*);
74extern void __cxa_guard_abort(uint32_t*);
75#else
Howard Hinnantd213ffd2011-05-05 15:27:28 +000076extern int __cxa_guard_acquire(uint64_t*);
77extern void __cxa_guard_release(uint64_t*);
78extern void __cxa_guard_abort(uint64_t*);
Nick Lewyckyd8cfd652011-06-07 18:46:10 +000079#endif
Howard Hinnantd213ffd2011-05-05 15:27:28 +000080
81// 3.3.3 Array Construction and Destruction API
82extern void* __cxa_vec_new(size_t element_count,
Howard Hinnant25f18072011-06-07 19:56:49 +000083 size_t element_size,
Howard Hinnantd213ffd2011-05-05 15:27:28 +000084 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +000085 void (*constructor)(void*),
86 void (*destructor)(void*) );
Howard Hinnantd213ffd2011-05-05 15:27:28 +000087
88extern void* __cxa_vec_new2(size_t element_count,
Howard Hinnant25f18072011-06-07 19:56:49 +000089 size_t element_size,
Howard Hinnantd213ffd2011-05-05 15:27:28 +000090 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +000091 void (*constructor)(void*),
92 void (*destructor)(void*),
Howard Hinnantd213ffd2011-05-05 15:27:28 +000093 void* (*alloc)(size_t),
94 void (*dealloc)(void*) );
95
96extern void* __cxa_vec_new3(size_t element_count,
Howard Hinnant25f18072011-06-07 19:56:49 +000097 size_t element_size,
Howard Hinnantd213ffd2011-05-05 15:27:28 +000098 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +000099 void (*constructor)(void*),
100 void (*destructor)(void*),
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000101 void* (*alloc)(size_t),
102 void (*dealloc)(void*, size_t) );
103
104extern void __cxa_vec_ctor(void* array_address,
105 size_t element_count,
106 size_t element_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000107 void (*constructor)(void*),
108 void (*destructor)(void*) );
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000109
110
111extern void __cxa_vec_dtor(void* array_address,
112 size_t element_count,
Howard Hinnant25f18072011-06-07 19:56:49 +0000113 size_t element_size,
114 void (*destructor)(void*) );
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000115
116
117extern void __cxa_vec_cleanup(void* array_address,
118 size_t element_count,
119 size_t element_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000120 void (*destructor)(void*) );
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000121
122
123extern void __cxa_vec_delete(void* array_address,
124 size_t element_size,
125 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000126 void (*destructor)(void*) );
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000127
128
129extern void __cxa_vec_delete2(void* array_address,
130 size_t element_size,
131 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000132 void (*destructor)(void*),
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000133 void (*dealloc)(void*) );
134
135
136extern void __cxa_vec_delete3(void* __array_address,
137 size_t element_size,
138 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000139 void (*destructor)(void*),
140 void (*dealloc) (void*, size_t));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000141
142
143extern void __cxa_vec_cctor(void* dest_array,
Howard Hinnant25f18072011-06-07 19:56:49 +0000144 void* src_array,
145 size_t element_count,
146 size_t element_size,
147 void (*constructor) (void*, void*),
148 void (*destructor)(void*) );
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000149
150
151// 3.3.5.3 Runtime API
152extern int __cxa_atexit(void (*f)(void*), void* p, void* d);
153extern int __cxa_finalize(void*);
154
155
156// 3.4 Demangler API
157extern char* __cxa_demangle(const char* mangled_name,
Howard Hinnant25f18072011-06-07 19:56:49 +0000158 char* output_buffer,
159 size_t* length,
160 int* status);
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000161
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000162// Apple additions to support C++ 0x exception_ptr class
163// These are primitives to wrap a smart pointer around an exception object
Howard Hinnantca00a4e2012-01-30 16:02:11 +0000164extern void * __cxa_current_primary_exception() throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000165extern void __cxa_rethrow_primary_exception(void* primary_exception);
Howard Hinnantca00a4e2012-01-30 16:02:11 +0000166extern void __cxa_increment_exception_refcount(void* primary_exception) throw();
167extern void __cxa_decrement_exception_refcount(void* primary_exception) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000168
169// Apple addition to support std::uncaught_exception()
Howard Hinnantca00a4e2012-01-30 16:02:11 +0000170extern bool __cxa_uncaught_exception() throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000171
172 } // extern "C"
173} // namespace __cxxabiv1
174
Nick Kledzik15a69282011-08-02 05:15:26 +0000175#endif // __cplusplus
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000176
Howard Hinnant3759e452012-02-17 18:45:44 +0000177namespace abi = __cxxabiv1;
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000178
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000179#endif // __CXXABI_H