Index: libstdc++-v3/libsupc++/eh_terminate.cc =================================================================== RCS file: /cvs/gcc/gcc/libstdc++-v3/libsupc++/eh_terminate.cc,v retrieving revision 1.4 retrieving revision 1.4.78.1 diff -u -p -u -p -r1.4 -r1.4.78.1 --- libstdc++-v3/libsupc++/eh_terminate.cc 24 May 2003 16:22:03 -0000 1.4 +++ libstdc++-v3/libsupc++/eh_terminate.cc 21 Feb 2005 21:21:30 -0000 1.4.78.1 @@ -34,6 +34,12 @@ #include "unwind-cxx.h" #include "exception_defines.h" +/* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) +#include "bits/os_defines.h" +#endif +/* APPLE LOCAL end keymgr */ + using namespace __cxxabiv1; void @@ -50,6 +56,18 @@ __cxxabiv1::__terminate (std::terminate_ void std::terminate () { + /* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) + /* + * If the Key Manager has a terminate function assigned to this thread, invoke that fn. + * If not (KeyMgr has 0), use whatever is initialized into my local static pointer (above). + */ + std::terminate_handler __keymgr_terminate_func = (std::terminate_handler) + _keymgr_get_per_thread_data (KEYMGR_TERMINATE_HANDLER_KEY); + if (__keymgr_terminate_func) + __terminate_handler = __keymgr_terminate_func; +#endif /* __APPLE__ etc. */ + /* APPLE LOCAL end keymgr */ __terminate (__terminate_handler); } @@ -63,13 +81,32 @@ __cxxabiv1::__unexpected (std::unexpecte void std::unexpected () { + /* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) + /* Similar to terminate case above. */ + std::unexpected_handler __keymgr_unexpected_func = (std::unexpected_handler) + _keymgr_get_per_thread_data (KEYMGR_UNEXPECTED_HANDLER_KEY); + if (__keymgr_unexpected_func) + __unexpected_handler = __keymgr_unexpected_func; +#endif /* __APPLE__ etc. */ + /* APPLE LOCAL end keymgr */ __unexpected (__unexpected_handler); } std::terminate_handler std::set_terminate (std::terminate_handler func) throw() { + /* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) + std::terminate_handler old = + (std::terminate_handler) _keymgr_get_per_thread_data (KEYMGR_TERMINATE_HANDLER_KEY); + _keymgr_set_per_thread_data (KEYMGR_TERMINATE_HANDLER_KEY, (void *) func) ; + if ( ! old) + old = __terminate_handler; +#else std::terminate_handler old = __terminate_handler; +#endif /* __APPLE__ etc. */ + /* APPLE LOCAL end keymgr */ __terminate_handler = func; return old; } @@ -77,7 +114,17 @@ std::set_terminate (std::terminate_handl std::unexpected_handler std::set_unexpected (std::unexpected_handler func) throw() { + /* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) + std::unexpected_handler old = + (std::unexpected_handler) _keymgr_get_per_thread_data (KEYMGR_UNEXPECTED_HANDLER_KEY); + _keymgr_set_per_thread_data (KEYMGR_UNEXPECTED_HANDLER_KEY, (void *) func); + if ( ! old) + old = __unexpected_handler; +#else std::unexpected_handler old = __unexpected_handler; +#endif /* __APPLE__ etc. */ + /* APPLE LOCAL end keymgr */ __unexpected_handler = func; return old; } Index: libstdc++-v3/libsupc++/new_handler.cc =================================================================== RCS file: /cvs/gcc/gcc/libstdc++-v3/libsupc++/new_handler.cc,v retrieving revision 1.7 retrieving revision 1.7.78.1 diff -u -p -u -p -r1.7 -r1.7.78.1 --- new_handler.cc.orig 2003-05-24 09:22:03.000000000 -0700 +++ libstdc++-v3/libsupc++/new_handler.cc 2005-07-11 18:16:26.000000000 -0700 @@ -31,6 +31,12 @@ #include "new" +/* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) +#include "bits/os_defines.h" +#endif +/* APPLE LOCAL end keymgr */ + const std::nothrow_t std::nothrow = { }; using std::new_handler; @@ -39,7 +45,17 @@ new_handler __new_handler; new_handler std::set_new_handler (new_handler handler) throw() { +/* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) + new_handler prev_handler = + (new_handler) _keymgr_get_per_thread_data (KEYMGR_NEW_HANDLER_KEY); + if ( ! prev_handler) + prev_handler = __new_handler; + _keymgr_set_per_thread_data (KEYMGR_NEW_HANDLER_KEY, (void *) handler); +#else /* __APPLE__ etc. */ new_handler prev_handler = __new_handler; +#endif /* __APPLE__ etc. */ +/* APPLE LOCAL end keymgr */ __new_handler = handler; return prev_handler; } Index: libstdc++-v3/libsupc++/new_op.cc --- new_op.cc.orig 2004-11-02 20:07:22.000000000 -0800 +++ libstdc++-v3/libsupc++/new_op.cc 2005-07-11 18:03:27.000000000 -0700 @@ -57,7 +57,15 @@ operator new (std::size_t sz) throw (std p = (void *) malloc (sz); while (p == 0) { + /* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) + /* Ask Key Manager for new_handler; if provided (!=0), use it, else use local version. */ + new_handler handler = + (new_handler) _keymgr_get_per_thread_data (KEYMGR_NEW_HANDLER_KEY); +#else /* __APPLE__ etc. */ new_handler handler = __new_handler; +#endif /* __APPLE__ etc. */ + /* APPLE LOCAL end keymgr */ if (! handler) #ifdef __EXCEPTIONS throw bad_alloc(); Index: libstdc++-v3/libsupc++/new_opnt.cc =================================================================== RCS file: /cvs/gcc/gcc/libstdc++-v3/libsupc++/new_opnt.cc,v retrieving revision 1.7 retrieving revision 1.7.14.1 diff -u -p -u -p -r1.7 -r1.7.14.1 --- libstdc++-v3/libsupc++/new_opnt.cc 3 Nov 2004 04:07:22 -0000 1.7 +++ libstdc++-v3/libsupc++/new_opnt.cc 21 Feb 2005 21:21:30 -0000 1.7.14.1 @@ -31,6 +31,12 @@ #include <exception_defines.h> #include <bits/c++config.h> +/* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) +#include "bits/os_defines.h" +#endif /* __APPLE__ etc. */ +/* APPLE LOCAL end keymgr */ + using std::new_handler; using std::bad_alloc; @@ -48,7 +54,14 @@ operator new (std::size_t sz, const std: p = (void *) malloc (sz); while (p == 0) { + /* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) + new_handler handler = + (new_handler) _keymgr_get_per_thread_data (KEYMGR_NEW_HANDLER_KEY); +#else /* __APPLE__ etc. */ new_handler handler = __new_handler; +#endif /* __APPLE__ etc. */ + /* APPLE LOCAL end keymgr */ if (! handler) return 0; try Index: libstdc++-v3/config/os/bsd/darwin/os_defines.h =================================================================== RCS file: /cvs/gcc/gcc/libstdc++-v3/config/os/bsd/darwin/os_defines.h,v retrieving revision 1.3 retrieving revision 1.3.22.1 diff -u -p -u -p -r1.3 -r1.3.22.1 --- libstdc++-v3/config/os/bsd/darwin/os_defines.h 3 Nov 2004 02:59:59 -0000 1.3 +++ libstdc++-v3/config/os/bsd/darwin/os_defines.h 28 Feb 2005 22:25:55 -0000 1.3.22.1 @@ -44,4 +44,144 @@ // -flat_namespace to work around the way that it doesn't. #define _GLIBCXX_WEAK_DEFINITION __attribute__ ((weak)) +/* APPLE LOCAL begin keymgr */ +#if defined(__APPLE__) && defined(__ppc__) && defined(PIC) +/* Copyright (C) 1989, 92-97, 1998, Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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 2, or (at your option) +any later version. + +GNU CC 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. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + + +/* + * This file added by Apple Computer Inc. for its OS X + * environment. + */ + +#ifndef __KEYMGR_H +#define __KEYMGR_H + +#ifdef __cplusplus +extern "C" { +#endif + + + +/* + * keymgr - Create and maintain process-wide global data known to + * all threads across all dynamic libraries. + * + */ + +typedef enum node_kinds { + NODE_THREAD_SPECIFIC_DATA=1, + NODE_PROCESSWIDE_PTR=2, + NODE_LAST_KIND + } TnodeKind ; + +/* + * These enum members are bits or combination of bits. + */ + +typedef enum node_mode { + NM_ALLOW_RECURSION=1, + NM_RECURSION_ILLEGAL=2, + NM_ENHANCED_LOCKING=3, + NM_LOCKED=4 + } TnodeMode ; + +/* WARNING: the return value of _keymgr_set_per_thread_data is + not meaningful on Tiger and above. Use the macro + KEYMGR_SET_PER_THREAD_DATA (below) to handle this properly. */ +extern void * _keymgr_get_per_thread_data(unsigned int key) ; +extern int _keymgr_set_per_thread_data(unsigned int key, void *keydata) ; +extern void *_keymgr_get_and_lock_processwide_ptr(unsigned int key) ; +extern void _keymgr_set_and_unlock_processwide_ptr(unsigned int key, void *ptr) ; +extern void _keymgr_unlock_processwide_ptr(unsigned int key) ; +extern void _keymgr_set_lockmode_processwide_ptr(unsigned int key, unsigned int mode) ; +extern unsigned int _keymgr_get_lockmode_processwide_ptr(unsigned int key) ; +extern int _keymgr_get_lock_count_processwide_ptr(unsigned int key) ; + +extern void *__keymgr_global[]; +typedef struct _Sinfo_Node { + unsigned int size ; /*size of this node*/ + unsigned short major_version ; /*API major version.*/ + unsigned short minor_version ; /*API minor version.*/ + } _Tinfo_Node ; + +#define KEYMGR_VERSION \ + (__keymgr_global[2] ? ((_Tinfo_Node *)__keymgr_global[2])->major_version : 0) + +#define KEYMGR_SET_PER_THREAD_DATA(key, keydata) \ + (KEYMGR_VERSION >= 4 \ + ? _keymgr_set_per_thread_data((key), (keydata)) \ + : (_keymgr_set_per_thread_data((key), (keydata)), 0)) + +#ifndef NULL +#ifdef __GNUG__ +#define NULL __null +#else +#define NULL 0 +#endif +#endif + +/* + * Keys currently in use: + */ + +#define KEYMGR_EH_CONTEXT_KEY 1 /*stores handle for root pointer of exception context node.*/ + +#define KEYMGR_NEW_HANDLER_KEY 2 /*store handle for new handler pointer.*/ + +#define KEYMGR_UNEXPECTED_HANDLER_KEY 3 /*store handle for unexpected exception pointer.*/ + +#define KEYMGR_TERMINATE_HANDLER_KEY 4 /*store handle for terminate handler pointer. */ + +#define KEYMGR_MODE_BITS 5 /*stores handle for runtime mode bits.*/ + +#define KEYMGR_IO_LIST 6 /*Root pointer to the list of open streams.*/ + +#define KEYMGR_IO_STDIN 7 /*GNU stdin.*/ + +#define KEYMGR_IO_STDOUT 8 /*GNU stdout.*/ + +#define KEYMGR_IO_STDERR 9 /*GNU stderr.*/ + +#define KEYMGR_IO_REFCNT 10 /*How many plugins/main program currently using streams.*/ + +#define KEYMGR_IO_MODE_BITS 11 /*Flags controlling the behavior of C++ I/O.*/ + +#define KEYMGR_ZOE_IMAGE_LIST 12 /*Head pointer for list of per image dwarf2 unwind sections.*/ + +#define KEYMGR_EH_GLOBALS_KEY 13 /* Variable used in eh_globals.cc */ + +/* + * Other important data. + */ + +#define KEYMGR_API_REV_MAJOR 2 /*Major revision number of the keymgr API.*/ +#define KEYMGR_API_REV_MINOR 1 /*Minor revision number of the keymgr API.*/ + + + +#ifdef __cplusplus +} +#endif + +#endif /* __KEYMGR_H */ +#endif /* __APPLE__ etc. */ +/* APPLE LOCAL end keymgr */ #endif --- libstdc++-v3/libsupc++/eh_globals.cc-orig 2005-08-23 12:35:39.000000000 -0700 +++ libstdc++-v3/libsupc++/eh_globals.cc 2005-08-23 12:36:19.000000000 -0700 @@ -37,6 +37,7 @@ using namespace __cxxabiv1; +#if ! defined(__APPLE__) || ! defined (__ppc__) || ! defined (PIC) // Single-threaded fallback buffer. static __cxa_eh_globals globals_static; @@ -77,10 +78,12 @@ get_globals_init_once () use_thread_key = 0; } #endif +#endif extern "C" __cxa_eh_globals * __cxxabiv1::__cxa_get_globals_fast () throw() { +#if ! defined(__APPLE__) || ! defined (__ppc__) || ! defined (PIC) #if __GTHREADS if (use_thread_key) return (__cxa_eh_globals *) __gthread_getspecific (globals_key); @@ -89,6 +92,11 @@ __cxxabiv1::__cxa_get_globals_fast () th #else return &globals_static; #endif +#else + /* APPLE LOCAL begin radar 3373515 */ + return (__cxa_eh_globals *) _keymgr_get_per_thread_data (KEYMGR_EH_GLOBALS_KEY); + /* APPLE LOCAL end radar 3373515 */ +#endif } extern "C" __cxa_eh_globals * @@ -96,6 +104,7 @@ __cxxabiv1::__cxa_get_globals () throw() { #if __GTHREADS __cxa_eh_globals *g; +#if ! defined(__APPLE__) || ! defined (__ppc__) || ! defined (PIC) if (use_thread_key == 0) return &globals_static; @@ -110,11 +119,20 @@ __cxxabiv1::__cxa_get_globals () throw() } g = (__cxa_eh_globals *) __gthread_getspecific (globals_key); +#else + g = (__cxa_eh_globals *) _keymgr_get_per_thread_data (KEYMGR_EH_GLOBALS_KEY); +#endif if (! g) { if ((g = (__cxa_eh_globals *) std::malloc (sizeof (__cxa_eh_globals))) == 0 +#if ! defined(__APPLE__) || ! defined (__ppc__) || ! defined (PIC) || __gthread_setspecific (globals_key, (void *) g) != 0) +#else + /* APPLE LOCAL begin radar 3373515 */ + || KEYMGR_SET_PER_THREAD_DATA (KEYMGR_EH_GLOBALS_KEY, (void *) g) != 0) + /* APPLE LOCAL end radar 3373515 */ +#endif std::terminate (); g->caughtExceptions = 0; g->uncaughtExceptions = 0;