Commit e9d5a271 by Jason Merrill Committed by Jason Merrill

re PR c++/56346 (FAIL: g++.dg/tls/thread_local3.C -std=gnu++11 (test for excess errors))

	PR c++/56346
	* decl.c (register_dtor_fn): Pass null to __cxa_thread_atexit
	dso_handle parm on targets without __cxa_atexit.

From-SVN: r196657
parent d803a491
2013-03-14 Jason Merrill <jason@redhat.com>
PR c++/56346
* decl.c (register_dtor_fn): Pass null to __cxa_thread_atexit
dso_handle parm on targets without __cxa_atexit.
2013-03-11 Jason Merrill <jason@redhat.com> 2013-03-11 Jason Merrill <jason@redhat.com>
PR c++/56567 PR c++/56567
......
...@@ -6758,10 +6758,9 @@ register_dtor_fn (tree decl) ...@@ -6758,10 +6758,9 @@ register_dtor_fn (tree decl)
"__aeabi_atexit"), and DECL is a class object, we can just pass the "__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 destructor to "__cxa_atexit"; we don't have to build a temporary
function to do the cleanup. */ function to do the cleanup. */
ob_parm = (DECL_THREAD_LOCAL_P (decl) dso_parm = (flag_use_cxa_atexit
|| (flag_use_cxa_atexit && !targetm.cxx.use_atexit_for_cxa_atexit ());
&& !targetm.cxx.use_atexit_for_cxa_atexit ())); ob_parm = (DECL_THREAD_LOCAL_P (decl) || dso_parm);
dso_parm = ob_parm;
use_dtor = ob_parm && CLASS_TYPE_P (type); use_dtor = ob_parm && CLASS_TYPE_P (type);
if (use_dtor) if (use_dtor)
{ {
...@@ -6825,7 +6824,7 @@ register_dtor_fn (tree decl) ...@@ -6825,7 +6824,7 @@ register_dtor_fn (tree decl)
before passing it in, to avoid spurious errors. */ before passing it in, to avoid spurious errors. */
addr = build_nop (ptr_type_node, addr); addr = build_nop (ptr_type_node, addr);
} }
else if (ob_parm) else
/* Since the cleanup functions we build ignore the address /* Since the cleanup functions we build ignore the address
they're given, there's no reason to pass the actual 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 in, and, in general, it's cheaper to pass NULL than any
...@@ -6835,6 +6834,10 @@ register_dtor_fn (tree decl) ...@@ -6835,6 +6834,10 @@ register_dtor_fn (tree decl)
if (dso_parm) if (dso_parm)
arg2 = cp_build_addr_expr (get_dso_handle_node (), arg2 = cp_build_addr_expr (get_dso_handle_node (),
tf_warning_or_error); 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 else
arg2 = NULL_TREE; arg2 = NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment