blob: 2596560d6e9215abb9594131d088e0de10820cd0 [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
Dan Albert8414c5a2015-02-05 23:55:15 +000021#include <__cxxabi_config.h>
22
Marshall Clow5013d7c2015-06-02 13:03:17 +000023#define _LIBCPPABI_VERSION 1002
Eric Fiselier9e2169e2017-03-01 02:23:54 +000024#define _LIBCXXABI_NORETURN __attribute__((noreturn))
Marshall Clow4c2acbc2011-06-03 02:04:41 +000025
Nick Kledzik15a69282011-08-02 05:15:26 +000026#ifdef __cplusplus
27
Howard Hinnantd213ffd2011-05-05 15:27:28 +000028namespace std {
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000029#if defined(_WIN32)
30class _LIBCXXABI_TYPE_VIS type_info; // forward declaration
31#else
Dan Albert3cbecdf2015-02-04 21:23:20 +000032class type_info; // forward declaration
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000033#endif
Howard Hinnantd213ffd2011-05-05 15:27:28 +000034}
35
36
37// runtime routines use C calling conventions, but are in __cxxabiv1 namespace
Dan Albert3cbecdf2015-02-04 21:23:20 +000038namespace __cxxabiv1 {
39extern "C" {
Howard Hinnantd213ffd2011-05-05 15:27:28 +000040
41// 2.4.2 Allocating the Exception Object
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000042extern _LIBCXXABI_FUNC_VIS void *
43__cxa_allocate_exception(size_t thrown_size) throw();
44extern _LIBCXXABI_FUNC_VIS void
45__cxa_free_exception(void *thrown_exception) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000046
47// 2.4.3 Throwing the Exception Object
Eric Fiselier9e2169e2017-03-01 02:23:54 +000048extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000049__cxa_throw(void *thrown_exception, std::type_info *tinfo,
50 void (*dest)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +000051
52// 2.5.3 Exception Handlers
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000053extern _LIBCXXABI_FUNC_VIS void *
54__cxa_get_exception_ptr(void *exceptionObject) throw();
55extern _LIBCXXABI_FUNC_VIS void *
56__cxa_begin_catch(void *exceptionObject) throw();
57extern _LIBCXXABI_FUNC_VIS void __cxa_end_catch();
Ranjeet Singh2ecb4ee2017-03-01 11:42:01 +000058#if defined(_LIBCXXABI_ARM_EHABI)
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000059extern _LIBCXXABI_FUNC_VIS bool
60__cxa_begin_cleanup(void *exceptionObject) throw();
61extern _LIBCXXABI_FUNC_VIS void __cxa_end_cleanup();
Logan Chien05d51bc2014-05-10 00:42:10 +000062#endif
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000063extern _LIBCXXABI_FUNC_VIS std::type_info *__cxa_current_exception_type();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000064
65// 2.5.4 Rethrowing Exceptions
Eric Fiselier9e2169e2017-03-01 02:23:54 +000066extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_rethrow();
Howard Hinnantd213ffd2011-05-05 15:27:28 +000067
Howard Hinnantd213ffd2011-05-05 15:27:28 +000068// 2.6 Auxiliary Runtime APIs
Eric Fiselier9e2169e2017-03-01 02:23:54 +000069extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_cast(void);
70extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
71extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000072__cxa_throw_bad_array_new_length(void);
Howard Hinnantd213ffd2011-05-05 15:27:28 +000073
Howard Hinnantd213ffd2011-05-05 15:27:28 +000074// 3.2.6 Pure Virtual Function API
Eric Fiselier9e2169e2017-03-01 02:23:54 +000075extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_pure_virtual(void);
Howard Hinnantd213ffd2011-05-05 15:27:28 +000076
Howard Hinnant92827182011-05-24 22:01:16 +000077// 3.2.7 Deleted Virtual Function API
Eric Fiselier9e2169e2017-03-01 02:23:54 +000078extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_deleted_virtual(void);
Howard Hinnant92827182011-05-24 22:01:16 +000079
Howard Hinnantd213ffd2011-05-05 15:27:28 +000080// 3.3.2 One-time Construction API
Dan Alberta1fce462015-02-05 01:33:15 +000081#ifdef __arm__
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000082extern _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(uint32_t *);
83extern _LIBCXXABI_FUNC_VIS void __cxa_guard_release(uint32_t *);
84extern _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(uint32_t *);
Nick Lewyckyd8cfd652011-06-07 18:46:10 +000085#else
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000086extern _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(uint64_t *);
87extern _LIBCXXABI_FUNC_VIS void __cxa_guard_release(uint64_t *);
88extern _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(uint64_t *);
Nick Lewyckyd8cfd652011-06-07 18:46:10 +000089#endif
Howard Hinnantd213ffd2011-05-05 15:27:28 +000090
91// 3.3.3 Array Construction and Destruction API
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000092extern _LIBCXXABI_FUNC_VIS void *
93__cxa_vec_new(size_t element_count, size_t element_size, size_t padding_size,
94 void (*constructor)(void *), void (*destructor)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +000095
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +000096extern _LIBCXXABI_FUNC_VIS void *
97__cxa_vec_new2(size_t element_count, size_t element_size, size_t padding_size,
98 void (*constructor)(void *), void (*destructor)(void *),
99 void *(*alloc)(size_t), void (*dealloc)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000100
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000101extern _LIBCXXABI_FUNC_VIS void *
102__cxa_vec_new3(size_t element_count, size_t element_size, size_t padding_size,
103 void (*constructor)(void *), void (*destructor)(void *),
104 void *(*alloc)(size_t), void (*dealloc)(void *, size_t));
Dan Albert3cbecdf2015-02-04 21:23:20 +0000105
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000106extern _LIBCXXABI_FUNC_VIS void
107__cxa_vec_ctor(void *array_address, size_t element_count, size_t element_size,
108 void (*constructor)(void *), void (*destructor)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000109
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000110extern _LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void *array_address,
111 size_t element_count,
112 size_t element_size,
113 void (*destructor)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000114
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000115extern _LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void *array_address,
116 size_t element_count,
117 size_t element_size,
118 void (*destructor)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000119
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000120extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void *array_address,
121 size_t element_size,
122 size_t padding_size,
123 void (*destructor)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000124
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000125extern _LIBCXXABI_FUNC_VIS void
126__cxa_vec_delete2(void *array_address, size_t element_size, size_t padding_size,
127 void (*destructor)(void *), void (*dealloc)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000128
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000129extern _LIBCXXABI_FUNC_VIS void
130__cxa_vec_delete3(void *__array_address, size_t element_size,
131 size_t padding_size, void (*destructor)(void *),
132 void (*dealloc)(void *, size_t));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000133
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000134extern _LIBCXXABI_FUNC_VIS void
135__cxa_vec_cctor(void *dest_array, void *src_array, size_t element_count,
136 size_t element_size, void (*constructor)(void *, void *),
137 void (*destructor)(void *));
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000138
139// 3.3.5.3 Runtime API
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000140extern _LIBCXXABI_FUNC_VIS int __cxa_atexit(void (*f)(void *), void *p,
141 void *d);
142extern _LIBCXXABI_FUNC_VIS int __cxa_finalize(void *);
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000143
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000144// 3.4 Demangler API
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000145extern _LIBCXXABI_FUNC_VIS char *__cxa_demangle(const char *mangled_name,
146 char *output_buffer,
147 size_t *length, int *status);
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000148
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000149// Apple additions to support C++ 0x exception_ptr class
150// These are primitives to wrap a smart pointer around an exception object
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000151extern _LIBCXXABI_FUNC_VIS void *__cxa_current_primary_exception() throw();
152extern _LIBCXXABI_FUNC_VIS void
153__cxa_rethrow_primary_exception(void *primary_exception);
154extern _LIBCXXABI_FUNC_VIS void
155__cxa_increment_exception_refcount(void *primary_exception) throw();
156extern _LIBCXXABI_FUNC_VIS void
157__cxa_decrement_exception_refcount(void *primary_exception) throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000158
Marshall Clow5013d7c2015-06-02 13:03:17 +0000159// Apple extension to support std::uncaught_exception()
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000160extern _LIBCXXABI_FUNC_VIS bool __cxa_uncaught_exception() throw();
161extern _LIBCXXABI_FUNC_VIS unsigned int __cxa_uncaught_exceptions() throw();
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000162
Dan Albertefa37d12014-12-18 00:03:57 +0000163#ifdef __linux__
164// Linux TLS support. Not yet an official part of the Itanium ABI.
165// https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables
Saleem Abdulrasoolb4ec5792015-12-04 02:14:58 +0000166extern _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(void (*)(void *), void *,
167 void *) throw();
Dan Albertefa37d12014-12-18 00:03:57 +0000168#endif
169
Saleem Abdulrasool77a304b2015-12-04 02:14:41 +0000170} // extern "C"
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000171} // namespace __cxxabiv1
172
Howard Hinnant3759e452012-02-17 18:45:44 +0000173namespace abi = __cxxabiv1;
Howard Hinnantd213ffd2011-05-05 15:27:28 +0000174
Nico Weber55d99b72014-06-25 22:49:13 +0000175#endif // __cplusplus
176
Dan Albert3cbecdf2015-02-04 21:23:20 +0000177#endif // __CXXABI_H