diff --git a/contrib/sdk/sources/libsupc++/Makefile b/contrib/sdk/sources/libsupc++/Makefile deleted file mode 100644 index 4b89d8a86..000000000 --- a/contrib/sdk/sources/libsupc++/Makefile +++ /dev/null @@ -1,70 +0,0 @@ -LIBRARY= libsupc++ - -CC = kos32-gcc -AR = kos32-ar -LD = kos32-ld -CPP= kos32-g++ -STRIP = kos32-strip - -CFLAGS = -U_Win32 -U_WIN32 -U__MINGW32__ -c -O2 -fno-ident -fomit-frame-pointer - -ARFLAGS= crs - -INCLUDES= -I. -I../newlib/libc/include - -LIBS:= -ldll -lc.dll - -DEFINES= -DIN_GCC -DUSE_EMUTLS=1 -D_GLIBCXX_HAVE_TLS - - -SOURCES = gthr_mutex.c \ - bad_alloc.cc \ - class_type_info.cc \ - del_op.cc \ - del_opv.cc \ - eh_alloc.cc \ - eh_aux_runtime.cc \ - eh_call.cc \ - eh_catch.cc \ - eh_exception.cc \ - eh_globals.cc \ - eh_personality.cc \ - eh_term_handler.cc \ - eh_terminate.cc \ - eh_throw.cc \ - eh_type.c \ - eh_unex_handler.cc \ - guard.cc \ - guard_error.cc \ - new_handler.cc \ - new_op.cc \ - new_opnt.cc \ - new_opv.cc \ - pbase_type_info.cc \ - pure.cc \ - si_class_type_info.cc \ - tinfo.cc \ - vmi_class_type_info.cc \ - vterminate.cc - - -OBJECTS = $(patsubst %.cc, %.o, $(patsubst %.c, %.o, $(SOURCES))) - -# targets - -all:$(LIBRARY).a - -$(LIBRARY).a: $(OBJECTS) Makefile - $(AR) $(ARFLAGS) $(LIBRARY).a $(OBJECTS) - mv -f $(LIBRARY).a ../../lib - -%.o : %.c Makefile - $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< - -%.o : %.cc Makefile - $(CPP) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< - - -clean: - -rm -f *.o - diff --git a/contrib/sdk/sources/libsupc++/bad_alloc.cc b/contrib/sdk/sources/libsupc++/bad_alloc.cc deleted file mode 100644 index b5ed6da49..000000000 --- a/contrib/sdk/sources/libsupc++/bad_alloc.cc +++ /dev/null @@ -1,34 +0,0 @@ -// Implementation file for the -*- C++ -*- dynamic memory management header. - -// Copyright (C) 2010, 2011 Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "new" - -std::bad_alloc::~bad_alloc() _GLIBCXX_USE_NOEXCEPT { } - -const char* -std::bad_alloc::what() const _GLIBCXX_USE_NOEXCEPT -{ - return "std::bad_alloc"; -} diff --git a/contrib/sdk/sources/libsupc++/class_type_info.cc b/contrib/sdk/sources/libsupc++/class_type_info.cc deleted file mode 100644 index 9d40d0c6b..000000000 --- a/contrib/sdk/sources/libsupc++/class_type_info.cc +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2007, -// 2009 Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "tinfo.h" - -namespace __cxxabiv1 { - -__class_type_info:: -~__class_type_info () -{} - -bool __class_type_info:: -__do_catch (const type_info *thr_type, - void **thr_obj, - unsigned outer) const -{ - if (*this == *thr_type) - return true; - if (outer >= 4) - // Neither `A' nor `A *'. - return false; - return thr_type->__do_upcast (this, thr_obj); -} - -bool __class_type_info:: -__do_upcast (const __class_type_info *dst_type, - void **obj_ptr) const -{ - __upcast_result result (__vmi_class_type_info::__flags_unknown_mask); - - __do_upcast (dst_type, *obj_ptr, result); - if (!contained_public_p (result.part2dst)) - return false; - *obj_ptr = const_cast (result.dst_ptr); - return true; -} - -__class_type_info::__sub_kind __class_type_info:: -__do_find_public_src (ptrdiff_t, - const void *obj_ptr, - const __class_type_info *, - const void *src_ptr) const -{ - if (src_ptr == obj_ptr) - // Must be our type, as the pointers match. - return __contained_public; - return __not_contained; -} - -bool __class_type_info:: -__do_dyncast (ptrdiff_t, - __sub_kind access_path, - const __class_type_info *dst_type, - const void *obj_ptr, - const __class_type_info *src_type, - const void *src_ptr, - __dyncast_result &__restrict result) const -{ - if (obj_ptr == src_ptr && *this == *src_type) - { - // The src object we started from. Indicate how we are accessible from - // the most derived object. - result.whole2src = access_path; - return false; - } - if (*this == *dst_type) - { - result.dst_ptr = obj_ptr; - result.whole2dst = access_path; - result.dst2src = __not_contained; - return false; - } - return false; -} - -bool __class_type_info:: -__do_upcast (const __class_type_info *dst, const void *obj, - __upcast_result &__restrict result) const -{ - if (*this == *dst) - { - result.dst_ptr = obj; - result.base_type = nonvirtual_base_type; - result.part2dst = __contained_public; - return true; - } - return false; -} - -} diff --git a/contrib/sdk/sources/libsupc++/del_op.cc b/contrib/sdk/sources/libsupc++/del_op.cc deleted file mode 100644 index 0d69aa3aa..000000000 --- a/contrib/sdk/sources/libsupc++/del_op.cc +++ /dev/null @@ -1,49 +0,0 @@ -// Boilerplate support routines for -*- C++ -*- dynamic memory management. - -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2007, 2009, 2010, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include - -#if !_GLIBCXX_HOSTED -// A freestanding C runtime may not provide "free" -- but there is no -// other reasonable way to implement "operator delete". -namespace std -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - extern "C" void free(void*); -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace -#else -# include -#endif - -#include "new" - -_GLIBCXX_WEAK_DEFINITION void -operator delete(void* ptr) _GLIBCXX_USE_NOEXCEPT -{ - if (ptr) - std::free(ptr); -} diff --git a/contrib/sdk/sources/libsupc++/del_opv.cc b/contrib/sdk/sources/libsupc++/del_opv.cc deleted file mode 100644 index 594f86262..000000000 --- a/contrib/sdk/sources/libsupc++/del_opv.cc +++ /dev/null @@ -1,34 +0,0 @@ -// Boilerplate support routines for -*- C++ -*- dynamic memory management. - -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009, 2010, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include "new" - -_GLIBCXX_WEAK_DEFINITION void -operator delete[] (void *ptr) _GLIBCXX_USE_NOEXCEPT -{ - ::operator delete (ptr); -} diff --git a/contrib/sdk/sources/libsupc++/eh_alloc.cc b/contrib/sdk/sources/libsupc++/eh_alloc.cc deleted file mode 100644 index 74474d82e..000000000 --- a/contrib/sdk/sources/libsupc++/eh_alloc.cc +++ /dev/null @@ -1,220 +0,0 @@ -// -*- C++ -*- Allocate exception objects. -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2011 -// Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -// This is derived from the C++ ABI for IA-64. Where we diverge -// for cross-architecture compatibility are noted with "@@@". - -#include -#include -#if _GLIBCXX_HOSTED -#include -#endif -#include -#include -#include "unwind-cxx.h" -#include - -#if _GLIBCXX_HOSTED -using std::free; -using std::malloc; -using std::memset; -#else -// In a freestanding environment, these functions may not be available -// -- but for now, we assume that they are. -extern "C" void *malloc (std::size_t); -extern "C" void free(void *); -extern "C" void *memset (void *, int, std::size_t); -#endif - -using namespace __cxxabiv1; - -// ??? How to control these parameters. - -// Guess from the size of basic types how large a buffer is reasonable. -// Note that the basic c++ exception header has 13 pointers and 2 ints, -// so on a system with PSImode pointers we're talking about 56 bytes -// just for overhead. - -#if INT_MAX == 32767 -# define EMERGENCY_OBJ_SIZE 128 -# define EMERGENCY_OBJ_COUNT 16 -#elif LONG_MAX == 2147483647 -# define EMERGENCY_OBJ_SIZE 512 -# define EMERGENCY_OBJ_COUNT 32 -#else -# define EMERGENCY_OBJ_SIZE 1024 -# define EMERGENCY_OBJ_COUNT 64 -#endif - -#ifndef __GTHREADS -# undef EMERGENCY_OBJ_COUNT -# define EMERGENCY_OBJ_COUNT 4 -#endif - -#if INT_MAX == 32767 || EMERGENCY_OBJ_COUNT <= 32 -typedef unsigned int bitmask_type; -#else -typedef unsigned long bitmask_type; -#endif - - -typedef char one_buffer[EMERGENCY_OBJ_SIZE] __attribute__((aligned)); -static one_buffer emergency_buffer[EMERGENCY_OBJ_COUNT]; -static bitmask_type emergency_used; - -static __cxa_dependent_exception dependents_buffer[EMERGENCY_OBJ_COUNT]; -static bitmask_type dependents_used; - -namespace -{ - // A single mutex controlling emergency allocations. - __gnu_cxx::__mutex emergency_mutex; -} - -extern "C" void * -__cxxabiv1::__cxa_allocate_exception(std::size_t thrown_size) _GLIBCXX_NOTHROW -{ - void *ret; - - thrown_size += sizeof (__cxa_refcounted_exception); - ret = malloc (thrown_size); - - if (! ret) - { - __gnu_cxx::__scoped_lock sentry(emergency_mutex); - - bitmask_type used = emergency_used; - unsigned int which = 0; - - if (thrown_size > EMERGENCY_OBJ_SIZE) - goto failed; - while (used & 1) - { - used >>= 1; - if (++which >= EMERGENCY_OBJ_COUNT) - goto failed; - } - - emergency_used |= (bitmask_type)1 << which; - ret = &emergency_buffer[which][0]; - - failed:; - - if (!ret) - std::terminate (); - } - - // We have an uncaught exception as soon as we allocate memory. This - // yields uncaught_exception() true during the copy-constructor that - // initializes the exception object. See Issue 475. - __cxa_eh_globals *globals = __cxa_get_globals (); - globals->uncaughtExceptions += 1; - - memset (ret, 0, sizeof (__cxa_refcounted_exception)); - - return (void *)((char *)ret + sizeof (__cxa_refcounted_exception)); -} - - -extern "C" void -__cxxabiv1::__cxa_free_exception(void *vptr) _GLIBCXX_NOTHROW -{ - char *base = (char *) emergency_buffer; - char *ptr = (char *) vptr; - if (ptr >= base - && ptr < base + sizeof (emergency_buffer)) - { - const unsigned int which - = (unsigned) (ptr - base) / EMERGENCY_OBJ_SIZE; - - __gnu_cxx::__scoped_lock sentry(emergency_mutex); - emergency_used &= ~((bitmask_type)1 << which); - } - else - free (ptr - sizeof (__cxa_refcounted_exception)); -} - - -extern "C" __cxa_dependent_exception* -__cxxabiv1::__cxa_allocate_dependent_exception() _GLIBCXX_NOTHROW -{ - __cxa_dependent_exception *ret; - - ret = static_cast<__cxa_dependent_exception*> - (malloc (sizeof (__cxa_dependent_exception))); - - if (!ret) - { - __gnu_cxx::__scoped_lock sentry(emergency_mutex); - - bitmask_type used = dependents_used; - unsigned int which = 0; - - while (used & 1) - { - used >>= 1; - if (++which >= EMERGENCY_OBJ_COUNT) - goto failed; - } - - dependents_used |= (bitmask_type)1 << which; - ret = &dependents_buffer[which]; - - failed:; - - if (!ret) - std::terminate (); - } - - // We have an uncaught exception as soon as we allocate memory. This - // yields uncaught_exception() true during the copy-constructor that - // initializes the exception object. See Issue 475. - __cxa_eh_globals *globals = __cxa_get_globals (); - globals->uncaughtExceptions += 1; - - memset (ret, 0, sizeof (__cxa_dependent_exception)); - - return ret; -} - - -extern "C" void -__cxxabiv1::__cxa_free_dependent_exception - (__cxa_dependent_exception *vptr) _GLIBCXX_NOTHROW -{ - char *base = (char *) dependents_buffer; - char *ptr = (char *) vptr; - if (ptr >= base - && ptr < base + sizeof (dependents_buffer)) - { - const unsigned int which - = (unsigned) (ptr - base) / sizeof (__cxa_dependent_exception); - - __gnu_cxx::__scoped_lock sentry(emergency_mutex); - dependents_used &= ~((bitmask_type)1 << which); - } - else - free (vptr); -} diff --git a/contrib/sdk/sources/libsupc++/eh_aux_runtime.cc b/contrib/sdk/sources/libsupc++/eh_aux_runtime.cc deleted file mode 100644 index c6abe3546..000000000 --- a/contrib/sdk/sources/libsupc++/eh_aux_runtime.cc +++ /dev/null @@ -1,51 +0,0 @@ -// -*- C++ -*- Common throw conditions. -// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2009, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. -// -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "typeinfo" -#include "exception" -#include -#include "unwind-cxx.h" -#include - -extern "C" void -__cxxabiv1::__cxa_bad_cast () -{ -#ifdef __EXCEPTIONS - throw std::bad_cast(); -#else - std::abort(); -#endif -} - -extern "C" void -__cxxabiv1::__cxa_bad_typeid () -{ -#ifdef __EXCEPTIONS - throw std::bad_typeid(); -#else - std::abort(); -#endif -} - diff --git a/contrib/sdk/sources/libsupc++/eh_call.cc b/contrib/sdk/sources/libsupc++/eh_call.cc deleted file mode 100644 index a6a55a4d9..000000000 --- a/contrib/sdk/sources/libsupc++/eh_call.cc +++ /dev/null @@ -1,159 +0,0 @@ -// -*- C++ -*- Helpers for calling unextected and terminate -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, -// 2011 -// Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include -#include -#include "unwind-cxx.h" - -using namespace __cxxabiv1; - -#include "unwind-pe.h" - - -// Helper routine for when the exception handling code needs to call -// terminate. - -extern "C" void -__cxa_call_terminate(_Unwind_Exception* ue_header) throw () -{ - - if (ue_header) - { - // terminate is classed as a catch handler. - __cxa_begin_catch(ue_header); - - // Call the terminate handler that was in effect when we threw this - // exception. */ - if (__is_gxx_exception_class(ue_header->exception_class)) - { - __cxa_exception* xh; - - xh = __get_exception_header_from_ue(ue_header); - __terminate(xh->terminateHandler); - } - } - /* Call the global routine if we don't have anything better. */ - std::terminate(); -} - - -#ifdef __ARM_EABI_UNWINDER__ -// The ARM EABI __cxa_call_unexpected has the same semantics as the generic -// routine, but the exception specification has a different format. -extern "C" void -__cxa_call_unexpected(void* exc_obj_in) -{ - _Unwind_Exception* exc_obj - = reinterpret_cast<_Unwind_Exception*>(exc_obj_in); - - int rtti_count = 0; - _Unwind_Word rtti_stride = 0; - _Unwind_Word* rtti_list = NULL; - _Unwind_Ptr rtti_base = 0; - bool foreign_exception; - std::unexpected_handler unexpectedHandler = NULL; - std::terminate_handler terminateHandler = NULL; - __cxa_exception* xh; - if (__is_gxx_exception_class(exc_obj->exception_class)) - { - // Save data from the EO, which may be clobbered by _cxa_begin_catch. - xh = __get_exception_header_from_ue(exc_obj); - unexpectedHandler = xh->unexpectedHandler; - terminateHandler = xh->terminateHandler; - rtti_count = exc_obj->barrier_cache.bitpattern[1]; - rtti_base = (_Unwind_Ptr) exc_obj->barrier_cache.bitpattern[2]; - rtti_stride = exc_obj->barrier_cache.bitpattern[3]; - rtti_list = (_Unwind_Word*) exc_obj->barrier_cache.bitpattern[4]; - foreign_exception = false; - } - else - foreign_exception = true; - - /* This must be called after extracting data from the EO, but before - calling unexpected(). */ - __cxa_begin_catch(exc_obj); - - // This function is a handler for our exception argument. If we exit - // by throwing a different exception, we'll need the original cleaned up. - struct end_catch_protect - { - end_catch_protect() { } - ~end_catch_protect() { __cxa_end_catch(); } - } end_catch_protect_obj; - - - __try - { - if (foreign_exception) - std::unexpected(); - else - __unexpected(unexpectedHandler); - } - __catch(...) - { - /* See if the new exception matches the rtti list. */ - if (foreign_exception) - std::terminate(); - - // Get the exception thrown from unexpected. - - __cxa_eh_globals* globals = __cxa_get_globals_fast(); - __cxa_exception* new_xh = globals->caughtExceptions; - void* new_ptr = __get_object_from_ambiguous_exception (new_xh); - const std::type_info* catch_type; - int n; - bool bad_exception_allowed = false; - const std::type_info& bad_exc = typeid(std::bad_exception); - - // Check the new exception against the rtti list - for (n = 0; n < rtti_count; n++) - { - _Unwind_Word offset; - - offset = (_Unwind_Word) &rtti_list[n * (rtti_stride >> 2)]; - offset = _Unwind_decode_typeinfo_ptr(rtti_base, offset); - catch_type = (const std::type_info*) (offset); - - if (__cxa_type_match(&new_xh->unwindHeader, catch_type, false, - &new_ptr) != ctm_failed) - __throw_exception_again; - - if (catch_type->__do_catch(&bad_exc, 0, 1)) - bad_exception_allowed = true; - } - - // If the exception spec allows std::bad_exception, throw that. -#ifdef __EXCEPTIONS - if (bad_exception_allowed) - throw std::bad_exception(); -#endif - - // Otherwise, die. - __terminate(terminateHandler); - } -} -#endif // __ARM_EABI_UNWINDER__ diff --git a/contrib/sdk/sources/libsupc++/eh_catch.cc b/contrib/sdk/sources/libsupc++/eh_catch.cc deleted file mode 100644 index b11149768..000000000 --- a/contrib/sdk/sources/libsupc++/eh_catch.cc +++ /dev/null @@ -1,138 +0,0 @@ -// -*- C++ -*- Exception handling routines for catching. -// Copyright (C) 2001, 2003, 2004, 2009, 2011 Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include "unwind-cxx.h" - -using namespace __cxxabiv1; - -extern "C" void * -__cxxabiv1::__cxa_get_exception_ptr(void *exc_obj_in) _GLIBCXX_NOTHROW -{ - _Unwind_Exception *exceptionObject - = reinterpret_cast <_Unwind_Exception *>(exc_obj_in); - - return __gxx_caught_object(exceptionObject); -} - -extern "C" void * -__cxxabiv1::__cxa_begin_catch (void *exc_obj_in) _GLIBCXX_NOTHROW -{ - _Unwind_Exception *exceptionObject - = reinterpret_cast <_Unwind_Exception *>(exc_obj_in); - __cxa_eh_globals *globals = __cxa_get_globals (); - __cxa_exception *prev = globals->caughtExceptions; - __cxa_exception *header = __get_exception_header_from_ue (exceptionObject); - void* objectp; - - // Foreign exceptions can't be stacked here. If the exception stack is - // empty, then fine. Otherwise we really have no choice but to terminate. - // Note that this use of "header" is a lie. It's fine so long as we only - // examine header->unwindHeader though. - if (!__is_gxx_exception_class(header->unwindHeader.exception_class)) - { - if (prev != 0) - std::terminate (); - - // Remember for end_catch and rethrow. - globals->caughtExceptions = header; - - // ??? No sensible value to return; we don't know what the - // object is, much less where it is in relation to the header. - return 0; - } - - int count = header->handlerCount; - // Count is less than zero if this exception was rethrown from an - // immediately enclosing region. - if (count < 0) - count = -count + 1; - else - count += 1; - header->handlerCount = count; - globals->uncaughtExceptions -= 1; - - if (header != prev) - { - header->nextException = prev; - globals->caughtExceptions = header; - } - - objectp = __gxx_caught_object(exceptionObject); -#ifdef __ARM_EABI_UNWINDER__ - _Unwind_Complete(exceptionObject); -#endif - return objectp; -} - - -extern "C" void -__cxxabiv1::__cxa_end_catch () -{ - __cxa_eh_globals *globals = __cxa_get_globals_fast (); - __cxa_exception *header = globals->caughtExceptions; - - // A rethrow of a foreign exception will be removed from the - // the exception stack immediately by __cxa_rethrow. - if (!header) - return; - - // A foreign exception couldn't have been stacked (see above), - // so by definition processing must be complete. - if (!__is_gxx_exception_class(header->unwindHeader.exception_class)) - { - globals->caughtExceptions = 0; - _Unwind_DeleteException (&header->unwindHeader); - return; - } - - int count = header->handlerCount; - if (count < 0) - { - // This exception was rethrown. Decrement the (inverted) catch - // count and remove it from the chain when it reaches zero. - if (++count == 0) - globals->caughtExceptions = header->nextException; - } - else if (--count == 0) - { - // Handling for this exception is complete. Destroy the object. - globals->caughtExceptions = header->nextException; - _Unwind_DeleteException (&header->unwindHeader); - return; - } - else if (count < 0) - // A bug in the exception handling library or compiler. - std::terminate (); - - header->handlerCount = count; -} - - -bool -std::uncaught_exception() throw() -{ - __cxa_eh_globals *globals = __cxa_get_globals (); - return globals->uncaughtExceptions != 0; -} diff --git a/contrib/sdk/sources/libsupc++/eh_exception.cc b/contrib/sdk/sources/libsupc++/eh_exception.cc deleted file mode 100644 index cbdca199b..000000000 --- a/contrib/sdk/sources/libsupc++/eh_exception.cc +++ /dev/null @@ -1,52 +0,0 @@ -// -*- C++ -*- std::exception implementation. -// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -// 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "typeinfo" -#include "exception" -#include - -std::exception::~exception() _GLIBCXX_USE_NOEXCEPT { } - -std::bad_exception::~bad_exception() _GLIBCXX_USE_NOEXCEPT { } - -abi::__forced_unwind::~__forced_unwind() throw() { } - -abi::__foreign_exception::~__foreign_exception() throw() { } - -const char* -std::exception::what() const _GLIBCXX_USE_NOEXCEPT -{ - // NB: Another elegant option would be returning typeid(*this).name() - // and not overriding what() in bad_exception, bad_alloc, etc. In - // that case, however, mangled names would be returned, PR 14493. - return "std::exception"; -} - -const char* -std::bad_exception::what() const _GLIBCXX_USE_NOEXCEPT -{ - return "std::bad_exception"; -} diff --git a/contrib/sdk/sources/libsupc++/eh_globals.cc b/contrib/sdk/sources/libsupc++/eh_globals.cc deleted file mode 100644 index e49640d1f..000000000 --- a/contrib/sdk/sources/libsupc++/eh_globals.cc +++ /dev/null @@ -1,160 +0,0 @@ -// -*- C++ -*- Manage the thread-local exception globals. -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2011 -// Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include -#include -#include "cxxabi.h" -#include "unwind-cxx.h" -#include "bits/gthr.h" - -#if _GLIBCXX_HOSTED -using std::free; -using std::malloc; -#else -// In a freestanding environment, these functions may not be -// available -- but for now, we assume that they are. -extern "C" void *malloc (std::size_t); -extern "C" void free(void *); -#endif - -using namespace __cxxabiv1; - -#if _GLIBCXX_HAVE_TLS - -namespace -{ - abi::__cxa_eh_globals* - get_global() _GLIBCXX_NOTHROW - { - static __thread abi::__cxa_eh_globals global; - return &global; - } -} // anonymous namespace - -extern "C" __cxa_eh_globals* -__cxxabiv1::__cxa_get_globals_fast() _GLIBCXX_NOTHROW -{ return get_global(); } - -extern "C" __cxa_eh_globals* -__cxxabiv1::__cxa_get_globals() _GLIBCXX_NOTHROW -{ return get_global(); } - - -#else - -// Single-threaded fallback buffer. -static __cxa_eh_globals eh_globals; - -#if __GTHREADS - -static void -eh_globals_dtor(void* ptr) -{ - if (ptr) - { - __cxa_eh_globals* g = reinterpret_cast<__cxa_eh_globals*>(ptr); - __cxa_exception* exn = g->caughtExceptions; - __cxa_exception* next; - while (exn) - { - next = exn->nextException; - _Unwind_DeleteException(&exn->unwindHeader); - exn = next; - } - free(ptr); - } -} - -struct __eh_globals_init -{ - __gthread_key_t _M_key; - bool _M_init; - - __eh_globals_init() : _M_init(false) - { - if (__gthread_active_p()) - _M_init = __gthread_key_create(&_M_key, eh_globals_dtor) == 0; - } - - ~__eh_globals_init() - { - if (_M_init) - __gthread_key_delete(_M_key); - _M_init = false; - } -}; - -static __eh_globals_init init; - -extern "C" __cxa_eh_globals* -__cxxabiv1::__cxa_get_globals_fast() _GLIBCXX_NOTHROW -{ - __cxa_eh_globals* g; - if (init._M_init) - g = static_cast<__cxa_eh_globals*>(__gthread_getspecific(init._M_key)); - else - g = &eh_globals; - return g; -} - -extern "C" __cxa_eh_globals* -__cxxabiv1::__cxa_get_globals() _GLIBCXX_NOTHROW -{ - __cxa_eh_globals* g; - if (init._M_init) - { - g = static_cast<__cxa_eh_globals*>(__gthread_getspecific(init._M_key)); - if (!g) - { - void* v = malloc(sizeof(__cxa_eh_globals)); - if (v == 0 || __gthread_setspecific(init._M_key, v) != 0) - std::terminate(); - g = static_cast<__cxa_eh_globals*>(v); - g->caughtExceptions = 0; - g->uncaughtExceptions = 0; -#ifdef __ARM_EABI_UNWINDER__ - g->propagatingExceptions = 0; -#endif - } - } - else - g = &eh_globals; - return g; -} - -#else - -extern "C" __cxa_eh_globals* -__cxxabiv1::__cxa_get_globals_fast() _GLIBCXX_NOTHROW -{ return &eh_globals; } - -extern "C" __cxa_eh_globals* -__cxxabiv1::__cxa_get_globals() _GLIBCXX_NOTHROW -{ return &eh_globals; } - -#endif - -#endif diff --git a/contrib/sdk/sources/libsupc++/eh_personality.cc b/contrib/sdk/sources/libsupc++/eh_personality.cc deleted file mode 100644 index 43c6452cc..000000000 --- a/contrib/sdk/sources/libsupc++/eh_personality.cc +++ /dev/null @@ -1,781 +0,0 @@ -// -*- C++ -*- The GNU C++ exception personality routine. -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -// 2011 -// Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include -#include -#include -#include "unwind-cxx.h" - - -using namespace __cxxabiv1; - -#include "unwind-pe.h" - - -struct lsda_header_info -{ - _Unwind_Ptr Start; - _Unwind_Ptr LPStart; - _Unwind_Ptr ttype_base; - const unsigned char *TType; - const unsigned char *action_table; - unsigned char ttype_encoding; - unsigned char call_site_encoding; -}; - -static const unsigned char * -parse_lsda_header (_Unwind_Context *context, const unsigned char *p, - lsda_header_info *info) -{ - _uleb128_t tmp; - unsigned char lpstart_encoding; - - info->Start = (context ? _Unwind_GetRegionStart (context) : 0); - - // Find @LPStart, the base to which landing pad offsets are relative. - lpstart_encoding = *p++; - if (lpstart_encoding != DW_EH_PE_omit) - p = read_encoded_value (context, lpstart_encoding, p, &info->LPStart); - else - info->LPStart = info->Start; - - // Find @TType, the base of the handler and exception spec type data. - info->ttype_encoding = *p++; - if (info->ttype_encoding != DW_EH_PE_omit) - { -#if _GLIBCXX_OVERRIDE_TTYPE_ENCODING - /* Older ARM EABI toolchains set this value incorrectly, so use a - hardcoded OS-specific format. */ - info->ttype_encoding = _GLIBCXX_OVERRIDE_TTYPE_ENCODING; -#endif - p = read_uleb128 (p, &tmp); - info->TType = p + tmp; - } - else - info->TType = 0; - - // The encoding and length of the call-site table; the action table - // immediately follows. - info->call_site_encoding = *p++; - p = read_uleb128 (p, &tmp); - info->action_table = p + tmp; - - return p; -} - -// Return an element from a type table. - -static const std::type_info* -get_ttype_entry(lsda_header_info* info, _uleb128_t i) -{ - _Unwind_Ptr ptr; - - i *= size_of_encoded_value (info->ttype_encoding); - read_encoded_value_with_base (info->ttype_encoding, info->ttype_base, - info->TType - i, &ptr); - - return reinterpret_cast(ptr); -} - -#ifdef __ARM_EABI_UNWINDER__ - -// The ABI provides a routine for matching exception object types. -typedef _Unwind_Control_Block _throw_typet; -#define get_adjusted_ptr(catch_type, throw_type, thrown_ptr_p) \ - (__cxa_type_match (throw_type, catch_type, false, thrown_ptr_p) \ - != ctm_failed) - -// Return true if THROW_TYPE matches one if the filter types. - -static bool -check_exception_spec(lsda_header_info* info, _throw_typet* throw_type, - void* thrown_ptr, _sleb128_t filter_value) -{ - const _uleb128_t* e = ((const _uleb128_t*) info->TType) - - filter_value - 1; - - while (1) - { - const std::type_info* catch_type; - _uleb128_t tmp; - - tmp = *e; - - // Zero signals the end of the list. If we've not found - // a match by now, then we've failed the specification. - if (tmp == 0) - return false; - - tmp = _Unwind_decode_typeinfo_ptr(info->ttype_base, (_Unwind_Word) e); - - // Match a ttype entry. - catch_type = reinterpret_cast(tmp); - - // ??? There is currently no way to ask the RTTI code about the - // relationship between two types without reference to a specific - // object. There should be; then we wouldn't need to mess with - // thrown_ptr here. - if (get_adjusted_ptr(catch_type, throw_type, &thrown_ptr)) - return true; - - // Advance to the next entry. - e++; - } -} - - -// Save stage1 handler information in the exception object - -static inline void -save_caught_exception(struct _Unwind_Exception* ue_header, - struct _Unwind_Context* context, - void* thrown_ptr, - int handler_switch_value, - const unsigned char* language_specific_data, - _Unwind_Ptr landing_pad, - const unsigned char* action_record - __attribute__((__unused__))) -{ - ue_header->barrier_cache.sp = _Unwind_GetGR(context, UNWIND_STACK_REG); - ue_header->barrier_cache.bitpattern[0] = (_uw) thrown_ptr; - ue_header->barrier_cache.bitpattern[1] - = (_uw) handler_switch_value; - ue_header->barrier_cache.bitpattern[2] - = (_uw) language_specific_data; - ue_header->barrier_cache.bitpattern[3] = (_uw) landing_pad; -} - - -// Restore the catch handler data saved during phase1. - -static inline void -restore_caught_exception(struct _Unwind_Exception* ue_header, - int& handler_switch_value, - const unsigned char*& language_specific_data, - _Unwind_Ptr& landing_pad) -{ - handler_switch_value = (int) ue_header->barrier_cache.bitpattern[1]; - language_specific_data = - (const unsigned char*) ue_header->barrier_cache.bitpattern[2]; - landing_pad = (_Unwind_Ptr) ue_header->barrier_cache.bitpattern[3]; -} - -#define CONTINUE_UNWINDING \ - do \ - { \ - if (__gnu_unwind_frame(ue_header, context) != _URC_OK) \ - return _URC_FAILURE; \ - return _URC_CONTINUE_UNWIND; \ - } \ - while (0) - -// Return true if the filter spec is empty, ie throw(). - -static bool -empty_exception_spec (lsda_header_info *info, _Unwind_Sword filter_value) -{ - const _Unwind_Word* e = ((const _Unwind_Word*) info->TType) - - filter_value - 1; - - return *e == 0; -} - -#else -typedef const std::type_info _throw_typet; - - -// Given the thrown type THROW_TYPE, pointer to a variable containing a -// pointer to the exception object THROWN_PTR_P and a type CATCH_TYPE to -// compare against, return whether or not there is a match and if so, -// update *THROWN_PTR_P. - -static bool -get_adjusted_ptr (const std::type_info *catch_type, - const std::type_info *throw_type, - void **thrown_ptr_p) -{ - void *thrown_ptr = *thrown_ptr_p; - - // Pointer types need to adjust the actual pointer, not - // the pointer to pointer that is the exception object. - // This also has the effect of passing pointer types - // "by value" through the __cxa_begin_catch return value. - if (throw_type->__is_pointer_p ()) - thrown_ptr = *(void **) thrown_ptr; - - if (catch_type->__do_catch (throw_type, &thrown_ptr, 1)) - { - *thrown_ptr_p = thrown_ptr; - return true; - } - - return false; -} - -// Return true if THROW_TYPE matches one if the filter types. - -static bool -check_exception_spec(lsda_header_info* info, _throw_typet* throw_type, - void* thrown_ptr, _sleb128_t filter_value) -{ - const unsigned char *e = info->TType - filter_value - 1; - - while (1) - { - const std::type_info *catch_type; - _uleb128_t tmp; - - e = read_uleb128 (e, &tmp); - - // Zero signals the end of the list. If we've not found - // a match by now, then we've failed the specification. - if (tmp == 0) - return false; - - // Match a ttype entry. - catch_type = get_ttype_entry (info, tmp); - - // ??? There is currently no way to ask the RTTI code about the - // relationship between two types without reference to a specific - // object. There should be; then we wouldn't need to mess with - // thrown_ptr here. - if (get_adjusted_ptr (catch_type, throw_type, &thrown_ptr)) - return true; - } -} - - -// Save stage1 handler information in the exception object - -static inline void -save_caught_exception(struct _Unwind_Exception* ue_header, - struct _Unwind_Context* context - __attribute__((__unused__)), - void* thrown_ptr, - int handler_switch_value, - const unsigned char* language_specific_data, - _Unwind_Ptr landing_pad __attribute__((__unused__)), - const unsigned char* action_record) -{ - __cxa_exception* xh = __get_exception_header_from_ue(ue_header); - - xh->handlerSwitchValue = handler_switch_value; - xh->actionRecord = action_record; - xh->languageSpecificData = language_specific_data; - xh->adjustedPtr = thrown_ptr; - - // ??? Completely unknown what this field is supposed to be for. - // ??? Need to cache TType encoding base for call_unexpected. - xh->catchTemp = landing_pad; -} - - -// Restore the catch handler information saved during phase1. - -static inline void -restore_caught_exception(struct _Unwind_Exception* ue_header, - int& handler_switch_value, - const unsigned char*& language_specific_data, - _Unwind_Ptr& landing_pad) -{ - __cxa_exception* xh = __get_exception_header_from_ue(ue_header); - handler_switch_value = xh->handlerSwitchValue; - language_specific_data = xh->languageSpecificData; - landing_pad = (_Unwind_Ptr) xh->catchTemp; -} - -#define CONTINUE_UNWINDING return _URC_CONTINUE_UNWIND - -// Return true if the filter spec is empty, ie throw(). - -static bool -empty_exception_spec (lsda_header_info *info, _Unwind_Sword filter_value) -{ - const unsigned char *e = info->TType - filter_value - 1; - _uleb128_t tmp; - - e = read_uleb128 (e, &tmp); - return tmp == 0; -} - -#endif // !__ARM_EABI_UNWINDER__ - -namespace __cxxabiv1 -{ - -// Using a different personality function name causes link failures -// when trying to mix code using different exception handling models. -#ifdef _GLIBCXX_SJLJ_EXCEPTIONS -#define PERSONALITY_FUNCTION __gxx_personality_sj0 -#define __builtin_eh_return_data_regno(x) x -#else -#define PERSONALITY_FUNCTION __gxx_personality_v0 -#endif - -extern "C" _Unwind_Reason_Code -#ifdef __ARM_EABI_UNWINDER__ -PERSONALITY_FUNCTION (_Unwind_State state, - struct _Unwind_Exception* ue_header, - struct _Unwind_Context* context) -#else -PERSONALITY_FUNCTION (int version, - _Unwind_Action actions, - _Unwind_Exception_Class exception_class, - struct _Unwind_Exception *ue_header, - struct _Unwind_Context *context) -#endif -{ - enum found_handler_type - { - found_nothing, - found_terminate, - found_cleanup, - found_handler - } found_type; - - lsda_header_info info; - const unsigned char *language_specific_data; - const unsigned char *action_record; - const unsigned char *p; - _Unwind_Ptr landing_pad, ip; - int handler_switch_value; - void* thrown_ptr = 0; - bool foreign_exception; - int ip_before_insn = 0; - -#ifdef __ARM_EABI_UNWINDER__ - _Unwind_Action actions; - - switch (state & _US_ACTION_MASK) - { - case _US_VIRTUAL_UNWIND_FRAME: - actions = _UA_SEARCH_PHASE; - break; - - case _US_UNWIND_FRAME_STARTING: - actions = _UA_CLEANUP_PHASE; - if (!(state & _US_FORCE_UNWIND) - && ue_header->barrier_cache.sp == _Unwind_GetGR(context, - UNWIND_STACK_REG)) - actions |= _UA_HANDLER_FRAME; - break; - - case _US_UNWIND_FRAME_RESUME: - CONTINUE_UNWINDING; - break; - - default: - std::abort(); - } - actions |= state & _US_FORCE_UNWIND; - - // We don't know which runtime we're working with, so can't check this. - // However the ABI routines hide this from us, and we don't actually need - // to know. - foreign_exception = false; - - // The dwarf unwinder assumes the context structure holds things like the - // function and LSDA pointers. The ARM implementation caches these in - // the exception header (UCB). To avoid rewriting everything we make a - // virtual scratch register point at the UCB. - ip = (_Unwind_Ptr) ue_header; - _Unwind_SetGR(context, UNWIND_POINTER_REG, ip); -#else - __cxa_exception* xh = __get_exception_header_from_ue(ue_header); - - // Interface version check. - if (version != 1) - return _URC_FATAL_PHASE1_ERROR; - foreign_exception = !__is_gxx_exception_class(exception_class); -#endif - - // Shortcut for phase 2 found handler for domestic exception. - if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME) - && !foreign_exception) - { - restore_caught_exception(ue_header, handler_switch_value, - language_specific_data, landing_pad); - found_type = (landing_pad == 0 ? found_terminate : found_handler); - goto install_context; - } - - language_specific_data = (const unsigned char *) - _Unwind_GetLanguageSpecificData (context); - - // If no LSDA, then there are no handlers or cleanups. - if (! language_specific_data) - CONTINUE_UNWINDING; - - // Parse the LSDA header. - p = parse_lsda_header (context, language_specific_data, &info); - info.ttype_base = base_of_encoded_value (info.ttype_encoding, context); -#ifdef _GLIBCXX_HAVE_GETIPINFO - ip = _Unwind_GetIPInfo (context, &ip_before_insn); -#else - ip = _Unwind_GetIP (context); -#endif - if (! ip_before_insn) - --ip; - landing_pad = 0; - action_record = 0; - handler_switch_value = 0; - -#ifdef _GLIBCXX_SJLJ_EXCEPTIONS - // The given "IP" is an index into the call-site table, with two - // exceptions -- -1 means no-action, and 0 means terminate. But - // since we're using uleb128 values, we've not got random access - // to the array. - if ((int) ip < 0) - return _URC_CONTINUE_UNWIND; - else if (ip == 0) - { - // Fall through to set found_terminate. - } - else - { - _uleb128_t cs_lp, cs_action; - do - { - p = read_uleb128 (p, &cs_lp); - p = read_uleb128 (p, &cs_action); - } - while (--ip); - - // Can never have null landing pad for sjlj -- that would have - // been indicated by a -1 call site index. - landing_pad = cs_lp + 1; - if (cs_action) - action_record = info.action_table + cs_action - 1; - goto found_something; - } -#else - // Search the call-site table for the action associated with this IP. - while (p < info.action_table) - { - _Unwind_Ptr cs_start, cs_len, cs_lp; - _uleb128_t cs_action; - - // Note that all call-site encodings are "absolute" displacements. - p = read_encoded_value (0, info.call_site_encoding, p, &cs_start); - p = read_encoded_value (0, info.call_site_encoding, p, &cs_len); - p = read_encoded_value (0, info.call_site_encoding, p, &cs_lp); - p = read_uleb128 (p, &cs_action); - - // The table is sorted, so if we've passed the ip, stop. - if (ip < info.Start + cs_start) - p = info.action_table; - else if (ip < info.Start + cs_start + cs_len) - { - if (cs_lp) - landing_pad = info.LPStart + cs_lp; - if (cs_action) - action_record = info.action_table + cs_action - 1; - goto found_something; - } - } -#endif // _GLIBCXX_SJLJ_EXCEPTIONS - - // If ip is not present in the table, call terminate. This is for - // a destructor inside a cleanup, or a library routine the compiler - // was not expecting to throw. - found_type = found_terminate; - goto do_something; - - found_something: - if (landing_pad == 0) - { - // If ip is present, and has a null landing pad, there are - // no cleanups or handlers to be run. - found_type = found_nothing; - } - else if (action_record == 0) - { - // If ip is present, has a non-null landing pad, and a null - // action table offset, then there are only cleanups present. - // Cleanups use a zero switch value, as set above. - found_type = found_cleanup; - } - else - { - // Otherwise we have a catch handler or exception specification. - - _sleb128_t ar_filter, ar_disp; - const std::type_info* catch_type; - _throw_typet* throw_type; - bool saw_cleanup = false; - bool saw_handler = false; - -#ifdef __ARM_EABI_UNWINDER__ - // ??? How does this work - more importantly, how does it interact with - // dependent exceptions? - throw_type = ue_header; - if (actions & _UA_FORCE_UNWIND) - { - __GXX_INIT_FORCED_UNWIND_CLASS(ue_header->exception_class); - } - else if (!foreign_exception) - thrown_ptr = __get_object_from_ue (ue_header); -#else -#ifdef __GXX_RTTI - // During forced unwinding, match a magic exception type. - if (actions & _UA_FORCE_UNWIND) - { - throw_type = &typeid(abi::__forced_unwind); - } - // With a foreign exception class, there's no exception type. - // ??? What to do about GNU Java and GNU Ada exceptions? - else if (foreign_exception) - { - throw_type = &typeid(abi::__foreign_exception); - } - else -#endif - { - thrown_ptr = __get_object_from_ue (ue_header); - throw_type = __get_exception_header_from_obj - (thrown_ptr)->exceptionType; - } -#endif - - while (1) - { - p = action_record; - p = read_sleb128 (p, &ar_filter); - read_sleb128 (p, &ar_disp); - - if (ar_filter == 0) - { - // Zero filter values are cleanups. - saw_cleanup = true; - } - else if (ar_filter > 0) - { - // Positive filter values are handlers. - catch_type = get_ttype_entry (&info, ar_filter); - - // Null catch type is a catch-all handler; we can catch foreign - // exceptions with this. Otherwise we must match types. - if (! catch_type - || (throw_type - && get_adjusted_ptr (catch_type, throw_type, - &thrown_ptr))) - { - saw_handler = true; - break; - } - } - else - { - // Negative filter values are exception specifications. - // ??? How do foreign exceptions fit in? As far as I can - // see we can't match because there's no __cxa_exception - // object to stuff bits in for __cxa_call_unexpected to use. - // Allow them iff the exception spec is non-empty. I.e. - // a throw() specification results in __unexpected. - if ((throw_type - && !(actions & _UA_FORCE_UNWIND) - && !foreign_exception) - ? ! check_exception_spec (&info, throw_type, thrown_ptr, - ar_filter) - : empty_exception_spec (&info, ar_filter)) - { - saw_handler = true; - break; - } - } - - if (ar_disp == 0) - break; - action_record = p + ar_disp; - } - - if (saw_handler) - { - handler_switch_value = ar_filter; - found_type = found_handler; - } - else - found_type = (saw_cleanup ? found_cleanup : found_nothing); - } - - do_something: - if (found_type == found_nothing) - CONTINUE_UNWINDING; - - if (actions & _UA_SEARCH_PHASE) - { - if (found_type == found_cleanup) - CONTINUE_UNWINDING; - - // For domestic exceptions, we cache data from phase 1 for phase 2. - if (!foreign_exception) - { - save_caught_exception(ue_header, context, thrown_ptr, - handler_switch_value, language_specific_data, - landing_pad, action_record); - } - return _URC_HANDLER_FOUND; - } - - install_context: - - // We can't use any of the cxa routines with foreign exceptions, - // because they all expect ue_header to be a struct __cxa_exception. - // So in that case, call terminate or unexpected directly. - if ((actions & _UA_FORCE_UNWIND) - || foreign_exception) - { - if (found_type == found_terminate) - std::terminate (); - else if (handler_switch_value < 0) - { - __try - { std::unexpected (); } - __catch(...) - { std::terminate (); } - } - } - else - { - if (found_type == found_terminate) - __cxa_call_terminate(ue_header); - - // Cache the TType base value for __cxa_call_unexpected, as we won't - // have an _Unwind_Context then. - if (handler_switch_value < 0) - { - parse_lsda_header (context, language_specific_data, &info); - info.ttype_base = base_of_encoded_value (info.ttype_encoding, - context); - -#ifdef __ARM_EABI_UNWINDER__ - const _Unwind_Word* e; - _Unwind_Word n; - - e = ((const _Unwind_Word*) info.TType) - handler_switch_value - 1; - // Count the number of rtti objects. - n = 0; - while (e[n] != 0) - n++; - - // Count. - ue_header->barrier_cache.bitpattern[1] = n; - // Base - ue_header->barrier_cache.bitpattern[2] = info.ttype_base; - // Stride. - ue_header->barrier_cache.bitpattern[3] = 4; - // List head. - ue_header->barrier_cache.bitpattern[4] = (_Unwind_Word) e; -#else - xh->catchTemp = base_of_encoded_value (info.ttype_encoding, context); -#endif - } - } - - /* For targets with pointers smaller than the word size, we must extend the - pointer, and this extension is target dependent. */ - _Unwind_SetGR (context, __builtin_eh_return_data_regno (0), - __builtin_extend_pointer (ue_header)); - _Unwind_SetGR (context, __builtin_eh_return_data_regno (1), - handler_switch_value); - _Unwind_SetIP (context, landing_pad); -#ifdef __ARM_EABI_UNWINDER__ - if (found_type == found_cleanup) - __cxa_begin_cleanup(ue_header); -#endif - return _URC_INSTALL_CONTEXT; -} - -/* The ARM EABI implementation of __cxa_call_unexpected is in a - different file so that the personality routine (PR) can be used - standalone. The generic routine shared datastructures with the PR - so it is most convenient to implement it here. */ -#ifndef __ARM_EABI_UNWINDER__ -extern "C" void -__cxa_call_unexpected (void *exc_obj_in) -{ - _Unwind_Exception *exc_obj - = reinterpret_cast <_Unwind_Exception *>(exc_obj_in); - - __cxa_begin_catch (exc_obj); - - // This function is a handler for our exception argument. If we exit - // by throwing a different exception, we'll need the original cleaned up. - struct end_catch_protect - { - end_catch_protect() { } - ~end_catch_protect() { __cxa_end_catch(); } - } end_catch_protect_obj; - - lsda_header_info info; - __cxa_exception *xh = __get_exception_header_from_ue (exc_obj); - const unsigned char *xh_lsda; - _Unwind_Sword xh_switch_value; - std::terminate_handler xh_terminate_handler; - - // If the unexpectedHandler rethrows the exception (e.g. to categorize it), - // it will clobber data about the current handler. So copy the data out now. - xh_lsda = xh->languageSpecificData; - xh_switch_value = xh->handlerSwitchValue; - xh_terminate_handler = xh->terminateHandler; - info.ttype_base = (_Unwind_Ptr) xh->catchTemp; - - __try - { __unexpected (xh->unexpectedHandler); } - __catch(...) - { - // Get the exception thrown from unexpected. - - __cxa_eh_globals *globals = __cxa_get_globals_fast (); - __cxa_exception *new_xh = globals->caughtExceptions; - void *new_ptr = __get_object_from_ambiguous_exception (new_xh); - - // We don't quite have enough stuff cached; re-parse the LSDA. - parse_lsda_header (0, xh_lsda, &info); - - // If this new exception meets the exception spec, allow it. - if (check_exception_spec (&info, __get_exception_header_from_obj - (new_ptr)->exceptionType, - new_ptr, xh_switch_value)) - __throw_exception_again; - - // If the exception spec allows std::bad_exception, throw that. - // We don't have a thrown object to compare against, but since - // bad_exception doesn't have virtual bases, that's OK; just pass 0. -#if defined(__EXCEPTIONS) && defined(__GXX_RTTI) - const std::type_info &bad_exc = typeid (std::bad_exception); - if (check_exception_spec (&info, &bad_exc, 0, xh_switch_value)) - throw std::bad_exception(); -#endif - - // Otherwise, die. - __terminate (xh_terminate_handler); - } -} -#endif - -} // namespace __cxxabiv1 diff --git a/contrib/sdk/sources/libsupc++/eh_term_handler.cc b/contrib/sdk/sources/libsupc++/eh_term_handler.cc deleted file mode 100644 index 52a074596..000000000 --- a/contrib/sdk/sources/libsupc++/eh_term_handler.cc +++ /dev/null @@ -1,46 +0,0 @@ -// -*- C++ -*- std::terminate handler -// Copyright (C) 2002, 2003, 2009 Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include "unwind-cxx.h" - -/* We default to the talkative, informative handler in a normal hosted - library. This pulls in the demangler, the dyn-string utilities, and - elements of the I/O library. For a low-memory environment, you can return - to the earlier "silent death" handler by including , initializing - to "std::abort", and rebuilding the library. In a freestanding mode, we - default to this latter approach. */ - -#if ! _GLIBCXX_HOSTED -# include -#endif - -/* The current installed user handler. */ -std::terminate_handler __cxxabiv1::__terminate_handler = -#if _GLIBCXX_HOSTED - __gnu_cxx::__verbose_terminate_handler; -#else - std::abort; -#endif - diff --git a/contrib/sdk/sources/libsupc++/eh_terminate.cc b/contrib/sdk/sources/libsupc++/eh_terminate.cc deleted file mode 100644 index 87359d09f..000000000 --- a/contrib/sdk/sources/libsupc++/eh_terminate.cc +++ /dev/null @@ -1,80 +0,0 @@ -// -*- C++ -*- std::terminate, std::unexpected and friends. -// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2009, -// 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "typeinfo" -#include "exception" -#include -#include "unwind-cxx.h" -#include - -using namespace __cxxabiv1; - -void -__cxxabiv1::__terminate (std::terminate_handler handler) throw () -{ - __try - { - handler (); - std::abort (); - } - __catch(...) - { std::abort (); } -} - -void -std::terminate () throw() -{ - __terminate (__terminate_handler); -} - -void -__cxxabiv1::__unexpected (std::unexpected_handler handler) -{ - handler(); - std::terminate (); -} - -void -std::unexpected () -{ - __unexpected (__unexpected_handler); -} - -std::terminate_handler -std::set_terminate (std::terminate_handler func) throw() -{ - std::terminate_handler old = __terminate_handler; - __terminate_handler = func; - return old; -} - -std::unexpected_handler -std::set_unexpected (std::unexpected_handler func) throw() -{ - std::unexpected_handler old = __unexpected_handler; - __unexpected_handler = func; - return old; -} diff --git a/contrib/sdk/sources/libsupc++/eh_throw.cc b/contrib/sdk/sources/libsupc++/eh_throw.cc deleted file mode 100644 index e78f8e754..000000000 --- a/contrib/sdk/sources/libsupc++/eh_throw.cc +++ /dev/null @@ -1,117 +0,0 @@ -// -*- C++ -*- Exception handling routines for throwing. -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, -// 2011, 2012 Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include "unwind-cxx.h" - -using namespace __cxxabiv1; - - -static void -__gxx_exception_cleanup (_Unwind_Reason_Code code, _Unwind_Exception *exc) -{ - // This cleanup is set only for primaries. - __cxa_refcounted_exception *header - = __get_refcounted_exception_header_from_ue (exc); - - // We only want to be called through _Unwind_DeleteException. - // _Unwind_DeleteException in the HP-UX IA64 libunwind library - // returns _URC_NO_REASON and not _URC_FOREIGN_EXCEPTION_CAUGHT - // like the GCC _Unwind_DeleteException function does. - if (code != _URC_FOREIGN_EXCEPTION_CAUGHT && code != _URC_NO_REASON) - __terminate (header->exc.terminateHandler); - -#if ATOMIC_INT_LOCK_FREE > 1 - if (__atomic_sub_fetch (&header->referenceCount, 1, __ATOMIC_ACQ_REL) == 0) - { -#endif - if (header->exc.exceptionDestructor) - header->exc.exceptionDestructor (header + 1); - - __cxa_free_exception (header + 1); -#if ATOMIC_INT_LOCK_FREE > 1 - } -#endif -} - - -extern "C" void -__cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, - void (_GLIBCXX_CDTOR_CALLABI *dest) (void *)) -{ - // Definitely a primary. - __cxa_refcounted_exception *header - = __get_refcounted_exception_header_from_obj (obj); - header->referenceCount = 1; - header->exc.exceptionType = tinfo; - header->exc.exceptionDestructor = dest; - header->exc.unexpectedHandler = __unexpected_handler; - header->exc.terminateHandler = __terminate_handler; - __GXX_INIT_PRIMARY_EXCEPTION_CLASS(header->exc.unwindHeader.exception_class); - header->exc.unwindHeader.exception_cleanup = __gxx_exception_cleanup; - -#ifdef _GLIBCXX_SJLJ_EXCEPTIONS - _Unwind_SjLj_RaiseException (&header->exc.unwindHeader); -#else - _Unwind_RaiseException (&header->exc.unwindHeader); -#endif - - // Some sort of unwinding error. Note that terminate is a handler. - __cxa_begin_catch (&header->exc.unwindHeader); - std::terminate (); -} - -extern "C" void -__cxxabiv1::__cxa_rethrow () -{ - __cxa_eh_globals *globals = __cxa_get_globals (); - __cxa_exception *header = globals->caughtExceptions; - - globals->uncaughtExceptions += 1; - - // Watch for luser rethrowing with no active exception. - if (header) - { - // Tell __cxa_end_catch this is a rethrow. - if (!__is_gxx_exception_class(header->unwindHeader.exception_class)) - globals->caughtExceptions = 0; - else - header->handlerCount = -header->handlerCount; - -#ifdef _GLIBCXX_SJLJ_EXCEPTIONS - _Unwind_SjLj_Resume_or_Rethrow (&header->unwindHeader); -#else -#if defined(_LIBUNWIND_STD_ABI) - _Unwind_RaiseException (&header->unwindHeader); -#else - _Unwind_Resume_or_Rethrow (&header->unwindHeader); -#endif -#endif - - // Some sort of unwinding error. Note that terminate is a handler. - __cxa_begin_catch (&header->unwindHeader); - } - std::terminate (); -} diff --git a/contrib/sdk/sources/libsupc++/eh_type.cc b/contrib/sdk/sources/libsupc++/eh_type.cc deleted file mode 100644 index 245e0eaab..000000000 --- a/contrib/sdk/sources/libsupc++/eh_type.cc +++ /dev/null @@ -1,54 +0,0 @@ -// -*- C++ -*- Exception handling routines for catching. -// Copyright (C) 2001, 2008, 2009, 2011 Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - - -#include -#include -#include "unwind-cxx.h" - -namespace __cxxabiv1 -{ - -// Returns the type_info for the currently handled exception [15.3/8], or -// null if there is none. -extern "C" -std::type_info *__cxa_current_exception_type () _GLIBCXX_NOTHROW -{ - __cxa_eh_globals *globals = __cxa_get_globals (); - __cxa_exception *header = globals->caughtExceptions; - if (header) - { - if (__is_dependent_exception (header->unwindHeader.exception_class)) - { - __cxa_dependent_exception *de = - __get_dependent_exception_from_ue (&header->unwindHeader); - header = __get_exception_header_from_obj (de->primaryException); - } - return header->exceptionType; - } - else - return 0; -} - -} // namespace __cxxabiv1 diff --git a/contrib/sdk/sources/libsupc++/eh_unex_handler.cc b/contrib/sdk/sources/libsupc++/eh_unex_handler.cc deleted file mode 100644 index e4f390620..000000000 --- a/contrib/sdk/sources/libsupc++/eh_unex_handler.cc +++ /dev/null @@ -1,29 +0,0 @@ -// -*- C++ -*- std::unexpected handler -// Copyright (C) 2002, 2009 Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "unwind-cxx.h" - -/* The current installed user handler. */ -std::unexpected_handler __cxxabiv1::__unexpected_handler = std::terminate; - diff --git a/contrib/sdk/sources/libsupc++/exception b/contrib/sdk/sources/libsupc++/exception deleted file mode 100644 index 94a0bcbc6..000000000 --- a/contrib/sdk/sources/libsupc++/exception +++ /dev/null @@ -1,158 +0,0 @@ -// Exception Handling support header for -*- C++ -*- - -// Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, -// 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file exception - * This is a Standard C++ Library header. - */ - -#ifndef __EXCEPTION__ -#define __EXCEPTION__ - -#pragma GCC system_header - -#pragma GCC visibility push(default) - -#include -#include - -extern "C++" { - -namespace std -{ - /** - * @defgroup exceptions Exceptions - * @ingroup diagnostics - * - * Classes and functions for reporting errors via exception classes. - * @{ - */ - - /** - * @brief Base class for all library exceptions. - * - * This is the base class for all exceptions thrown by the standard - * library, and by certain language expressions. You are free to derive - * your own %exception classes, or use a different hierarchy, or to - * throw non-class data (e.g., fundamental types). - */ - class exception - { - public: - exception() _GLIBCXX_USE_NOEXCEPT { } - virtual ~exception() _GLIBCXX_USE_NOEXCEPT; - - /** Returns a C-style character string describing the general cause - * of the current error. */ - virtual const char* what() const _GLIBCXX_USE_NOEXCEPT; - }; - - /** If an %exception is thrown which is not listed in a function's - * %exception specification, one of these may be thrown. */ - class bad_exception : public exception - { - public: - bad_exception() _GLIBCXX_USE_NOEXCEPT { } - - // This declaration is not useless: - // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 - virtual ~bad_exception() _GLIBCXX_USE_NOEXCEPT; - - // See comment in eh_exception.cc. - virtual const char* what() const _GLIBCXX_USE_NOEXCEPT; - }; - - /// If you write a replacement %terminate handler, it must be of this type. - typedef void (*terminate_handler) (); - - /// If you write a replacement %unexpected handler, it must be of this type. - typedef void (*unexpected_handler) (); - - /// Takes a new handler function as an argument, returns the old function. - terminate_handler set_terminate(terminate_handler) _GLIBCXX_USE_NOEXCEPT; - - /** The runtime will call this function if %exception handling must be - * abandoned for any reason. It can also be called by the user. */ - void terminate() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__noreturn__)); - - /// Takes a new handler function as an argument, returns the old function. - unexpected_handler set_unexpected(unexpected_handler) _GLIBCXX_USE_NOEXCEPT; - - /** The runtime will call this function if an %exception is thrown which - * violates the function's %exception specification. */ - void unexpected() __attribute__ ((__noreturn__)); - - /** [18.6.4]/1: 'Returns true after completing evaluation of a - * throw-expression until either completing initialization of the - * exception-declaration in the matching handler or entering @c unexpected() - * due to the throw; or after entering @c terminate() for any reason - * other than an explicit call to @c terminate(). [Note: This includes - * stack unwinding [15.2]. end note]' - * - * 2: 'When @c uncaught_exception() is true, throwing an - * %exception can result in a call of @c terminate() - * (15.5.1).' - */ - bool uncaught_exception() _GLIBCXX_USE_NOEXCEPT __attribute__ ((__pure__)); - - // @} group exceptions -} // namespace std - -namespace __gnu_cxx -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - - /** - * @brief A replacement for the standard terminate_handler which - * prints more information about the terminating exception (if any) - * on stderr. - * - * @ingroup exceptions - * - * Call - * @code - * std::set_terminate(__gnu_cxx::__verbose_terminate_handler) - * @endcode - * to use. For more info, see - * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt02ch06s02.html - * - * In 3.4 and later, this is on by default. - */ - void __verbose_terminate_handler(); - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace - -} // extern "C++" - -#pragma GCC visibility pop - -#if defined(__GXX_EXPERIMENTAL_CXX0X__) && (ATOMIC_INT_LOCK_FREE > 1) -#include -#include -#endif - -#endif diff --git a/contrib/sdk/sources/libsupc++/exception_defines.h b/contrib/sdk/sources/libsupc++/exception_defines.h deleted file mode 100644 index 269937cff..000000000 --- a/contrib/sdk/sources/libsupc++/exception_defines.h +++ /dev/null @@ -1,47 +0,0 @@ -// -fno-exceptions Support -*- C++ -*- - -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2006, 2007, 2008, 2009, -// 2011 -// Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file bits/exception_defines.h - * This is an internal header file, included by other library headers. - * Do not attempt to use it directly. @headername{exception} - */ - -#ifndef _EXCEPTION_DEFINES_H -#define _EXCEPTION_DEFINES_H 1 - -#ifndef __EXCEPTIONS -// Iff -fno-exceptions, transform error handling code to work without it. -# define __try if (true) -# define __catch(X) if (false) -# define __throw_exception_again -#else -// Else proceed normally. -# define __try try -# define __catch(X) catch(X) -# define __throw_exception_again throw -#endif - -#endif diff --git a/contrib/sdk/sources/libsupc++/gthr-default.h b/contrib/sdk/sources/libsupc++/gthr-default.h deleted file mode 100644 index 53f8396cc..000000000 --- a/contrib/sdk/sources/libsupc++/gthr-default.h +++ /dev/null @@ -1,772 +0,0 @@ -/* Threads compatibility routines for libgcc2 and libobjc. */ -/* Compile this one with gcc. */ - -/* Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2008, 2009 - Free Software Foundation, Inc. - Contributed by Mumit Khan . - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 3, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#ifndef GCC_GTHR_WIN32_H -#define GCC_GTHR_WIN32_H - -/* Make sure CONST_CAST2 (origin in system.h) is declared. */ -#ifndef CONST_CAST2 -#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq) -#endif - -/* Windows32 threads specific definitions. The windows32 threading model - does not map well into pthread-inspired gcc's threading model, and so - there are caveats one needs to be aware of. - - 1. The destructor supplied to __gthread_key_create is ignored for - generic x86-win32 ports. This will certainly cause memory leaks - due to unreclaimed eh contexts (sizeof (eh_context) is at least - 24 bytes for x86 currently). - - This memory leak may be significant for long-running applications - that make heavy use of C++ EH. - - However, Mingw runtime (version 0.3 or newer) provides a mechanism - to emulate pthreads key dtors; the runtime provides a special DLL, - linked in if -mthreads option is specified, that runs the dtors in - the reverse order of registration when each thread exits. If - -mthreads option is not given, a stub is linked in instead of the - DLL, which results in memory leak. Other x86-win32 ports can use - the same technique of course to avoid the leak. - - 2. The error codes returned are non-POSIX like, and cast into ints. - This may cause incorrect error return due to truncation values on - hw where sizeof (DWORD) > sizeof (int). - - 3. We are currently using a special mutex instead of the Critical - Sections, since Win9x does not support TryEnterCriticalSection - (while NT does). - - The basic framework should work well enough. In the long term, GCC - needs to use Structured Exception Handling on Windows32. */ - -#define __GTHREADS 1 - -#include -#ifdef __MINGW32__ -#include <_mingw.h> -#endif - -#ifndef __UNUSED_PARAM -#define __UNUSED_PARAM(x) x -#endif - -#ifdef _LIBOBJC - -/* This is necessary to prevent windef.h (included from windows.h) from - defining its own BOOL as a typedef. */ -#ifndef __OBJC__ -#define __OBJC__ -#endif -#include -/* Now undef the windows BOOL. */ -#undef BOOL - -/* Key structure for maintaining thread specific storage */ -static DWORD __gthread_objc_data_tls = (DWORD) -1; - -/* Backend initialization functions */ - -/* Initialize the threads subsystem. */ -int -__gthread_objc_init_thread_system (void) -{ - /* Initialize the thread storage key. */ - if ((__gthread_objc_data_tls = TlsAlloc ()) != (DWORD) -1) - return 0; - else - return -1; -} - -/* Close the threads subsystem. */ -int -__gthread_objc_close_thread_system (void) -{ - if (__gthread_objc_data_tls != (DWORD) -1) - TlsFree (__gthread_objc_data_tls); - return 0; -} - -/* Backend thread functions */ - -/* Create a new thread of execution. */ -objc_thread_t -__gthread_objc_thread_detach (void (*func)(void *arg), void *arg) -{ - DWORD thread_id = 0; - HANDLE win32_handle; - - if (!(win32_handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) func, - arg, 0, &thread_id))) - thread_id = 0; - - return (objc_thread_t) (INT_PTR) thread_id; -} - -/* Set the current thread's priority. */ -int -__gthread_objc_thread_set_priority (int priority) -{ - int sys_priority = 0; - - switch (priority) - { - case OBJC_THREAD_INTERACTIVE_PRIORITY: - sys_priority = THREAD_PRIORITY_NORMAL; - break; - default: - case OBJC_THREAD_BACKGROUND_PRIORITY: - sys_priority = THREAD_PRIORITY_BELOW_NORMAL; - break; - case OBJC_THREAD_LOW_PRIORITY: - sys_priority = THREAD_PRIORITY_LOWEST; - break; - } - - /* Change priority */ - if (SetThreadPriority (GetCurrentThread (), sys_priority)) - return 0; - else - return -1; -} - -/* Return the current thread's priority. */ -int -__gthread_objc_thread_get_priority (void) -{ - int sys_priority; - - sys_priority = GetThreadPriority (GetCurrentThread ()); - - switch (sys_priority) - { - case THREAD_PRIORITY_HIGHEST: - case THREAD_PRIORITY_TIME_CRITICAL: - case THREAD_PRIORITY_ABOVE_NORMAL: - case THREAD_PRIORITY_NORMAL: - return OBJC_THREAD_INTERACTIVE_PRIORITY; - - default: - case THREAD_PRIORITY_BELOW_NORMAL: - return OBJC_THREAD_BACKGROUND_PRIORITY; - - case THREAD_PRIORITY_IDLE: - case THREAD_PRIORITY_LOWEST: - return OBJC_THREAD_LOW_PRIORITY; - } - - /* Couldn't get priority. */ - return -1; -} - -/* Yield our process time to another thread. */ -void -__gthread_objc_thread_yield (void) -{ - Sleep (0); -} - -/* Terminate the current thread. */ -int -__gthread_objc_thread_exit (void) -{ - /* exit the thread */ - ExitThread (__objc_thread_exit_status); - - /* Failed if we reached here */ - return -1; -} - -/* Returns an integer value which uniquely describes a thread. */ -objc_thread_t -__gthread_objc_thread_id (void) -{ - return (objc_thread_t) (INT_PTR) GetCurrentThreadId (); -} - -/* Sets the thread's local storage pointer. */ -int -__gthread_objc_thread_set_data (void *value) -{ - if (TlsSetValue (__gthread_objc_data_tls, value)) - return 0; - else - return -1; -} - -/* Returns the thread's local storage pointer. */ -void * -__gthread_objc_thread_get_data (void) -{ - DWORD lasterror; - void *ptr; - - lasterror = GetLastError (); - - ptr = TlsGetValue (__gthread_objc_data_tls); /* Return thread data. */ - - SetLastError (lasterror); - - return ptr; -} - -/* Backend mutex functions */ - -/* Allocate a mutex. */ -int -__gthread_objc_mutex_allocate (objc_mutex_t mutex) -{ - if ((mutex->backend = (void *) CreateMutex (NULL, 0, NULL)) == NULL) - return -1; - else - return 0; -} - -/* Deallocate a mutex. */ -int -__gthread_objc_mutex_deallocate (objc_mutex_t mutex) -{ - CloseHandle ((HANDLE) (mutex->backend)); - return 0; -} - -/* Grab a lock on a mutex. */ -int -__gthread_objc_mutex_lock (objc_mutex_t mutex) -{ - int status; - - status = WaitForSingleObject ((HANDLE) (mutex->backend), INFINITE); - if (status != WAIT_OBJECT_0 && status != WAIT_ABANDONED) - return -1; - else - return 0; -} - -/* Try to grab a lock on a mutex. */ -int -__gthread_objc_mutex_trylock (objc_mutex_t mutex) -{ - int status; - - status = WaitForSingleObject ((HANDLE) (mutex->backend), 0); - if (status != WAIT_OBJECT_0 && status != WAIT_ABANDONED) - return -1; - else - return 0; -} - -/* Unlock the mutex */ -int -__gthread_objc_mutex_unlock (objc_mutex_t mutex) -{ - if (ReleaseMutex ((HANDLE) (mutex->backend)) == 0) - return -1; - else - return 0; -} - -/* Backend condition mutex functions */ - -/* Allocate a condition. */ -int -__gthread_objc_condition_allocate (objc_condition_t __UNUSED_PARAM(condition)) -{ - /* Unimplemented. */ - return -1; -} - -/* Deallocate a condition. */ -int -__gthread_objc_condition_deallocate (objc_condition_t __UNUSED_PARAM(condition)) -{ - /* Unimplemented. */ - return -1; -} - -/* Wait on the condition */ -int -__gthread_objc_condition_wait (objc_condition_t __UNUSED_PARAM(condition), - objc_mutex_t __UNUSED_PARAM(mutex)) -{ - /* Unimplemented. */ - return -1; -} - -/* Wake up all threads waiting on this condition. */ -int -__gthread_objc_condition_broadcast (objc_condition_t __UNUSED_PARAM(condition)) -{ - /* Unimplemented. */ - return -1; -} - -/* Wake up one thread waiting on this condition. */ -int -__gthread_objc_condition_signal (objc_condition_t __UNUSED_PARAM(condition)) -{ - /* Unimplemented. */ - return -1; -} - -#else /* _LIBOBJC */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef unsigned long __gthread_key_t; - -typedef struct { - int done; - long started; -} __gthread_once_t; - -typedef struct { - long counter; - void *sema; -} __gthread_mutex_t; - -typedef struct { - long counter; - long depth; - unsigned long owner; - void *sema; -} __gthread_recursive_mutex_t; - -#define __GTHREAD_ONCE_INIT {0, -1} -#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function -#define __GTHREAD_MUTEX_INIT_DEFAULT {-1, 0} -#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION \ - __gthread_recursive_mutex_init_function -#define __GTHREAD_RECURSIVE_MUTEX_INIT_DEFAULT {-1, 0, 0, 0} - -#if defined (_WIN32) && !defined(__CYGWIN__) -#define MINGW32_SUPPORTS_MT_EH 1 -/* Mingw runtime >= v0.3 provides a magic variable that is set to nonzero - if -mthreads option was specified, or 0 otherwise. This is to get around - the lack of weak symbols in PE-COFF. */ -extern int _CRT_MT; -extern int __mingwthr_key_dtor (unsigned long, void (*) (void *)); -#endif /* _WIN32 && !__CYGWIN__ */ - -/* The Windows95 kernel does not export InterlockedCompareExchange. - This provides a substitute. When building apps that reference - gthread_mutex_try_lock, the __GTHREAD_I486_INLINE_LOCK_PRIMITIVES - macro must be defined if Windows95 is a target. Currently - gthread_mutex_try_lock is not referenced by libgcc or libstdc++. */ -#ifdef __GTHREAD_I486_INLINE_LOCK_PRIMITIVES -static inline long -__gthr_i486_lock_cmp_xchg(long *__dest, long __xchg, long __comperand) -{ - long result; - __asm__ __volatile__ ("\n\ - lock\n\ - cmpxchg{l} {%4, %1|%1, %4}\n" - : "=a" (result), "=m" (*__dest) - : "0" (__comperand), "m" (*__dest), "r" (__xchg) - : "cc"); - return result; -} -#define __GTHR_W32_InterlockedCompareExchange __gthr_i486_lock_cmp_xchg -#else /* __GTHREAD_I486_INLINE_LOCK_PRIMITIVES */ -#define __GTHR_W32_InterlockedCompareExchange InterlockedCompareExchange -#endif /* __GTHREAD_I486_INLINE_LOCK_PRIMITIVES */ - -static inline int -__gthread_active_p (void) -{ -#ifdef MINGW32_SUPPORTS_MT_EH - return _CRT_MT; -#else - return 1; -#endif -} - -#if __GTHREAD_HIDE_WIN32API - -/* The implementations are in config/i386/gthr-win32.c in libgcc.a. - Only stubs are exposed to avoid polluting the C++ namespace with - windows api definitions. */ - -extern int __gthr_win32_once (__gthread_once_t *, void (*) (void)); -extern int __gthr_win32_key_create (__gthread_key_t *, void (*) (void*)); -extern int __gthr_win32_key_delete (__gthread_key_t); -extern void * __gthr_win32_getspecific (__gthread_key_t); -extern int __gthr_win32_setspecific (__gthread_key_t, const void *); -extern void __gthr_win32_mutex_init_function (__gthread_mutex_t *); -extern int __gthr_win32_mutex_lock (__gthread_mutex_t *); -extern int __gthr_win32_mutex_trylock (__gthread_mutex_t *); -extern int __gthr_win32_mutex_unlock (__gthread_mutex_t *); -extern void - __gthr_win32_recursive_mutex_init_function (__gthread_recursive_mutex_t *); -extern int __gthr_win32_recursive_mutex_lock (__gthread_recursive_mutex_t *); -extern int - __gthr_win32_recursive_mutex_trylock (__gthread_recursive_mutex_t *); -extern int __gthr_win32_recursive_mutex_unlock (__gthread_recursive_mutex_t *); -extern void __gthr_win32_mutex_destroy (__gthread_mutex_t *); - -static inline int -__gthread_once (__gthread_once_t *__once, void (*__func) (void)) -{ - if (__gthread_active_p ()) - return __gthr_win32_once (__once, __func); - else - return -1; -} - -static inline int -__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) -{ - return __gthr_win32_key_create (__key, __dtor); -} - -static inline int -__gthread_key_delete (__gthread_key_t __key) -{ - return __gthr_win32_key_delete (__key); -} - -static inline void * -__gthread_getspecific (__gthread_key_t __key) -{ - return __gthr_win32_getspecific (__key); -} - -static inline int -__gthread_setspecific (__gthread_key_t __key, const void *__ptr) -{ - return __gthr_win32_setspecific (__key, __ptr); -} - -static inline void -__gthread_mutex_init_function (__gthread_mutex_t *__mutex) -{ - __gthr_win32_mutex_init_function (__mutex); -} - -static inline void -__gthread_mutex_destroy (__gthread_mutex_t *__mutex) -{ - __gthr_win32_mutex_destroy (__mutex); -} - -static inline int -__gthread_mutex_lock (__gthread_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - return __gthr_win32_mutex_lock (__mutex); - else - return 0; -} - -static inline int -__gthread_mutex_trylock (__gthread_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - return __gthr_win32_mutex_trylock (__mutex); - else - return 0; -} - -static inline int -__gthread_mutex_unlock (__gthread_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - return __gthr_win32_mutex_unlock (__mutex); - else - return 0; -} - -static inline void -__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) -{ - __gthr_win32_recursive_mutex_init_function (__mutex); -} - -static inline int -__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - return __gthr_win32_recursive_mutex_lock (__mutex); - else - return 0; -} - -static inline int -__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - return __gthr_win32_recursive_mutex_trylock (__mutex); - else - return 0; -} - -static inline int -__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - return __gthr_win32_recursive_mutex_unlock (__mutex); - else - return 0; -} - -#else /* ! __GTHREAD_HIDE_WIN32API */ - -#include -#include - -static inline int -__gthread_once (__gthread_once_t *__once, void (*__func) (void)) -{ - if (! __gthread_active_p ()) - return -1; - else if (__once == NULL || __func == NULL) - return EINVAL; - - if (! __once->done) - { - if (InterlockedIncrement (&(__once->started)) == 0) - { - (*__func) (); - __once->done = TRUE; - } - else - { - /* Another thread is currently executing the code, so wait for it - to finish; yield the CPU in the meantime. If performance - does become an issue, the solution is to use an Event that - we wait on here (and set above), but that implies a place to - create the event before this routine is called. */ - while (! __once->done) - Sleep (0); - } - } - - return 0; -} - -/* Windows32 thread local keys don't support destructors; this leads to - leaks, especially in threaded applications making extensive use of - C++ EH. Mingw uses a thread-support DLL to work-around this problem. */ -static inline int -__gthread_key_create (__gthread_key_t *__key, - void (*__dtor) (void *) __attribute__((unused))) -{ - int __status = 0; - DWORD __tls_index = TlsAlloc (); - if (__tls_index != 0xFFFFFFFF) - { - *__key = __tls_index; -#ifdef MINGW32_SUPPORTS_MT_EH - /* Mingw runtime will run the dtors in reverse order for each thread - when the thread exits. */ - __status = __mingwthr_key_dtor (*__key, __dtor); -#endif - } - else - __status = (int) GetLastError (); - return __status; -} - -static inline int -__gthread_key_delete (__gthread_key_t __key) -{ - return (TlsFree (__key) != 0) ? 0 : (int) GetLastError (); -} - -static inline void * -__gthread_getspecific (__gthread_key_t __key) -{ - DWORD __lasterror; - void *__ptr; - - __lasterror = GetLastError (); - - __ptr = TlsGetValue (__key); - - SetLastError (__lasterror); - - return __ptr; -} - -static inline int -__gthread_setspecific (__gthread_key_t __key, const void *__ptr) -{ - if (TlsSetValue (__key, CONST_CAST2(void *, const void *, __ptr)) != 0) - return 0; - else - return GetLastError (); -} - -static inline void -__gthread_mutex_init_function (__gthread_mutex_t *__mutex) -{ - __mutex->counter = -1; - __mutex->sema = CreateSemaphore (NULL, 0, 65535, NULL); -} - -static inline void -__gthread_mutex_destroy (__gthread_mutex_t *__mutex) -{ - CloseHandle ((HANDLE) __mutex->sema); -} - -static inline int -__gthread_mutex_lock (__gthread_mutex_t *__mutex) -{ - int __status = 0; - - if (__gthread_active_p ()) - { - if (InterlockedIncrement (&__mutex->counter) == 0 || - WaitForSingleObject (__mutex->sema, INFINITE) == WAIT_OBJECT_0) - __status = 0; - else - { - /* WaitForSingleObject returns WAIT_FAILED, and we can only do - some best-effort cleanup here. */ - InterlockedDecrement (&__mutex->counter); - __status = 1; - } - } - return __status; -} - -static inline int -__gthread_mutex_trylock (__gthread_mutex_t *__mutex) -{ - int __status = 0; - - if (__gthread_active_p ()) - { - if (__GTHR_W32_InterlockedCompareExchange (&__mutex->counter, 0, -1) < 0) - __status = 0; - else - __status = 1; - } - return __status; -} - -static inline int -__gthread_mutex_unlock (__gthread_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - { - if (InterlockedDecrement (&__mutex->counter) >= 0) - return ReleaseSemaphore (__mutex->sema, 1, NULL) ? 0 : 1; - } - return 0; -} - -static inline void -__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) -{ - __mutex->counter = -1; - __mutex->depth = 0; - __mutex->owner = 0; - __mutex->sema = CreateSemaphore (NULL, 0, 65535, NULL); -} - -static inline int -__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - { - DWORD __me = GetCurrentThreadId(); - if (InterlockedIncrement (&__mutex->counter) == 0) - { - __mutex->depth = 1; - __mutex->owner = __me; - } - else if (__mutex->owner == __me) - { - InterlockedDecrement (&__mutex->counter); - ++(__mutex->depth); - } - else if (WaitForSingleObject (__mutex->sema, INFINITE) == WAIT_OBJECT_0) - { - __mutex->depth = 1; - __mutex->owner = __me; - } - else - { - /* WaitForSingleObject returns WAIT_FAILED, and we can only do - some best-effort cleanup here. */ - InterlockedDecrement (&__mutex->counter); - return 1; - } - } - return 0; -} - -static inline int -__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - { - DWORD __me = GetCurrentThreadId(); - if (__GTHR_W32_InterlockedCompareExchange (&__mutex->counter, 0, -1) < 0) - { - __mutex->depth = 1; - __mutex->owner = __me; - } - else if (__mutex->owner == __me) - ++(__mutex->depth); - else - return 1; - } - return 0; -} - -static inline int -__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) -{ - if (__gthread_active_p ()) - { - --(__mutex->depth); - if (__mutex->depth == 0) - { - __mutex->owner = 0; - - if (InterlockedDecrement (&__mutex->counter) >= 0) - return ReleaseSemaphore (__mutex->sema, 1, NULL) ? 0 : 1; - } - } - return 0; -} - -#endif /* __GTHREAD_HIDE_WIN32API */ - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBOBJC */ - -#endif /* ! GCC_GTHR_WIN32_H */ diff --git a/contrib/sdk/sources/libsupc++/gthr_mutex.c b/contrib/sdk/sources/libsupc++/gthr_mutex.c deleted file mode 100644 index f5cb8eb1a..000000000 --- a/contrib/sdk/sources/libsupc++/gthr_mutex.c +++ /dev/null @@ -1,150 +0,0 @@ -#include -#include -#include - -void __mutex_lock(volatile int *val); - -static inline int tls_get(int key) -{ - int val; - __asm__ __volatile__( - "movl %%fs:(%1), %0" - :"=r"(val) - :"r"(key)); - - return val; -}; - -typedef struct { - int done; - long started; -} __gthread_once_t; - -typedef struct { - int counter; - void *sema; -} __gthread_mutex_t; - -typedef struct { - int counter; - int depth; - unsigned long owner; - int sema; -} __gthread_recursive_mutex_t; - - -int -__gthr_win32_once (__gthread_once_t *once, void (*func) (void)) -{ - if (once == NULL || func == NULL) - return EINVAL; - - if (! once->done) - { - if (__sync_add_and_fetch (&(once->started), 1) == 0) - { - (*func) (); - once->done = 1; - } - else - { - /* Another thread is currently executing the code, so wait for it - to finish; yield the CPU in the meantime. If performance - does become an issue, the solution is to use an Event that - we wait on here (and set above), but that implies a place to - create the event before this routine is called. */ - while (! once->done) - delay(1); - } - } - return 0; -} - -void __gthr_win32_mutex_init_function (__gthread_mutex_t *mutex) -{ - mutex->counter = 0; - mutex->sema = 0; -} - -int __gthr_win32_mutex_lock (__gthread_mutex_t *mutex) -{ - __mutex_lock(&mutex->counter); - return 0; -} - -int -__gthr_win32_mutex_unlock (__gthread_mutex_t *mutex) -{ - mutex->counter = 0; - return 0; -} - -void -__gthr_win32_recursive_mutex_init_function (__gthread_recursive_mutex_t *mutex) -{ - mutex->counter = -1; - mutex->depth = 0; - mutex->owner = 0; - mutex->sema = 0; -} - -void -__gthr_win32_mutex_destroy (__gthread_mutex_t *mutex) -{ } - -int -__gthr_win32_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex) -{ - int me = tls_get(0); - if ( __sync_add_and_fetch(&mutex->counter, 1) == 0) - { - mutex->depth = 1; - mutex->owner = me; - mutex->sema = 1; - } - else if (mutex->owner == me) - { - __sync_sub_and_fetch(&mutex->counter, 1); - ++(mutex->depth); - } - else - { - __mutex_lock(&mutex->sema); - mutex->depth = 1; - mutex->owner = me; - } - return 0; -} - -int -__gthr_win32_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex) -{ - int me = tls_get(0); - if (__sync_val_compare_and_swap (&mutex->counter, -1, 0) < 0) - { - mutex->depth = 1; - mutex->owner = me; - mutex->sema = 1; - } - else if (mutex->owner == me) - ++(mutex->depth); - else - return 1; - - return 0; -} - -int -__gthr_win32_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) -{ - --(mutex->depth); - if (mutex->depth == 0) - { - mutex->owner = 0; - - if (__sync_sub_and_fetch (&mutex->counter, 1) >= 0) - mutex->sema = 0; - } - - return 0; -} diff --git a/contrib/sdk/sources/libsupc++/guard.cc b/contrib/sdk/sources/libsupc++/guard.cc deleted file mode 100644 index f8550c03f..000000000 --- a/contrib/sdk/sources/libsupc++/guard.cc +++ /dev/null @@ -1,416 +0,0 @@ -// Copyright (C) 2002, 2004, 2006, 2008, 2009, 2010, 2011, 2012 -// Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -// Written by Mark Mitchell, CodeSourcery LLC, -// Thread support written by Jason Merrill, Red Hat Inc. - -#include -#include -#include -#include -#include -#include -#if defined(__GTHREADS) && defined(__GTHREAD_HAS_COND) \ - && (ATOMIC_INT_LOCK_FREE > 1) && defined(_GLIBCXX_HAVE_LINUX_FUTEX) -# include -# include -# include -# define _GLIBCXX_USE_FUTEX -# define _GLIBCXX_FUTEX_WAIT 0 -# define _GLIBCXX_FUTEX_WAKE 1 -#endif - -// The IA64/generic ABI uses the first byte of the guard variable. -// The ARM EABI uses the least significant bit. - -// Thread-safe static local initialization support. -#ifdef __GTHREADS -# ifndef _GLIBCXX_USE_FUTEX -namespace -{ - // A single mutex controlling all static initializations. - static __gnu_cxx::__recursive_mutex* static_mutex; - - typedef char fake_recursive_mutex[sizeof(__gnu_cxx::__recursive_mutex)] - __attribute__ ((aligned(__alignof__(__gnu_cxx::__recursive_mutex)))); - fake_recursive_mutex fake_mutex; - - static void init() - { static_mutex = new (&fake_mutex) __gnu_cxx::__recursive_mutex(); } - - __gnu_cxx::__recursive_mutex& - get_static_mutex() - { - static __gthread_once_t once = __GTHREAD_ONCE_INIT; - __gthread_once(&once, init); - return *static_mutex; - } - - // Simple wrapper for exception safety. - struct mutex_wrapper - { - bool unlock; - mutex_wrapper() : unlock(true) - { get_static_mutex().lock(); } - - ~mutex_wrapper() - { - if (unlock) - static_mutex->unlock(); - } - }; -} -# endif - -# if defined(__GTHREAD_HAS_COND) && !defined(_GLIBCXX_USE_FUTEX) -namespace -{ - // A single condition variable controlling all static initializations. - static __gnu_cxx::__cond* static_cond; - - // using a fake type to avoid initializing a static class. - typedef char fake_cond_t[sizeof(__gnu_cxx::__cond)] - __attribute__ ((aligned(__alignof__(__gnu_cxx::__cond)))); - fake_cond_t fake_cond; - - static void init_static_cond() - { static_cond = new (&fake_cond) __gnu_cxx::__cond(); } - - __gnu_cxx::__cond& - get_static_cond() - { - static __gthread_once_t once = __GTHREAD_ONCE_INIT; - __gthread_once(&once, init_static_cond); - return *static_cond; - } -} -# endif - -# ifndef _GLIBCXX_GUARD_TEST_AND_ACQUIRE -inline bool -__test_and_acquire (__cxxabiv1::__guard *g) -{ - bool b = _GLIBCXX_GUARD_TEST (g); - _GLIBCXX_READ_MEM_BARRIER; - return b; -} -# define _GLIBCXX_GUARD_TEST_AND_ACQUIRE(G) __test_and_acquire (G) -# endif - -# ifndef _GLIBCXX_GUARD_SET_AND_RELEASE -inline void -__set_and_release (__cxxabiv1::__guard *g) -{ - _GLIBCXX_WRITE_MEM_BARRIER; - _GLIBCXX_GUARD_SET (g); -} -# define _GLIBCXX_GUARD_SET_AND_RELEASE(G) __set_and_release (G) -# endif - -#else /* !__GTHREADS */ - -# undef _GLIBCXX_GUARD_TEST_AND_ACQUIRE -# undef _GLIBCXX_GUARD_SET_AND_RELEASE -# define _GLIBCXX_GUARD_SET_AND_RELEASE(G) _GLIBCXX_GUARD_SET (G) - -#endif /* __GTHREADS */ - -// -// Here are C++ run-time routines for guarded initialization of static -// variables. There are 4 scenarios under which these routines are called: -// -// 1. Threads not supported (__GTHREADS not defined) -// 2. Threads are supported but not enabled at run-time. -// 3. Threads enabled at run-time but __gthreads_* are not fully POSIX. -// 4. Threads enabled at run-time and __gthreads_* support all POSIX threads -// primitives we need here. -// -// The old code supported scenarios 1-3 but was broken since it used a global -// mutex for all threads and had the mutex locked during the whole duration of -// initialization of a guarded static variable. The following created a -// dead-lock with the old code. -// -// Thread 1 acquires the global mutex. -// Thread 1 starts initializing static variable. -// Thread 1 creates thread 2 during initialization. -// Thread 2 attempts to acquire mutex to initialize another variable. -// Thread 2 blocks since thread 1 is locking the mutex. -// Thread 1 waits for result from thread 2 and also blocks. A deadlock. -// -// The new code here can handle this situation and thus is more robust. However, -// we need to use the POSIX thread condition variable, which is not supported -// in all platforms, notably older versions of Microsoft Windows. The gthr*.h -// headers define a symbol __GTHREAD_HAS_COND for platforms that support POSIX -// like condition variables. For platforms that do not support condition -// variables, we need to fall back to the old code. - -// If _GLIBCXX_USE_FUTEX, no global mutex or condition variable is used, -// only atomic operations are used together with futex syscall. -// Valid values of the first integer in guard are: -// 0 No thread encountered the guarded init -// yet or it has been aborted. -// _GLIBCXX_GUARD_BIT The guarded static var has been successfully -// initialized. -// _GLIBCXX_GUARD_PENDING_BIT The guarded static var is being initialized -// and no other thread is waiting for its -// initialization. -// (_GLIBCXX_GUARD_PENDING_BIT The guarded static var is being initialized -// | _GLIBCXX_GUARD_WAITING_BIT) and some other threads are waiting until -// it is initialized. - -namespace __cxxabiv1 -{ -#ifdef _GLIBCXX_USE_FUTEX - namespace - { - static inline int __guard_test_bit (const int __byte, const int __val) - { - union { int __i; char __c[sizeof (int)]; } __u = { 0 }; - __u.__c[__byte] = __val; - return __u.__i; - } - } -#endif - - static inline int - init_in_progress_flag(__guard* g) - { return ((char *)g)[1]; } - - static inline void - set_init_in_progress_flag(__guard* g, int v) - { ((char *)g)[1] = v; } - - static inline void - throw_recursive_init_exception() - { -#ifdef __EXCEPTIONS - throw __gnu_cxx::recursive_init_error(); -#else - // Use __builtin_trap so we don't require abort(). - __builtin_trap(); -#endif - } - - // acquire() is a helper function used to acquire guard if thread support is - // not compiled in or is compiled in but not enabled at run-time. - static int - acquire(__guard *g) - { - // Quit if the object is already initialized. - if (_GLIBCXX_GUARD_TEST(g)) - return 0; - - if (init_in_progress_flag(g)) - throw_recursive_init_exception(); - - set_init_in_progress_flag(g, 1); - return 1; - } - - extern "C" - int __cxa_guard_acquire (__guard *g) - { -#ifdef __GTHREADS - // If the target can reorder loads, we need to insert a read memory - // barrier so that accesses to the guarded variable happen after the - // guard test. - if (_GLIBCXX_GUARD_TEST_AND_ACQUIRE (g)) - return 0; - -# ifdef _GLIBCXX_USE_FUTEX - // If __atomic_* and futex syscall are supported, don't use any global - // mutex. - if (__gthread_active_p ()) - { - int *gi = (int *) (void *) g; - const int guard_bit = _GLIBCXX_GUARD_BIT; - const int pending_bit = _GLIBCXX_GUARD_PENDING_BIT; - const int waiting_bit = _GLIBCXX_GUARD_WAITING_BIT; - - while (1) - { - int expected(0); - if (__atomic_compare_exchange_n(gi, &expected, pending_bit, false, - __ATOMIC_ACQ_REL, - __ATOMIC_ACQUIRE)) - { - // This thread should do the initialization. - return 1; - } - - if (expected == guard_bit) - { - // Already initialized. - return 0; - } - - if (expected == pending_bit) - { - // Use acquire here. - int newv = expected | waiting_bit; - if (!__atomic_compare_exchange_n(gi, &expected, newv, false, - __ATOMIC_ACQ_REL, - __ATOMIC_ACQUIRE)) - { - if (expected == guard_bit) - { - // Make a thread that failed to set the - // waiting bit exit the function earlier, - // if it detects that another thread has - // successfully finished initialising. - return 0; - } - if (expected == 0) - continue; - } - - expected = newv; - } - - syscall (SYS_futex, gi, _GLIBCXX_FUTEX_WAIT, expected, 0); - } - } -# else - if (__gthread_active_p ()) - { - mutex_wrapper mw; - - while (1) // When this loop is executing, mutex is locked. - { -# ifdef __GTHREAD_HAS_COND - // The static is already initialized. - if (_GLIBCXX_GUARD_TEST(g)) - return 0; // The mutex will be unlocked via wrapper - - if (init_in_progress_flag(g)) - { - // The guarded static is currently being initialized by - // another thread, so we release mutex and wait for the - // condition variable. We will lock the mutex again after - // this. - get_static_cond().wait_recursive(&get_static_mutex()); - } - else - { - set_init_in_progress_flag(g, 1); - return 1; // The mutex will be unlocked via wrapper. - } -# else - // This provides compatibility with older systems not supporting - // POSIX like condition variables. - if (acquire(g)) - { - mw.unlock = false; - return 1; // The mutex still locked. - } - return 0; // The mutex will be unlocked via wrapper. -# endif - } - } -# endif -#endif - - return acquire (g); - } - - extern "C" - void __cxa_guard_abort (__guard *g) throw () - { -#ifdef _GLIBCXX_USE_FUTEX - // If __atomic_* and futex syscall are supported, don't use any global - // mutex. - if (__gthread_active_p ()) - { - int *gi = (int *) (void *) g; - const int waiting_bit = _GLIBCXX_GUARD_WAITING_BIT; - int old = __atomic_exchange_n (gi, 0, __ATOMIC_ACQ_REL); - - if ((old & waiting_bit) != 0) - syscall (SYS_futex, gi, _GLIBCXX_FUTEX_WAKE, INT_MAX); - return; - } -#elif defined(__GTHREAD_HAS_COND) - if (__gthread_active_p()) - { - mutex_wrapper mw; - - set_init_in_progress_flag(g, 0); - - // If we abort, we still need to wake up all other threads waiting for - // the condition variable. - get_static_cond().broadcast(); - return; - } -#endif - - set_init_in_progress_flag(g, 0); -#if defined(__GTHREADS) && !defined(__GTHREAD_HAS_COND) - // This provides compatibility with older systems not supporting POSIX like - // condition variables. - if (__gthread_active_p ()) - static_mutex->unlock(); -#endif - } - - extern "C" - void __cxa_guard_release (__guard *g) throw () - { -#ifdef _GLIBCXX_USE_FUTEX - // If __atomic_* and futex syscall are supported, don't use any global - // mutex. - if (__gthread_active_p ()) - { - int *gi = (int *) (void *) g; - const int guard_bit = _GLIBCXX_GUARD_BIT; - const int waiting_bit = _GLIBCXX_GUARD_WAITING_BIT; - int old = __atomic_exchange_n (gi, guard_bit, __ATOMIC_ACQ_REL); - - if ((old & waiting_bit) != 0) - syscall (SYS_futex, gi, _GLIBCXX_FUTEX_WAKE, INT_MAX); - return; - } -#elif defined(__GTHREAD_HAS_COND) - if (__gthread_active_p()) - { - mutex_wrapper mw; - - set_init_in_progress_flag(g, 0); - _GLIBCXX_GUARD_SET_AND_RELEASE(g); - - get_static_cond().broadcast(); - return; - } -#endif - - set_init_in_progress_flag(g, 0); - _GLIBCXX_GUARD_SET_AND_RELEASE (g); - -#if defined(__GTHREADS) && !defined(__GTHREAD_HAS_COND) - // This provides compatibility with older systems not supporting POSIX like - // condition variables. - if (__gthread_active_p()) - static_mutex->unlock(); -#endif - } -} diff --git a/contrib/sdk/sources/libsupc++/guard_error.cc b/contrib/sdk/sources/libsupc++/guard_error.cc deleted file mode 100644 index 7c06bcd0d..000000000 --- a/contrib/sdk/sources/libsupc++/guard_error.cc +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2011 Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include - -namespace __gnu_cxx -{ - recursive_init_error::~recursive_init_error() throw() { } -} - diff --git a/contrib/sdk/sources/libsupc++/initializer_list b/contrib/sdk/sources/libsupc++/initializer_list deleted file mode 100644 index 6b991b7d6..000000000 --- a/contrib/sdk/sources/libsupc++/initializer_list +++ /dev/null @@ -1,107 +0,0 @@ -// std::initializer_list support -*- C++ -*- - -// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file initializer_list - * This is a Standard C++ Library header. - */ - -#ifndef _INITIALIZER_LIST -#define _INITIALIZER_LIST - -#pragma GCC system_header - -#ifndef __GXX_EXPERIMENTAL_CXX0X__ -# include -#else // C++0x - -#pragma GCC visibility push(default) - -#include - -namespace std -{ - /// initializer_list - template - class initializer_list - { - public: - typedef _E value_type; - typedef const _E& reference; - typedef const _E& const_reference; - typedef size_t size_type; - typedef const _E* iterator; - typedef const _E* const_iterator; - - private: - iterator _M_array; - size_type _M_len; - - // The compiler can call a private constructor. - constexpr initializer_list(const_iterator __a, size_type __l) - : _M_array(__a), _M_len(__l) { } - - public: - constexpr initializer_list() noexcept - : _M_array(0), _M_len(0) { } - - // Number of elements. - constexpr size_type - size() const noexcept { return _M_len; } - - // First element. - constexpr const_iterator - begin() const noexcept { return _M_array; } - - // One past the last element. - constexpr const_iterator - end() const noexcept { return begin() + size(); } - }; - - /** - * @brief Return an iterator pointing to the first element of - * the initilizer_list. - * @param __ils Initializer list. - */ - template - constexpr const _Tp* - begin(initializer_list<_Tp> __ils) noexcept - { return __ils.begin(); } - - /** - * @brief Return an iterator pointing to one past the last element - * of the initilizer_list. - * @param __ils Initializer list. - */ - template - constexpr const _Tp* - end(initializer_list<_Tp> __ils) noexcept - { return __ils.end(); } -} - -#pragma GCC visibility pop - -#endif // __GXX_EXPERIMENTAL_CXX0X__ - -#endif // _INITIALIZER_LIST diff --git a/contrib/sdk/sources/libsupc++/new b/contrib/sdk/sources/libsupc++/new deleted file mode 100644 index 1c258002e..000000000 --- a/contrib/sdk/sources/libsupc++/new +++ /dev/null @@ -1,124 +0,0 @@ -// The -*- C++ -*- dynamic memory management header. - -// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -// 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 -// Free Software Foundation - -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file new - * This is a Standard C++ Library header. - * - * The header @c new defines several functions to manage dynamic memory and - * handling memory allocation errors; see - * http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#4 for more. - */ - -#ifndef _NEW -#define _NEW - -#pragma GCC system_header - -#include -#include - -#pragma GCC visibility push(default) - -extern "C++" { - -namespace std -{ - /** - * @brief Exception possibly thrown by @c new. - * @ingroup exceptions - * - * @c bad_alloc (or classes derived from it) is used to report allocation - * errors from the throwing forms of @c new. */ - class bad_alloc : public exception - { - public: - bad_alloc() throw() { } - - // This declaration is not useless: - // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 - virtual ~bad_alloc() throw(); - - // See comment in eh_exception.cc. - virtual const char* what() const throw(); - }; - - struct nothrow_t { }; - - extern const nothrow_t nothrow; - - /** If you write your own error handler to be called by @c new, it must - * be of this type. */ - typedef void (*new_handler)(); - - /// Takes a replacement handler as the argument, returns the - /// previous handler. - new_handler set_new_handler(new_handler) throw(); -} // namespace std - -//@{ -/** These are replaceable signatures: - * - normal single new and delete (no arguments, throw @c bad_alloc on error) - * - normal array new and delete (same) - * - @c nothrow single new and delete (take a @c nothrow argument, return - * @c NULL on error) - * - @c nothrow array new and delete (same) - * - * Placement new and delete signatures (take a memory address argument, - * does nothing) may not be replaced by a user's program. -*/ -void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc) - __attribute__((__externally_visible__)); -void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) - __attribute__((__externally_visible__)); -void operator delete(void*) _GLIBCXX_USE_NOEXCEPT - __attribute__((__externally_visible__)); -void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT - __attribute__((__externally_visible__)); -void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT - __attribute__((__externally_visible__)); -void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT - __attribute__((__externally_visible__)); -void operator delete(void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT - __attribute__((__externally_visible__)); -void operator delete[](void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT - __attribute__((__externally_visible__)); - -// Default placement versions of operator new. -inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT -{ return __p; } -inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT -{ return __p; } - -// Default placement versions of operator delete. -inline void operator delete (void*, void*) _GLIBCXX_USE_NOEXCEPT { } -inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { } -//@} -} // extern "C++" - -#pragma GCC visibility pop - -#endif diff --git a/contrib/sdk/sources/libsupc++/new_handler.cc b/contrib/sdk/sources/libsupc++/new_handler.cc deleted file mode 100644 index 4e3c93545..000000000 --- a/contrib/sdk/sources/libsupc++/new_handler.cc +++ /dev/null @@ -1,41 +0,0 @@ -// Implementation file for the -*- C++ -*- dynamic memory management header. - -// Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -// 2005, 2006, 2007, 2008, 2009, 2010 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "new" - -const std::nothrow_t std::nothrow = { }; - -using std::new_handler; -new_handler __new_handler; - -new_handler -std::set_new_handler (new_handler handler) throw() -{ - new_handler prev_handler = __new_handler; - __new_handler = handler; - return prev_handler; -} diff --git a/contrib/sdk/sources/libsupc++/new_op.cc b/contrib/sdk/sources/libsupc++/new_op.cc deleted file mode 100644 index bb0199e96..000000000 --- a/contrib/sdk/sources/libsupc++/new_op.cc +++ /dev/null @@ -1,67 +0,0 @@ -// Support routines for the -*- C++ -*- dynamic memory management. - -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2009, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include -#include -#include "new" - -using std::new_handler; -using std::bad_alloc; -#if _GLIBCXX_HOSTED -using std::malloc; -#else -// A freestanding C runtime may not provide "malloc" -- but there is no -// other reasonable way to implement "operator new". -extern "C" void *malloc (std::size_t); -#endif - -extern new_handler __new_handler; - -_GLIBCXX_WEAK_DEFINITION void * -operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc) -{ - void *p; - - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - p = (void *) malloc (sz); - while (p == 0) - { - new_handler handler = __new_handler; - if (! handler) -#ifdef __EXCEPTIONS - throw bad_alloc(); -#else - std::abort(); -#endif - handler (); - p = (void *) malloc (sz); - } - - return p; -} diff --git a/contrib/sdk/sources/libsupc++/new_opnt.cc b/contrib/sdk/sources/libsupc++/new_opnt.cc deleted file mode 100644 index 71600a63c..000000000 --- a/contrib/sdk/sources/libsupc++/new_opnt.cc +++ /dev/null @@ -1,63 +0,0 @@ -// Support routines for the -*- C++ -*- dynamic memory management. -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004, 2009, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include -#include "new" - -using std::new_handler; -using std::bad_alloc; - -extern "C" void *malloc (std::size_t); -extern new_handler __new_handler; - -_GLIBCXX_WEAK_DEFINITION void * -operator new (std::size_t sz, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT -{ - void *p; - - /* malloc (0) is unpredictable; avoid it. */ - if (sz == 0) - sz = 1; - p = (void *) malloc (sz); - while (p == 0) - { - new_handler handler = __new_handler; - if (! handler) - return 0; - __try - { - handler (); - } - __catch(const bad_alloc&) - { - return 0; - } - - p = (void *) malloc (sz); - } - - return p; -} diff --git a/contrib/sdk/sources/libsupc++/new_opv.cc b/contrib/sdk/sources/libsupc++/new_opv.cc deleted file mode 100644 index 4080bd25b..000000000 --- a/contrib/sdk/sources/libsupc++/new_opv.cc +++ /dev/null @@ -1,34 +0,0 @@ -// Boilerplate support routines for -*- C++ -*- dynamic memory management. - -// Copyright (C) 1997, 1998, 1999, 2000, 2004, 2009, 2010, 2011 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include "new" - -_GLIBCXX_WEAK_DEFINITION void* -operator new[] (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc) -{ - return ::operator new(sz); -} diff --git a/contrib/sdk/sources/libsupc++/pbase_type_info.cc b/contrib/sdk/sources/libsupc++/pbase_type_info.cc deleted file mode 100644 index f79d9e968..000000000 --- a/contrib/sdk/sources/libsupc++/pbase_type_info.cc +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2007, -// 2009, 2010 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "tinfo.h" - -namespace __cxxabiv1 { - -__pbase_type_info:: -~__pbase_type_info () -{} - -bool __pbase_type_info:: -__do_catch (const type_info *thr_type, - void **thr_obj, - unsigned outer) const -{ - if (*this == *thr_type) - return true; // same type - -#ifdef __GXX_RTTI - if (typeid (*this) != typeid (*thr_type)) - return false; // not both same kind of pointers -#endif - - if (!(outer & 1)) - // We're not the same and our outer pointers are not all const qualified - // Therefore there must at least be a qualification conversion involved - // But for that to be valid, our outer pointers must be const qualified. - return false; - - const __pbase_type_info *thrown_type = - static_cast (thr_type); - - if (thrown_type->__flags & ~__flags) - // We're less qualified. - return false; - - if (!(__flags & __const_mask)) - outer &= ~1; - - return __pointer_catch (thrown_type, thr_obj, outer); -} - -} diff --git a/contrib/sdk/sources/libsupc++/pure.cc b/contrib/sdk/sources/libsupc++/pure.cc deleted file mode 100644 index 4879e59de..000000000 --- a/contrib/sdk/sources/libsupc++/pure.cc +++ /dev/null @@ -1,58 +0,0 @@ -// -*- C++ -*- -// Copyright (C) 2000, 2001, 2009, 2011 Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include -#include "unwind-cxx.h" - -#if _GLIBCXX_HOSTED -#ifdef _GLIBCXX_HAVE_UNISTD_H -# include -# define writestr(str) write(2, str, sizeof(str) - 1) -# ifdef __GNU_LIBRARY__ - /* Avoid forcing the library's meaning of `write' on the user program - by using the "internal" name (for use within the library). */ -/*# define write(fd, buf, n) __write((fd), (buf), (n))*/ -# endif -#else -# include -# define writestr(str) std::fputs(str, stderr) -#endif -#else -# define writestr(str) /* Empty */ -#endif - -extern "C" void -__cxxabiv1::__cxa_pure_virtual (void) -{ - writestr ("pure virtual method called\n"); - std::terminate (); -} - -extern "C" void -__cxxabiv1::__cxa_deleted_virtual (void) -{ - writestr ("deleted virtual method called\n"); - std::terminate (); -} diff --git a/contrib/sdk/sources/libsupc++/si_class_type_info.cc b/contrib/sdk/sources/libsupc++/si_class_type_info.cc deleted file mode 100644 index 829e71fad..000000000 --- a/contrib/sdk/sources/libsupc++/si_class_type_info.cc +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2007, 2009 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "tinfo.h" - -namespace __cxxabiv1 { - -__si_class_type_info:: -~__si_class_type_info () -{} - -__class_type_info::__sub_kind __si_class_type_info:: -__do_find_public_src (ptrdiff_t src2dst, - const void *obj_ptr, - const __class_type_info *src_type, - const void *src_ptr) const -{ - if (src_ptr == obj_ptr && *this == *src_type) - return __contained_public; - return __base_type->__do_find_public_src (src2dst, obj_ptr, src_type, src_ptr); -} - -bool __si_class_type_info:: -__do_dyncast (ptrdiff_t src2dst, - __sub_kind access_path, - const __class_type_info *dst_type, - const void *obj_ptr, - const __class_type_info *src_type, - const void *src_ptr, - __dyncast_result &__restrict result) const -{ - if (*this == *dst_type) - { - result.dst_ptr = obj_ptr; - result.whole2dst = access_path; - if (src2dst >= 0) - result.dst2src = adjust_pointer (obj_ptr, src2dst) == src_ptr - ? __contained_public : __not_contained; - else if (src2dst == -2) - result.dst2src = __not_contained; - return false; - } - if (obj_ptr == src_ptr && *this == *src_type) - { - // The src object we started from. Indicate how we are accessible from - // the most derived object. - result.whole2src = access_path; - return false; - } - return __base_type->__do_dyncast (src2dst, access_path, dst_type, obj_ptr, - src_type, src_ptr, result); -} - -bool __si_class_type_info:: -__do_upcast (const __class_type_info *dst, const void *obj_ptr, - __upcast_result &__restrict result) const -{ - if (__class_type_info::__do_upcast (dst, obj_ptr, result)) - return true; - - return __base_type->__do_upcast (dst, obj_ptr, result); -} - -} diff --git a/contrib/sdk/sources/libsupc++/tinfo.cc b/contrib/sdk/sources/libsupc++/tinfo.cc deleted file mode 100644 index eba74dbda..000000000 --- a/contrib/sdk/sources/libsupc++/tinfo.cc +++ /dev/null @@ -1,84 +0,0 @@ -// Methods for type_info for -*- C++ -*- Run Time Type Identification. -// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -// 2003, 2004, 2005, 2006, 2007, 2009 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include -#include -#include "tinfo.h" - -std::type_info:: -~type_info () -{ } - -#if !__GXX_TYPEINFO_EQUALITY_INLINE - -// We can't rely on common symbols being shared between shared objects. -bool std::type_info:: -operator== (const std::type_info& arg) const -{ -#if __GXX_MERGED_TYPEINFO_NAMES - return name () == arg.name (); -#else - /* The name() method will strip any leading '*' prefix. Therefore - take care to look at __name rather than name() when looking for - the "pointer" prefix. */ - return (&arg == this) - || (__name[0] != '*' && (__builtin_strcmp (name (), arg.name ()) == 0)); -#endif -} - -#endif - -namespace std { - -// return true if this is a type_info for a pointer type -bool type_info:: -__is_pointer_p () const -{ - return false; -} - -// return true if this is a type_info for a function type -bool type_info:: -__is_function_p () const -{ - return false; -} - -// try and catch a thrown object. -bool type_info:: -__do_catch (const type_info *thr_type, void **, unsigned) const -{ - return *this == *thr_type; -} - -// upcast from this type to the target. __class_type_info will override -bool type_info:: -__do_upcast (const abi::__class_type_info *, void **) const -{ - return false; -} - -} diff --git a/contrib/sdk/sources/libsupc++/tinfo.h b/contrib/sdk/sources/libsupc++/tinfo.h deleted file mode 100644 index b3e22232f..000000000 --- a/contrib/sdk/sources/libsupc++/tinfo.h +++ /dev/null @@ -1,183 +0,0 @@ -// RTTI support internals for -*- C++ -*- -// Copyright (C) 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2004, 2009 -// Free Software Foundation - -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "typeinfo" -#include - -// Class declarations shared between the typeinfo implementation files. - -#include - -namespace __cxxabiv1 { - -inline bool __pbase_type_info:: -__pointer_catch (const __pbase_type_info *thrown_type, - void **thr_obj, - unsigned outer) const -{ - return __pointee->__do_catch (thrown_type->__pointee, thr_obj, outer + 2); -} - -namespace { - -using namespace std; -using namespace abi; - -// Initial part of a vtable, this structure is used with offsetof, so we don't -// have to keep alignments consistent manually. -struct vtable_prefix -{ - // Offset to most derived object. - ptrdiff_t whole_object; - - // Additional padding if necessary. -#ifdef _GLIBCXX_VTABLE_PADDING - ptrdiff_t padding1; -#endif - - // Pointer to most derived type_info. - const __class_type_info *whole_type; - - // Additional padding if necessary. -#ifdef _GLIBCXX_VTABLE_PADDING - ptrdiff_t padding2; -#endif - - // What a class's vptr points to. - const void *origin; -}; - -template -inline const T * -adjust_pointer (const void *base, ptrdiff_t offset) -{ - return reinterpret_cast - (reinterpret_cast (base) + offset); -} - -// ADDR is a pointer to an object. Convert it to a pointer to a base, -// using OFFSET. IS_VIRTUAL is true, if we are getting a virtual base. -inline void const * -convert_to_base (void const *addr, bool is_virtual, ptrdiff_t offset) -{ - if (is_virtual) - { - const void *vtable = *static_cast (addr); - - offset = *adjust_pointer (vtable, offset); - } - - return adjust_pointer (addr, offset); -} - -// some predicate functions for __class_type_info::__sub_kind -inline bool contained_p (__class_type_info::__sub_kind access_path) -{ - return access_path >= __class_type_info::__contained_mask; -} -inline bool public_p (__class_type_info::__sub_kind access_path) -{ - return access_path & __class_type_info::__contained_public_mask; -} -inline bool virtual_p (__class_type_info::__sub_kind access_path) -{ - return (access_path & __class_type_info::__contained_virtual_mask); -} -inline bool contained_public_p (__class_type_info::__sub_kind access_path) -{ - return ((access_path & __class_type_info::__contained_public) - == __class_type_info::__contained_public); -} -inline bool contained_nonpublic_p (__class_type_info::__sub_kind access_path) -{ - return ((access_path & __class_type_info::__contained_public) - == __class_type_info::__contained_mask); -} -inline bool contained_nonvirtual_p (__class_type_info::__sub_kind access_path) -{ - return ((access_path & (__class_type_info::__contained_mask - | __class_type_info::__contained_virtual_mask)) - == __class_type_info::__contained_mask); -} - -static const __class_type_info *const nonvirtual_base_type = - static_cast (0) + 1; - -} // namespace - -// __upcast_result is used to hold information during traversal of a class -// hierarchy when catch matching. -struct __class_type_info::__upcast_result -{ - const void *dst_ptr; // pointer to caught object - __sub_kind part2dst; // path from current base to target - int src_details; // hints about the source type hierarchy - const __class_type_info *base_type; // where we found the target, - // if in vbase the __class_type_info of vbase - // if a non-virtual base then 1 - // else NULL - __upcast_result (int d) - :dst_ptr (NULL), part2dst (__unknown), src_details (d), base_type (NULL) - {} -}; - -// __dyncast_result is used to hold information during traversal of a class -// hierarchy when dynamic casting. -struct __class_type_info::__dyncast_result -{ - const void *dst_ptr; // pointer to target object or NULL - __sub_kind whole2dst; // path from most derived object to target - __sub_kind whole2src; // path from most derived object to sub object - __sub_kind dst2src; // path from target to sub object - int whole_details; // details of the whole class hierarchy - - __dyncast_result (int details_ = __vmi_class_type_info::__flags_unknown_mask) - :dst_ptr (NULL), whole2dst (__unknown), - whole2src (__unknown), dst2src (__unknown), - whole_details (details_) - {} - -protected: - __dyncast_result(const __dyncast_result&); - - __dyncast_result& - operator=(const __dyncast_result&); -}; - -inline __class_type_info::__sub_kind __class_type_info:: -__find_public_src (ptrdiff_t src2dst, - const void *obj_ptr, - const __class_type_info *src_type, - const void *src_ptr) const -{ - if (src2dst >= 0) - return adjust_pointer (obj_ptr, src2dst) == src_ptr - ? __contained_public : __not_contained; - if (src2dst == -2) - return __not_contained; - return __do_find_public_src (src2dst, obj_ptr, src_type, src_ptr); -} - -} diff --git a/contrib/sdk/sources/libsupc++/typeinfo b/contrib/sdk/sources/libsupc++/typeinfo deleted file mode 100644 index be5991af7..000000000 --- a/contrib/sdk/sources/libsupc++/typeinfo +++ /dev/null @@ -1,224 +0,0 @@ -// RTTI support for -*- C++ -*- -// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -// 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -/** @file typeinfo - * This is a Standard C++ Library header. - */ - -#ifndef _TYPEINFO -#define _TYPEINFO - -#pragma GCC system_header - -#include -#ifdef __GXX_EXPERIMENTAL_CXX0X__ -#include -#endif - -#pragma GCC visibility push(default) - -extern "C++" { - -namespace __cxxabiv1 -{ - class __class_type_info; -} // namespace __cxxabiv1 - -// Determine whether typeinfo names for the same type are merged (in which -// case comparison can just compare pointers) or not (in which case strings -// must be compared), and whether comparison is to be implemented inline or -// not. We used to do inline pointer comparison by default if weak symbols -// are available, but even with weak symbols sometimes names are not merged -// when objects are loaded with RTLD_LOCAL, so now we always use strcmp by -// default. For ABI compatibility, we do the strcmp inline if weak symbols -// are available, and out-of-line if not. Out-of-line pointer comparison -// is used where the object files are to be portable to multiple systems, -// some of which may not be able to use pointer comparison, but the -// particular system for which libstdc++ is being built can use pointer -// comparison; in particular for most ARM EABI systems, where the ABI -// specifies out-of-line comparison. The compiler's target configuration -// can override the defaults by defining __GXX_TYPEINFO_EQUALITY_INLINE to -// 1 or 0 to indicate whether or not comparison is inline, and -// __GXX_MERGED_TYPEINFO_NAMES to 1 or 0 to indicate whether or not pointer -// comparison can be used. - -#ifndef __GXX_MERGED_TYPEINFO_NAMES -// By default, typeinfo names are not merged. -#define __GXX_MERGED_TYPEINFO_NAMES 0 -#endif - -// By default follow the old inline rules to avoid ABI changes. -#ifndef __GXX_TYPEINFO_EQUALITY_INLINE - #if !__GXX_WEAK__ - #define __GXX_TYPEINFO_EQUALITY_INLINE 0 - #else - #define __GXX_TYPEINFO_EQUALITY_INLINE 1 - #endif -#endif - -namespace std -{ - /** - * @brief Part of RTTI. - * - * The @c type_info class describes type information generated by - * an implementation. - */ - class type_info - { - public: - /** Destructor first. Being the first non-inline virtual function, this - * controls in which translation unit the vtable is emitted. The - * compiler makes use of that information to know where to emit - * the runtime-mandated type_info structures in the new-abi. */ - virtual ~type_info(); - - /** Returns an @e implementation-defined byte string; this is not - * portable between compilers! */ - const char* name() const - { return __name[0] == '*' ? __name + 1 : __name; } - -#if !__GXX_TYPEINFO_EQUALITY_INLINE - // In old abi, or when weak symbols are not supported, there can - // be multiple instances of a type_info object for one - // type. Uniqueness must use the _name value, not object address. - bool before(const type_info& __arg) const; - bool operator==(const type_info& __arg) const; -#else - #if !__GXX_MERGED_TYPEINFO_NAMES - /** Returns true if @c *this precedes @c __arg in the implementation's - * collation order. */ - // Even with the new abi, on systems that support dlopen - // we can run into cases where type_info names aren't merged, - // so we still need to do string comparison. - bool before(const type_info& __arg) const - { return (__name[0] == '*' && __arg.__name[0] == '*') - ? __name < __arg.__name - : __builtin_strcmp (__name, __arg.__name) < 0; } - - bool operator==(const type_info& __arg) const - { - return ((__name == __arg.__name) - || (__name[0] != '*' && - __builtin_strcmp (__name, __arg.__name) == 0)); - } - #else - // On some targets we can rely on type_info's NTBS being unique, - // and therefore address comparisons are sufficient. - bool before(const type_info& __arg) const - { return __name < __arg.__name; } - - bool operator==(const type_info& __arg) const - { return __name == __arg.__name; } - #endif -#endif - bool operator!=(const type_info& __arg) const - { return !operator==(__arg); } - -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - size_t hash_code() const noexcept - { -# if !__GXX_MERGED_TYPEINFO_NAMES - return _Hash_bytes(name(), __builtin_strlen(name()), - static_cast(0xc70f6907UL)); -# else - return reinterpret_cast(__name); -# endif - } -#endif // __GXX_EXPERIMENTAL_CXX0X__ - - // Return true if this is a pointer type of some kind - virtual bool __is_pointer_p() const; - - // Return true if this is a function type - virtual bool __is_function_p() const; - - // Try and catch a thrown type. Store an adjusted pointer to the - // caught type in THR_OBJ. If THR_TYPE is not a pointer type, then - // THR_OBJ points to the thrown object. If THR_TYPE is a pointer - // type, then THR_OBJ is the pointer itself. OUTER indicates the - // number of outer pointers, and whether they were const - // qualified. - virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj, - unsigned __outer) const; - - // Internally used during catch matching - virtual bool __do_upcast(const __cxxabiv1::__class_type_info *__target, - void **__obj_ptr) const; - - protected: - const char *__name; - - explicit type_info(const char *__n): __name(__n) { } - - private: - /// Assigning type_info is not supported. - type_info& operator=(const type_info&); - type_info(const type_info&); - }; - - /** - * @brief Thrown during incorrect typecasting. - * @ingroup exceptions - * - * If you attempt an invalid @c dynamic_cast expression, an instance of - * this class (or something derived from this class) is thrown. */ - class bad_cast : public exception - { - public: - bad_cast() _GLIBCXX_USE_NOEXCEPT { } - - // This declaration is not useless: - // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 - virtual ~bad_cast() _GLIBCXX_USE_NOEXCEPT; - - // See comment in eh_exception.cc. - virtual const char* what() const _GLIBCXX_USE_NOEXCEPT; - }; - - /** - * @brief Thrown when a NULL pointer in a @c typeid expression is used. - * @ingroup exceptions - */ - class bad_typeid : public exception - { - public: - bad_typeid () _GLIBCXX_USE_NOEXCEPT { } - - // This declaration is not useless: - // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 - virtual ~bad_typeid() _GLIBCXX_USE_NOEXCEPT; - - // See comment in eh_exception.cc. - virtual const char* what() const _GLIBCXX_USE_NOEXCEPT; - }; -} // namespace std - -} // extern "C++" - -#pragma GCC visibility pop - -#endif diff --git a/contrib/sdk/sources/libsupc++/unwind-cxx.h b/contrib/sdk/sources/libsupc++/unwind-cxx.h deleted file mode 100644 index a4a2b9de4..000000000 --- a/contrib/sdk/sources/libsupc++/unwind-cxx.h +++ /dev/null @@ -1,382 +0,0 @@ -// -*- C++ -*- Exception handling and frame unwind runtime interface routines. -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -// 2011 Free Software Foundation, Inc. -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. -// -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -// This is derived from the C++ ABI for IA-64. Where we diverge -// for cross-architecture compatibility are noted with "@@@". - -#ifndef _UNWIND_CXX_H -#define _UNWIND_CXX_H 1 - -// Level 2: C++ ABI - -#include -#include -#include -#include "unwind.h" -#include -#include - -#pragma GCC visibility push(default) - -namespace __cxxabiv1 -{ - -// A primary C++ exception object consists of a header, which is a wrapper -// around an unwind object header with additional C++ specific information, -// followed by the exception object itself. - -struct __cxa_exception -{ - // Manage the exception object itself. - std::type_info *exceptionType; - void (_GLIBCXX_CDTOR_CALLABI *exceptionDestructor)(void *); - - // The C++ standard has entertaining rules wrt calling set_terminate - // and set_unexpected in the middle of the exception cleanup process. - std::unexpected_handler unexpectedHandler; - std::terminate_handler terminateHandler; - - // The caught exception stack threads through here. - __cxa_exception *nextException; - - // How many nested handlers have caught this exception. A negated - // value is a signal that this object has been rethrown. - int handlerCount; - -#ifdef __ARM_EABI_UNWINDER__ - // Stack of exceptions in cleanups. - __cxa_exception* nextPropagatingException; - - // The nuber of active cleanup handlers for this exception. - int propagationCount; -#else - // Cache parsed handler data from the personality routine Phase 1 - // for Phase 2 and __cxa_call_unexpected. - int handlerSwitchValue; - const unsigned char *actionRecord; - const unsigned char *languageSpecificData; - _Unwind_Ptr catchTemp; - void *adjustedPtr; -#endif - - // The generic exception header. Must be last. - _Unwind_Exception unwindHeader; -}; - -struct __cxa_refcounted_exception -{ - // Manage this header. - _Atomic_word referenceCount; - // __cxa_exception must be last, and no padding can be after it. - __cxa_exception exc; -}; - -// A dependent C++ exception object consists of a wrapper around an unwind -// object header with additional C++ specific information, containing a pointer -// to a primary exception object. - -struct __cxa_dependent_exception -{ - // The primary exception this thing depends on. - void *primaryException; - - // The C++ standard has entertaining rules wrt calling set_terminate - // and set_unexpected in the middle of the exception cleanup process. - std::unexpected_handler unexpectedHandler; - std::terminate_handler terminateHandler; - - // The caught exception stack threads through here. - __cxa_exception *nextException; - - // How many nested handlers have caught this exception. A negated - // value is a signal that this object has been rethrown. - int handlerCount; - -#ifdef __ARM_EABI_UNWINDER__ - // Stack of exceptions in cleanups. - __cxa_exception* nextPropagatingException; - - // The nuber of active cleanup handlers for this exception. - int propagationCount; -#else - // Cache parsed handler data from the personality routine Phase 1 - // for Phase 2 and __cxa_call_unexpected. - int handlerSwitchValue; - const unsigned char *actionRecord; - const unsigned char *languageSpecificData; - _Unwind_Ptr catchTemp; - void *adjustedPtr; -#endif - - // The generic exception header. Must be last. - _Unwind_Exception unwindHeader; -}; - -// Each thread in a C++ program has access to a __cxa_eh_globals object. -struct __cxa_eh_globals -{ - __cxa_exception *caughtExceptions; - unsigned int uncaughtExceptions; -#ifdef __ARM_EABI_UNWINDER__ - __cxa_exception* propagatingExceptions; -#endif -}; - -// @@@ These are not directly specified by the IA-64 C++ ABI. - -// Handles re-checking the exception specification if unexpectedHandler -// throws, and if bad_exception needs to be thrown. Called from the -// compiler. -extern "C" void __cxa_call_unexpected (void *) __attribute__((__noreturn__)); -extern "C" void __cxa_call_terminate (_Unwind_Exception*) throw () - __attribute__((__noreturn__)); - -#ifdef __ARM_EABI_UNWINDER__ -// Arm EABI specified routines. -typedef enum { - ctm_failed = 0, - ctm_succeeded = 1, - ctm_succeeded_with_ptr_to_base = 2 -} __cxa_type_match_result; -extern "C" __cxa_type_match_result __cxa_type_match(_Unwind_Exception*, - const std::type_info*, - bool, void**); -extern "C" bool __cxa_begin_cleanup (_Unwind_Exception*); -extern "C" void __cxa_end_cleanup (void); -#endif - -// Handles cleanup from transactional memory restart. -extern "C" void __cxa_tm_cleanup (void *, void *, unsigned int) throw(); - -// Invokes given handler, dying appropriately if the user handler was -// so inconsiderate as to return. -extern void __terminate(std::terminate_handler) throw () - __attribute__((__noreturn__)); -extern void __unexpected(std::unexpected_handler) - __attribute__((__noreturn__)); - -// The current installed user handlers. -extern std::terminate_handler __terminate_handler; -extern std::unexpected_handler __unexpected_handler; - -// These are explicitly GNU C++ specific. - -// Acquire the C++ exception header from the C++ object. -static inline __cxa_exception * -__get_exception_header_from_obj (void *ptr) -{ - return reinterpret_cast<__cxa_exception *>(ptr) - 1; -} - -// Acquire the C++ exception header from the generic exception header. -static inline __cxa_exception * -__get_exception_header_from_ue (_Unwind_Exception *exc) -{ - return reinterpret_cast<__cxa_exception *>(exc + 1) - 1; -} - -// Acquire the C++ refcounted exception header from the C++ object. -static inline __cxa_refcounted_exception * -__get_refcounted_exception_header_from_obj (void *ptr) -{ - return reinterpret_cast<__cxa_refcounted_exception *>(ptr) - 1; -} - -// Acquire the C++ refcounted exception header from the generic exception -// header. -static inline __cxa_refcounted_exception * -__get_refcounted_exception_header_from_ue (_Unwind_Exception *exc) -{ - return reinterpret_cast<__cxa_refcounted_exception *>(exc + 1) - 1; -} - -static inline __cxa_dependent_exception * -__get_dependent_exception_from_ue (_Unwind_Exception *exc) -{ - return reinterpret_cast<__cxa_dependent_exception *>(exc + 1) - 1; -} - -#ifdef __ARM_EABI_UNWINDER__ -static inline bool -__is_gxx_exception_class(_Unwind_Exception_Class c) -{ - // TODO: Take advantage of the fact that c will always be word aligned. - return c[0] == 'G' - && c[1] == 'N' - && c[2] == 'U' - && c[3] == 'C' - && c[4] == 'C' - && c[5] == '+' - && c[6] == '+' - && (c[7] == '\0' || c[7] == '\x01'); -} - -// Only checks for primary or dependent, but not that it is a C++ exception at -// all. -static inline bool -__is_dependent_exception(_Unwind_Exception_Class c) -{ - return c[7] == '\x01'; -} - -static inline void -__GXX_INIT_PRIMARY_EXCEPTION_CLASS(_Unwind_Exception_Class c) -{ - c[0] = 'G'; - c[1] = 'N'; - c[2] = 'U'; - c[3] = 'C'; - c[4] = 'C'; - c[5] = '+'; - c[6] = '+'; - c[7] = '\0'; -} - -static inline void -__GXX_INIT_DEPENDENT_EXCEPTION_CLASS(_Unwind_Exception_Class c) -{ - c[0] = 'G'; - c[1] = 'N'; - c[2] = 'U'; - c[3] = 'C'; - c[4] = 'C'; - c[5] = '+'; - c[6] = '+'; - c[7] = '\x01'; -} - -static inline bool -__is_gxx_forced_unwind_class(_Unwind_Exception_Class c) -{ - return c[0] == 'G' - && c[1] == 'N' - && c[2] == 'U' - && c[3] == 'C' - && c[4] == 'F' - && c[5] == 'O' - && c[6] == 'R' - && c[7] == '\0'; -} - -static inline void -__GXX_INIT_FORCED_UNWIND_CLASS(_Unwind_Exception_Class c) -{ - c[0] = 'G'; - c[1] = 'N'; - c[2] = 'U'; - c[3] = 'C'; - c[4] = 'F'; - c[5] = 'O'; - c[6] = 'R'; - c[7] = '\0'; -} - -static inline void* -__gxx_caught_object(_Unwind_Exception* eo) -{ - return (void*)eo->barrier_cache.bitpattern[0]; -} -#else // !__ARM_EABI_UNWINDER__ -// This is the primary exception class we report -- "GNUCC++\0". -const _Unwind_Exception_Class __gxx_primary_exception_class -= ((((((((_Unwind_Exception_Class) 'G' - << 8 | (_Unwind_Exception_Class) 'N') - << 8 | (_Unwind_Exception_Class) 'U') - << 8 | (_Unwind_Exception_Class) 'C') - << 8 | (_Unwind_Exception_Class) 'C') - << 8 | (_Unwind_Exception_Class) '+') - << 8 | (_Unwind_Exception_Class) '+') - << 8 | (_Unwind_Exception_Class) '\0'); - -// This is the dependent (from std::rethrow_exception) exception class we report -// "GNUCC++\x01" -const _Unwind_Exception_Class __gxx_dependent_exception_class -= ((((((((_Unwind_Exception_Class) 'G' - << 8 | (_Unwind_Exception_Class) 'N') - << 8 | (_Unwind_Exception_Class) 'U') - << 8 | (_Unwind_Exception_Class) 'C') - << 8 | (_Unwind_Exception_Class) 'C') - << 8 | (_Unwind_Exception_Class) '+') - << 8 | (_Unwind_Exception_Class) '+') - << 8 | (_Unwind_Exception_Class) '\x01'); - -static inline bool -__is_gxx_exception_class(_Unwind_Exception_Class c) -{ - return c == __gxx_primary_exception_class - || c == __gxx_dependent_exception_class; -} - -// Only checks for primary or dependent, but not that it is a C++ exception at -// all. -static inline bool -__is_dependent_exception(_Unwind_Exception_Class c) -{ - return (c & 1); -} - -#define __GXX_INIT_PRIMARY_EXCEPTION_CLASS(c) c = __gxx_primary_exception_class -#define __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(c) \ - c = __gxx_dependent_exception_class - -// GNU C++ personality routine, Version 0. -extern "C" _Unwind_Reason_Code __gxx_personality_v0 - (int, _Unwind_Action, _Unwind_Exception_Class, - struct _Unwind_Exception *, struct _Unwind_Context *); - -// GNU C++ sjlj personality routine, Version 0. -extern "C" _Unwind_Reason_Code __gxx_personality_sj0 - (int, _Unwind_Action, _Unwind_Exception_Class, - struct _Unwind_Exception *, struct _Unwind_Context *); - -static inline void* -__gxx_caught_object(_Unwind_Exception* eo) -{ - // Bad as it looks, this actually works for dependent exceptions too. - __cxa_exception* header = __get_exception_header_from_ue (eo); - return header->adjustedPtr; -} -#endif // !__ARM_EABI_UNWINDER__ - -static inline void* -__get_object_from_ue(_Unwind_Exception* eo) throw() -{ - return __is_dependent_exception (eo->exception_class) ? - __get_dependent_exception_from_ue (eo)->primaryException : - eo + 1; -} - -static inline void * -__get_object_from_ambiguous_exception(__cxa_exception *p_or_d) throw() -{ - return __get_object_from_ue (&p_or_d->unwindHeader); -} - - -} /* namespace __cxxabiv1 */ - -#pragma GCC visibility pop - -#endif // _UNWIND_CXX_H diff --git a/contrib/sdk/sources/libsupc++/unwind-pe.h b/contrib/sdk/sources/libsupc++/unwind-pe.h deleted file mode 100644 index 121f87767..000000000 --- a/contrib/sdk/sources/libsupc++/unwind-pe.h +++ /dev/null @@ -1,289 +0,0 @@ -/* Exception handling and frame unwind runtime interface routines. - Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009 Free Software Foundation, Inc. - - This file is part of GCC. - - GCC is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3, or (at your option) - any later version. - - GCC is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - Under Section 7 of GPL version 3, you are granted additional - permissions described in the GCC Runtime Library Exception, version - 3.1, as published by the Free Software Foundation. - - You should have received a copy of the GNU General Public License and - a copy of the GCC Runtime Library Exception along with this program; - see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - . */ - -/* @@@ Really this should be out of line, but this also causes link - compatibility problems with the base ABI. This is slightly better - than duplicating code, however. */ - -#ifndef GCC_UNWIND_PE_H -#define GCC_UNWIND_PE_H - -/* If using C++, references to abort have to be qualified with std::. */ -#if __cplusplus -#define __gxx_abort std::abort -#else -#define __gxx_abort abort -#endif - -/* Pointer encodings, from dwarf2.h. */ -#define DW_EH_PE_absptr 0x00 -#define DW_EH_PE_omit 0xff - -#define DW_EH_PE_uleb128 0x01 -#define DW_EH_PE_udata2 0x02 -#define DW_EH_PE_udata4 0x03 -#define DW_EH_PE_udata8 0x04 -#define DW_EH_PE_sleb128 0x09 -#define DW_EH_PE_sdata2 0x0A -#define DW_EH_PE_sdata4 0x0B -#define DW_EH_PE_sdata8 0x0C -#define DW_EH_PE_signed 0x08 - -#define DW_EH_PE_pcrel 0x10 -#define DW_EH_PE_textrel 0x20 -#define DW_EH_PE_datarel 0x30 -#define DW_EH_PE_funcrel 0x40 -#define DW_EH_PE_aligned 0x50 - -#define DW_EH_PE_indirect 0x80 - - -#ifndef NO_SIZE_OF_ENCODED_VALUE - -/* Given an encoding, return the number of bytes the format occupies. - This is only defined for fixed-size encodings, and so does not - include leb128. */ - -static unsigned int -size_of_encoded_value (unsigned char encoding) __attribute__ ((unused)); - -static unsigned int -size_of_encoded_value (unsigned char encoding) -{ - if (encoding == DW_EH_PE_omit) - return 0; - - switch (encoding & 0x07) - { - case DW_EH_PE_absptr: - return sizeof (void *); - case DW_EH_PE_udata2: - return 2; - case DW_EH_PE_udata4: - return 4; - case DW_EH_PE_udata8: - return 8; - } - __gxx_abort (); -} - -#endif - -#ifndef NO_BASE_OF_ENCODED_VALUE - -/* Given an encoding and an _Unwind_Context, return the base to which - the encoding is relative. This base may then be passed to - read_encoded_value_with_base for use when the _Unwind_Context is - not available. */ - -static _Unwind_Ptr -base_of_encoded_value (unsigned char encoding, struct _Unwind_Context *context) -{ - if (encoding == DW_EH_PE_omit) - return 0; - - switch (encoding & 0x70) - { - case DW_EH_PE_absptr: - case DW_EH_PE_pcrel: - case DW_EH_PE_aligned: - return 0; - - case DW_EH_PE_textrel: - return _Unwind_GetTextRelBase (context); - case DW_EH_PE_datarel: - return _Unwind_GetDataRelBase (context); - case DW_EH_PE_funcrel: - return _Unwind_GetRegionStart (context); - } - __gxx_abort (); -} - -#endif - -/* Read an unsigned leb128 value from P, store the value in VAL, return - P incremented past the value. We assume that a word is large enough to - hold any value so encoded; if it is smaller than a pointer on some target, - pointers should not be leb128 encoded on that target. */ - -static const unsigned char * -read_uleb128 (const unsigned char *p, _uleb128_t *val) -{ - unsigned int shift = 0; - unsigned char byte; - _uleb128_t result; - - result = 0; - do - { - byte = *p++; - result |= ((_uleb128_t)byte & 0x7f) << shift; - shift += 7; - } - while (byte & 0x80); - - *val = result; - return p; -} - -/* Similar, but read a signed leb128 value. */ - -static const unsigned char * -read_sleb128 (const unsigned char *p, _sleb128_t *val) -{ - unsigned int shift = 0; - unsigned char byte; - _uleb128_t result; - - result = 0; - do - { - byte = *p++; - result |= ((_uleb128_t)byte & 0x7f) << shift; - shift += 7; - } - while (byte & 0x80); - - /* Sign-extend a negative value. */ - if (shift < 8 * sizeof(result) && (byte & 0x40) != 0) - result |= -(((_uleb128_t)1L) << shift); - - *val = (_sleb128_t) result; - return p; -} - -/* Load an encoded value from memory at P. The value is returned in VAL; - The function returns P incremented past the value. BASE is as given - by base_of_encoded_value for this encoding in the appropriate context. */ - -static const unsigned char * -read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base, - const unsigned char *p, _Unwind_Ptr *val) -{ - union unaligned - { - void *ptr; - unsigned u2 __attribute__ ((mode (HI))); - unsigned u4 __attribute__ ((mode (SI))); - unsigned u8 __attribute__ ((mode (DI))); - signed s2 __attribute__ ((mode (HI))); - signed s4 __attribute__ ((mode (SI))); - signed s8 __attribute__ ((mode (DI))); - } __attribute__((__packed__)); - - const union unaligned *u = (const union unaligned *) p; - _Unwind_Internal_Ptr result; - - if (encoding == DW_EH_PE_aligned) - { - _Unwind_Internal_Ptr a = (_Unwind_Internal_Ptr) p; - a = (a + sizeof (void *) - 1) & - sizeof(void *); - result = *(_Unwind_Internal_Ptr *) a; - p = (const unsigned char *) (_Unwind_Internal_Ptr) (a + sizeof (void *)); - } - else - { - switch (encoding & 0x0f) - { - case DW_EH_PE_absptr: - result = (_Unwind_Internal_Ptr) u->ptr; - p += sizeof (void *); - break; - - case DW_EH_PE_uleb128: - { - _uleb128_t tmp; - p = read_uleb128 (p, &tmp); - result = (_Unwind_Internal_Ptr) tmp; - } - break; - - case DW_EH_PE_sleb128: - { - _sleb128_t tmp; - p = read_sleb128 (p, &tmp); - result = (_Unwind_Internal_Ptr) tmp; - } - break; - - case DW_EH_PE_udata2: - result = u->u2; - p += 2; - break; - case DW_EH_PE_udata4: - result = u->u4; - p += 4; - break; - case DW_EH_PE_udata8: - result = u->u8; - p += 8; - break; - - case DW_EH_PE_sdata2: - result = u->s2; - p += 2; - break; - case DW_EH_PE_sdata4: - result = u->s4; - p += 4; - break; - case DW_EH_PE_sdata8: - result = u->s8; - p += 8; - break; - - default: - __gxx_abort (); - } - - if (result != 0) - { - result += ((encoding & 0x70) == DW_EH_PE_pcrel - ? (_Unwind_Internal_Ptr) u : base); - if (encoding & DW_EH_PE_indirect) - result = *(_Unwind_Internal_Ptr *) result; - } - } - - *val = result; - return p; -} - -#ifndef NO_BASE_OF_ENCODED_VALUE - -/* Like read_encoded_value_with_base, but get the base from the context - rather than providing it directly. */ - -static inline const unsigned char * -read_encoded_value (struct _Unwind_Context *context, unsigned char encoding, - const unsigned char *p, _Unwind_Ptr *val) -{ - return read_encoded_value_with_base (encoding, - base_of_encoded_value (encoding, context), - p, val); -} - -#endif - -#endif /* unwind-pe.h */ diff --git a/contrib/sdk/sources/libsupc++/vmi_class_type_info.cc b/contrib/sdk/sources/libsupc++/vmi_class_type_info.cc deleted file mode 100644 index 195061d72..000000000 --- a/contrib/sdk/sources/libsupc++/vmi_class_type_info.cc +++ /dev/null @@ -1,391 +0,0 @@ -// Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2007, 2009 -// Free Software Foundation -// -// This file is part of GCC. -// -// GCC is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 3, or (at your option) -// any later version. - -// GCC is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include "tinfo.h" - -namespace __cxxabiv1 { - -__vmi_class_type_info:: -~__vmi_class_type_info () -{} - -__class_type_info::__sub_kind __vmi_class_type_info:: -__do_find_public_src (ptrdiff_t src2dst, - const void *obj_ptr, - const __class_type_info *src_type, - const void *src_ptr) const -{ - if (obj_ptr == src_ptr && *this == *src_type) - return __contained_public; - - for (std::size_t i = __base_count; i--;) - { - if (!__base_info[i].__is_public_p ()) - continue; // Not public, can't be here. - - const void *base = obj_ptr; - ptrdiff_t offset = __base_info[i].__offset (); - bool is_virtual = __base_info[i].__is_virtual_p (); - - if (is_virtual) - { - if (src2dst == -3) - continue; // Not a virtual base, so can't be here. - } - base = convert_to_base (base, is_virtual, offset); - - __sub_kind base_kind = __base_info[i].__base_type->__do_find_public_src - (src2dst, base, src_type, src_ptr); - if (contained_p (base_kind)) - { - if (is_virtual) - base_kind = __sub_kind (base_kind | __contained_virtual_mask); - return base_kind; - } - } - - return __not_contained; -} - -// This is a big hairy function. Although the run-time behaviour of -// dynamic_cast is simple to describe, it gives rise to some non-obvious -// behaviour. We also desire to determine as early as possible any definite -// answer we can get. Because it is unknown what the run-time ratio of -// succeeding to failing dynamic casts is, we do not know in which direction -// to bias any optimizations. To that end we make no particular effort towards -// early fail answers or early success answers. Instead we try to minimize -// work by filling in things lazily (when we know we need the information), -// and opportunisticly take early success or failure results. -bool __vmi_class_type_info:: -__do_dyncast (ptrdiff_t src2dst, - __sub_kind access_path, - const __class_type_info *dst_type, - const void *obj_ptr, - const __class_type_info *src_type, - const void *src_ptr, - __dyncast_result &__restrict result) const -{ - if (result.whole_details & __flags_unknown_mask) - result.whole_details = __flags; - - if (obj_ptr == src_ptr && *this == *src_type) - { - // The src object we started from. Indicate how we are accessible from - // the most derived object. - result.whole2src = access_path; - return false; - } - if (*this == *dst_type) - { - result.dst_ptr = obj_ptr; - result.whole2dst = access_path; - if (src2dst >= 0) - result.dst2src = adjust_pointer (obj_ptr, src2dst) == src_ptr - ? __contained_public : __not_contained; - else if (src2dst == -2) - result.dst2src = __not_contained; - return false; - } - - // If src_type is a unique non-virtual base of dst_type, we have a good - // guess at the address we want, so in the first pass try skipping any - // bases which don't contain that address. - const void *dst_cand = NULL; - if (src2dst >= 0) - dst_cand = adjust_pointer(src_ptr, -src2dst); - bool first_pass = true; - bool skipped = false; - - bool result_ambig = false; - again: - for (std::size_t i = __base_count; i--;) - { - __dyncast_result result2 (result.whole_details); - void const *base = obj_ptr; - __sub_kind base_access = access_path; - ptrdiff_t offset = __base_info[i].__offset (); - bool is_virtual = __base_info[i].__is_virtual_p (); - - if (is_virtual) - base_access = __sub_kind (base_access | __contained_virtual_mask); - base = convert_to_base (base, is_virtual, offset); - - if (dst_cand) - { - bool skip_on_first_pass = base > dst_cand; - if (skip_on_first_pass == first_pass) - { - // We aren't interested in this base on this pass: either - // we're on the first pass and this base doesn't contain the - // likely address, or we're on the second pass and we checked - // this base on the first pass. - skipped = true; - continue; - } - } - - if (!__base_info[i].__is_public_p ()) - { - if (src2dst == -2 && - !(result.whole_details - & (__non_diamond_repeat_mask | __diamond_shaped_mask))) - // The hierarchy has no duplicate bases (which might ambiguate - // things) and where we started is not a public base of what we - // want (so it cannot be a downcast). There is nothing of interest - // hiding in a non-public base. - continue; - base_access = __sub_kind (base_access & ~__contained_public_mask); - } - - bool result2_ambig - = __base_info[i].__base_type->__do_dyncast (src2dst, base_access, - dst_type, base, - src_type, src_ptr, result2); - result.whole2src = __sub_kind (result.whole2src | result2.whole2src); - if (result2.dst2src == __contained_public - || result2.dst2src == __contained_ambig) - { - result.dst_ptr = result2.dst_ptr; - result.whole2dst = result2.whole2dst; - result.dst2src = result2.dst2src; - // Found a downcast which can't be bettered or an ambiguous downcast - // which can't be disambiguated - return result2_ambig; - } - - if (!result_ambig && !result.dst_ptr) - { - // Not found anything yet. - result.dst_ptr = result2.dst_ptr; - result.whole2dst = result2.whole2dst; - result_ambig = result2_ambig; - if (result.dst_ptr && result.whole2src != __unknown - && !(__flags & __non_diamond_repeat_mask)) - // Found dst and src and we don't have repeated bases. - return result_ambig; - } - else if (result.dst_ptr && result.dst_ptr == result2.dst_ptr) - { - // Found at same address, must be via virtual. Pick the most - // accessible path. - result.whole2dst = - __sub_kind (result.whole2dst | result2.whole2dst); - } - else if ((result.dst_ptr != 0 && result2.dst_ptr != 0) - || (result.dst_ptr != 0 && result2_ambig) - || (result2.dst_ptr != 0 && result_ambig)) - { - // Found two different DST_TYPE bases, or a valid one and a set of - // ambiguous ones, must disambiguate. See whether SRC_PTR is - // contained publicly within one of the non-ambiguous choices. If it - // is in only one, then that's the choice. If it is in both, then - // we're ambiguous and fail. If it is in neither, we're ambiguous, - // but don't yet fail as we might later find a third base which does - // contain SRC_PTR. - - __sub_kind new_sub_kind = result2.dst2src; - __sub_kind old_sub_kind = result.dst2src; - - if (contained_p (result.whole2src) - && (!virtual_p (result.whole2src) - || !(result.whole_details & __diamond_shaped_mask))) - { - // We already found SRC_PTR as a base of most derived, and - // either it was non-virtual, or the whole hierarchy is - // not-diamond shaped. Therefore if it is in either choice, it - // can only be in one of them, and we will already know. - if (old_sub_kind == __unknown) - old_sub_kind = __not_contained; - if (new_sub_kind == __unknown) - new_sub_kind = __not_contained; - } - else - { - if (old_sub_kind >= __not_contained) - ;// already calculated - else if (contained_p (new_sub_kind) - && (!virtual_p (new_sub_kind) - || !(__flags & __diamond_shaped_mask))) - // Already found inside the other choice, and it was - // non-virtual or we are not diamond shaped. - old_sub_kind = __not_contained; - else - old_sub_kind = dst_type->__find_public_src - (src2dst, result.dst_ptr, src_type, src_ptr); - - if (new_sub_kind >= __not_contained) - ;// already calculated - else if (contained_p (old_sub_kind) - && (!virtual_p (old_sub_kind) - || !(__flags & __diamond_shaped_mask))) - // Already found inside the other choice, and it was - // non-virtual or we are not diamond shaped. - new_sub_kind = __not_contained; - else - new_sub_kind = dst_type->__find_public_src - (src2dst, result2.dst_ptr, src_type, src_ptr); - } - - // Neither sub_kind can be contained_ambig -- we bail out early - // when we find those. - if (contained_p (__sub_kind (new_sub_kind ^ old_sub_kind))) - { - // Only on one choice, not ambiguous. - if (contained_p (new_sub_kind)) - { - // Only in new. - result.dst_ptr = result2.dst_ptr; - result.whole2dst = result2.whole2dst; - result_ambig = false; - old_sub_kind = new_sub_kind; - } - result.dst2src = old_sub_kind; - if (public_p (result.dst2src)) - return false; // Can't be an ambiguating downcast for later discovery. - if (!virtual_p (result.dst2src)) - return false; // Found non-virtually can't be bettered - } - else if (contained_p (__sub_kind (new_sub_kind & old_sub_kind))) - { - // In both. - result.dst_ptr = NULL; - result.dst2src = __contained_ambig; - return true; // Fail. - } - else - { - // In neither publicly, ambiguous for the moment, but keep - // looking. It is possible that it was private in one or - // both and therefore we should fail, but that's just tough. - result.dst_ptr = NULL; - result.dst2src = __not_contained; - result_ambig = true; - } - } - - if (result.whole2src == __contained_private) - // We found SRC_PTR as a private non-virtual base, therefore all - // cross casts will fail. We have already found a down cast, if - // there is one. - return result_ambig; - } - - if (skipped && first_pass) - { - // We didn't find dst where we expected it, so let's go back and try - // the bases we skipped (if any). - first_pass = false; - goto again; - } - - return result_ambig; -} - -bool __vmi_class_type_info:: -__do_upcast (const __class_type_info *dst, const void *obj_ptr, - __upcast_result &__restrict result) const -{ - if (__class_type_info::__do_upcast (dst, obj_ptr, result)) - return true; - - int src_details = result.src_details; - if (src_details & __flags_unknown_mask) - src_details = __flags; - - for (std::size_t i = __base_count; i--;) - { - __upcast_result result2 (src_details); - const void *base = obj_ptr; - ptrdiff_t offset = __base_info[i].__offset (); - bool is_virtual = __base_info[i].__is_virtual_p (); - bool is_public = __base_info[i].__is_public_p (); - - if (!is_public && !(src_details & __non_diamond_repeat_mask)) - // original cannot have an ambiguous base, so skip private bases - continue; - - if (base) - base = convert_to_base (base, is_virtual, offset); - - if (__base_info[i].__base_type->__do_upcast (dst, base, result2)) - { - if (result2.base_type == nonvirtual_base_type && is_virtual) - result2.base_type = __base_info[i].__base_type; - if (contained_p (result2.part2dst) && !is_public) - result2.part2dst = __sub_kind (result2.part2dst & ~__contained_public_mask); - - if (!result.base_type) - { - result = result2; - if (!contained_p (result.part2dst)) - return true; // found ambiguously - - if (result.part2dst & __contained_public_mask) - { - if (!(__flags & __non_diamond_repeat_mask)) - return true; // cannot have an ambiguous other base - } - else - { - if (!virtual_p (result.part2dst)) - return true; // cannot have another path - if (!(__flags & __diamond_shaped_mask)) - return true; // cannot have a more accessible path - } - } - else if (result.dst_ptr != result2.dst_ptr) - { - // Found an ambiguity. - result.dst_ptr = NULL; - result.part2dst = __contained_ambig; - return true; - } - else if (result.dst_ptr) - { - // Ok, found real object via a virtual path. - result.part2dst - = __sub_kind (result.part2dst | result2.part2dst); - } - else - { - // Dealing with a null pointer, need to check vbase - // containing each of the two choices. - if (result2.base_type == nonvirtual_base_type - || result.base_type == nonvirtual_base_type - || !(*result2.base_type == *result.base_type)) - { - // Already ambiguous, not virtual or via different virtuals. - // Cannot match. - result.part2dst = __contained_ambig; - return true; - } - result.part2dst - = __sub_kind (result.part2dst | result2.part2dst); - } - } - } - return result.part2dst != __unknown; -} - -} diff --git a/contrib/sdk/sources/libsupc++/vterminate.cc b/contrib/sdk/sources/libsupc++/vterminate.cc deleted file mode 100644 index 00c86e54c..000000000 --- a/contrib/sdk/sources/libsupc++/vterminate.cc +++ /dev/null @@ -1,101 +0,0 @@ -// Verbose terminate_handler -*- C++ -*- - -// Copyright (C) 2001, 2002, 2004, 2005, 2009, 2011 Free Software Foundation -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// Under Section 7 of GPL version 3, you are granted additional -// permissions described in the GCC Runtime Library Exception, version -// 3.1, as published by the Free Software Foundation. - -// You should have received a copy of the GNU General Public License and -// a copy of the GCC Runtime Library Exception along with this program; -// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -// . - -#include - -#if _GLIBCXX_HOSTED -#include -#include -#include -#include -# include - -using namespace std; -using namespace abi; - -namespace __gnu_cxx -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - - // A replacement for the standard terminate_handler which prints - // more information about the terminating exception (if any) on - // stderr. - void __verbose_terminate_handler() - { - static bool terminating; - if (terminating) - { - //fputs("terminate called recursively\n", stderr); - abort (); - } - terminating = true; - - // Make sure there was an exception; terminate is also called for an - // attempt to rethrow when there is no suitable exception. - type_info *t = __cxa_current_exception_type(); - if (t) - { - // Note that "name" is the mangled name. - char const *name = t->name(); - { - int status = -1; - char *dem = 0; - -// dem = __cxa_demangle(name, 0, 0, &status); - -// fputs("terminate called after throwing an instance of '", stderr); -// if (status == 0) -// fputs(dem, stderr); -// else -// fputs(name, stderr); -// fputs("'\n", stderr); - -// if (status == 0) -// free(dem); - } - - // If the exception is derived from std::exception, we can - // give more information. - __try { __throw_exception_again; } -#ifdef __EXCEPTIONS - __catch(const exception& exc) - { - char const *w = exc.what(); -// fputs(" what(): ", stderr); -// fputs(w, stderr); -// fputs("\n", stderr); - } -#endif - __catch(...) { } - } - else; -// fputs("terminate called without an active exception\n", stderr); - - abort(); - } - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace - -#endif