There are 2 macros defined in tree.h the depend on the definition of
NO_DOT_IN_LABEL and NO_DOLLAR_IN_LABEL. These are ANON_AGGRNAME_FORMAT
and ANON_AGGRNAME_P. This means that in order to get the correct values
for those macros, you have to be sure that tm.h was included before
tree.h, and thats the only conditional dependency tree.h has on tm.h.
By changing those 2 macos to functions and defining them in tree.c, the
restriction/requirement is removed. These are not heavily used, Im sure
compilation issues are unmeasurable.
There is also single hard compilation dependency on the definition of
TARGET_DLLIMPORT_DECL_ATTRIBUTES. it shows:
#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
defaults.h provides a default definition of 0, but I'm not convinced
that we need to hide function prototypes like this... Anything that
cares will be checking that macro before calling or creating those
functions... and if they don't there will be an unresolved external at
compilation time.. so we still get an error. We also don't get any
errors if the prototype isn't used. If it is not protected, then it
removes the need to have defaults.h and tm.h included before tree.h
This patch makes both these changes, and tree.h no longer requires tm.h
or defaults.h
bootstraps on x86_64-unknown-linux-gnu with no new regressions. No
failures on config-list.mk target runs either.
OK for trunk?
Andrew
* 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
defintions 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.
Index: tree.h
===================================================================
*** tree.h (revision 224345)
--- tree.h (working copy)
*************** extern tree remove_attribute (const char
*** 3988,4001 ****
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. */
--- 3988,3999 ----
*************** target_opts_for_fn (const_tree fndecl)
*** 4899,4921 ****
/* 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 */
/* The tree and const_tree overload templates. */
namespace wi
--- 4897,4904 ----
/* 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. */
! extern const char *anon_aggrname_format();
! extern bool anon_aggrname_p (const_tree);
/* The tree and const_tree overload templates. */
namespace wi
Index: tree.c
===================================================================
*** tree.c (revision 224345)
--- tree.c (working copy)
*************** clean_symbol_name (char *p)
*** 9258,9263 ****
--- 9258,9299 ----
*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
Index: lto-streamer-out.c
===================================================================
*** lto-streamer-out.c (revision 224345)
--- lto-streamer-out.c (working copy)
*************** DFS::DFS_write_tree_body (struct output_
*** 740,746 ****
/* 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)))
;
else
DFS_follow_tree_edge (DECL_NAME (expr));
--- 740,746 ----
/* 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)))
;
else
DFS_follow_tree_edge (DECL_NAME (expr));
*************** hash_tree (struct streamer_tree_cache_d
*** 1180,1186 ****
/* 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)))
;
else
visit (DECL_NAME (t));
--- 1180,1186 ----
/* 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)))
;
else
visit (DECL_NAME (t));
Index: tree-streamer-out.c
===================================================================
*** tree-streamer-out.c (revision 224345)
--- tree-streamer-out.c (working copy)
*************** write_ts_decl_minimal_tree_pointers (str
*** 603,609 ****
/* 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)))
stream_write_tree (ob, NULL_TREE, ref_p);
else
stream_write_tree (ob, DECL_NAME (expr), ref_p);
--- 603,609 ----
/* 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)))
stream_write_tree (ob, NULL_TREE, ref_p);
else
stream_write_tree (ob, DECL_NAME (expr), ref_p);
Index: cp/cp-lang.c
===================================================================
*** cp/cp-lang.c (revision 224345)
--- cp/cp-lang.c (working copy)
*************** cxx_dwarf_name (tree t, int verbosity)
*** 120,126 ****
gcc_assert (DECL_P (t));
if (DECL_NAME (t)
! && (ANON_AGGRNAME_P (DECL_NAME (t)) || LAMBDA_TYPE_P (t)))
return NULL;
if (verbosity >= 2)
return decl_as_dwarf_string (t,
--- 120,126 ----
gcc_assert (DECL_P (t));
if (DECL_NAME (t)
! && (anon_aggrname_p (DECL_NAME (t)) || LAMBDA_TYPE_P (t)))
return NULL;
if (verbosity >= 2)
return decl_as_dwarf_string (t,
Index: cp/cp-tree.h
===================================================================
*** cp/cp-tree.h (revision 224345)
--- cp/cp-tree.h (working copy)
*************** enum languages { lang_c, lang_cplusplus,
*** 1335,1341 ****
/* 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)))
/* The _DECL for this _TYPE. */
#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
--- 1335,1341 ----
/* 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)))
/* The _DECL for this _TYPE. */
#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
Index: cp/decl.c
===================================================================
*** cp/decl.c (revision 224345)
--- cp/decl.c (working copy)
*************** grokdeclarator (const cp_declarator *dec
*** 10390,10396 ****
/* 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)))
/* 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
--- 10390,10396 ----
/* 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)))
/* 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
*************** xref_tag_1 (enum tag_types tag_code, tre
*** 12291,12297 ****
/* 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))
t = NULL_TREE;
else
t = lookup_and_check_tag (tag_code, name,
--- 12291,12297 ----
/* 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))
t = NULL_TREE;
else
t = lookup_and_check_tag (tag_code, name,
Index: cp/error.c
===================================================================
*** cp/error.c (revision 224345)
--- cp/error.c (working copy)
*************** dump_aggr_type (cxx_pretty_printer *pp,
*** 678,684 ****
name = DECL_NAME (name);
}
! if (name == 0 || ANON_AGGRNAME_P (name))
{
if (flags & TFF_CLASS_KEY_OR_ENUM)
pp_string (pp, M_("<anonymous>"));
--- 678,684 ----
name = DECL_NAME (name);
}
! if (name == 0 || anon_aggrname_p (name))
{
if (flags & TFF_CLASS_KEY_OR_ENUM)
pp_string (pp, M_("<anonymous>"));
Index: cp/name-lookup.c
===================================================================
*** cp/name-lookup.c (revision 224345)
--- cp/name-lookup.c (working copy)
*************** make_anon_name (void)
*** 2097,2103 ****
{
char buf[32];
! sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++);
return get_identifier (buf);
}
--- 2097,2103 ----
{
char buf[32];
! sprintf (buf, anon_aggrname_format (), anon_cnt++);
return get_identifier (buf);
}
Index: cp/pt.c
===================================================================
*** cp/pt.c (revision 224345)
--- cp/pt.c (working copy)
*************** push_template_decl_real (tree decl, bool
*** 4795,4801 ****
if (DECL_CLASS_SCOPE_P (decl))
member_template_p = true;
if (TREE_CODE (decl) == TYPE_DECL
! && ANON_AGGRNAME_P (DECL_NAME (decl)))
{
error ("template class without a name");
return error_mark_node;
--- 4795,4801 ----
if (DECL_CLASS_SCOPE_P (decl))
member_template_p = true;
if (TREE_CODE (decl) == TYPE_DECL
! && anon_aggrname_p (DECL_NAME (decl)))
{
error ("template class without a name");
return error_mark_node;