From 56363ffd48e81fd2bfbed9cf047809b45fc7c20f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 16 Jun 2014 01:38:29 +0200 Subject: [PATCH] c-common.c (handle_tls_model_attribute): Use set_decl_tls_model. * c-family/c-common.c (handle_tls_model_attribute): Use set_decl_tls_model. * cgraph.h (struct varpool_node): Add tls_model. * tree.c (decl_tls_model, set_decl_tls_model): New functions. * tree.h (DECL_TLS_MODEL): Update. (DECL_THREAD_LOCAL_P): Check that variable is static. (decl_tls_model): Declare. (set_decl_tls_model): Declare. * tree-emutls.c (get_emutls_init_templ_addr): First build decl and then set symbol prorperties. (get_emutls_init_templ_addr): Cleanup. (new_emutls_decl): Update. * lto-cgraph.c (lto_output_varpool_node): Stream TLS model (lto_input_varpool_node): Likewise. * lto-streamer-out.c (hash_tree): Likewise. * tree-streamer-in.c (unpack_ts_decl_with_vis_value_fields): Do not stream DECL_TLS_MODEL. * tree-profile.c (init_ic_make_global_vars): Use set_decl_tls_model. * tree-core.h (tree_decl_with_vis): Remove tls_model; update comments. * c-parser.c (c_parser_omp_threadprivate): Likewise. * c-decl.c (merge_decls): Likewise. * decl.c (duplicate_decls): Use set_decl_tls_model. (grokdeclarator): Likewise. * semantics.c (finish_id_expression): Check TLS only for static variables. (finish_omp_threadprivate): Use decl_default_tls_model. * decl2.c (get_guard): Likewise. * call.c (make_temporary_var_for_ref_to_temp): Likewise. * gcc-interface/utils.c (process_attributes): Use set_decl_tls_model. * trans-common.c (build_common_decl): Use set_decl_tls_model. * trans-decl.c (gfc_finish_var_decl): Likewise. (get_proc_pointer_decl): Likewise. * lto.c (compare_tree_sccs_1): Do not compare DECL_TLS_MODEL. From-SVN: r211689 --- gcc/ChangeLog | 23 +++++++++++++++++++++++ gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/utils.c | 2 +- gcc/c-family/c-common.c | 2 +- gcc/c/ChangeLog | 5 +++++ gcc/c/c-decl.c | 4 ++-- gcc/c/c-parser.c | 2 +- gcc/cgraph.h | 2 ++ gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/call.c | 2 +- gcc/cp/decl.c | 7 ++++--- gcc/cp/decl2.c | 4 ++-- gcc/cp/semantics.c | 3 ++- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/trans-common.c | 2 +- gcc/fortran/trans-decl.c | 4 ++-- gcc/lto-cgraph.c | 2 ++ gcc/lto-streamer-out.c | 1 - gcc/lto/ChangeLog | 4 ++++ gcc/lto/lto.c | 1 - gcc/tree-core.h | 5 ++--- gcc/tree-emutls.c | 9 ++++----- gcc/tree-profile.c | 6 ++---- gcc/tree-streamer-in.c | 1 - gcc/tree-streamer-out.c | 1 - gcc/tree.c | 27 +++++++++++++++++++++++++++ gcc/tree.h | 6 ++++-- 27 files changed, 114 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9134a88e422..1917c285a67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2014-06-15 Jan Hubicka + + * c-family/c-common.c (handle_tls_model_attribute): Use set_decl_tls_model. + * cgraph.h (struct varpool_node): Add tls_model. + * tree.c (decl_tls_model, set_decl_tls_model): New functions. + * tree.h (DECL_TLS_MODEL): Update. + (DECL_THREAD_LOCAL_P): Check that variable is static. + (decl_tls_model): Declare. + (set_decl_tls_model): Declare. + * tree-emutls.c (get_emutls_init_templ_addr): First build decl and then + set symbol prorperties. + (get_emutls_init_templ_addr): Cleanup. + (new_emutls_decl): Update. + * lto-cgraph.c (lto_output_varpool_node): Stream TLS model + (lto_input_varpool_node): Likewise. + * lto-streamer-out.c (hash_tree): Likewise. + * tree-streamer-in.c (unpack_ts_decl_with_vis_value_fields): Do + not stream DECL_TLS_MODEL. + * tree-profile.c (init_ic_make_global_vars): Use + set_decl_tls_model. + * tree-core.h (tree_decl_with_vis): Remove tls_model; + update comments. + 2014-06-15 Richard Sandiford * df.h (DF_REF_REG_USE_P, DF_MWS_REG_USE_P): Remove null checks. diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e83b056ecf0..649533afb1d 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2014-06-15 Jan Hubicka + + * gcc-interface/utils.c (process_attributes): Use + set_decl_tls_model. + 2014-06-14 Bernd Edlinger PR ada/61505 diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 201c022f6c8..4d4623b3419 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -2495,7 +2495,7 @@ process_attributes (tree *node, struct attrib **attr_list, bool in_place, break; case ATTR_THREAD_LOCAL_STORAGE: - DECL_TLS_MODEL (*node) = decl_default_tls_model (*node); + set_decl_tls_model (*node, decl_default_tls_model (*node)); DECL_COMMON (*node) = 0; break; } diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index b010653ddcc..077263e1de5 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -8036,7 +8036,7 @@ handle_tls_model_attribute (tree *node, tree name, tree args, else error ("tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\""); - DECL_TLS_MODEL (decl) = kind; + set_decl_tls_model (decl, kind); return NULL_TREE; } diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 86372fa3035..cc3e5feda8a 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2014-06-15 Jan Hubicka + + * c-parser.c (c_parser_omp_threadprivate): Likewise. + * c-decl.c (merge_decls): Likewise. + 2014-06-09 Marek Polacek PR c/36446 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 4acb4f9f50d..34560308b83 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2294,7 +2294,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) /* Merge the threadprivate attribute. */ if (TREE_CODE (olddecl) == VAR_DECL && C_DECL_THREADPRIVATE_P (olddecl)) { - DECL_TLS_MODEL (newdecl) = DECL_TLS_MODEL (olddecl); + set_decl_tls_model (newdecl, DECL_TLS_MODEL (olddecl)); C_DECL_THREADPRIVATE_P (newdecl) = 1; } @@ -6345,7 +6345,7 @@ grokdeclarator (const struct c_declarator *declarator, } if (threadp) - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + set_decl_tls_model (decl, decl_default_tls_model (decl)); } if ((storage_class == csc_extern diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index abd636c5436..5fecb488b6a 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -13557,7 +13557,7 @@ c_parser_omp_threadprivate (c_parser *parser) { if (! DECL_THREAD_LOCAL_P (v)) { - DECL_TLS_MODEL (v) = decl_default_tls_model (v); + set_decl_tls_model (v, decl_default_tls_model (v)); /* If rtl has been already set for this var, call make_decl_rtl once again, so that encode_section_info has a chance to look at the new decl flags. */ diff --git a/gcc/cgraph.h b/gcc/cgraph.h index ce99166fd4d..a701cf90f08 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -708,6 +708,8 @@ public: /* Set if the variable is dynamically initialized, except for function local statics. */ unsigned dynamically_initialized : 1; + + ENUM_BITFIELD(tls_model) tls_model : 3; }; /* Every top level asm statement is put into a asm_node. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 52744d80919..8ab004896fc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2014-06-15 Jan Hubicka + + * decl.c (duplicate_decls): Use set_decl_tls_model. + (grokdeclarator): Likewise. + * semantics.c (finish_id_expression): Check TLS only for + static variables. + (finish_omp_threadprivate): Use decl_default_tls_model. + * decl2.c (get_guard): Likewise. + * call.c (make_temporary_var_for_ref_to_temp): Likewise. + 2014-06-14 Paolo Carlini PR c++/33101 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 44e92fcd437..1d4c4f99e2f 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -9387,7 +9387,7 @@ make_temporary_var_for_ref_to_temp (tree decl, tree type) tree name; TREE_STATIC (var) = TREE_STATIC (decl); - DECL_TLS_MODEL (var) = DECL_TLS_MODEL (decl); + set_decl_tls_model (var, DECL_TLS_MODEL (decl)); name = mangle_ref_init_variable (decl); DECL_NAME (var) = name; SET_DECL_ASSEMBLER_NAME (var, name); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 29082240d84..1c8d4978848 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1952,7 +1952,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) if (!DECL_LANG_SPECIFIC (newdecl)) retrofit_lang_decl (newdecl); - DECL_TLS_MODEL (newdecl) = DECL_TLS_MODEL (olddecl); + set_decl_tls_model (newdecl, DECL_TLS_MODEL (olddecl)); CP_DECL_THREADPRIVATE_P (newdecl) = 1; } } @@ -8016,7 +8016,8 @@ grokvardecl (tree type, if (decl_spec_seq_has_spec_p (declspecs, ds_thread)) { - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + if (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl)) + set_decl_tls_model (decl, decl_default_tls_model (decl)); if (declspecs->gnu_thread_keyword_p) DECL_GNU_TLS_P (decl) = true; } @@ -10699,7 +10700,7 @@ grokdeclarator (const cp_declarator *declarator, if (thread_p) { - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + set_decl_tls_model (decl, decl_default_tls_model (decl)); if (declspecs->gnu_thread_keyword_p) DECL_GNU_TLS_P (decl) = true; } diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 602a0c55759..99ea582f958 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2939,7 +2939,7 @@ get_guard (tree decl) TREE_STATIC (guard) = TREE_STATIC (decl); DECL_COMMON (guard) = DECL_COMMON (decl); DECL_COMDAT (guard) = DECL_COMDAT (decl); - DECL_TLS_MODEL (guard) = DECL_TLS_MODEL (decl); + set_decl_tls_model (guard, DECL_TLS_MODEL (decl)); if (DECL_ONE_ONLY (decl)) make_decl_one_only (guard, cxx_comdat_group (guard)); if (TREE_PUBLIC (decl)) @@ -4212,7 +4212,7 @@ handle_tls_init (void) DECL_ARTIFICIAL (guard) = true; DECL_IGNORED_P (guard) = true; TREE_USED (guard) = true; - DECL_TLS_MODEL (guard) = decl_default_tls_model (guard); + set_decl_tls_model (guard, decl_default_tls_model (guard)); pushdecl_top_level_and_finish (guard, NULL_TREE); tree fn = get_local_tls_init_fn (); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index ca0c34bf6f2..ec510c96fed 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3493,6 +3493,7 @@ finish_id_expression (tree id_expression, tree wrap; if (VAR_P (decl) && !cp_unevaluated_operand + && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) && DECL_THREAD_LOCAL_P (decl) && (wrap = get_tls_wrapper_fn (decl))) { @@ -5956,7 +5957,7 @@ finish_omp_threadprivate (tree vars) if (! DECL_THREAD_LOCAL_P (v)) { - DECL_TLS_MODEL (v) = decl_default_tls_model (v); + set_decl_tls_model (v, decl_default_tls_model (v)); /* If rtl has been already set for this var, call make_decl_rtl once again, so that encode_section_info has a chance to look at the new decl flags. */ diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 308a7bc22bf..e795de6767b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2014-06-15 Jan Hubicka + + * trans-common.c (build_common_decl): Use + set_decl_tls_model. + * trans-decl.c (gfc_finish_var_decl): Likewise. + (get_proc_pointer_decl): Likewise. + 2014-06-15 Francois-Xavier Coudert PR fortran/28484 diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c index 36aa8f3efd8..5a52984602f 100644 --- a/gcc/fortran/trans-common.c +++ b/gcc/fortran/trans-common.c @@ -454,7 +454,7 @@ build_common_decl (gfc_common_head *com, tree union_type, bool is_init) gfc_set_decl_location (decl, &com->where); if (com->threadprivate) - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + set_decl_tls_model (decl, decl_default_tls_model (decl)); /* Place the back end declaration for this common block in GLOBAL_BINDING_LEVEL. */ diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 1940622d9da..bd82a905560 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -631,7 +631,7 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) /* Handle threadprivate variables. */ if (sym->attr.threadprivate && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + set_decl_tls_model (decl, decl_default_tls_model (decl)); gfc_finish_decl_attrs (decl, &sym->attr); } @@ -1645,7 +1645,7 @@ get_proc_pointer_decl (gfc_symbol *sym) /* Handle threadprivate procedure pointers. */ if (sym->attr.threadprivate && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) - DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + set_decl_tls_model (decl, decl_default_tls_model (decl)); attributes = add_attributes_to_decl (sym->attr, NULL_TREE); decl_attributes (&decl, attributes, 0); diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 803b66a2c4c..6c6896cb0f8 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -609,6 +609,7 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node, && boundary_p && !DECL_EXTERNAL (node->decl), 1); /* in_other_partition. */ } + bp_pack_value (&bp, node->tls_model, 3); streamer_write_bitpack (&bp); group = node->get_comdat_group (); @@ -1265,6 +1266,7 @@ input_varpool_node (struct lto_file_decl_data *file_data, } if (node->alias && !node->analyzed && node->weakref) node->alias_target = get_alias_symbol (node->decl); + node->tls_model = (enum tls_model)bp_unpack_value (&bp, 3); group = read_identifier (ib); if (group) { diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index ece0d3f1458..14d3623a1be 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -821,7 +821,6 @@ hash_tree (struct streamer_tree_cache_d *cache, tree t) v = iterative_hash_host_wide_int (DECL_HARD_REGISTER (t) | (DECL_IN_CONSTANT_POOL (t) << 1), v); - v = iterative_hash_host_wide_int (DECL_TLS_MODEL (t), v); } if (TREE_CODE (t) == FUNCTION_DECL) v = iterative_hash_host_wide_int (DECL_FINAL_P (t) diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index ae48cdc0571..9c45cc6071c 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2014-06-15 Jan Hubicka + + * lto.c (compare_tree_sccs_1): Do not compare DECL_TLS_MODEL. + 2014-06-10 Jan Hubicka * lto.c (read_cgraph_and_symbols): Remove unreachable symbols. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index c6c6c825180..015eaf0c1a0 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1299,7 +1299,6 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map) compare_values (DECL_HARD_REGISTER); /* DECL_IN_TEXT_SECTION is set during final asm output only. */ compare_values (DECL_IN_CONSTANT_POOL); - compare_values (DECL_TLS_MODEL); } if (VAR_OR_FUNCTION_DECL_P (t1)) compare_values (DECL_INIT_PRIORITY); diff --git a/gcc/tree-core.h b/gcc/tree-core.h index 8fd27e56b61..aa7498b90e0 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -1455,10 +1455,9 @@ struct GTY(()) tree_decl_with_vis { unsigned seen_in_bind_expr : 1; unsigned comdat_flag : 1; + /* Used for FUNCTION_DECL, VAR_DECL and in C++ for TYPE_DECL. */ ENUM_BITFIELD(symbol_visibility) visibility : 2; unsigned visibility_specified : 1; - /* Belongs to VAR_DECL exclusively. */ - ENUM_BITFIELD(tls_model) tls_model : 3; /* Belong to FUNCTION_DECL exclusively. */ unsigned init_priority_p : 1; @@ -1470,7 +1469,7 @@ struct GTY(()) tree_decl_with_vis { unsigned cxx_destructor : 1; /* Belong to FUNCTION_DECL exclusively. */ unsigned final : 1; - /* 12 unused bits. */ + /* 15 unused bits. */ }; struct GTY(()) tree_var_decl { diff --git a/gcc/tree-emutls.c b/gcc/tree-emutls.c index 5bb96ce0b55..fe1e85d9014 100644 --- a/gcc/tree-emutls.c +++ b/gcc/tree-emutls.c @@ -250,10 +250,10 @@ get_emutls_init_templ_addr (tree decl) DECL_WEAK (to) = DECL_WEAK (decl); if (DECL_ONE_ONLY (decl)) { - make_decl_one_only (to, DECL_ASSEMBLER_NAME (to)); TREE_STATIC (to) = TREE_STATIC (decl); TREE_PUBLIC (to) = TREE_PUBLIC (decl); DECL_VISIBILITY (to) = DECL_VISIBILITY (decl); + make_decl_one_only (to, DECL_ASSEMBLER_NAME (to)); } else TREE_STATIC (to) = 1; @@ -263,9 +263,7 @@ get_emutls_init_templ_addr (tree decl) DECL_INITIAL (decl) = NULL; if (targetm.emutls.tmpl_section) - { - set_decl_section_name (to, targetm.emutls.tmpl_section); - } + set_decl_section_name (to, targetm.emutls.tmpl_section); else set_decl_section_name (to, DECL_SECTION_NAME (decl)); @@ -292,7 +290,6 @@ new_emutls_decl (tree decl, tree alias_of) SET_DECL_ASSEMBLER_NAME (to, DECL_NAME (to)); - DECL_TLS_MODEL (to) = TLS_MODEL_EMULATED; DECL_ARTIFICIAL (to) = 1; DECL_IGNORED_P (to) = 1; TREE_READONLY (to) = 0; @@ -314,6 +311,8 @@ new_emutls_decl (tree decl, tree alias_of) if (DECL_ONE_ONLY (decl)) make_decl_one_only (to, DECL_ASSEMBLER_NAME (to)); + set_decl_tls_model (to, TLS_MODEL_EMULATED); + /* If we're not allowed to change the proxy object's alignment, pretend it has been set by the user. */ if (targetm.emutls.var_align_fixed) diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c index deefa8b992a..e0de24cd0e2 100644 --- a/gcc/tree-profile.c +++ b/gcc/tree-profile.c @@ -110,8 +110,7 @@ init_ic_make_global_vars (void) 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); + set_decl_tls_model (ic_void_ptr_var, decl_default_tls_model (ic_void_ptr_var)); varpool_finalize_decl (ic_void_ptr_var); @@ -141,8 +140,7 @@ init_ic_make_global_vars (void) 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); + set_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); } diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c index 8b3adebc6f3..1ab9d9f7d05 100644 --- a/gcc/tree-streamer-in.c +++ b/gcc/tree-streamer-in.c @@ -280,7 +280,6 @@ unpack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr) { DECL_HARD_REGISTER (expr) = (unsigned) bp_unpack_value (bp, 1); DECL_IN_CONSTANT_POOL (expr) = (unsigned) bp_unpack_value (bp, 1); - DECL_TLS_MODEL (expr) = (enum tls_model) bp_unpack_value (bp, 3); } if (TREE_CODE (expr) == FUNCTION_DECL) diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c index dd148fa7080..c65214c83b6 100644 --- a/gcc/tree-streamer-out.c +++ b/gcc/tree-streamer-out.c @@ -248,7 +248,6 @@ pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr) bp_pack_value (bp, DECL_HARD_REGISTER (expr), 1); /* DECL_IN_TEXT_SECTION is set during final asm output only. */ bp_pack_value (bp, DECL_IN_CONSTANT_POOL (expr), 1); - bp_pack_value (bp, DECL_TLS_MODEL (expr), 3); } if (TREE_CODE (expr) == FUNCTION_DECL) diff --git a/gcc/tree.c b/gcc/tree.c index 62477c3b1b3..559e7581ef8 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -657,6 +657,33 @@ set_decl_section_name (tree node, const char *value) snode->set_section (value); } +/* Return TLS model of a variable NODE. */ +enum tls_model +decl_tls_model (const_tree node) +{ + struct varpool_node *snode = varpool_get_node (node); + if (!snode) + return TLS_MODEL_NONE; + return snode->tls_model; +} + +/* Set TLS model of variable NODE to MODEL. */ +void +set_decl_tls_model (tree node, enum tls_model model) +{ + struct varpool_node *vnode; + + if (model == TLS_MODEL_NONE) + { + vnode = varpool_get_node (node); + if (!vnode) + return; + } + else + vnode = varpool_node_for_decl (node); + vnode->tls_model = model; +} + /* Compute the number of bytes occupied by a tree with code CODE. This function cannot be used for nodes that have variable sizes, including TREE_VEC, INTEGER_CST, STRING_CST, and CALL_EXPR. */ diff --git a/gcc/tree.h b/gcc/tree.h index 31a9a87d2d1..4a29aa2776d 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2386,12 +2386,12 @@ extern void decl_value_expr_insert (tree, tree); /* In a VAR_DECL, the model to use if the data should be allocated from thread-local storage. */ -#define DECL_TLS_MODEL(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model) +#define DECL_TLS_MODEL(NODE) decl_tls_model (NODE) /* In a VAR_DECL, nonzero if the data should be allocated from thread-local storage. */ #define DECL_THREAD_LOCAL_P(NODE) \ - (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model >= TLS_MODEL_REAL) + ((TREE_STATIC (NODE) || DECL_EXTERNAL (NODE)) && decl_tls_model (NODE) >= TLS_MODEL_REAL) /* In a non-local VAR_DECL with static storage duration, true if the variable has an initialization priority. If false, the variable @@ -3429,6 +3429,8 @@ extern tree decl_comdat_group (const_tree); extern tree decl_comdat_group_id (const_tree); extern const char *decl_section_name (const_tree); extern void set_decl_section_name (tree, const char *); +extern enum tls_model decl_tls_model (const_tree); +extern void set_decl_tls_model (tree, enum tls_model); /* Compute the number of bytes occupied by 'node'. This routine only looks at TREE_CODE and, if the code is TREE_VEC, TREE_VEC_LENGTH. */ -- 2.11.4.GIT