Chromium: LTO

Jan Hubicka hubicka@ucw.cz
Sun Feb 15 22:33:00 GMT 2015


> Hi,
> 
> > +symtab_node::iterate_direct_aliases (unsigned i, ipa_ref *&ref)
> > +{
> > +  ref_list.referring.iterate (i, &ref);
> > +
> > +  if (ref && ref->use != IPA_REF_ALIAS)
> > +    return NULL;
> > +
> > +  return ref;
> > +}
> 
> it seems a little weird the out arg can return a non alias, and so if
> you only want to look at aliases you have to check the return value.
> 
> > +
> > +/* Return true if list contains an alias.  */
> > +
> > +inline bool
> > +symtab_node::has_aliases_p (void)
> > +{
> > +  ipa_ref *ref = NULL;
> > +  int i;
> > +
> > +  for (i = 0; iterate_direct_aliases (i, ref); i++)
> > +    if (ref->use == IPA_REF_ALIAS)
> > +      return true;
> > +  return false;
> > +}
> 
> can it ever be true there is an alias in the list but it isn't the first
> thing? the function above suggests not.

Yeah, you are right here; I was not very cureful when simplifying the function.
> 
> > +symtab_node::call_for_symbol_and_aliases (bool (*callback) (symtab_node *,
> > +							    void *),
> > +					  void *data,
> > +					  bool include_overwritable)
> > +{
> > +  ipa_ref *ref;
> > +
> > +  if (callback (this, data))
> > +    return true;
> > +  if (iterate_direct_aliases (0, ref))
> 
> wouldn't has_aliases_p be a little more clear?

Indeed.

I commited the following cleanup that also cleans get_binfo_at_offset per
martin Jambor comments.

	* cgraph.h (symtab_node::has_aliases_p): Simplify.
	(symtab_node::call_for_symbol_and_aliases): Use has_aliases_p
	* tree.c (lookup_binfo_at_offset): Make static.
	(get_binfo_at_offset): Do not shadow offset; add explanatory
	comment.
Index: cgraph.h
===================================================================
--- cgraph.h	(revision 220709)
+++ cgraph.h	(working copy)
@@ -2338,12 +2338,8 @@ inline bool
 symtab_node::has_aliases_p (void)
 {
   ipa_ref *ref = NULL;
-  int i;
 
-  for (i = 0; iterate_direct_aliases (i, ref); i++)
-    if (ref->use == IPA_REF_ALIAS)
-      return true;
-  return false;
+  return (iterate_direct_aliases (0, ref) != NULL);
 }
 
 /* Return true when RESOLUTION indicate that linker will use
@@ -2984,11 +2980,9 @@ symtab_node::call_for_symbol_and_aliases
 					  void *data,
 					  bool include_overwritable)
 {
-  ipa_ref *ref;
-
   if (callback (this, data))
     return true;
-  if (iterate_direct_aliases (0, ref))
+  if (has_aliases_p ())
     return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
   return false;
 }
@@ -3003,13 +2997,10 @@ cgraph_node::call_for_symbol_and_aliases
 					  void *data,
 					  bool include_overwritable)
 {
-  ipa_ref *ref;
-
   if (callback (this, data))
     return true;
-  if (iterate_direct_aliases (0, ref))
+  if (has_aliases_p ())
     return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
-
   return false;
 }
 
@@ -3023,13 +3014,10 @@ varpool_node::call_for_symbol_and_aliase
 					   void *data,
 					   bool include_overwritable)
 {
-  ipa_ref *ref;
-
   if (callback (this, data))
     return true;
-  if (iterate_direct_aliases (0, ref))
+  if (has_aliases_p ())
     return call_for_symbol_and_aliases_1 (callback, data, include_overwritable);
-
   return false;
 }
 
Index: tree.c
===================================================================
--- tree.c	(revision 220709)
+++ tree.c	(working copy)
@@ -11992,7 +11992,7 @@ type_in_anonymous_namespace_p (const_tre
 
 /* Lookup sub-BINFO of BINFO of TYPE at offset POS.  */
 
-tree
+static tree
 lookup_binfo_at_offset (tree binfo, tree type, HOST_WIDE_INT pos)
 {
   unsigned int i;
@@ -12045,11 +12045,13 @@ get_binfo_at_offset (tree binfo, HOST_WI
       else if (offset != 0)
 	{
 	  tree found_binfo = NULL, base_binfo;
-	  int offset = (tree_to_shwi (BINFO_OFFSET (binfo)) + pos
-			/ BITS_PER_UNIT);
+	  /* Offsets in BINFO are in bytes relative to the whole structure
+	     while POS is in bits relative to the containing field.  */
+	  int binfo_offset = (tree_to_shwi (BINFO_OFFSET (binfo)) + pos
+			     / BITS_PER_UNIT);
 
 	  for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
-	    if (tree_to_shwi (BINFO_OFFSET (base_binfo)) == offset
+	    if (tree_to_shwi (BINFO_OFFSET (base_binfo)) == binfo_offset
 		&& types_same_for_odr (TREE_TYPE (base_binfo), TREE_TYPE (fld)))
 	      {
 		found_binfo = base_binfo;
@@ -12058,7 +12060,8 @@ get_binfo_at_offset (tree binfo, HOST_WI
 	  if (found_binfo)
 	    binfo = found_binfo;
 	  else
-	    binfo = lookup_binfo_at_offset (binfo, TREE_TYPE (fld), offset);
+	    binfo = lookup_binfo_at_offset (binfo, TREE_TYPE (fld),
+					    binfo_offset);
 	 }
 
       type = TREE_TYPE (fld);



More information about the Gcc-patches mailing list