On 09/24/2014 05:01 PM, Jan Hubicka wrote:
Hi.

Following patch enhances API functions to be ready for main patch of this 
patchset.

Ready for thunk?

Thank you,
Martin

gcc/ChangeLog:

2014-09-21  Martin Liška  <mli...@suse.cz>

        * cgraph.c (cgraph_node::release_body): New argument keep_arguments
        introduced.
        * cgraph.h: Likewise.
        * cgraphunit.c (cgraph_node::create_wrapper): Usage of new argument 
introduced.
        * ipa-devirt.c (polymorphic_type_binfo_p): Safe check for binfos 
created by Java.
        * tree-ssa-alias.c (ao_ref_base_alias_set): Static function transformed 
to global.
        * tree-ssa-alias.h: Likewise.

diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 8f04284..d40a2922 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1637,13 +1637,15 @@ release_function_body (tree decl)
     are free'd in final.c via free_after_compilation().  */

  void
-cgraph_node::release_body (void)
+cgraph_node::release_body (bool keep_arguments)
  {
    ipa_transforms_to_apply.release ();
    if (!used_as_abstract_origin && symtab->state != PARSING)
      {
        DECL_RESULT (decl) = NULL;
-      DECL_ARGUMENTS (decl) = NULL;
+
+      if (!keep_arguments)
+       DECL_ARGUMENTS (decl) = NULL;
      }
    /* If the node is abstract and needed, then do not clear DECL_INITIAL
       of its associated function function declaration because it's
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index a316e40..19ce3b8 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -915,7 +915,7 @@ public:
       Use this only for functions that are released before being translated to
       target code (i.e. RTL).  Functions that are compiled to RTL and beyond
       are free'd in final.c via free_after_compilation().  */
-  void release_body (void);
+  void release_body (bool keep_arguments = false);

Please add documentation for KEEP_ARGUMENTS explaining that it is useful only 
if you want to
rebuild body as thunk.

    /* cgraph_node is no longer nested function; update cgraph accordingly.  */
    void unnest (void);
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 3e3b8d2..c4597e2 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2300,7 +2300,7 @@ cgraph_node::create_wrapper (cgraph_node *target)
      tree decl_result = DECL_RESULT (decl);

      /* Remove the function's body.  */
I would say Remove the function's body but keep arguments to be reused for 
thunk.
-    release_body ();
+    release_body (true);
      reset ();

      DECL_RESULT (decl) = decl_result;
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index af42c6d..f374933 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -225,7 +225,7 @@ static inline bool
  polymorphic_type_binfo_p (tree binfo)
  {
    /* See if BINFO's type has an virtual table associtated with it.  */
-  return BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo)));
+  return BINFO_TYPE (binfo) && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo)));

Aha, this change was for Java, right? Please add comment that Java produces
BINFOs without BINFO_TYPE set.
  }

  /* Return TRUE if all derived types of T are known and thus
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 442112a..1bf88e2 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -559,7 +559,7 @@ ao_ref_base (ao_ref *ref)

  /* Returns the base object alias set of the memory reference *REF.  */

-static alias_set_type
+alias_set_type
  ao_ref_base_alias_set (ao_ref *ref)
  {
    tree base_ref;
diff --git a/gcc/tree-ssa-alias.h b/gcc/tree-ssa-alias.h
index 436381a..0d35283 100644
--- a/gcc/tree-ssa-alias.h
+++ b/gcc/tree-ssa-alias.h
@@ -98,6 +98,7 @@ extern void ao_ref_init (ao_ref *, tree);
  extern void ao_ref_init_from_ptr_and_size (ao_ref *, tree, tree);
  extern tree ao_ref_base (ao_ref *);
  extern alias_set_type ao_ref_alias_set (ao_ref *);
+extern alias_set_type ao_ref_base_alias_set (ao_ref *);

I can not approve this change, but I suppose it is what Richard suggested?


There's updated version of the patch that deals with Honza's notes.
Yes, I explicitly asked Richard if we can mark the function as global.

I will commit the patch soon.

Thank you,
Martin

Patch is OK except for the tree-ssa-alias bits.
Honza
  extern bool ptr_deref_may_alias_global_p (tree);
  extern bool ptr_derefs_may_alias_p (tree, tree);
  extern bool ref_may_alias_global_p (tree);


diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 1cfc783..fdcaf79 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1625,16 +1625,19 @@ release_function_body (tree decl)
 /* Release memory used to represent body of function.
    Use this only for functions that are released before being translated to
    target code (i.e. RTL).  Functions that are compiled to RTL and beyond
-   are free'd in final.c via free_after_compilation().  */
+   are free'd in final.c via free_after_compilation().
+   KEEP_ARGUMENTS are useful only if you want to rebuild body as thunk.  */
 
 void
-cgraph_node::release_body (void)
+cgraph_node::release_body (bool keep_arguments)
 {
   ipa_transforms_to_apply.release ();
   if (!used_as_abstract_origin && symtab->state != PARSING)
     {
       DECL_RESULT (decl) = NULL;
-      DECL_ARGUMENTS (decl) = NULL;
+
+      if (!keep_arguments)
+	DECL_ARGUMENTS (decl) = NULL;
     }
   /* If the node is abstract and needed, then do not clear DECL_INITIAL
      of its associated function function declaration because it's
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 7481906..4fd58a5 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -917,7 +917,7 @@ public:
      Use this only for functions that are released before being translated to
      target code (i.e. RTL).  Functions that are compiled to RTL and beyond
      are free'd in final.c via free_after_compilation().  */
-  void release_body (void);
+  void release_body (bool keep_arguments = false);
 
   /* cgraph_node is no longer nested function; update cgraph accordingly.  */
   void unnest (void);
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index b854e4b..d463505 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2294,8 +2294,9 @@ cgraph_node::create_wrapper (cgraph_node *target)
     /* Preserve DECL_RESULT so we get right by reference flag.  */
     tree decl_result = DECL_RESULT (decl);
 
-    /* Remove the function's body.  */
-    release_body ();
+    /* Remove the function's body but keep arguments to be reused
+       for thunk.  */
+    release_body (true);
     reset ();
 
     DECL_RESULT (decl) = decl_result;
diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h
index 029f39a..465bc26 100644
--- a/gcc/ipa-utils.h
+++ b/gcc/ipa-utils.h
@@ -179,8 +179,10 @@ odr_type_p (const_tree t)
 inline bool
 polymorphic_type_binfo_p (const_tree binfo)
 {
-  /* See if BINFO's type has an virtual table associtated with it.  */
-  return BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo)));
+  /* See if BINFO's type has an virtual table associtated with it.
+     Check is defensive because of Java FE produces BINFOs
+     without BINFO_TYPE set.   */
+  return BINFO_TYPE (binfo) && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (binfo)));
 }
 #endif  /* GCC_IPA_UTILS_H  */
 
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 442112a..1bf88e2 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -559,7 +559,7 @@ ao_ref_base (ao_ref *ref)
 
 /* Returns the base object alias set of the memory reference *REF.  */
 
-static alias_set_type
+alias_set_type
 ao_ref_base_alias_set (ao_ref *ref)
 {
   tree base_ref;
diff --git a/gcc/tree-ssa-alias.h b/gcc/tree-ssa-alias.h
index 436381a..0d35283 100644
--- a/gcc/tree-ssa-alias.h
+++ b/gcc/tree-ssa-alias.h
@@ -98,6 +98,7 @@ extern void ao_ref_init (ao_ref *, tree);
 extern void ao_ref_init_from_ptr_and_size (ao_ref *, tree, tree);
 extern tree ao_ref_base (ao_ref *);
 extern alias_set_type ao_ref_alias_set (ao_ref *);
+extern alias_set_type ao_ref_base_alias_set (ao_ref *);
 extern bool ptr_deref_may_alias_global_p (tree);
 extern bool ptr_derefs_may_alias_p (tree, tree);
 extern bool ref_may_alias_global_p (tree);

Reply via email to