aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Tietz <ktietz@gcc.gnu.org>2011-12-16 19:43:06 +0100
committerKai Tietz <ktietz@gcc.gnu.org>2011-12-16 19:43:06 +0100
commit2ecb85c86b62f9daa50b8fd19096ed9f80ede9e4 (patch)
tree235420959ce49d4349d33b9c1a7eb34ef39e0a60
parent134f529521772583a1249809157d14f298a1440d (diff)
downloadgcc-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.h7
-rw-r--r--libstdc++-v3/config/os/mingw32/os_defines.h7
-rw-r--r--libstdc++-v3/libsupc++/cxxabi.h6
-rw-r--r--libstdc++-v3/libsupc++/eh_throw.cc2
-rw-r--r--libstdc++-v3/libsupc++/unwind-cxx.h2
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.