On Tue, Apr 10, 2012 at 2:45 AM, John David Anglin
<d...@hiauly1.hia.nrc.ca> wrote:
> The current 4.5, 4.6 and 4.7 branches are now seriously broken for all
> PA target due to the fix applied for PR middle-end/52640, an optimization
> fix.  This is because the PA backend defers output of function descriptors
> and externals (hpux) using TARGET_ASM_FILE_END.  As a result, 
> assemble_external
> can be called after after varasm.c processes it's list of pending externals
> and the vector used for this list deleted.
>
> The attached change fixes this problem.  The change has been tested
> on hppa-unknown-linux-gnu and hppa2.0w-hp-hpux11.11 with no observed
> regressions.  I believe it to be the simplest way to fix these release
> branches although it may not be optimal (externals are doublely delayed
> on PA hpux).
>
> Ok for the 4.5, 4.6 and 4.7 branches?  The fix for PR middle-end/52640
> was not applied to the trunk.

I can't immediately see how your description of "the list of pending externals
and the vector" is deleted.  pa.c keeps its own vector which references the
decls and the only issue I see is that if you call assemble_external after
processing externals you ICE because the pointer-set is not initialized?

Why does the pa backend end up calling assemble_external at final time?

Richard.

> Dave
> --
> J. David Anglin                                  dave.ang...@nrc-cnrc.gc.ca
> National Research Council of Canada              (613) 990-0752 (FAX: 
> 952-6602)
>
> 2012-04-09  John David Anglin  <dave.ang...@nrc-cnrc.gc.ca>
>
>        PR middle-end/52894
>        * varasm.c (process_pending_assemble_externals): Set
>        pending_assemble_externals_processed true.
>        (assemble_external): Call assemble_external_real if the pending
>        assemble externals have been processed.
>
> Index: varasm.c
> ===================================================================
> --- varasm.c    (revision 186213)
> +++ varasm.c    (working copy)
> @@ -2108,6 +2108,11 @@
>    the entire pending_assemble_externals list.  See assemble_external().  */
>  static struct pointer_set_t *pending_assemble_externals_set;
>
> +/* Some targets delay some output to final using TARGET_ASM_FILE_END.
> +   As a result, assemble_external can be called after the list of externals
> +   is processed and the pointer set destroyed.  */
> +static bool pending_assemble_externals_processed;
> +
>  #ifdef ASM_OUTPUT_EXTERNAL
>  /* True if DECL is a function decl for which no out-of-line copy exists.
>    It is assumed that DECL's assembler name has been set.  */
> @@ -2160,6 +2165,7 @@
>     assemble_external_real (TREE_VALUE (list));
>
>   pending_assemble_externals = 0;
> +  pending_assemble_externals_processed = true;
>   pointer_set_destroy (pending_assemble_externals_set);
>  #endif
>  }
> @@ -2201,6 +2207,12 @@
>     weak_decls = tree_cons (NULL, decl, weak_decls);
>
>  #ifdef ASM_OUTPUT_EXTERNAL
> +  if (pending_assemble_externals_processed)
> +    {
> +      assemble_external_real (decl);
> +      return;
> +    }
> +
>   if (! pointer_set_insert (pending_assemble_externals_set, decl))
>     pending_assemble_externals = tree_cons (NULL, decl,
>                                            pending_assemble_externals);

Reply via email to