summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2011-05-05 15:27:28 +0000
committerHoward Hinnant <hhinnant@apple.com>2011-05-05 15:27:28 +0000
commitd213ffdf3befead3b8f5a0ba12ce1c2d9949525b (patch)
tree73cd07434c5081e3deb91dd54ac9e46e9c9e39ed /include
initial import
git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@130921 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/cxa_demangle.h160
-rw-r--r--include/cxxabi.h177
2 files changed, 337 insertions, 0 deletions
diff --git a/include/cxa_demangle.h b/include/cxa_demangle.h
new file mode 100644
index 0000000..863e0bc
--- /dev/null
+++ b/include/cxa_demangle.h
@@ -0,0 +1,160 @@
+//===-------------------------- cxa_demangle.h ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _CXA_DEMANGLE_H
+#define _CXA_DEMANGLE_H
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+
+namespace __libcxxabi
+{
+
+struct __demangle_tree;
+class __node;
+
+char*
+__demangle(__demangle_tree, char*, size_t*, int*);
+
+struct __demangle_tree_rv
+{
+ __demangle_tree* ptr_;
+
+ explicit __demangle_tree_rv(__demangle_tree* ptr)
+ : ptr_(ptr) {}
+};
+
+class __demangle_tree
+{
+ const char* __mangled_name_begin_;
+ const char* __mangled_name_end_;
+ int __status_;
+ __node* __root_;
+ __node* __node_begin_;
+ __node* __node_end_;
+ __node* __node_cap_;
+ __node** __sub_begin_;
+ __node** __sub_end_;
+ __node** __sub_cap_;
+ __node** __t_begin_;
+ __node** __t_end_;
+ __node** __t_cap_;
+ bool __tag_templates_;
+ bool __fix_forward_references_;
+ bool __owns_buf_;
+
+ __demangle_tree& operator=(const __demangle_tree&);
+public:
+ __demangle_tree(const char*, char*, size_t);
+ ~__demangle_tree();
+
+ __demangle_tree(__demangle_tree&);
+ __demangle_tree(__demangle_tree_rv);
+ operator __demangle_tree_rv() {return __demangle_tree_rv(this);}
+
+ int __status() const;
+ size_t size() const;
+ char* __get_demangled_name(char*) const;
+
+ void __parse();
+
+private:
+ const char* __parse_encoding(const char*, const char*);
+ const char* __parse_type(const char*, const char*,
+ bool = true, bool = false);
+ const char* __parse_special_name(const char*, const char*);
+ const char* __parse_name(const char*, const char*);
+ const char* __parse_bare_function_type(const char*, const char*);
+ const char* __parse_call_offset(const char*, const char*);
+ const char* __parse_number(const char*, const char*);
+ const char* __parse_cv_qualifiers(const char* first, const char* last,
+ unsigned& cv, bool = false);
+ const char* __parse_nested_name(const char*, const char*);
+ const char* __parse_discriminator(const char*, const char*);
+ const char* __parse_local_name(const char*, const char*);
+ const char* __parse_unscoped_template_name(const char*, const char*);
+ const char* __parse_unscoped_name(const char*, const char*);
+ const char* __parse_operator_name(const char*, const char*, int* = 0);
+ const char* __parse_unqualified_name(const char*, const char*);
+ const char* __parse_source_name(const char*, const char*);
+ const char* __parse_ctor_dtor_name(const char*, const char*);
+ const char* __parse_unnamed_type_name(const char*, const char*);
+ const char* __parse_template_args(const char*, const char*);
+ const char* __parse_template_arg(const char*, const char*);
+ const char* __parse_expression(const char*, const char*);
+ const char* __parse_expr_primary(const char*, const char*);
+ const char* __parse_substitution(const char*, const char*);
+ const char* __parse_builtin_type(const char*, const char*);
+ const char* __parse_function_type(const char*, const char*);
+ const char* __parse_class_enum_type(const char*, const char*);
+ const char* __parse_array_type(const char*, const char*);
+ const char* __parse_pointer_to_member_type(const char*, const char*);
+ const char* __parse_decltype(const char*, const char*);
+ const char* __parse_template_param(const char*, const char*);
+ const char* __parse_unresolved_name(const char*, const char*);
+ const char* __parse_unresolved_type(const char*, const char*);
+ const char* __parse_base_unresolved_name(const char*, const char*);
+ const char* __parse_simple_id(const char*, const char*);
+ const char* __parse_destructor_name(const char*, const char*);
+ const char* __parse_function_param(const char*, const char*);
+ const char* __parse_const_cast_expr(const char*, const char*);
+ const char* __parse_alignof_expr(const char*, const char*);
+ const char* __parse_call_expr(const char*, const char*);
+ const char* __parse_conversion_expr(const char*, const char*);
+ const char* __parse_delete_array_expr(const char*, const char*);
+ const char* __parse_delete_expr(const char*, const char*);
+ const char* __parse_dynamic_cast_expr(const char*, const char*);
+ const char* __parse_dot_star_expr(const char*, const char*);
+ const char* __parse_dot_expr(const char*, const char*);
+ const char* __parse_decrement_expr(const char*, const char*);
+ const char* __parse_new_expr(const char*, const char*);
+ const char* __parse_increment_expr(const char*, const char*);
+ const char* __parse_arrow_expr(const char*, const char*);
+ const char* __parse_reinterpret_cast_expr(const char*, const char*);
+ const char* __parse_static_cast_expr(const char*, const char*);
+ const char* __parse_sizeof_type_expr(const char*, const char*);
+ const char* __parse_sizeof_param_pack_expr(const char*, const char*);
+ const char* __parse_typeid_expr(const char*, const char*);
+ const char* __parse_throw_expr(const char*, const char*);
+ const char* __parse_pack_expansion(const char*, const char*);
+ const char* __parse_sizeof_function_param_pack_expr(const char*, const char*);
+ const char* __parse_dot_suffix(const char*, const char*);
+ const char* __parse_hex_number(const char*, const char*, unsigned long long&);
+
+ template <class _Tp> bool __make();
+ template <class _Tp, class _A0> bool __make(_A0 __a0);
+ template <class _Tp, class _A0, class _A1> bool __make(_A0 __a0, _A1 __a1);
+ template <class _Tp, class _A0, class _A1, class _A2>
+ bool __make(_A0 __a0, _A1 __a1, _A2 __a2);
+ template <class _Tp, class _A0, class _A1, class _A2, class _A3>
+ bool __make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3);
+ template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4>
+ bool __make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4);
+ template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4,
+ class _A5>
+ bool __make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4, _A5 __a5);
+
+ friend
+ char*
+ __demangle(__demangle_tree, char*, size_t*, int*);
+
+};
+
+__demangle_tree
+__demangle(const char*);
+
+__demangle_tree
+__demangle(const char*, char*, size_t);
+
+} // __libcxxabi
+} // __cxxabiv1
+
+#endif // _CXA_DEMANGLE_H
diff --git a/include/cxxabi.h b/include/cxxabi.h
new file mode 100644
index 0000000..d163dd4
--- /dev/null
+++ b/include/cxxabi.h
@@ -0,0 +1,177 @@
+//===--------------------------- cxxabi.h ---------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __CXXABI_H
+#define __CXXABI_H
+
+/*
+ * This header provides the interface to the C++ ABI as defined at:
+ * http://www.codesourcery.com/cxx-abi/
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+
+namespace std {
+ class type_info; // forward declaration
+}
+
+
+// runtime routines use C calling conventions, but are in __cxxabiv1 namespace
+namespace __cxxabiv1 {
+ extern "C" {
+
+// 2.4.2 Allocating the Exception Object
+extern void * __cxa_allocate_exception(size_t thrown_size) throw();
+extern void __cxa_free_exception(void * thrown_exception) throw();
+
+// 2.4.3 Throwing the Exception Object
+extern void __cxa_throw(void * thrown_exception, struct std::type_info * tinfo,
+ void (*dest)(void *));
+
+// 2.5.3 Exception Handlers
+extern void * __cxa_get_exception_ptr(void * exceptionObject) throw();
+extern void * __cxa_begin_catch(void * exceptionObject) throw();
+extern void __cxa_end_catch();
+extern std::type_info * __cxa_current_exception_type();
+
+// 2.5.4 Rethrowing Exceptions
+extern void __cxa_rethrow();
+
+
+
+// 2.6 Auxiliary Runtime APIs
+extern void __cxa_bad_cast();
+extern void __cxa_bad_typeid();
+
+
+
+// 3.2.6 Pure Virtual Function API
+extern void __cxa_pure_virtual(void);
+
+// 3.3.2 One-time Construction API
+extern int __cxa_guard_acquire(uint64_t*);
+extern void __cxa_guard_release(uint64_t*);
+extern void __cxa_guard_abort(uint64_t*);
+
+// 3.3.3 Array Construction and Destruction API
+extern void* __cxa_vec_new(size_t element_count,
+ size_t element_size,
+ size_t padding_size,
+ void (*constructor)(void*),
+ void (*destructor)(void*) );
+
+extern void* __cxa_vec_new2(size_t element_count,
+ size_t element_size,
+ size_t padding_size,
+ void (*constructor)(void*),
+ void (*destructor)(void*),
+ void* (*alloc)(size_t),
+ void (*dealloc)(void*) );
+
+extern void* __cxa_vec_new3(size_t element_count,
+ size_t element_size,
+ size_t padding_size,
+ void (*constructor)(void*),
+ void (*destructor)(void*),
+ void* (*alloc)(size_t),
+ void (*dealloc)(void*, size_t) );
+
+extern void __cxa_vec_ctor(void* array_address,
+ size_t element_count,
+ size_t element_size,
+ void (*constructor)(void*),
+ void (*destructor)(void*) );
+
+
+extern void __cxa_vec_dtor(void* array_address,
+ size_t element_count,
+ size_t element_size,
+ void (*destructor)(void*) );
+
+
+extern void __cxa_vec_cleanup(void* array_address,
+ size_t element_count,
+ size_t element_size,
+ void (*destructor)(void*) );
+
+
+extern void __cxa_vec_delete(void* array_address,
+ size_t element_size,
+ size_t padding_size,
+ void (*destructor)(void*) );
+
+
+extern void __cxa_vec_delete2(void* array_address,
+ size_t element_size,
+ size_t padding_size,
+ void (*destructor)(void*),
+ void (*dealloc)(void*) );
+
+
+extern void __cxa_vec_delete3(void* __array_address,
+ size_t element_size,
+ size_t padding_size,
+ void (*destructor)(void*),
+ void (*dealloc) (void*, size_t));
+
+
+extern void __cxa_vec_cctor(void* dest_array,
+ void* src_array,
+ size_t element_count,
+ size_t element_size,
+ void (*constructor) (void*, void*),
+ void (*destructor)(void*) );
+
+
+// 3.3.5.3 Runtime API
+extern int __cxa_atexit(void (*f)(void*), void* p, void* d);
+extern int __cxa_finalize(void*);
+
+
+// 3.4 Demangler API
+extern char* __cxa_demangle(const char* mangled_name,
+ char* output_buffer,
+ size_t* length,
+ int* status);
+
+ } // extern "C"
+} // namespace __cxxabiv1
+namespace abi = __cxxabiv1;
+
+
+
+
+
+// Below are Apple extensions to support implementing C++ ABI in a seperate dylib
+namespace __cxxabiapple {
+ extern "C" {
+
+// Apple additions to support multiple STL stacks that share common
+// terminate, unexpected, and new handlers
+extern void (*__cxa_terminate_handler)();
+extern void (*__cxa_unexpected_handler)();
+extern void (*__cxa_new_handler)();
+
+// Apple additions to support C++ 0x exception_ptr class
+// These are primitives to wrap a smart pointer around an exception object
+extern void * __cxa_current_primary_exception() throw();
+extern void __cxa_rethrow_primary_exception(void* primary_exception);
+extern void __cxa_increment_exception_refcount(void* primary_exception) throw();
+extern void __cxa_decrement_exception_refcount(void* primary_exception) throw();
+
+// Apple addition to support std::uncaught_exception()
+extern bool __cxa_uncaught_exception() throw();
+
+ } // extern "C"
+} // namespace __cxxabiv1
+
+
+
+#endif // __CXXABI_H