diff mbox

[2/5] Remove tree.h compilation dependency for tm.h

Message ID 55805A27.4000007@redhat.com
State New
Headers show

Commit Message

Andrew MacLeod June 16, 2015, 5:17 p.m. UTC
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

Comments

Richard Biener June 17, 2015, 12:34 p.m. UTC | #1
On Tue, Jun 16, 2015 at 7:17 PM, Andrew MacLeod <amacleod@redhat.com> wrote:
>
> 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.

Well, I'm sure it's not measurable, but 100 changes like this and it will
become a measurable slowdown...

I wonder if the macros should simply move to target.h

> 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?

Ok.

Thanks,
Richard.

> Andrew
>
>
diff mbox

Patch


	* 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;