Hi please review the trivial patch below. It reduces race conditions in value profiling. Another trivial change (to initialize function_list struct) is also included.
Bootstrapped and regression tested on x86-64/linux. Thanks, David 2011-04-27 Xinliang David Li <davi...@google.com> * tree-profile.c (init_ic_make_global_vars): Set tls attribute on ic vars. * coverage.c (coverage_end_function): Initialize function_list with zero.
Index: coverage.c =================================================================== --- coverage.c (revision 172977) +++ coverage.c (working copy) @@ -608,7 +608,7 @@ coverage_end_function (void) { struct function_list *item; - item = XNEW (struct function_list); + item = XCNEW (struct function_list); *functions_tail = item; functions_tail = &item->next; Index: tree-profile.c =================================================================== --- tree-profile.c (revision 172977) +++ tree-profile.c (working copy) @@ -44,6 +44,8 @@ along with GCC; see the file COPYING3. #include "value-prof.h" #include "cgraph.h" #include "profile.h" +#include "target.h" +#include "output.h" static GTY(()) tree gcov_type_node; static GTY(()) tree gcov_type_tmp_var; @@ -80,6 +82,10 @@ init_ic_make_global_vars (void) TREE_PUBLIC (ic_void_ptr_var) = 0; DECL_ARTIFICIAL (ic_void_ptr_var) = 1; DECL_INITIAL (ic_void_ptr_var) = NULL; + if (targetm.have_tls) + DECL_TLS_MODEL (ic_void_ptr_var) = + decl_default_tls_model (ic_void_ptr_var); + varpool_finalize_decl (ic_void_ptr_var); varpool_mark_needed_node (varpool_node (ic_void_ptr_var)); @@ -92,6 +98,10 @@ init_ic_make_global_vars (void) TREE_PUBLIC (ic_gcov_type_ptr_var) = 0; DECL_ARTIFICIAL (ic_gcov_type_ptr_var) = 1; DECL_INITIAL (ic_gcov_type_ptr_var) = NULL; + if (targetm.have_tls) + DECL_TLS_MODEL (ic_gcov_type_ptr_var) = + decl_default_tls_model (ic_gcov_type_ptr_var); + varpool_finalize_decl (ic_gcov_type_ptr_var); varpool_mark_needed_node (varpool_node (ic_gcov_type_ptr_var)); }