From 462819c8e20aab1124e95392974dd55cd70350f3 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 8 Oct 2012 14:45:37 +0000 Subject: Allow dynamic initialization of thread_locals. gcc/cp/ * decl.c: Define tls_aggregates. (expand_static_init): Remove sorry. Add to tls_aggregates. * cp-tree.h: Declare tls_aggregates. * call.c (set_up_extended_ref_temp): Add to tls_aggregates. * decl2.c (var_needs_tls_wrapper): New. (var_defined_without_dynamic_init): New. (get_tls_init_fn, get_tls_wrapper_fn): New. (generate_tls_wrapper, handle_tls_init): New. (cp_write_global_declarations): Call handle_tls_init and enerate_tls_wrapper. * mangle.c (write_guarded_var_name): Split out from.. (mangle_guard_variable): ...here. (mangle_tls_init_fn, mangle_tls_wrapper_fn): Use it. (decl_tls_wrapper_p): New. * semantics.c (finish_id_expression): Replace use of thread_local variable with a call to its wrapper. libiberty/ * cp-demangle.c (d_special_name, d_dump): Handle TH and TW. (d_make_comp, d_print_comp): Likewise. include/ * demangle.h (enum demangle_component_type): Add DEMANGLE_COMPONENT_TLS_INIT and DEMANGLE_COMPONENT_TLS_WRAPPER. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192211 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgomp/ChangeLog | 4 ++++ libgomp/testsuite/libgomp.c++/tls-init1.C | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 libgomp/testsuite/libgomp.c++/tls-init1.C (limited to 'libgomp') diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index ce8384d108d..8ed6abc207c 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,7 @@ +2012-10-04 Jason Merrill + + * testsuite/libgomp.c++/tls-init1.C: New. + 2012-09-14 David Edelsohn * configure: Regenerated. diff --git a/libgomp/testsuite/libgomp.c++/tls-init1.C b/libgomp/testsuite/libgomp.c++/tls-init1.C new file mode 100644 index 00000000000..4cbaccb9851 --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/tls-init1.C @@ -0,0 +1,26 @@ +extern "C" void abort(); + +struct A +{ + A(); + int i; +}; + +extern A a; +#pragma omp threadprivate (a) +A a; + +A &f() +{ + return a; +} + +int j; +A::A(): i(j) { } + +int main() +{ + j = 42; + if (f().i != 42) + abort (); +} -- cgit v1.2.3