From 7230e51393cb7dbd64c48fbd3520c560fe87064c Mon Sep 17 00:00:00 2001 From: John Hodge Date: Wed, 21 May 2014 23:23:10 +0800 Subject: [PATCH] Usermode/libc++ - Exceptions mostly --- .../libc++.so_src/exception_handling.cc | 105 ++++++++++-------- .../libc++.so_src/exception_handling.h | 63 +++++++++++ .../Libraries/libc++.so_src/exceptions.cc | 7 ++ .../libc++.so_src/include_exp/allocator | 14 +++ .../libc++.so_src/include_exp/cstdlib | 17 +++ .../libc++.so_src/include_exp/cstring | 17 +++ .../libc++.so_src/include_exp/exception | 16 +++ .../libc++.so_src/include_exp/vector | 73 ++++++++++++ 8 files changed, 266 insertions(+), 46 deletions(-) create mode 100644 Usermode/Libraries/libc++.so_src/exception_handling.h create mode 100644 Usermode/Libraries/libc++.so_src/include_exp/cstdlib create mode 100644 Usermode/Libraries/libc++.so_src/include_exp/cstring diff --git a/Usermode/Libraries/libc++.so_src/exception_handling.cc b/Usermode/Libraries/libc++.so_src/exception_handling.cc index 23039803..44d029ba 100644 --- a/Usermode/Libraries/libc++.so_src/exception_handling.cc +++ b/Usermode/Libraries/libc++.so_src/exception_handling.cc @@ -2,66 +2,79 @@ */ #include #include +#include +#include +#include +#include +#include "exception_handling.h" -typedef void *(unexpected_handler)(void); -typedef void *(terminate_handler)(void); -struct _Unwind_Context; + int uncaught_exception_count; +__cxa_exception *uncaught_exception_top; -typedef enum { - _URC_NO_REASON = 0, - _URC_FOREIGN_EXCEPTION_CAUGHT = 1, - _URC_FATAL_PHASE2_ERROR = 2, - _URC_FATAL_PHASE1_ERROR = 3, - _URC_NORMAL_STOP = 4, - _URC_END_OF_STACK = 5, - _URC_HANDLER_FOUND = 6, - _URC_INSTALL_CONTEXT = 7, - _URC_CONTINUE_UNWIND = 8 -} _Unwind_Reason_Code; +/*__thread*/ struct { + __cxa_exception info; + char buf[32]; +} emergency_exception; +/*__thread*/ bool emergency_exception_used; -typedef void (*_Unwind_Exception_Cleanup_Fn)(_Unwind_Reason_Code reason, struct _Unwind_Exception *exc); +static bool TEST_AND_SET(bool& flag) { + bool ret = flag; + flag = true; + return ret; +} -struct _Unwind_Exception +// === CODE === +extern "C" void __cxa_call_unexpected(void *) { - uint64_t exception_class; - _Unwind_Exception_Cleanup_Fn exception_cleanup; - uint64_t private_1; - uint64_t private_2; -}; + // An unexpected exception was thrown from a function that lists its possible exceptions + for(;;); +} -struct __cxa_exception +extern "C" void *__cxa_allocate_exception(size_t thrown_size) { - std::type_info* exceptionType; - void (*exceptionDestructor)(void *); - unexpected_handler unexpectedHandler; - terminate_handler terminateHandler; - __cxa_exception* nextException; - - int handlerCount; - - int handlerSwitchValue; - const char* actionRecord; - const char* languageSpecificData; - void* catchTemp; - void* adjustedPtr; - - _Unwind_Exception unwindHeader; -}; + __cxa_exception *ret = static_cast<__cxa_exception*>( malloc( sizeof(__cxa_exception) + thrown_size ) ); + if( !ret ) { + if( thrown_size <= sizeof(emergency_exception.buf) && TEST_AND_SET(emergency_exception_used) ) + { + ret = &emergency_exception.info; + } + } + if( !ret ) { + ::std::terminate(); + } + return ret; +} - int uncaught_exception_count; -__cxa_exception *uncaught_exception_top; +extern "C" void __cxa_free_exception(void *thrown_exception) +{ + if(thrown_exception == &emergency_exception.buf) { + //assert(emergency_exception_used); + emergency_exception_used = false; + } + else { + __cxa_exception *except = static_cast<__cxa_exception*>( thrown_exception ) - 1; + free(except); + } +} -extern "C" void __cxa_call_unexpected(void *) +extern "C" void __cxa_throw(void *thrown_exception, std::type_info *tinfo, void (*dest)(void*)) { - // An unexpected exception was thrown from a function that lists its possible exceptions - for(;;); + __cxa_exception *except = static_cast<__cxa_exception*>( thrown_exception ) - 1; + + except->exceptionType = tinfo; + except->exceptionDestructor = dest; + memcpy(&except->unwindHeader.exception_class, "Ac20C++\0", 8); + uncaught_exception_top ++; + + _Unwind_RaiseException(thrown_exception); + + ::std::terminate(); } extern "C" void *__cxa_begin_catch(void *exceptionObject) { - struct __cxa_exception *except = static_cast<__cxa_exception*>( exceptionObject ); - except --; + __cxa_exception *except = static_cast<__cxa_exception*>( exceptionObject ) - 1; except->handlerCount ++; @@ -80,7 +93,7 @@ extern "C" void __cxa_end_catch() uncaught_exception_top = except->nextException; if( except->handlerCount == 0 ) { - //__cxa_free_exception(except+1); + __cxa_free_exception(except+1); } } diff --git a/Usermode/Libraries/libc++.so_src/exception_handling.h b/Usermode/Libraries/libc++.so_src/exception_handling.h new file mode 100644 index 00000000..b1feae55 --- /dev/null +++ b/Usermode/Libraries/libc++.so_src/exception_handling.h @@ -0,0 +1,63 @@ +/* + */ +#ifndef _EXCEPTION_HANLDING_H_ +#define _EXCEPTION_HANLDING_H_ + +typedef void *(unexpected_handler)(void); +typedef void *(terminate_handler)(void); + +struct _Unwind_Context; + +typedef enum { + _URC_NO_REASON = 0, + _URC_FOREIGN_EXCEPTION_CAUGHT = 1, + _URC_FATAL_PHASE2_ERROR = 2, + _URC_FATAL_PHASE1_ERROR = 3, + _URC_NORMAL_STOP = 4, + _URC_END_OF_STACK = 5, + _URC_HANDLER_FOUND = 6, + _URC_INSTALL_CONTEXT = 7, + _URC_CONTINUE_UNWIND = 8 +} _Unwind_Reason_Code; + +typedef void (*_Unwind_Exception_Cleanup_Fn)(_Unwind_Reason_Code reason, struct _Unwind_Exception *exc); + +struct _Unwind_Exception +{ + uint64_t exception_class; + _Unwind_Exception_Cleanup_Fn exception_cleanup; + uint64_t private_1; + uint64_t private_2; +}; + +struct __cxa_exception +{ + std::type_info* exceptionType; + void (*exceptionDestructor)(void *); + unexpected_handler unexpectedHandler; + terminate_handler terminateHandler; + __cxa_exception* nextException; + + int handlerCount; + + int handlerSwitchValue; + const char* actionRecord; + const char* languageSpecificData; + void* catchTemp; + void* adjustedPtr; + + _Unwind_Exception unwindHeader; +}; + + +extern "C" void __cxa_call_unexpected(void *); +extern "C" void *__cxa_allocate_exception(size_t thrown_size); +extern "C" void __cxa_free_exception(void *thrown_exception); +extern "C" void __cxa_throw(void *thrown_exception, std::type_info *tinfo, void (*dest)(void*)); +extern "C" void *__cxa_begin_catch(void *exceptionObject); +extern "C" void __cxa_end_catch(); + +extern "C" void _Unwind_RaiseException(void *thrown_exception); + +#endif + diff --git a/Usermode/Libraries/libc++.so_src/exceptions.cc b/Usermode/Libraries/libc++.so_src/exceptions.cc index 2b66dcee..593ce3ad 100644 --- a/Usermode/Libraries/libc++.so_src/exceptions.cc +++ b/Usermode/Libraries/libc++.so_src/exceptions.cc @@ -8,6 +8,7 @@ #include #include #include +#include // === CODE === ::std::exception::exception() throw(): @@ -35,6 +36,12 @@ const char* ::std::exception::what() const throw() return m_what_str.c_str(); } +void ::std::terminate() +{ + _exit(0); +} + +// --- Standar Exceptions --- ::std::logic_error::logic_error(const ::std::string& what_str): exception(what_str) { diff --git a/Usermode/Libraries/libc++.so_src/include_exp/allocator b/Usermode/Libraries/libc++.so_src/include_exp/allocator index d9faae97..943dc0f6 100644 --- a/Usermode/Libraries/libc++.so_src/include_exp/allocator +++ b/Usermode/Libraries/libc++.so_src/include_exp/allocator @@ -53,6 +53,20 @@ public: n=n; ::operator delete(p); } + size_type max_size() { + return ((size_type)-1) / sizeof(value_type); + } + void construct( pointer p, const_reference val ) { + ::new ((void*)p) value_type (val); + } + // C++11 + //template + //void construct( U* p, Args&&... args ) { + // ::new ((void*)p) U (forward(args)); + //} + void destroy(pointer p) { + p->~value_type(); + } }; }; diff --git a/Usermode/Libraries/libc++.so_src/include_exp/cstdlib b/Usermode/Libraries/libc++.so_src/include_exp/cstdlib new file mode 100644 index 00000000..7d119a76 --- /dev/null +++ b/Usermode/Libraries/libc++.so_src/include_exp/cstdlib @@ -0,0 +1,17 @@ +/* + * Acess2 C++ Library + * - By John Hodge (thePowersGang) + * + * cstdlib (header) + * - C++ wrapper around stdlib.h + */ +#ifndef _LIBCXX_CSTDLIB_ +#define _LIBCXX_CSTDLIB_ + +extern "C" { +#include +}; + +#endif + + diff --git a/Usermode/Libraries/libc++.so_src/include_exp/cstring b/Usermode/Libraries/libc++.so_src/include_exp/cstring new file mode 100644 index 00000000..66149e03 --- /dev/null +++ b/Usermode/Libraries/libc++.so_src/include_exp/cstring @@ -0,0 +1,17 @@ +/* + * Acess2 C++ Library + * - By John Hodge (thePowersGang) + * + * cstring (header) + * - C++ wrapper around string.h + */ +#ifndef _LIBCXX_CSTRING_ +#define _LIBCXX_CSTRING_ + +extern "C" { +#include +}; + +#endif + + diff --git a/Usermode/Libraries/libc++.so_src/include_exp/exception b/Usermode/Libraries/libc++.so_src/include_exp/exception index 0beb0160..63e35bde 100644 --- a/Usermode/Libraries/libc++.so_src/include_exp/exception +++ b/Usermode/Libraries/libc++.so_src/include_exp/exception @@ -27,6 +27,22 @@ protected: exception(const string& what_str) noexcept; }; +class bad_exception: + public exception +{ +public: + bad_exception() noexcept; +}; + +typedef void (*terminate_handler)(); +typedef void (*unexpected_handler)(); + +extern void set_terminate(terminate_handler f) throw(); +extern void set_unexpected(unexpected_handler f) throw(); +extern void terminate(); +extern void unexpected(); +extern bool uncaught_exception() throw(); + }; // namespace std #endif diff --git a/Usermode/Libraries/libc++.so_src/include_exp/vector b/Usermode/Libraries/libc++.so_src/include_exp/vector index e69de29b..c1301238 100644 --- a/Usermode/Libraries/libc++.so_src/include_exp/vector +++ b/Usermode/Libraries/libc++.so_src/include_exp/vector @@ -0,0 +1,73 @@ +/* + * Acess2 C++ Library + * - By John Hodge (thePowersGang) + * + * string (header) + * - C++'s String type + */ +#ifndef _LIBCXX_VECTOR_ +#define _LIBCXX_VECTOR_ + +#include + +namespace std { + +namespace _bits { +template class vector_iterator; +} + +template > +class vector +{ +public: + typedef T value_type; + typedef Alloc allocator_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef ::std::_bits::vector_iterator iterator; + typedef ::std::_bits::vector_iterator const_iterator; + typedef int difference_type; + typedef size_t size_type; + +private: + allocator_type m_alloc; + size_type m_size; + size_type m_capacity; + value_type* m_data; + +public: + vector(const allocator_type& alloc = allocator_type()): + m_alloc(alloc), + m_size(0), + m_capacity(0), + m_data(0) + { + } + vector(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type()): + vector(alloc) + { + + } + vector(const vector& x): + vector(x.m_alloc) + { + *this = x; + } + + ~vector() + { + for( size_type i = 0; i < m_size; i ++ ) { + m_alloc.destroy( &m_data[i] ); + } + } + + +}; + +}; // namespace std + +#endif +// vim: ft=cpp + -- 2.20.1