Home | History | Annotate | Download | only in v1
      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 1002
     24 #define _LIBCXXABI_NORETURN  __attribute__((noreturn))
     25 
     26 #ifdef __cplusplus
     27 
     28 namespace std {
     29 #if defined(_WIN32)
     30 class _LIBCXXABI_TYPE_VIS type_info; // forward declaration
     31 #else
     32 class type_info; // forward declaration
     33 #endif
     34 }
     35 
     36 
     37 // runtime routines use C calling conventions, but are in __cxxabiv1 namespace
     38 namespace __cxxabiv1 {
     39 extern "C"  {
     40 
     41 // 2.4.2 Allocating the Exception Object
     42 extern _LIBCXXABI_FUNC_VIS void *
     43 __cxa_allocate_exception(size_t thrown_size) throw();
     44 extern _LIBCXXABI_FUNC_VIS void
     45 __cxa_free_exception(void *thrown_exception) throw();
     46 
     47 // 2.4.3 Throwing the Exception Object
     48 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void
     49 __cxa_throw(void *thrown_exception, std::type_info *tinfo,
     50             void (*dest)(void *));
     51 
     52 // 2.5.3 Exception Handlers
     53 extern _LIBCXXABI_FUNC_VIS void *
     54 __cxa_get_exception_ptr(void *exceptionObject) throw();
     55 extern _LIBCXXABI_FUNC_VIS void *
     56 __cxa_begin_catch(void *exceptionObject) throw();
     57 extern _LIBCXXABI_FUNC_VIS void __cxa_end_catch();
     58 #if defined(_LIBCXXABI_ARM_EHABI)
     59 extern _LIBCXXABI_FUNC_VIS bool
     60 __cxa_begin_cleanup(void *exceptionObject) throw();
     61 extern _LIBCXXABI_FUNC_VIS void __cxa_end_cleanup();
     62 #endif
     63 extern _LIBCXXABI_FUNC_VIS std::type_info *__cxa_current_exception_type();
     64 
     65 // 2.5.4 Rethrowing Exceptions
     66 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_rethrow();
     67 
     68 // 2.6 Auxiliary Runtime APIs
     69 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_cast(void);
     70 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_bad_typeid(void);
     71 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void
     72 __cxa_throw_bad_array_new_length(void);
     73 
     74 // 3.2.6 Pure Virtual Function API
     75 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_pure_virtual(void);
     76 
     77 // 3.2.7 Deleted Virtual Function API
     78 extern _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_deleted_virtual(void);
     79 
     80 // 3.3.2 One-time Construction API
     81 #ifdef __arm__
     82 extern _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(uint32_t *);
     83 extern _LIBCXXABI_FUNC_VIS void __cxa_guard_release(uint32_t *);
     84 extern _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(uint32_t *);
     85 #else
     86 extern _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(uint64_t *);
     87 extern _LIBCXXABI_FUNC_VIS void __cxa_guard_release(uint64_t *);
     88 extern _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(uint64_t *);
     89 #endif
     90 
     91 // 3.3.3 Array Construction and Destruction API
     92 extern _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 *));
     95 
     96 extern _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 *));
    100 
    101 extern _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));
    105 
    106 extern _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 *));
    109 
    110 extern _LIBCXXABI_FUNC_VIS void __cxa_vec_dtor(void *array_address,
    111                                                size_t element_count,
    112                                                size_t element_size,
    113                                                void (*destructor)(void *));
    114 
    115 extern _LIBCXXABI_FUNC_VIS void __cxa_vec_cleanup(void *array_address,
    116                                                   size_t element_count,
    117                                                   size_t element_size,
    118                                                   void (*destructor)(void *));
    119 
    120 extern _LIBCXXABI_FUNC_VIS void __cxa_vec_delete(void *array_address,
    121                                                  size_t element_size,
    122                                                  size_t padding_size,
    123                                                  void (*destructor)(void *));
    124 
    125 extern _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 *));
    128 
    129 extern _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));
    133 
    134 extern _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 *));
    138 
    139 // 3.3.5.3 Runtime API
    140 extern _LIBCXXABI_FUNC_VIS int __cxa_atexit(void (*f)(void *), void *p,
    141                                             void *d);
    142 extern _LIBCXXABI_FUNC_VIS int __cxa_finalize(void *);
    143 
    144 // 3.4 Demangler API
    145 extern _LIBCXXABI_FUNC_VIS char *__cxa_demangle(const char *mangled_name,
    146                                                 char *output_buffer,
    147                                                 size_t *length, int *status);
    148 
    149 // Apple additions to support C++ 0x exception_ptr class
    150 // These are primitives to wrap a smart pointer around an exception object
    151 extern _LIBCXXABI_FUNC_VIS void *__cxa_current_primary_exception() throw();
    152 extern _LIBCXXABI_FUNC_VIS void
    153 __cxa_rethrow_primary_exception(void *primary_exception);
    154 extern _LIBCXXABI_FUNC_VIS void
    155 __cxa_increment_exception_refcount(void *primary_exception) throw();
    156 extern _LIBCXXABI_FUNC_VIS void
    157 __cxa_decrement_exception_refcount(void *primary_exception) throw();
    158 
    159 // Apple extension to support std::uncaught_exception()
    160 extern _LIBCXXABI_FUNC_VIS bool __cxa_uncaught_exception() throw();
    161 extern _LIBCXXABI_FUNC_VIS unsigned int __cxa_uncaught_exceptions() throw();
    162 
    163 #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
    166 extern _LIBCXXABI_FUNC_VIS int __cxa_thread_atexit(void (*)(void *), void *,
    167                                                    void *) throw();
    168 #endif
    169 
    170 } // extern "C"
    171 } // namespace __cxxabiv1
    172 
    173 namespace abi = __cxxabiv1;
    174 
    175 #endif // __cplusplus
    176 
    177 #endif // __CXXABI_H
    178