[PATCH v2] IPA: Provide a mechanism to register static DTORs via cxa_atexit.

Jan Hubicka hubicka@kam.mff.cuni.cz
Sat Nov 13 15:16:11 GMT 2021


> sheesh … EWRONGREVISEDPATCH
> 
> > On 5 Nov 2021, at 13:08, Iain Sandoe <iains.gcc@gmail.com> wrote:
> > 
> > I tried enabling this on x86-64-linux (just for interest) and it seems to work
> > OK there too - but that testing revealed a thinko that didn’t show with a
> > a normal regstrap.
> 
> … now with the correct patch.
> 
> [PATCH v2] IPA: Provide a mechanism to register static DTORs via
>  cxa_atexit.
> 
> For at least one target (Darwin) the platform convention is to
> register static destructors (i.e. __attribute__((destructor)))
> with __cxa_atexit rather than placing them into a list that is
> run by some other mechanism.
> 
> This patch provides a target hook that allows a target to opt
> into this and handling for the process in ipa_cdtor_merge ().
> 
> When the mode is enabled (dtors_from_cxa_atexit is set) we:
> 
>  * Generate new CTORs to register static destructors with
>    __cxa_atexit and add them to the existing list of CTORs;
>    we then process the revised CTORs list.
> 
>  * We sort the DTORs into priority and then TU order, this
>    means that they are registered in that order with
>    __cxa_atexit () and therefore will be run in the reverse
>    order.
> 
>  * Likewise, CTORs are sorted into priority and then TU order,
>    which means that they will run in that order.
> 
> This matches the behavior of using init/fini (or
> mod_init_func/mod_term_func) sections.
> 
> Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
> 
> gcc/ChangeLog:
> 
> 	* config/darwin.h (TARGET_DTORS_FROM_CXA_ATEXIT): New.
> 	* doc/tm.texi: Regenerated.
> 	* doc/tm.texi.in: Add TARGET_DTORS_FROM_CXA_ATEXIT hook.
> 	* ipa.c (ipa_discover_variable_flags):
> 	(cgraph_build_static_cdtor_1): Return the built function
> 	decl.
> 	(build_cxa_atexit_decl): New.
> 	(build_dso_handle_decl): New.
> 	(build_cxa_dtor_registrations): New.
> 	(compare_cdtor_tu_order): New.
> 	(build_cxa_atexit_fns): New.
> 	(ipa_cdtor_merge): If dtors_from_cxa_atexit is set,
> 	process the DTORs/CTORs accordingly.
> 	(pass_ipa_cdtor_merge::gate): Also run if
> 	dtors_from_cxa_atexit is set.
> 	* target.def (dtors_from_cxa_atexit): New hook.

OK, thanks!
Honza


More information about the Gcc-patches mailing list