aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-05-30 19:12:35 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2017-05-30 19:12:35 +0000
commit98c28dd4ba5bc2fe9141f44aeed7d59a07012018 (patch)
treee0e4292c8b996890aeb6b35593dfc720d1fa9446
parent5256a7f5961e6a5137be1d340cb380b62b06e19f (diff)
downloadgcc-98c28dd4ba5bc2fe9141f44aeed7d59a07012018.zip
gcc-98c28dd4ba5bc2fe9141f44aeed7d59a07012018.tar.gz
gcc-98c28dd4ba5bc2fe9141f44aeed7d59a07012018.tar.bz2
Kill IDENTIFIER_NAMESPACE_BINDINGS
Kill IDENTIFIER_NAMESPACE_BINDINGS * cp-tree.h (lang_identifier): Delete namespace_bindings. (IDENTIFIER_NAMESPACE_BINDINGS): Delete. (lang_decl_ns): Add bindings. (DECL_NAMESPACE_BINDINGS): New. * lex.c (retrofit_lang_decl): Create namespace hash table. * name-lookup.c (find_namespace_slot): Change to use hash-map. * ptree.c (cxx_print_binding): Delete. (cxx_print_identifier): Remove NAMESPACE_BINDING printing. From-SVN: r248694
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/cp-tree.h10
-rw-r--r--gcc/cp/lex.c6
-rw-r--r--gcc/cp/name-lookup.c23
-rw-r--r--gcc/cp/ptree.c15
5 files changed, 31 insertions, 33 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1e4685f..3da2f97 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,15 @@
2017-05-30 Nathan Sidwell <nathan@acm.org>
+ Kill IDENTIFIER_NAMESPACE_BINDINGS
+ * cp-tree.h (lang_identifier): Delete namespace_bindings.
+ (IDENTIFIER_NAMESPACE_BINDINGS): Delete.
+ (lang_decl_ns): Add bindings.
+ (DECL_NAMESPACE_BINDINGS): New.
+ * lex.c (retrofit_lang_decl): Create namespace hash table.
+ * name-lookup.c (find_namespace_slot): Change to use hash-map.
+ * ptree.c (cxx_print_binding): Delete.
+ (cxx_print_identifier): Remove NAMESPACE_BINDING printing.
+
* cp-tree.def (OVERLOAD): Fix comment.
* cp-tree.h: Fix comments and whitespace.
* error.c (dump_decl): Use pp_cxx_colon_colon, ovl_scope.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index a01e76a..d6713f1 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -535,7 +535,6 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
struct GTY(()) lang_identifier {
struct c_common_identifier c_common;
- cxx_binding *namespace_bindings;
cxx_binding *bindings;
tree class_template_info;
tree label_value;
@@ -965,8 +964,6 @@ enum GTY(()) abstract_class_use {
/* Macros for access to language-specific slots in an identifier. */
-#define IDENTIFIER_NAMESPACE_BINDINGS(NODE) \
- (LANG_IDENTIFIER_CAST (NODE)->namespace_bindings)
#define IDENTIFIER_TEMPLATE(NODE) \
(LANG_IDENTIFIER_CAST (NODE)->class_template_info)
@@ -2552,6 +2549,9 @@ struct GTY(()) lang_decl_ns {
because of PCH. */
vec<tree, va_gc> *usings;
vec<tree, va_gc> *inlinees;
+
+ /* Map from IDENTIFIER nodes to DECLS. */
+ hash_map<lang_identifier *, tree> *bindings;
};
/* DECL_LANG_SPECIFIC for parameters. */
@@ -3146,6 +3146,10 @@ struct GTY(()) lang_decl {
#define DECL_NAMESPACE_INLINEES(NODE) \
(LANG_DECL_NS_CHECK (NODE)->inlinees)
+/* Pointer to hash_map from IDENTIFIERS to DECLS */
+#define DECL_NAMESPACE_BINDINGS(NODE) \
+ (LANG_DECL_NS_CHECK (NODE)->bindings)
+
/* In a NAMESPACE_DECL, points to the original namespace if this is
a namespace alias. */
#define DECL_NAMESPACE_ALIAS(NODE) \
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index a9c38ff..1b4eb35 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -566,8 +566,12 @@ retrofit_lang_decl (tree t, int sel)
memcpy (ld, DECL_LANG_SPECIFIC (t), oldsize);
ld->u.base.selector = sel;
-
DECL_LANG_SPECIFIC (t) = ld;
+
+ if (sel == 2)
+ /* Who'd create a namespace, only to put nothing in it? */
+ ld->u.ns.bindings = hash_map<lang_identifier *, tree>::create_ggc (499);
+
if (current_lang_name == lang_name_cplusplus
|| decl_linkage (t) == lk_none)
SET_DECL_LANGUAGE (t, lang_cplusplus);
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 7f58682..e4d6074 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -86,25 +86,18 @@ create_local_binding (cp_binding_level *level, tree name)
static tree *
find_namespace_slot (tree ns, tree name, bool create_p = false)
{
- cp_binding_level *level = NAMESPACE_LEVEL (ns);
- cxx_binding *binding = IDENTIFIER_NAMESPACE_BINDINGS (name);
-
- for (;binding; binding = binding->previous)
- if (binding->scope == level)
- return &binding->value;
+ tree *slot;
if (create_p)
{
- binding = cxx_binding_make (NULL, NULL);
- binding->previous = IDENTIFIER_NAMESPACE_BINDINGS (name);
- binding->scope = level;
- binding->is_local = false;
- binding->value_is_inherited = false;
- IDENTIFIER_NAMESPACE_BINDINGS (name) = binding;
- return &binding->value;
+ bool existed;
+ slot = &DECL_NAMESPACE_BINDINGS (ns)->get_or_insert (name, &existed);
+ if (!existed)
+ *slot = NULL_TREE;
}
-
- return NULL;
+ else
+ slot = DECL_NAMESPACE_BINDINGS (ns)->get (name);
+ return slot;
}
static tree
diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c
index f8e879e..5775e07 100644
--- a/gcc/cp/ptree.c
+++ b/gcc/cp/ptree.c
@@ -171,14 +171,6 @@ cxx_print_type (FILE *file, tree node, int indent)
}
}
-
-static void
-cxx_print_binding (FILE *stream, cxx_binding *binding, const char *prefix)
-{
- fprintf (stream, "%s <%p>",
- prefix, (void *) binding);
-}
-
void
cxx_print_identifier (FILE *file, tree node, int indent)
{
@@ -186,12 +178,7 @@ cxx_print_identifier (FILE *file, tree node, int indent)
fprintf (file, " ");
else
indent_to (file, indent + 4);
- cxx_print_binding (file, IDENTIFIER_NAMESPACE_BINDINGS (node), "bindings");
- if (indent == 0)
- fprintf (file, " ");
- else
- indent_to (file, indent + 4);
- cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings");
+ fprintf (file, "local bindings <%p>", (void *) IDENTIFIER_BINDING (node));
print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4);
print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4);
}