在 2020/10/8 22:56, Jason Merrill 写道: > On 10/7/20 10:52 PM, Liu Hao via Gcc-patches wrote: >> [Please CC me as I am not subscribed to this list.] > > Hmm, why isn't the mingw implementation used for all programs? That would > avoid the bug. >
I am afraid the libstdc++ implementation has to be kept for compatibility, as the mingw-w64 one was only added two years ago. Neither am I clear about MinGW.org. > > This patch is a good start but won't actually fix the bug: the calling > convention only makes a difference when we actually > call the function, at the line > > e->destructor (e->object); > > in atexit_thread.cc, and your patch doesn't change the calling convention for > elt::destructor. > > I'd think we should add the attribute to __cxa_cdtor_type, and use it more > consistently for __cxa_*atexit and __cxa_throw. > This patch contains a hunk ```diff @@ -52,7 +57,7 @@ namespace { // One element in a singly-linked stack of cleanups. struct elt { - void (*destructor)(void *); + void (_GLIBCXX_CDTOR_CALLABI *destructor)(void *); void *object; elt *next; #ifdef _GLIBCXX_THREAD_ATEXIT_WIN32 ``` which should suffice. I am not against introduction of another macro for this calling convention thing, as the name `__cxa_thread_atexit()` doesn't suggest its first argument is a non-static member function. (Technically I think it should not be, so GCC's use of it to register the destructor looks like a bug. The call should go through a thunk.) -- Best regards, LH_Mouse
signature.asc
Description: OpenPGP digital signature