From ad9870f2d507ce98df7e5daf57dfd6d7c4b16c50 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 4 May 2017 15:39:05 +0000 Subject: [PATCH] More global trees. * cp-tree.h (enum cp_tree_index): Add CPTI_GLOBAL, CPTI_GLOBAL_TYPE, CPTI_GLOBAL_IDENTIFIER, CPTI_ANON_IDENTIFIER, CPTI_INIT_LIST_IDENTIFIER. (global_namespace, global_type_node, global_identifier) anon_identifier, init_list_identifier): New. * decl.c (global_type_node, global_scope_name): Delete. (initialize_predefined_identifiers): Add new identifiers. (cxx_init_decl_processing): Adjust. * name-lookup.h (global_namespace, global_type_node): Delete. * name-lookup.c (global_namespace, anonymous_namespace_name) get_anonymous_namespace_name): Delete. (namespace_scope_ht_size, begin_scope, pushtag_1) push_namespace): Adjust, * call.c (type_has_extended_temps): Use init_list_identifier. * pt.c (listify): Likewise. (((--This line, and those below, will be ignored-- M cp/name-lookup.c M cp/name-lookup.h M cp/ChangeLog M cp/call.c M cp/pt.c M cp/cp-tree.h M cp/decl.c From-SVN: r247599 --- gcc/cp/ChangeLog | 17 +++++++++++++++++ gcc/cp/call.c | 4 ++-- gcc/cp/cp-tree.h | 14 ++++++++++++-- gcc/cp/decl.c | 22 ++++++++++------------ gcc/cp/name-lookup.c | 35 +++++------------------------------ gcc/cp/name-lookup.h | 9 --------- gcc/cp/pt.c | 3 +-- 7 files changed, 47 insertions(+), 57 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c942b46b931..06596e176ac 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,22 @@ 2017-05-04 Nathan Sidwell + More global trees. + * cp-tree.h (enum cp_tree_index): Add CPTI_GLOBAL, + CPTI_GLOBAL_TYPE, CPTI_GLOBAL_IDENTIFIER, CPTI_ANON_IDENTIFIER, + CPTI_INIT_LIST_IDENTIFIER. + (global_namespace, global_type_node, global_identifier, + anon_identifier, init_list_identifier): New. + * decl.c (global_type_node, global_scope_name): Delete. + (initialize_predefined_identifiers): Add new identifiers. + (cxx_init_decl_processing): Adjust. + * name-lookup.h (global_namespace, global_type_node): Delete. + * name-lookup.c (global_namespace, anonymous_namespace_name, + get_anonymous_namespace_name): Delete. + (namespace_scope_ht_size, begin_scope, pushtag_1, + push_namespace): Adjust, + * call.c (type_has_extended_temps): Use init_list_identifier. + * pt.c (listify): Likewise. + * name-lookup.c: Reorder functions to make merging from modules branch simpler. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c15b8e46f34..9110f4f5308 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -10543,15 +10543,15 @@ type_has_extended_temps (tree type) bool is_std_init_list (tree type) { - /* Look through typedefs. */ if (!TYPE_P (type)) return false; if (cxx_dialect == cxx98) return false; + /* Look through typedefs. */ type = TYPE_MAIN_VARIANT (type); return (CLASS_TYPE_P (type) && CP_TYPE_CONTEXT (type) == std_node - && strcmp (TYPE_NAME_STRING (type), "initializer_list") == 0); + && init_list_identifier == DECL_NAME (TYPE_NAME (type))); } /* Returns true iff DECL is a list constructor: i.e. a constructor which diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 844f5ed4f79..e27cc3c6dcd 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -119,6 +119,8 @@ enum cp_tree_index CPTI_VTBL_PTR_TYPE, CPTI_STD, CPTI_ABI, + CPTI_GLOBAL, + CPTI_GLOBAL_TYPE, CPTI_CONST_TYPE_INFO_TYPE, CPTI_TYPE_INFO_PTR_TYPE, CPTI_ABORT_FNDECL, @@ -138,9 +140,12 @@ enum cp_tree_index CPTI_THIS_IDENTIFIER, CPTI_PFN_IDENTIFIER, CPTI_VPTR_IDENTIFIER, + CPTI_GLOBAL_IDENTIFIER, CPTI_STD_IDENTIFIER, + CPTI_ANON_IDENTIFIER, CPTI_AUTO_IDENTIFIER, CPTI_DECLTYPE_AUTO_IDENTIFIER, + CPTI_INIT_LIST_IDENTIFIER, CPTI_LANG_NAME_C, CPTI_LANG_NAME_CPLUSPLUS, @@ -184,6 +189,8 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; #define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE] #define std_node cp_global_trees[CPTI_STD] #define abi_node cp_global_trees[CPTI_ABI] +#define global_namespace cp_global_trees[CPTI_GLOBAL] +#define global_type_node cp_global_trees[CPTI_GLOBAL_TYPE] #define const_type_info_type_node cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE] #define type_info_ptr_type cp_global_trees[CPTI_TYPE_INFO_PTR_TYPE] #define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL] @@ -224,12 +231,14 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; #define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER] #define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER] #define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER] -/* The name of the std namespace. */ +/* The name of the ::, std & anon namespaces. */ +#define global_identifier cp_global_trees[CPTI_GLOBAL_IDENTIFIER] #define std_identifier cp_global_trees[CPTI_STD_IDENTIFIER] +#define anon_identifier cp_global_trees[CPTI_ANON_IDENTIFIER] /* auto and declspec(auto) identifiers. */ #define auto_identifier cp_global_trees[CPTI_AUTO_IDENTIFIER] #define decltype_auto_identifier cp_global_trees[CPTI_DECLTYPE_AUTO_IDENTIFIER] -/* The name of a C++17 deduction guide. */ +#define init_list_identifier cp_global_trees[CPTI_INIT_LIST_IDENTIFIER] #define lang_name_c cp_global_trees[CPTI_LANG_NAME_C] #define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS] @@ -277,6 +286,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX]; access nodes in tree.h. */ #define access_default_node null_node + #include "name-lookup.h" diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 4f065724ae3..6a7aeb3f7b3 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -140,14 +140,6 @@ static void expand_static_init (tree, tree); tree cp_global_trees[CPTI_MAX]; -/* Indicates that there is a type value in some namespace, although - that is not necessarily in scope at the moment. */ - -tree global_type_node; - -/* The node that holds the "name" of the global scope. */ -tree global_scope_name; - #define local_names cp_function_chain->x_local_names /* A list of objects which have constructors or destructors @@ -3935,7 +3927,7 @@ make_unbound_class_template (tree context, tree name, tree parm_list, -/* Push the declarations of builtin types into the namespace. +/* Push the declarations of builtin types into the global namespace. RID_INDEX is the index of the builtin type in the array RID_POINTERS. NAME is the name used when looking up the builtin type. TYPE is the _TYPE node for the builtin type. */ @@ -4037,10 +4029,15 @@ initialize_predefined_identifiers (void) { VTABLE_PFN_NAME, &pfn_identifier, 0 }, { "_vptr", &vptr_identifier, 0 }, { "__vtt_parm", &vtt_parm_identifier, 0 }, - { "::", &global_scope_name, 0 }, + { "::", &global_identifier, 0 }, { "std", &std_identifier, 0 }, + /* The demangler expects anonymous namespaces to be called + something starting with '_GLOBAL__N_'. It no longer needs + to be unique to the TU. */ + { "_GLOBAL__N_1", &anon_identifier, 0 }, { "auto", &auto_identifier, 0 }, { "decltype(auto)", &decltype_auto_identifier, 0 }, + { "initializer_list", &init_list_identifier, 0 }, { NULL, NULL, 0 } }; @@ -4073,14 +4070,15 @@ cxx_init_decl_processing (void) current_binding_level = NULL; /* Enter the global namespace. */ gcc_assert (global_namespace == NULL_TREE); - global_namespace = build_lang_decl (NAMESPACE_DECL, global_scope_name, + global_namespace = build_lang_decl (NAMESPACE_DECL, global_identifier, void_type_node); + TREE_PUBLIC (global_namespace) = 1; DECL_CONTEXT (global_namespace) = build_translation_unit_decl (get_identifier (main_input_filename)); debug_hooks->register_main_translation_unit (DECL_CONTEXT (global_namespace)); - TREE_PUBLIC (global_namespace) = 1; begin_scope (sk_namespace, global_namespace); + current_namespace = global_namespace; if (flag_visibility_ms_compat) default_visibility = VISIBILITY_HIDDEN; diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 6b0219a542e..43f334bd19d 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -61,14 +61,6 @@ static tree push_using_directive (tree); static tree lookup_extern_c_fun_in_all_ns (tree); static void diagnose_name_conflict (tree, tree); -/* The :: namespace. */ - -tree global_namespace; - -/* The name of the anonymous namespace, throughout this translation - unit. */ -static GTY(()) tree anonymous_namespace_name; - /* Add DECL to the list of things declared in B. */ static void @@ -644,23 +636,6 @@ lookup_arg_dependent (tree name, tree fns, vec *args) return ret; } -/* Initialize anonymous_namespace_name if necessary, and return it. */ - -static tree -get_anonymous_namespace_name (void) -{ - if (!anonymous_namespace_name) - { - /* We used to use get_file_function_name here, but that isn't - necessary now that anonymous namespace typeinfos - are !TREE_PUBLIC, and thus compared by address. */ - /* The demangler expects anonymous namespaces to be called - something starting with '_GLOBAL__N_'. */ - anonymous_namespace_name = get_identifier ("_GLOBAL__N_1"); - } - return anonymous_namespace_name; -} - /* Compute the chain index of a binding_entry given the HASH value of its name and the total COUNT of chains. COUNT is assumed to be a power of 2. */ @@ -2111,7 +2086,7 @@ namespace_scope_ht_size (tree ns) return name == std_identifier ? NAMESPACE_STD_HT_SIZE - : (name == global_scope_name + : (name == global_identifier ? GLOBAL_SCOPE_HT_SIZE : NAMESPACE_ORDINARY_HT_SIZE); } @@ -2189,7 +2164,7 @@ begin_scope (scope_kind kind, tree entity) NAMESPACE_LEVEL (entity) = scope; vec_alloc (scope->static_decls, (DECL_NAME (entity) == std_identifier - || DECL_NAME (entity) == global_scope_name) ? 200 : 10); + || DECL_NAME (entity) == global_identifier) ? 200 : 10); break; default: @@ -6167,7 +6142,7 @@ pushtag_1 (tree name, tree type, tag_scope scope) return decl; if (DECL_CONTEXT (decl) == std_node - && strcmp (TYPE_NAME_STRING (type), "initializer_list") == 0 + && init_list_identifier == DECL_NAME (TYPE_NAME (type)) && !CLASSTYPE_TEMPLATE_INFO (type)) { error ("declaration of std::initializer_list does not match " @@ -6489,11 +6464,11 @@ push_namespace (tree name) /* We should not get here if the global_namespace is not yet constructed nor if NAME designates the global namespace: The global scope is constructed elsewhere. */ - gcc_assert (global_namespace != NULL && name != global_scope_name); + gcc_assert (global_namespace != NULL && name != global_identifier); if (anon) { - name = get_anonymous_namespace_name(); + name = anon_identifier; d = IDENTIFIER_NAMESPACE_VALUE (name); if (d) /* Reopening anonymous namespace. */ diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h index 8d8d72310c9..a2ffc56e336 100644 --- a/gcc/cp/name-lookup.h +++ b/gcc/cp/name-lookup.h @@ -278,15 +278,6 @@ struct GTY(()) cp_binding_level { #define class_binding_level scope_chain->class_bindings -/* The tree node representing the global scope. */ -extern GTY(()) tree global_namespace; -extern GTY(()) tree global_scope_name; - -/* Indicates that there is a type value in some namespace, although - that is not necessarily in scope at the moment. */ - -extern GTY(()) tree global_type_node; - /* True if SCOPE designates the global scope binding contour. */ #define global_scope_p(SCOPE) \ ((SCOPE) == NAMESPACE_LEVEL (global_namespace)) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1567e2b5000..809f7b8e90f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -24730,8 +24730,7 @@ make_constrained_auto (tree con, tree args) static tree listify (tree arg) { - tree std_init_list = namespace_binding - (get_identifier ("initializer_list"), std_node); + tree std_init_list = namespace_binding (init_list_identifier, std_node); tree argvec; if (!std_init_list || !DECL_CLASS_TEMPLATE_P (std_init_list)) { -- 2.30.2