Patchwork [RFC] bail out after front-end errors

login
register
mail settings
Submitter Steven Bosscher
Date Dec. 28, 2012, 5:35 p.m.
Message ID <CABu31nNawk1bKmVVp6f8TGAJaQMCUhh25HOEB7Suu8kamAeHrQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/208512/
State New
Headers show

Comments

Steven Bosscher - Dec. 28, 2012, 5:35 p.m.
On Tue, Mar 27, 2012 at 10:59 AM, Richard Guenther wrote:
> On Tue, Mar 27, 2012 at 10:32 AM, Steven Bosscher  wrote:
>> On Tue, Mar 27, 2012 at 9:17 AM, Richard Guenther wrote:
>>> It would be nice to finally move
>>> the call to cgraph_finalize_compilation_unit to the middle-end ...
>>> (warning, if you try that you run into an issue with the Java frontend ... :/)
>>
>> Do you remember what issues that causes? I'm running into a great
>> number of issues there already with some varasm fixes (basically just
>> cleanups for the tree-ssa and unit-at-a-time era we're supposed to
>> live in - except Java).
>
> I think it was the
>
>   /* Generate hidden aliases for Java.  */
>   if (candidates)
>     {
>       build_java_method_aliases (candidates);
>       pointer_set_destroy (candidates);
>     }
>
> hunk in cp_write_global_declarations that does not work when run
> before cgraph_finalize_compilation_unit
> (I simply tried to move that call out of, and after calling the
> langhook).  So the problem materialized when
> building libjava I think.

Hello,

Coming back to this issue...  Attached patch is an attempt to resolve
this part of the finalize_compilation_unit problem. Instead of
emitting aliases with assemble_alias after finalize_compilation_unit,
this patch uses cgraph_same_body_alias before it.

Bootstrapped&tested on powerpc64-unknown-linux-gnu.
Richi, Honza, does this make sense?

Ciao!
Steven

cp/
	* decl2.c (collect_candidates_for_java_method_aliases): Remove.
	(build_java_method_aliases): Rewrite to emit the aliases via the
	cgraphunit machinery.
	(cp_write_global_declarations): Adjust for abovementioned changes.

Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 194725)
+++ cp/decl2.c	(working copy)
stevenb@stevenb-laptop:~$ cat devel/java_method_aliases.diff
cp/
	* decl2.c (collect_candidates_for_java_method_aliases): Remove.
	(build_java_method_aliases): Rewrite to emit the aliases via the
	cgraphunit machinery.
	(cp_write_global_declarations): Adjust for abovementioned changes.
Richard Guenther - Jan. 2, 2013, 3:07 p.m.
On Fri, Dec 28, 2012 at 6:35 PM, Steven Bosscher <stevenb.gcc@gmail.com> wrote:
> On Tue, Mar 27, 2012 at 10:59 AM, Richard Guenther wrote:
>> On Tue, Mar 27, 2012 at 10:32 AM, Steven Bosscher  wrote:
>>> On Tue, Mar 27, 2012 at 9:17 AM, Richard Guenther wrote:
>>>> It would be nice to finally move
>>>> the call to cgraph_finalize_compilation_unit to the middle-end ...
>>>> (warning, if you try that you run into an issue with the Java frontend ... :/)
>>>
>>> Do you remember what issues that causes? I'm running into a great
>>> number of issues there already with some varasm fixes (basically just
>>> cleanups for the tree-ssa and unit-at-a-time era we're supposed to
>>> live in - except Java).
>>
>> I think it was the
>>
>>   /* Generate hidden aliases for Java.  */
>>   if (candidates)
>>     {
>>       build_java_method_aliases (candidates);
>>       pointer_set_destroy (candidates);
>>     }
>>
>> hunk in cp_write_global_declarations that does not work when run
>> before cgraph_finalize_compilation_unit
>> (I simply tried to move that call out of, and after calling the
>> langhook).  So the problem materialized when
>> building libjava I think.
>
> Hello,
>
> Coming back to this issue...  Attached patch is an attempt to resolve
> this part of the finalize_compilation_unit problem. Instead of
> emitting aliases with assemble_alias after finalize_compilation_unit,
> this patch uses cgraph_same_body_alias before it.
>
> Bootstrapped&tested on powerpc64-unknown-linux-gnu.
> Richi, Honza, does this make sense?

Looks sensible to me.  In theory it should even allow more optimizations
this way ...

Of course it looks like stage1 material.

Thanks,
Richard.

> Ciao!
> Steven
>
> cp/
>         * decl2.c (collect_candidates_for_java_method_aliases): Remove.
>         (build_java_method_aliases): Rewrite to emit the aliases via the
>         cgraphunit machinery.
>         (cp_write_global_declarations): Adjust for abovementioned changes.
>
> Index: cp/decl2.c
> ===================================================================
> --- cp/decl2.c  (revision 194725)
> +++ cp/decl2.c  (working copy)
> stevenb@stevenb-laptop:~$ cat devel/java_method_aliases.diff
> cp/
>         * decl2.c (collect_candidates_for_java_method_aliases): Remove.
>         (build_java_method_aliases): Rewrite to emit the aliases via the
>         cgraphunit machinery.
>         (cp_write_global_declarations): Adjust for abovementioned changes.
>
> Index: cp/decl2.c
> ===================================================================
> --- cp/decl2.c  (revision 194725)
> +++ cp/decl2.c  (working copy)
> @@ -3615,79 +3615,53 @@ generate_ctor_and_dtor_functions_for_priority (spl
>
>  /* Java requires that we be able to reference a local address for a
>     method, and not be confused by PLT entries.  If hidden aliases are
> -   supported, collect and return all the functions for which we should
> +   supported, emit one for each java function that we've emitted.
>     emit a hidden alias.  */
>
> -static struct pointer_set_t *
> -collect_candidates_for_java_method_aliases (void)
> +static void
> +build_java_method_aliases (void)
>  {
> +#ifdef HAVE_GAS_HIDDEN
>    struct cgraph_node *node;
> -  struct pointer_set_t *candidates = NULL;
> +  tree fndecl;
> +  vec<tree> candidates = vNULL;
> +  unsigned int ix;
>
> -#ifndef HAVE_GAS_HIDDEN
> -  return candidates;
> -#endif
> -
> +  /* First collect all candidates.  We cannot create the aliases
> +     in place, it confuses the FOR_EACH_FUNCTION iterator.  */
>    FOR_EACH_FUNCTION (node)
>      {
> -      tree fndecl = node->symbol.decl;
> -
> +      fndecl = node->symbol.decl;
>        if (DECL_CONTEXT (fndecl)
>           && TYPE_P (DECL_CONTEXT (fndecl))
>           && TYPE_FOR_JAVA (DECL_CONTEXT (fndecl))
>           && TARGET_USE_LOCAL_THUNK_ALIAS_P (fndecl))
> -       {
> -         if (candidates == NULL)
> -           candidates = pointer_set_create ();
> -         pointer_set_insert (candidates, fndecl);
> -       }
> +       candidates.safe_push (fndecl);
>      }
>
> -  return candidates;
> -}
> -
> -
> -/* Java requires that we be able to reference a local address for a
> -   method, and not be confused by PLT entries.  If hidden aliases are
> -   supported, emit one for each java function that we've emitted.
> -   CANDIDATES is the set of FUNCTION_DECLs that were gathered
> -   by collect_candidates_for_java_method_aliases.  */
> -
> -static void
> -build_java_method_aliases (struct pointer_set_t *candidates)
> -{
> -  struct cgraph_node *node;
> -
> -#ifndef HAVE_GAS_HIDDEN
> -  return;
> -#endif
> -
> -  FOR_EACH_FUNCTION (node)
> +  /* Now add the aliases for the candidates collected above.
> +     Mangle the name in a predictable way; we need to reference
> +     this from a java compiled object file.  */
> +  FOR_EACH_VEC_ELT (candidates, ix, fndecl)
>      {
> -      tree fndecl = node->symbol.decl;
> +      tree oid, nid, alias;
> +      const char *oname;
> +      char *nname;
>
> -      if (TREE_ASM_WRITTEN (fndecl)
> -         && pointer_set_contains (candidates, fndecl))
> -       {
> -         /* Mangle the name in a predictable way; we need to reference
> -            this from a java compiled object file.  */
> -         tree oid, nid, alias;
> -         const char *oname;
> -         char *nname;
> +      oid = DECL_ASSEMBLER_NAME (fndecl);
> +      oname = IDENTIFIER_POINTER (oid);
> +      gcc_assert (oname[0] == '_' && oname[1] == 'Z');
> +      nname = ACONCAT (("_ZGA", oname+2, NULL));
> +      nid = get_identifier (nname);
>
> -         oid = DECL_ASSEMBLER_NAME (fndecl);
> -         oname = IDENTIFIER_POINTER (oid);
> -         gcc_assert (oname[0] == '_' && oname[1] == 'Z');
> -         nname = ACONCAT (("_ZGA", oname+2, NULL));
> -         nid = get_identifier (nname);
> -
> -         alias = make_alias_for (fndecl, nid);
> -         TREE_PUBLIC (alias) = 1;
> -         DECL_VISIBILITY (alias) = VISIBILITY_HIDDEN;
> -
> -         assemble_alias (alias, oid);
> -       }
> +      alias = make_alias_for (fndecl, nid);
> +      TREE_PUBLIC (alias) = 1;
> +      DECL_VISIBILITY (alias) = VISIBILITY_HIDDEN;
> +      node = cgraph_same_body_alias (NULL, alias, fndecl);
> +      gcc_assert (node);
>      }
> +#endif
> +  return;
>  }
>
>  /* Return C++ property of T, based on given operation OP.  */
> @@ -3933,7 +3907,6 @@ cp_write_global_declarations (void)
>    unsigned ssdf_count = 0;
>    int retries = 0;
>    tree decl;
> -  struct pointer_set_t *candidates;
>
>    locus = input_location;
>    at_eof = 1;
> @@ -4282,8 +4255,8 @@ cp_write_global_declarations (void)
>       linkage now.  */
>    pop_lang_context ();
>
> -  /* Collect candidates for Java hidden aliases.  */
> -  candidates = collect_candidates_for_java_method_aliases ();
> +  /* Generate hidden aliases for Java.  */
> +  build_java_method_aliases ();
>
>    timevar_stop (TV_PHASE_DEFERRED);
>    timevar_start (TV_PHASE_OPT_GEN);
> @@ -4306,13 +4279,6 @@ cp_write_global_declarations (void)
>
>    perform_deferred_noexcept_checks ();
>
> -  /* Generate hidden aliases for Java.  */
> -  if (candidates)
> -    {
> -      build_java_method_aliases (candidates);
> -      pointer_set_destroy (candidates);
> -    }
> -
>    finish_repo ();
>
>    /* The entire file is now complete.  If requested, dump everything

Patch

Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 194725)
+++ cp/decl2.c	(working copy)
@@ -3615,79 +3615,53 @@  generate_ctor_and_dtor_functions_for_priority (spl

 /* Java requires that we be able to reference a local address for a
    method, and not be confused by PLT entries.  If hidden aliases are
-   supported, collect and return all the functions for which we should
+   supported, emit one for each java function that we've emitted.
    emit a hidden alias.  */

-static struct pointer_set_t *
-collect_candidates_for_java_method_aliases (void)
+static void
+build_java_method_aliases (void)
 {
+#ifdef HAVE_GAS_HIDDEN
   struct cgraph_node *node;
-  struct pointer_set_t *candidates = NULL;
+  tree fndecl;
+  vec<tree> candidates = vNULL;
+  unsigned int ix;

-#ifndef HAVE_GAS_HIDDEN
-  return candidates;
-#endif
-
+  /* First collect all candidates.  We cannot create the aliases
+     in place, it confuses the FOR_EACH_FUNCTION iterator.  */
   FOR_EACH_FUNCTION (node)
     {
-      tree fndecl = node->symbol.decl;
-
+      fndecl = node->symbol.decl;
       if (DECL_CONTEXT (fndecl)
 	  && TYPE_P (DECL_CONTEXT (fndecl))
 	  && TYPE_FOR_JAVA (DECL_CONTEXT (fndecl))
 	  && TARGET_USE_LOCAL_THUNK_ALIAS_P (fndecl))
-	{
-	  if (candidates == NULL)
-	    candidates = pointer_set_create ();
-	  pointer_set_insert (candidates, fndecl);
-	}
+	candidates.safe_push (fndecl);
     }

-  return candidates;
-}
-
-
-/* Java requires that we be able to reference a local address for a
-   method, and not be confused by PLT entries.  If hidden aliases are
-   supported, emit one for each java function that we've emitted.
-   CANDIDATES is the set of FUNCTION_DECLs that were gathered
-   by collect_candidates_for_java_method_aliases.  */
-
-static void
-build_java_method_aliases (struct pointer_set_t *candidates)
-{
-  struct cgraph_node *node;
-
-#ifndef HAVE_GAS_HIDDEN
-  return;
-#endif
-
-  FOR_EACH_FUNCTION (node)
+  /* Now add the aliases for the candidates collected above.
+     Mangle the name in a predictable way; we need to reference
+     this from a java compiled object file.  */
+  FOR_EACH_VEC_ELT (candidates, ix, fndecl)
     {
-      tree fndecl = node->symbol.decl;
+      tree oid, nid, alias;
+      const char *oname;
+      char *nname;

-      if (TREE_ASM_WRITTEN (fndecl)
-	  && pointer_set_contains (candidates, fndecl))
-	{
-	  /* Mangle the name in a predictable way; we need to reference
-	     this from a java compiled object file.  */
-	  tree oid, nid, alias;
-	  const char *oname;
-	  char *nname;
+      oid = DECL_ASSEMBLER_NAME (fndecl);
+      oname = IDENTIFIER_POINTER (oid);
+      gcc_assert (oname[0] == '_' && oname[1] == 'Z');
+      nname = ACONCAT (("_ZGA", oname+2, NULL));
+      nid = get_identifier (nname);

-	  oid = DECL_ASSEMBLER_NAME (fndecl);
-	  oname = IDENTIFIER_POINTER (oid);
-	  gcc_assert (oname[0] == '_' && oname[1] == 'Z');
-	  nname = ACONCAT (("_ZGA", oname+2, NULL));
-	  nid = get_identifier (nname);
-
-	  alias = make_alias_for (fndecl, nid);
-	  TREE_PUBLIC (alias) = 1;
-	  DECL_VISIBILITY (alias) = VISIBILITY_HIDDEN;
-
-	  assemble_alias (alias, oid);
-	}
+      alias = make_alias_for (fndecl, nid);
+      TREE_PUBLIC (alias) = 1;
+      DECL_VISIBILITY (alias) = VISIBILITY_HIDDEN;
+      node = cgraph_same_body_alias (NULL, alias, fndecl);
+      gcc_assert (node);
     }
+#endif
+  return;
 }

 /* Return C++ property of T, based on given operation OP.  */
@@ -3933,7 +3907,6 @@  cp_write_global_declarations (void)
   unsigned ssdf_count = 0;
   int retries = 0;
   tree decl;
-  struct pointer_set_t *candidates;

   locus = input_location;
   at_eof = 1;
@@ -4282,8 +4255,8 @@  cp_write_global_declarations (void)
      linkage now.  */
   pop_lang_context ();

-  /* Collect candidates for Java hidden aliases.  */
-  candidates = collect_candidates_for_java_method_aliases ();
+  /* Generate hidden aliases for Java.  */
+  build_java_method_aliases ();

   timevar_stop (TV_PHASE_DEFERRED);
   timevar_start (TV_PHASE_OPT_GEN);
@@ -4306,13 +4279,6 @@  cp_write_global_declarations (void)

   perform_deferred_noexcept_checks ();

-  /* Generate hidden aliases for Java.  */
-  if (candidates)
-    {
-      build_java_method_aliases (candidates);
-      pointer_set_destroy (candidates);
-    }
-
   finish_repo ();

   /* The entire file is now complete.  If requested, dump everything