C++ PATCH for c++/56346 (thread_local3.C link error on targets without __dso_handle)

Jakub Jelinek jakub@redhat.com
Wed Mar 13 19:46:00 GMT 2013


On Wed, Mar 13, 2013 at 03:32:24PM -0400, Jason Merrill wrote:
> We can't pass the address of __dso_handle to __cxa_thread_atexit if
> the target doesn't provide that symbol in the crt files.  Fixed by
> passing NULL if the target doesn't use __cxa_atexit.
> 
> Tested x86_64-pc-linux-gnu and hppa2.0w-hp-hpux11.11.  This fixes
> broken new functionality on a secondary target; is it OK for 4.8.0
> or should it wait for 4.8.1?

This is ok for 4.8.0.

> commit 145dab2e1e46ac025414e1a225e29caa2c3b41c1
> Author: Jason Merrill <jason@redhat.com>
> Date:   Mon Mar 11 12:31:16 2013 -0400
> 
>     	PR c++/56346
>     	* decl.c (register_dtor_fn): Pass null to __cxa_thread_atexit
>     	dso_handle parm on targets without __cxa_atexit.
> 
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index 150e866..92114ff 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -6758,10 +6758,9 @@ register_dtor_fn (tree decl)
>       "__aeabi_atexit"), and DECL is a class object, we can just pass the
>       destructor to "__cxa_atexit"; we don't have to build a temporary
>       function to do the cleanup.  */
> -  ob_parm = (DECL_THREAD_LOCAL_P (decl)
> -	     || (flag_use_cxa_atexit
> -		 && !targetm.cxx.use_atexit_for_cxa_atexit ()));
> -  dso_parm = ob_parm;
> +  dso_parm = (flag_use_cxa_atexit
> +	      && !targetm.cxx.use_atexit_for_cxa_atexit ());
> +  ob_parm = (DECL_THREAD_LOCAL_P (decl) || dso_parm);
>    use_dtor = ob_parm && CLASS_TYPE_P (type);
>    if (use_dtor)
>      {
> @@ -6825,7 +6824,7 @@ register_dtor_fn (tree decl)
>  	 before passing it in, to avoid spurious errors.  */
>        addr = build_nop (ptr_type_node, addr);
>      }
> -  else if (ob_parm)
> +  else
>      /* Since the cleanup functions we build ignore the address
>         they're given, there's no reason to pass the actual address
>         in, and, in general, it's cheaper to pass NULL than any
> @@ -6835,6 +6834,10 @@ register_dtor_fn (tree decl)
>    if (dso_parm)
>      arg2 = cp_build_addr_expr (get_dso_handle_node (),
>  			       tf_warning_or_error);
> +  else if (ob_parm)
> +    /* Just pass NULL to the dso handle parm if we don't actually
> +       have a DSO handle on this target.  */
> +    arg2 = null_pointer_node;
>    else
>      arg2 = NULL_TREE;
>  


	Jakub



More information about the Gcc-patches mailing list