blob: ae75f86483cf74ded1fb8ee9545b1f25b8526cbc [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
Dan Albert3cbecdf2015-02-04 21:23:20 +000011#define __CXXABI_H
Howard Hinnantd213ffd2011-05-05 15:27:28 +000012
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
Nico Weber55d99b72014-06-25 22:49:13 +000024// FIXME: This is also in unwind.h and libunwind.h, can we consolidate?
25#if !defined(__USING_SJLJ_EXCEPTIONS__) && defined(__arm__) && \
26 !defined(__ARM_DWARF_EH__) && !defined(__APPLE__)
27#define LIBCXXABI_ARM_EHABI 1
28#else
29#define LIBCXXABI_ARM_EHABI 0
30#endif
31
Nick Kledzik15a69282011-08-02 05:15:26 +000032#ifdef __cplusplus
33
Howard Hinnantd213ffd2011-05-05 15:27:28 +000034namespace std {
Dan Albert3cbecdf2015-02-04 21:23:20 +000035class type_info; // forward declaration
Howard Hinnantd213ffd2011-05-05 15:27:28 +000036}
37
38
39// runtime routines use C calling conventions, but are in __cxxabiv1 namespace
Dan Albert3cbecdf2015-02-04 21:23:20 +000040namespace __cxxabiv1 {
41extern "C" {
Howard Hinnantd213ffd2011-05-05 15:27:28 +000042
43// 2.4.2 Allocating the Exception Object
Howard Hinnantca00a4e2012-01-30 16:02:11 +000044extern void * __cxa_allocate_exception(size_t thrown_size) throw();
45extern void __cxa_free_exception(void * thrown_exception) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000046
47// 2.4.3 Throwing the Exception Object
Dan Albert3cbecdf2015-02-04 21:23:20 +000048extern LIBCXXABI_NORETURN void __cxa_throw(void * thrown_exception,
Marshall Clow703d1482011-07-20 14:27:46 +000049 std::type_info * tinfo, void (*dest)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +000050
51// 2.5.3 Exception Handlers
Howard Hinnantca00a4e2012-01-30 16:02:11 +000052extern void * __cxa_get_exception_ptr(void * exceptionObject) throw();
53extern void * __cxa_begin_catch(void * exceptionObject) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000054extern void __cxa_end_catch();
Nico Weber55d99b72014-06-25 22:49:13 +000055#if LIBCXXABI_ARM_EHABI
Logan Chien05d51bc2014-05-10 00:42:10 +000056extern bool __cxa_begin_cleanup(void * exceptionObject) throw();
57extern void __cxa_end_cleanup();
58#endif
Howard Hinnantd213ffd2011-05-05 15:27:28 +000059extern std::type_info * __cxa_current_exception_type();
60
61// 2.5.4 Rethrowing Exceptions
Marshall Clow703d1482011-07-20 14:27:46 +000062extern LIBCXXABI_NORETURN void __cxa_rethrow();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000063
64
65
66// 2.6 Auxiliary Runtime APIs
Marshall Clow4c2acbc2011-06-03 02:04:41 +000067extern LIBCXXABI_NORETURN void __cxa_bad_cast(void);
68extern LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
Aaron Ballman68fcfa12014-09-11 17:26:43 +000069extern LIBCXXABI_NORETURN void __cxa_throw_bad_array_new_length(void);
Howard Hinnantd213ffd2011-05-05 15:27:28 +000070
71
72
73// 3.2.6 Pure Virtual Function API
Marshall Clow4c2acbc2011-06-03 02:04:41 +000074extern LIBCXXABI_NORETURN void __cxa_pure_virtual(void);
Howard Hinnantd213ffd2011-05-05 15:27:28 +000075
Howard Hinnant92827182011-05-24 22:01:16 +000076// 3.2.7 Deleted Virtual Function API
Marshall Clow4c2acbc2011-06-03 02:04:41 +000077extern LIBCXXABI_NORETURN void __cxa_deleted_virtual(void);
Howard Hinnant92827182011-05-24 22:01:16 +000078
Howard Hinnantd213ffd2011-05-05 15:27:28 +000079// 3.3.2 One-time Construction API
Dan Alberta1fce462015-02-05 01:33:15 +000080#ifdef __arm__
Nick Lewyckyd8cfd652011-06-07 18:46:10 +000081extern int __cxa_guard_acquire(uint32_t*);
82extern void __cxa_guard_release(uint32_t*);
83extern void __cxa_guard_abort(uint32_t*);
84#else
Howard Hinnantd213ffd2011-05-05 15:27:28 +000085extern int __cxa_guard_acquire(uint64_t*);
86extern void __cxa_guard_release(uint64_t*);
87extern void __cxa_guard_abort(uint64_t*);
Nick Lewyckyd8cfd652011-06-07 18:46:10 +000088#endif
Howard Hinnantd213ffd2011-05-05 15:27:28 +000089
90// 3.3.3 Array Construction and Destruction API
Dan Albert3cbecdf2015-02-04 21:23:20 +000091extern void* __cxa_vec_new(size_t element_count,
92 size_t element_size,
93 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +000094 void (*constructor)(void*),
Dan Albert3cbecdf2015-02-04 21:23:20 +000095 void (*destructor)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +000096
97extern void* __cxa_vec_new2(size_t element_count,
Dan Albert3cbecdf2015-02-04 21:23:20 +000098 size_t element_size,
Howard Hinnantd213ffd2011-05-05 15:27:28 +000099 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000100 void (*constructor)(void*),
101 void (*destructor)(void*),
Dan Albert3cbecdf2015-02-04 21:23:20 +0000102 void* (*alloc)(size_t),
103 void (*dealloc)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000104
105extern void* __cxa_vec_new3(size_t element_count,
Dan Albert3cbecdf2015-02-04 21:23:20 +0000106 size_t element_size,
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000107 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000108 void (*constructor)(void*),
109 void (*destructor)(void*),
Dan Albert3cbecdf2015-02-04 21:23:20 +0000110 void* (*alloc)(size_t),
111 void (*dealloc)(void*, size_t));
112
113extern void __cxa_vec_ctor(void* array_address,
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000114 size_t element_count,
Dan Albert3cbecdf2015-02-04 21:23:20 +0000115 size_t element_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000116 void (*constructor)(void*),
Dan Albert3cbecdf2015-02-04 21:23:20 +0000117 void (*destructor)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000118
Dan Albert3cbecdf2015-02-04 21:23:20 +0000119extern void __cxa_vec_dtor(void* array_address,
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000120 size_t element_count,
Dan Albert3cbecdf2015-02-04 21:23:20 +0000121 size_t element_size,
122 void (*destructor)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000123
Dan Albert3cbecdf2015-02-04 21:23:20 +0000124extern void __cxa_vec_cleanup(void* array_address,
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000125 size_t element_count,
Dan Albert3cbecdf2015-02-04 21:23:20 +0000126 size_t element_size,
127 void (*destructor)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000128
Dan Albert3cbecdf2015-02-04 21:23:20 +0000129extern void __cxa_vec_delete(void* array_address,
130 size_t element_size,
131 size_t padding_size,
132 void (*destructor)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000133
Dan Albert3cbecdf2015-02-04 21:23:20 +0000134extern void __cxa_vec_delete2(void* array_address,
135 size_t element_size,
136 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000137 void (*destructor)(void*),
Dan Albert3cbecdf2015-02-04 21:23:20 +0000138 void (*dealloc)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000139
Dan Albert3cbecdf2015-02-04 21:23:20 +0000140extern void __cxa_vec_delete3(void* __array_address,
141 size_t element_size,
142 size_t padding_size,
Howard Hinnant25f18072011-06-07 19:56:49 +0000143 void (*destructor)(void*),
Dan Albert3cbecdf2015-02-04 21:23:20 +0000144 void (*dealloc)(void*, size_t));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000145
Dan Albert3cbecdf2015-02-04 21:23:20 +0000146extern void __cxa_vec_cctor(void* dest_array,
147 void* src_array,
148 size_t element_count,
149 size_t element_size,
150 void (*constructor)(void*, void*),
151 void (*destructor)(void*));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000152
153// 3.3.5.3 Runtime API
154extern int __cxa_atexit(void (*f)(void*), void* p, void* d);
155extern int __cxa_finalize(void*);
156
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000157// 3.4 Demangler API
Dan Albert3cbecdf2015-02-04 21:23:20 +0000158extern char* __cxa_demangle(const char* mangled_name,
Howard Hinnant25f18072011-06-07 19:56:49 +0000159 char* output_buffer,
Dan Albert3cbecdf2015-02-04 21:23:20 +0000160 size_t* length,
Howard Hinnant25f18072011-06-07 19:56:49 +0000161 int* status);
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000162
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000163// Apple additions to support C++ 0x exception_ptr class
164// These are primitives to wrap a smart pointer around an exception object
Howard Hinnantca00a4e2012-01-30 16:02:11 +0000165extern void * __cxa_current_primary_exception() throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000166extern void __cxa_rethrow_primary_exception(void* primary_exception);
Howard Hinnantca00a4e2012-01-30 16:02:11 +0000167extern void __cxa_increment_exception_refcount(void* primary_exception) throw();
168extern void __cxa_decrement_exception_refcount(void* primary_exception) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000169
170// Apple addition to support std::uncaught_exception()
Howard Hinnantca00a4e2012-01-30 16:02:11 +0000171extern bool __cxa_uncaught_exception() throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000172
Dan Albertefa37d12014-12-18 00:03:57 +0000173#ifdef __linux__
174// Linux TLS support. Not yet an official part of the Itanium ABI.
175// https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables
176extern int __cxa_thread_atexit(void (*)(void *), void *, void *) throw();
177#endif
178
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000179 } // extern "C"
180} // namespace __cxxabiv1
181
Howard Hinnant3759e452012-02-17 18:45:44 +0000182namespace abi = __cxxabiv1;
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000183
Nico Weber55d99b72014-06-25 22:49:13 +0000184#endif // __cplusplus
185
Dan Albert3cbecdf2015-02-04 21:23:20 +0000186#endif // __CXXABI_H