| #ifndef __CXXABI_H_ |
| #define __CXXABI_H_ |
| #include <stdint.h> |
| #include <unwind.h> |
| namespace std |
| { |
| class type_info; |
| } |
| /* |
| * The cxxabi.h header provides a set of public definitions for types and |
| * functions defined by the Itanium C++ ABI specification. For reference, see |
| * the ABI specification here: |
| * |
| * http://sourcery.mentor.com/public/cxx-abi/abi.html |
| * |
| * All deviations from this specification, unless otherwise noted, are |
| * accidental. |
| */ |
| |
| #ifdef __cplusplus |
| namespace __cxxabiv1 { |
| extern "C" { |
| #endif |
| /** |
| * Function type to call when an unexpected exception is encountered. |
| */ |
| typedef void (*unexpected_handler)(); |
| /** |
| * Function type to call when an unrecoverable condition is encountered. |
| */ |
| typedef void (*terminate_handler)(); |
| |
| |
| /** |
| * Structure used as a header on thrown exceptions. This is the same layout as |
| * defined by the Itanium ABI spec, so should be interoperable with any other |
| * implementation of this spec, such as GNU libsupc++. |
| * |
| * This structure is allocated when an exception is thrown. Unwinding happens |
| * in two phases, the first looks for a handler and the second installs the |
| * context. This structure stores a cache of the handler location between |
| * phase 1 and phase 2. Unfortunately, cleanup information is not cached, so |
| * must be looked up in both phases. This happens for two reasons. The first |
| * is that we don't know how many frames containing cleanups there will be, and |
| * we should avoid dynamic allocation during unwinding (the exception may be |
| * reporting that we've run out of memory). The second is that finding |
| * cleanups is much cheaper than finding handlers, because we don't have to |
| * look at the type table at all. |
| * |
| * Note: Several fields of this structure have not-very-informative names. |
| * These are taken from the ABI spec and have not been changed to make it |
| * easier for people referring to to the spec while reading this code. |
| */ |
| struct __cxa_exception |
| { |
| #if __LP64__ |
| /** |
| * Reference count. Used to support the C++11 exception_ptr class. This |
| * is prepended to the structure in 64-bit mode and squeezed in to the |
| * padding left before the 64-bit aligned _Unwind_Exception at the end in |
| * 32-bit mode. |
| * |
| * Note that it is safe to extend this structure at the beginning, rather |
| * than the end, because the public API for creating it returns the address |
| * of the end (where the exception object can be stored). |
| */ |
| uintptr_t referenceCount; |
| #endif |
| /** Type info for the thrown object. */ |
| std::type_info *exceptionType; |
| /** Destructor for the object, if one exists. */ |
| void (*exceptionDestructor) (void *); |
| /** Handler called when an exception specification is violated. */ |
| unexpected_handler unexpectedHandler; |
| /** Hander called to terminate. */ |
| terminate_handler terminateHandler; |
| /** |
| * Next exception in the list. If an exception is thrown inside a catch |
| * block and caught in a nested catch, this points to the exception that |
| * will be handled after the inner catch block completes. |
| */ |
| __cxa_exception *nextException; |
| /** |
| * The number of handlers that currently have references to this |
| * exception. The top (non-sign) bit of this is used as a flag to indicate |
| * that the exception is being rethrown, so should not be deleted when its |
| * handler count reaches 0 (which it doesn't with the top bit set). |
| */ |
| int handlerCount; |
| /** |
| * The selector value to be returned when installing the catch handler. |
| * Used at the call site to determine which catch() block should execute. |
| * This is found in phase 1 of unwinding then installed in phase 2. |
| */ |
| int handlerSwitchValue; |
| /** |
| * The action record for the catch. This is cached during phase 1 |
| * unwinding. |
| */ |
| const char *actionRecord; |
| /** |
| * Pointer to the language-specific data area (LSDA) for the handler |
| * frame. This is unused in this implementation, but set for ABI |
| * compatibility in case we want to mix code in very weird ways. |
| */ |
| const char *languageSpecificData; |
| /** The cached landing pad for the catch handler.*/ |
| void *catchTemp; |
| /** |
| * The pointer that will be returned as the pointer to the object. When |
| * throwing a class and catching a virtual superclass (for example), we |
| * need to adjust the thrown pointer to make it all work correctly. |
| */ |
| void *adjustedPtr; |
| #if !__LP64__ |
| /** |
| * Reference count. Used to support the C++11 exception_ptr class. This |
| * is prepended to the structure in 64-bit mode and squeezed in to the |
| * padding left before the 64-bit aligned _Unwind_Exception at the end in |
| * 32-bit mode. |
| * |
| * Note that it is safe to extend this structure at the beginning, rather |
| * than the end, because the public API for creating it returns the address |
| * of the end (where the exception object can be stored) |
| */ |
| uintptr_t referenceCount; |
| #endif |
| /** The language-agnostic part of the exception header. */ |
| _Unwind_Exception unwindHeader; |
| }; |
| |
| /** |
| * ABI-specified globals structure. Returned by the __cxa_get_globals() |
| * function and its fast variant. This is a per-thread structure - every |
| * thread will have one lazily allocated. |
| * |
| * This structure is defined by the ABI, so may be used outside of this |
| * library. |
| */ |
| struct __cxa_eh_globals |
| { |
| /** |
| * A linked list of exceptions that are currently caught. There may be |
| * several of these in nested catch() blocks. |
| */ |
| __cxa_exception *caughtExceptions; |
| /** |
| * The number of uncaught exceptions. |
| */ |
| unsigned int uncaughtExceptions; |
| }; |
| /** |
| * ABI function returning the __cxa_eh_globals structure. |
| */ |
| __cxa_eh_globals *__cxa_get_globals(void); |
| /** |
| * Version of __cxa_get_globals() assuming that __cxa_get_globals() has already |
| * been called at least once by this thread. |
| */ |
| __cxa_eh_globals *__cxa_get_globals_fast(void); |
| |
| /** |
| * Throws an exception returned by __cxa_current_primary_exception(). This |
| * exception may have been caught in another thread. |
| */ |
| void __cxa_rethrow_primary_exception(void* thrown_exception); |
| /** |
| * Returns the current exception in a form that can be stored in an |
| * exception_ptr object and then rethrown by a call to |
| * __cxa_rethrow_primary_exception(). |
| */ |
| void *__cxa_current_primary_exception(void); |
| /** |
| * Increments the reference count of an exception. Called when an |
| * exception_ptr is copied. |
| */ |
| void __cxa_increment_exception_refcount(void* thrown_exception); |
| /** |
| * Decrements the reference count of an exception. Called when an |
| * exception_ptr is deleted. |
| */ |
| void __cxa_decrement_exception_refcount(void* thrown_exception); |
| /** |
| * Demangles a C++ symbol or type name. The buffer, if non-NULL, must be |
| * allocated with malloc() and must be *n bytes or more long. This function |
| * may call realloc() on the value pointed to by buf, and will return the |
| * length of the string via *n. |
| * |
| * The value pointed to by status is set to one of the following: |
| * |
| * 0: success |
| * -1: memory allocation failure |
| * -2: invalid mangled name |
| * -3: invalid arguments |
| */ |
| char* __cxa_demangle(const char* mangled_name, |
| char* buf, |
| size_t* n, |
| int* status); |
| #ifdef __cplusplus |
| } // extern "C" |
| } // namespace |
| #endif /* __cplusplus */ |
| #endif /* __CXXABI_H_ */ |