diff options
author | Kai Tietz <ktietz@gcc.gnu.org> | 2011-12-16 19:43:06 +0100 |
---|---|---|
committer | Kai Tietz <ktietz@gcc.gnu.org> | 2011-12-16 19:43:06 +0100 |
commit | 2ecb85c86b62f9daa50b8fd19096ed9f80ede9e4 (patch) | |
tree | 235420959ce49d4349d33b9c1a7eb34ef39e0a60 | |
parent | 134f529521772583a1249809157d14f298a1440d (diff) | |
download | gcc-2ecb85c86b62f9daa50b8fd19096ed9f80ede9e4.zip gcc-2ecb85c86b62f9daa50b8fd19096ed9f80ede9e4.tar.gz gcc-2ecb85c86b62f9daa50b8fd19096ed9f80ede9e4.tar.bz2 |
re PR target/51135 (SIGSEGV during exception cleanup on win32)
PR libstdc++/51135
* libsupc++/unwind-cxx.h (__cxa_exception): Mark
exceptionDestructor by _GLIBCXX_CDTOR_CALLABI.
* libsupc++/eh_throw.cc (__cxa_throw): Mark destructor
function argument by _GLIBCXX_CDTOR_CALLABI.
* libsupc++/cxxabi.h (__cxa_throw): Likewise.
(_GLIBCXX_CDTOR_CALLABI): Add empty default
definition.
* config/os/mingw32-w64/os_defines.h (_GLIBCXX_CDTOR_CALLABI): Define
for IA-32 target as __thiscall.
* config/os/mingw32/os_defines.h (_GLIBCXX_CDTOR_CALLABI): Likewise.
From-SVN: r182410
-rw-r--r-- | libstdc++-v3/config/os/mingw32-w64/os_defines.h | 7 | ||||
-rw-r--r-- | libstdc++-v3/config/os/mingw32/os_defines.h | 7 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/cxxabi.h | 6 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/eh_throw.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/unwind-cxx.h | 2 |
5 files changed, 21 insertions, 3 deletions
diff --git a/libstdc++-v3/config/os/mingw32-w64/os_defines.h b/libstdc++-v3/config/os/mingw32-w64/os_defines.h index 160c1ff..f82e25c 100644 --- a/libstdc++-v3/config/os/mingw32-w64/os_defines.h +++ b/libstdc++-v3/config/os/mingw32-w64/os_defines.h @@ -65,4 +65,11 @@ // ioctlsocket function doesn't work for normal file-descriptors. #define _GLIBCXX_NO_IOCTL 1 +// See libstdc++/51135 +// Class constructors/destructors have __thiscall calling-convention on +// IA 32-bit +#if defined (__i386__) +#define _GLIBCXX_CDTOR_CALLABI __thiscall +#endif + #endif diff --git a/libstdc++-v3/config/os/mingw32/os_defines.h b/libstdc++-v3/config/os/mingw32/os_defines.h index 160c1ff..f82e25c 100644 --- a/libstdc++-v3/config/os/mingw32/os_defines.h +++ b/libstdc++-v3/config/os/mingw32/os_defines.h @@ -65,4 +65,11 @@ // ioctlsocket function doesn't work for normal file-descriptors. #define _GLIBCXX_NO_IOCTL 1 +// See libstdc++/51135 +// Class constructors/destructors have __thiscall calling-convention on +// IA 32-bit +#if defined (__i386__) +#define _GLIBCXX_CDTOR_CALLABI __thiscall +#endif + #endif diff --git a/libstdc++-v3/libsupc++/cxxabi.h b/libstdc++-v3/libsupc++/cxxabi.h index aeaf4cc..b924fc1 100644 --- a/libstdc++-v3/libsupc++/cxxabi.h +++ b/libstdc++-v3/libsupc++/cxxabi.h @@ -51,6 +51,10 @@ #include <bits/cxxabi_tweaks.h> #include <bits/cxxabi_forced.h> +#ifndef _GLIBCXX_CDTOR_CALLABI +#define _GLIBCXX_CDTOR_CALLABI +#endif + #ifdef __cplusplus namespace __cxxabiv1 { @@ -596,7 +600,7 @@ namespace __cxxabiv1 // Throw the exception. void - __cxa_throw(void*, std::type_info*, void (*) (void *)) + __cxa_throw(void*, std::type_info*, void (_GLIBCXX_CDTOR_CALLABI *) (void *)) __attribute__((__noreturn__)); // Used to implement exception handlers. diff --git a/libstdc++-v3/libsupc++/eh_throw.cc b/libstdc++-v3/libsupc++/eh_throw.cc index 0e7083c..a3d2b0d 100644 --- a/libstdc++-v3/libsupc++/eh_throw.cc +++ b/libstdc++-v3/libsupc++/eh_throw.cc @@ -59,7 +59,7 @@ __gxx_exception_cleanup (_Unwind_Reason_Code code, _Unwind_Exception *exc) extern "C" void __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, - void (*dest) (void *)) + void (_GLIBCXX_CDTOR_CALLABI *dest) (void *)) { // Definitely a primary. __cxa_refcounted_exception *header diff --git a/libstdc++-v3/libsupc++/unwind-cxx.h b/libstdc++-v3/libsupc++/unwind-cxx.h index 3ce32e9..b0cdeae 100644 --- a/libstdc++-v3/libsupc++/unwind-cxx.h +++ b/libstdc++-v3/libsupc++/unwind-cxx.h @@ -51,7 +51,7 @@ struct __cxa_exception { // Manage the exception object itself. std::type_info *exceptionType; - void (*exceptionDestructor)(void *); + 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. |