Index: libstdc++-v3/libsupc++/eh_tm.cc =================================================================== --- libstdc++-v3/libsupc++/eh_tm.cc (.../trunk) (revision 0) +++ libstdc++-v3/libsupc++/eh_tm.cc (.../branches/transactional-memory) (revision 180773) @@ -0,0 +1,124 @@ +// -*- C++ -*- Exception handling routines for Transactional Memory. +// Copyright (C) 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 +// . + +#include +#include "unwind-cxx.h" + +using namespace __cxxabiv1; + +// Free one C++ exception. + +static void +free_any_cxa_exception (_Unwind_Exception *eo) +{ + __cxa_refcounted_exception *h + = __get_refcounted_exception_header_from_ue (eo); + + if (__is_dependent_exception (eo->exception_class)) + { + __cxa_dependent_exception *dep + = __get_dependent_exception_from_ue (eo); + + h = __get_refcounted_exception_header_from_obj (dep->primaryException); + + __cxa_free_dependent_exception (dep); + } + + if (__sync_sub_and_fetch (&h->referenceCount, 1) == 0) + __cxa_free_exception (h + 1); +} + +// Cleanup exception handling state while rolling back state for +// a software transactional memory transaction. +// +// UNTHROWN_OBJ is non-null if we've called __cxa_allocate_exception +// but not yet called __cxa_throw for it. +// +// CLEANUP_EXC is non-null if we're currently processing a cleanup +// along an exception path, but we've not caught the exception yet. +// +// CAUGHT_COUNT is the nesting depth of __cxa_begin_catch within +// the transaction; undo as if calling __cxa_end_catch that many times. + +extern "C" void +__cxxabiv1::__cxa_tm_cleanup (void *unthrown_obj, + void *cleanup_exc, + unsigned int caught_count) throw() +{ + __cxa_eh_globals *globals = __cxa_get_globals_fast (); + + // Handle a C++ exception not yet thrown. + if (unthrown_obj) + { + globals->uncaughtExceptions -= 1; + __cxa_free_exception (unthrown_obj); + } + + // Handle an exception not yet caught ie. processing a cleanup + // in between the throw and the catch. + if (cleanup_exc) + { + _Unwind_Exception *eo + = reinterpret_cast <_Unwind_Exception *>(cleanup_exc); + if (__is_gxx_exception_class (eo->exception_class)) + free_any_cxa_exception (eo); + else + _Unwind_DeleteException (eo); + } + + // Do __cxa_end_catch caught_count times, but don't bother running + // the destructors for the objects involved. All of that is being + // undone by the transaction restart. + if (caught_count > 0) + { + __cxa_exception *h = globals->caughtExceptions; + + // Rethrown foreign exceptions are removed from the stack immediately. + // We would have freed this exception via THIS_EXC above. + if (h == NULL) + return; + + do + { + __cxa_exception *next; + _Unwind_Exception *eo = &h->unwindHeader; + + if (__is_gxx_exception_class (eo->exception_class)) + { + next = h->nextException; + free_any_cxa_exception (eo); + } + else + { + _Unwind_DeleteException (eo); + next = 0; + } + + h = next; + } + while (--caught_count); + + globals->caughtExceptions = h; + } +} Index: libstdc++-v3/libsupc++/Makefile.in =================================================================== --- libstdc++-v3/libsupc++/Makefile.in (.../trunk) (revision 180744) +++ libstdc++-v3/libsupc++/Makefile.in (.../branches/transactional-memory) (revision 180773) @@ -95,13 +95,14 @@ am__objects_1 = array_type_info.lo atexi del_opnt.lo del_opv.lo del_opvnt.lo dyncast.lo eh_alloc.lo \ eh_arm.lo eh_aux_runtime.lo eh_call.lo eh_catch.lo \ eh_exception.lo eh_globals.lo eh_personality.lo eh_ptr.lo \ - eh_term_handler.lo eh_terminate.lo eh_throw.lo eh_type.lo \ - eh_unex_handler.lo enum_type_info.lo function_type_info.lo \ - fundamental_type_info.lo guard.lo guard_error.lo hash_bytes.lo \ - nested_exception.lo new_handler.lo new_op.lo new_opnt.lo \ - new_opv.lo new_opvnt.lo pbase_type_info.lo pmem_type_info.lo \ - pointer_type_info.lo pure.lo si_class_type_info.lo tinfo.lo \ - tinfo2.lo vec.lo vmi_class_type_info.lo vterminate.lo + eh_term_handler.lo eh_terminate.lo eh_tm.lo eh_throw.lo \ + eh_type.lo eh_unex_handler.lo enum_type_info.lo \ + function_type_info.lo fundamental_type_info.lo guard.lo \ + guard_error.lo hash_bytes.lo nested_exception.lo \ + new_handler.lo new_op.lo new_opnt.lo new_opv.lo new_opvnt.lo \ + pbase_type_info.lo pmem_type_info.lo pointer_type_info.lo \ + pure.lo si_class_type_info.lo tinfo.lo tinfo2.lo vec.lo \ + vmi_class_type_info.lo vterminate.lo @GLIBCXX_HOSTED_TRUE@am__objects_2 = cp-demangle.lo am_libsupc___la_OBJECTS = $(am__objects_1) $(am__objects_2) libsupc___la_OBJECTS = $(am_libsupc___la_OBJECTS) @@ -375,6 +376,7 @@ sources = \ eh_ptr.cc \ eh_term_handler.cc \ eh_terminate.cc \ + eh_tm.cc \ eh_throw.cc \ eh_type.cc \ eh_unex_handler.cc \ Index: libstdc++-v3/libsupc++/unwind-cxx.h =================================================================== --- libstdc++-v3/libsupc++/unwind-cxx.h (.../trunk) (revision 180744) +++ libstdc++-v3/libsupc++/unwind-cxx.h (.../branches/transactional-memory) (revision 180773) @@ -167,6 +167,9 @@ extern "C" bool __cxa_begin_cleanup (_Un 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 () Index: libstdc++-v3/libsupc++/Makefile.am =================================================================== --- libstdc++-v3/libsupc++/Makefile.am (.../trunk) (revision 180744) +++ libstdc++-v3/libsupc++/Makefile.am (.../branches/transactional-memory) (revision 180773) @@ -68,6 +68,7 @@ sources = \ eh_ptr.cc \ eh_term_handler.cc \ eh_terminate.cc \ + eh_tm.cc \ eh_throw.cc \ eh_type.cc \ eh_unex_handler.cc \ Index: libstdc++-v3/testsuite/util/testsuite_abi.cc =================================================================== --- libstdc++-v3/testsuite/util/testsuite_abi.cc (.../trunk) (revision 180744) +++ libstdc++-v3/testsuite/util/testsuite_abi.cc (.../branches/transactional-memory) (revision 180773) @@ -203,6 +203,7 @@ check_version(symbol& test, bool added) known_versions.push_back("CXXABI_1.3.2"); known_versions.push_back("CXXABI_1.3.3"); known_versions.push_back("CXXABI_1.3.4"); + known_versions.push_back("CXXABI_TM_1"); known_versions.push_back("CXXABI_1.3.5"); known_versions.push_back("CXXABI_1.3.6"); known_versions.push_back("CXXABI_LDBL_1.3"); Index: libstdc++-v3/config/abi/pre/gnu.ver =================================================================== --- libstdc++-v3/config/abi/pre/gnu.ver (.../trunk) (revision 180744) +++ libstdc++-v3/config/abi/pre/gnu.ver (.../branches/transactional-memory) (revision 180773) @@ -1458,6 +1458,15 @@ CXXABI_1.3.3 { } CXXABI_1.3.2; +# Symbols in the support library (libsupc++) supporting trans-mem. +CXXABI_TM_1 { + global: + __cxa_tm_cleanup; + + local: + *; +}; + CXXABI_1.3.4 { # typeinfo for decimal floating point types Index: libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver =================================================================== --- libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver (.../trunk) (revision 180744) +++ libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver (.../branches/transactional-memory) (revision 180773) @@ -302,3 +302,12 @@ CXXABI_2.0 { local: *; }; + +# Symbols in the support library (libsupc++) supporting trans-mem. +CXXABI_TM_1 { + global: + __cxa_tm_cleanup; + + local: + *; +};