https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114968
--- Comment #4 from LIU Hao <lh_mouse at 126 dot com> --- (In reply to Jakub Jelinek from comment #2) > Guess you need to add a target hook next to use_aeabi_atexit and > use_atexit_for_cxa_atexit which returns attributes that should be added to a > FUNCTION_TYPE constructed by get_atexit_fn_ptr_type > (build_function_type_list returns a shared type, so if attributes are to be > added, it needs to go on a variant of the type. > > On all but mingw ia32 it shouldn't add anything, and guess it shouldn't be > done if > !flag_use_cxa_atexit || !targetm.cxx.use_atexit_for_cxa_atexit () > A question is what to do about the __tcf_* cleanup functions that might be > sometimes created. > > Anyway, seems to be primarily mingw maintainer responsibility given that it > is the only target with such requirements. I think a quick and dirty solution should look like this? ``` diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 2af026d255d..311f1ca780b 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -9669,6 +9669,13 @@ get_atexit_fn_ptr_type (void) fn_type = build_function_type_list (void_type_node, arg_type, NULL_TREE); +#ifdef IX86_CALLCVT_THISCALL + if (flag_use_cxa_atexit + && !targetm.cxx.use_atexit_for_cxa_atexit ()) + TYPE_ATTRIBUTES (fn_type) = tree_cons ( + get_identifier ("thiscall"), NULL_TREE, + TYPE_ATTRIBUTES (fn_type)); +#endif atexit_fn_ptr_type_node = build_pointer_type (fn_type); } ```