From ee47f74ef0e961a0168e830919606981ef331c52 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Wed, 17 Jun 2015 15:36:02 +0000 Subject: [PATCH] tree.h (merge_dllimport_decl_attributes, [...]): Remove conditional exposure of prototypes. * tree.h (merge_dllimport_decl_attributes, handle_dll_attribute): Remove conditional exposure of prototypes. (ANON_AGGRNAME_FORMAT, ANON_AGGRNAME_P): Delete. * tree.c (anon_aggrname_format, anon_aggrname_p): New. Replace macro definitions in tree.h with functions. * lto-streamer-out.c (DFS_write_tree_body, hash_tree): Use anon_aggrname_p. * tree-streamer-out.c (write_ts_decl_minimal_tree_pointers): Likewise. * cp/cp-lang.c (cxx_dwarf_name): Use anon_aggrname_p. * cp/cp-tree.h (TYPE_ANONYMOUS_P): Likewise. * cp/decl.c (grokdeclarator, xref_tag_1): Likewise. * cp/error.c (dump_aggr_type): likewise. * cp/pt.c (push_template_decl_real): Likewise. * cp/name-lookup.c (make_anon_name): Use anon_aggrname_format. From-SVN: r224564 --- gcc/ChangeLog | 11 +++++++++++ gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/cp-lang.c | 2 +- gcc/cp/cp-tree.h | 2 +- gcc/cp/decl.c | 4 ++-- gcc/cp/error.c | 2 +- gcc/cp/name-lookup.c | 2 +- gcc/cp/pt.c | 2 +- gcc/lto-streamer-out.c | 4 ++-- gcc/tree-streamer-out.c | 2 +- gcc/tree.c | 36 ++++++++++++++++++++++++++++++++++++ gcc/tree.h | 21 ++------------------- 12 files changed, 69 insertions(+), 29 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 58a0a2bd717..155a985e7b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2015-06-17 Andrew MacLeod + + * tree.h (merge_dllimport_decl_attributes, handle_dll_attribute): + Remove conditional exposure of prototypes. + (ANON_AGGRNAME_FORMAT, ANON_AGGRNAME_P): Delete. + * tree.c (anon_aggrname_format, anon_aggrname_p): New. Replace macro + definitions in tree.h with functions. + * lto-streamer-out.c (DFS_write_tree_body, hash_tree): Use + anon_aggrname_p. + * tree-streamer-out.c (write_ts_decl_minimal_tree_pointers): Likewise. + 2015-06-17 Segher Boessenkool * config/rs6000/rs6000.md (*cmp_internal1): Rename to... diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cfa392b1a5c..98dab4a47b9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2015-06-17 Andrew MacLeod + + * cp-lang.c (cxx_dwarf_name): Use anon_aggrname_p. + * cp-tree.h (TYPE_ANONYMOUS_P): Likewise. + * decl.c (grokdeclarator, xref_tag_1): Likewise. + * error.c (dump_aggr_type): likewise. + * pt.c (push_template_decl_real): Likewise. + * name-lookup.c (make_anon_name): Use anon_aggrname_format. + + 2015-06-17 Andrew MacLeod * call.c: Do not include input.h, line-map.h or is-a.h. diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index 3645a06c9b5..0818be4bd4c 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -119,7 +119,7 @@ cxx_dwarf_name (tree t, int verbosity) gcc_assert (DECL_P (t)); if (DECL_NAME (t) - && (ANON_AGGRNAME_P (DECL_NAME (t)) || LAMBDA_TYPE_P (t))) + && (anon_aggrname_p (DECL_NAME (t)) || LAMBDA_TYPE_P (t))) return NULL; if (verbosity >= 2) return decl_as_dwarf_string (t, diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 37128be1600..b53aa9028e2 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1335,7 +1335,7 @@ enum languages { lang_c, lang_cplusplus, lang_java }; /* Nonzero if NODE has no name for linkage purposes. */ #define TYPE_ANONYMOUS_P(NODE) \ - (OVERLOAD_TYPE_P (NODE) && ANON_AGGRNAME_P (TYPE_LINKAGE_IDENTIFIER (NODE))) + (OVERLOAD_TYPE_P (NODE) && anon_aggrname_p (TYPE_LINKAGE_IDENTIFIER (NODE))) /* The _DECL for this _TYPE. */ #define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE))) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 3cb9ca19922..c102a4ee717 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -10389,7 +10389,7 @@ grokdeclarator (const cp_declarator *declarator, /* Replace the anonymous name with the real name everywhere. */ for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) { - if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))) + if (anon_aggrname_p (TYPE_IDENTIFIER (t))) /* We do not rename the debug info representing the anonymous tagged type because the standard says in [dcl.typedef] that the naming applies only for @@ -12290,7 +12290,7 @@ xref_tag_1 (enum tag_types tag_code, tree name, /* In case of anonymous name, xref_tag is only called to make type node and push name. Name lookup is not required. */ - if (ANON_AGGRNAME_P (name)) + if (anon_aggrname_p (name)) t = NULL_TREE; else t = lookup_and_check_tag (tag_code, name, diff --git a/gcc/cp/error.c b/gcc/cp/error.c index bb5106cacb6..96fa94d50e0 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -677,7 +677,7 @@ dump_aggr_type (cxx_pretty_printer *pp, tree t, int flags) name = DECL_NAME (name); } - if (name == 0 || ANON_AGGRNAME_P (name)) + if (name == 0 || anon_aggrname_p (name)) { if (flags & TFF_CLASS_KEY_OR_ENUM) pp_string (pp, M_("")); diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index cc116988637..1d7afea2aca 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -2096,7 +2096,7 @@ make_anon_name (void) { char buf[32]; - sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++); + sprintf (buf, anon_aggrname_format (), anon_cnt++); return get_identifier (buf); } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6a73a2eef36..60b94981b0a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4794,7 +4794,7 @@ push_template_decl_real (tree decl, bool is_friend) if (DECL_CLASS_SCOPE_P (decl)) member_template_p = true; if (TREE_CODE (decl) == TYPE_DECL - && ANON_AGGRNAME_P (DECL_NAME (decl))) + && anon_aggrname_p (DECL_NAME (decl))) { error ("template class without a name"); return error_mark_node; diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 88c2e80dfcc..4671702d249 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -738,7 +738,7 @@ DFS::DFS_write_tree_body (struct output_block *ob, /* Drop names that were created for anonymous entities. */ if (DECL_NAME (expr) && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE - && ANON_AGGRNAME_P (DECL_NAME (expr))) + && anon_aggrname_p (DECL_NAME (expr))) ; else DFS_follow_tree_edge (DECL_NAME (expr)); @@ -1179,7 +1179,7 @@ hash_tree (struct streamer_tree_cache_d *cache, hash_map *map, /* Drop names that were created for anonymous entities. */ if (DECL_NAME (t) && TREE_CODE (DECL_NAME (t)) == IDENTIFIER_NODE - && ANON_AGGRNAME_P (DECL_NAME (t))) + && anon_aggrname_p (DECL_NAME (t))) ; else visit (DECL_NAME (t)); diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c index 84ebb649774..10cbd561987 100644 --- a/gcc/tree-streamer-out.c +++ b/gcc/tree-streamer-out.c @@ -601,7 +601,7 @@ write_ts_decl_minimal_tree_pointers (struct output_block *ob, tree expr, /* Drop names that were created for anonymous entities. */ if (DECL_NAME (expr) && TREE_CODE (DECL_NAME (expr)) == IDENTIFIER_NODE - && ANON_AGGRNAME_P (DECL_NAME (expr))) + && anon_aggrname_p (DECL_NAME (expr))) stream_write_tree (ob, NULL_TREE, ref_p); else stream_write_tree (ob, DECL_NAME (expr), ref_p); diff --git a/gcc/tree.c b/gcc/tree.c index feeba1612b6..419e2767d9b 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -9256,6 +9256,42 @@ clean_symbol_name (char *p) *p = '_'; } +/* For anonymous aggregate types, we need some sort of name to + hold on to. In practice, this should not appear, but it should + not be harmful if it does. */ +bool +anon_aggrname_p(const_tree id_node) +{ +#ifndef NO_DOT_IN_LABEL + return (IDENTIFIER_POINTER (id_node)[0] == '.' + && IDENTIFIER_POINTER (id_node)[1] == '_'); +#else /* NO_DOT_IN_LABEL */ +#ifndef NO_DOLLAR_IN_LABEL + return (IDENTIFIER_POINTER (id_node)[0] == '$' \ + && IDENTIFIER_POINTER (id_node)[1] == '_'); +#else /* NO_DOLLAR_IN_LABEL */ +#define ANON_AGGRNAME_PREFIX "__anon_" + return (!strncmp (IDENTIFIER_POINTER (id_node), ANON_AGGRNAME_PREFIX, + sizeof (ANON_AGGRNAME_PREFIX) - 1)); +#endif /* NO_DOLLAR_IN_LABEL */ +#endif /* NO_DOT_IN_LABEL */ +} + +/* Return a format for an anonymous aggregate name. */ +const char * +anon_aggrname_format() +{ +#ifndef NO_DOT_IN_LABEL + return "._%d"; +#else /* NO_DOT_IN_LABEL */ +#ifndef NO_DOLLAR_IN_LABEL + return "$_%d"; +#else /* NO_DOLLAR_IN_LABEL */ + return "__anon_%d"; +#endif /* NO_DOLLAR_IN_LABEL */ +#endif /* NO_DOT_IN_LABEL */ +} + /* Generate a name for a special-purpose function. The generated name may need to be unique across the whole link. Changes to this function may also require corresponding changes to diff --git a/gcc/tree.h b/gcc/tree.h index ca5e68100da..dedcb370ea6 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -3988,14 +3988,12 @@ extern tree remove_attribute (const char *, tree); extern tree merge_attributes (tree, tree); -#if TARGET_DLLIMPORT_DECL_ATTRIBUTES /* Given two Windows decl attributes lists, possibly including dllimport, return a list of their union . */ extern tree merge_dllimport_decl_attributes (tree, tree); /* Handle a "dllimport" or "dllexport" attribute. */ extern tree handle_dll_attribute (tree *, tree, tree, int, bool *); -#endif /* Returns true iff unqualified CAND and BASE are equivalent. */ @@ -4899,23 +4897,8 @@ target_opts_for_fn (const_tree fndecl) /* For anonymous aggregate types, we need some sort of name to hold on to. In practice, this should not appear, but it should not be harmful if it does. */ -#ifndef NO_DOT_IN_LABEL -#define ANON_AGGRNAME_FORMAT "._%d" -#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '.' \ - && IDENTIFIER_POINTER (ID_NODE)[1] == '_') -#else /* NO_DOT_IN_LABEL */ -#ifndef NO_DOLLAR_IN_LABEL -#define ANON_AGGRNAME_FORMAT "$_%d" -#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '$' \ - && IDENTIFIER_POINTER (ID_NODE)[1] == '_') -#else /* NO_DOLLAR_IN_LABEL */ -#define ANON_AGGRNAME_PREFIX "__anon_" -#define ANON_AGGRNAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \ - sizeof (ANON_AGGRNAME_PREFIX) - 1)) -#define ANON_AGGRNAME_FORMAT "__anon_%d" -#endif /* NO_DOLLAR_IN_LABEL */ -#endif /* NO_DOT_IN_LABEL */ +extern const char *anon_aggrname_format(); +extern bool anon_aggrname_p (const_tree); /* The tree and const_tree overload templates. */ namespace wi -- 2.30.2