Message ID | CAEwic4ZXvBzKem-iXvEagvZP4eU=9thsyXbubQQwyeaeUM3pFQ@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Dec 8, 2011 7:16 PM, "Kai Tietz" wrote: > > * unwind-cxx.h (__cxa_exception): Use for member > exceptionDestructor the _GLIBCXX_DESTRUCTOR_CALLCONVENTION macro. I think "Use the _GLIBCXX_DESTRUCTOR_CALLCONVENTION macro for the exceptionDestructor member" would make more sense. However ... > Index: gcc/libstdc++-v3/libsupc++/cxxabi.h > =================================================================== > --- gcc.orig/libstdc++-v3/libsupc++/cxxabi.h > +++ gcc/libstdc++-v3/libsupc++/cxxabi.h > @@ -51,6 +51,16 @@ > #include <bits/cxxabi_tweaks.h> > #include <bits/cxxabi_forced.h> > > +// On 32-bit IA native windows target is the used calling-convention > +// for class-member-functions of kind __thiscall. As destructor is > +// also of kind class-member-function, we need to specify for this > +// target proper calling-convention on destructor-function-pointer. > +#if defined (__MINGW32__) && defined (__i386__) > +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION __thiscall > +#else > +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION > +#endif Could you define a typedef for void(*)(void*) and adapt that for mingw32 instead of using the macro everywhere? #if defined (__MINGW32__) && defined (__i386__) typedef void (__thiscall *__cxxabi_dtor_type)(void*); #else typedef void (*__cxxabi_dtor_type)(void*); #endif (That would be my preference, but the maintainers of that code might disagree.)
2011/12/8 Jonathan Wakely <jwakely.gcc@gmail.com>: > On Dec 8, 2011 7:16 PM, "Kai Tietz" wrote: >> >> * unwind-cxx.h (__cxa_exception): Use for member >> exceptionDestructor the _GLIBCXX_DESTRUCTOR_CALLCONVENTION macro. > > I think "Use the _GLIBCXX_DESTRUCTOR_CALLCONVENTION macro for the > exceptionDestructor member" would make more sense. Thanks, I will add it to ChangeLog that way, if the macro variant is selected by maintainer of that code. > However ... > >> Index: gcc/libstdc++-v3/libsupc++/cxxabi.h >> =================================================================== >> --- gcc.orig/libstdc++-v3/libsupc++/cxxabi.h >> +++ gcc/libstdc++-v3/libsupc++/cxxabi.h >> @@ -51,6 +51,16 @@ >> #include <bits/cxxabi_tweaks.h> >> #include <bits/cxxabi_forced.h> >> >> +// On 32-bit IA native windows target is the used calling-convention >> +// for class-member-functions of kind __thiscall. As destructor is >> +// also of kind class-member-function, we need to specify for this >> +// target proper calling-convention on destructor-function-pointer. >> +#if defined (__MINGW32__) && defined (__i386__) >> +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION __thiscall >> +#else >> +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION >> +#endif > > Could you define a typedef for void(*)(void*) and adapt that for > mingw32 instead of using the macro everywhere? > > #if defined (__MINGW32__) && defined (__i386__) > typedef void (__thiscall *__cxxabi_dtor_type)(void*); > #else > typedef void (*__cxxabi_dtor_type)(void*); > #endif > > (That would be my preference, but the maintainers of that code might disagree.) Well, sure. Might be even a more clear way to have here an explicit type-name indicating arguments kind. But code-maintainer should tell, what variant is preferred here. Kai
Index: gcc/libstdc++-v3/libsupc++/cxxabi.h =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/cxxabi.h +++ gcc/libstdc++-v3/libsupc++/cxxabi.h @@ -51,6 +51,16 @@ #include <bits/cxxabi_tweaks.h> #include <bits/cxxabi_forced.h> +// On 32-bit IA native windows target is the used calling-convention +// for class-member-functions of kind __thiscall. As destructor is +// also of kind class-member-function, we need to specify for this +// target proper calling-convention on destructor-function-pointer. +#if defined (__MINGW32__) && defined (__i386__) +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION __thiscall +#else +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION +#endif + #ifdef __cplusplus namespace __cxxabiv1 { @@ -596,7 +606,8 @@ namespace __cxxabiv1 // Throw the exception. void - __cxa_throw(void*, std::type_info*, void (*) (void *)) + __cxa_throw(void*, std::type_info*, + void (_GLIBCXX_DESTRUCTOR_CALLCONVENTION *) (void *)) __attribute__((__noreturn__)); // Used to implement exception handlers. Index: gcc/libstdc++-v3/libsupc++/eh_throw.cc =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/eh_throw.cc +++ gcc/libstdc++-v3/libsupc++/eh_throw.cc @@ -59,7 +59,8 @@ __gxx_exception_cleanup (_Unwind_Reason_ extern "C" void __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, - void (*dest) (void *)) + void (_GLIBCXX_DESTRUCTOR_CALLCONVENTION *dest) + (void *)) { // Definitely a primary. __cxa_refcounted_exception *header Index: gcc/libstdc++-v3/libsupc++/unwind-cxx.h =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/unwind-cxx.h +++ gcc/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_DESTRUCTOR_CALLCONVENTION *exceptionDestructor)(void *); // The C++ standard has entertaining rules wrt calling set_terminate // and set_unexpected in the middle of the exception cleanup process.