| Index: gcc/libstdc++-v3/libsupc++/eh_alloc.cc
|
| diff --git a/gcc/libstdc++-v3/libsupc++/eh_alloc.cc b/gcc/libstdc++-v3/libsupc++/eh_alloc.cc
|
| deleted file mode 100644
|
| index 818af0fe1f024ec7175320d57d253cc036f3ed75..0000000000000000000000000000000000000000
|
| --- a/gcc/libstdc++-v3/libsupc++/eh_alloc.cc
|
| +++ /dev/null
|
| @@ -1,220 +0,0 @@
|
| -// -*- C++ -*- Allocate exception objects.
|
| -// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 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
|
| -// <http://www.gnu.org/licenses/>.
|
| -
|
| -// This is derived from the C++ ABI for IA-64. Where we diverge
|
| -// for cross-architecture compatibility are noted with "@@@".
|
| -
|
| -#include <bits/c++config.h>
|
| -#include <cstdlib>
|
| -#if _GLIBCXX_HOSTED
|
| -#include <cstring>
|
| -#endif
|
| -#include <climits>
|
| -#include <exception>
|
| -#include "unwind-cxx.h"
|
| -#include <ext/concurrence.h>
|
| -
|
| -#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) throw()
|
| -{
|
| - 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) throw()
|
| -{
|
| - 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() throw()
|
| -{
|
| - __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) throw()
|
| -{
|
| - 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);
|
| -}
|
|
|