This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix output_set_got vs. barrier_args_size (PR middle-end/45484, take 2)
On Fri, Sep 03, 2010 at 11:46:14AM +0200, Jakub Jelinek wrote:
> On Thu, Sep 02, 2010 at 05:11:27PM -0700, Richard Henderson wrote:
> > On 09/02/2010 02:40 PM, Jakub Jelinek wrote:
> > > rtx insn;
> > > start_sequence ();
> > > - insn = emit_barrier ();
> > > + insn = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, pc_rtx));
> > > end_sequence ();
> > > dwarf2out_frame_debug (insn, false);
> >
> > Ug. Wouldn't it be better simply to expose a dwarf2out routine
> > that flushes the queue, without dancing around fake insns?
>
> Like this? Bootstrapped/regtested on x86_64-linux and i686-linux.
Jakub,
I can confirm that at r163660 on x86_64-apple-darwin10, which exhibits a high frequency of
failure for compiling sprintf-chk.c due to PR45484, the proposed alternative patch eliminates
these failures as well.
Jack
>
> 2010-09-02 Jakub Jelinek <jakub@redhat.com>
>
> PR middle-end/45484
> * dwarf2out.c (flush_queued_reg_saves): Rename to...
> (dwarf2out_flush_queued_reg_saves): ... this. No longer static.
> (dwarf2out_frame_debug_expr, dwarf2out_frame_debug): Adjust callers.
> * dwarf2out.h (dwarf2out_flush_queued_reg_saves): New prototype.
> * config/i386/i386.c (output_set_got): Call it.
>
> --- gcc/dwarf2out.c.jj 2010-09-02 20:48:05.000000000 +0200
> +++ gcc/dwarf2out.c 2010-09-03 09:02:53.060646349 +0200
> @@ -471,7 +471,6 @@ static void output_cfi (dw_cfi_ref, dw_f
> static void output_cfi_directive (dw_cfi_ref);
> static void output_call_frame_info (int);
> static void dwarf2out_note_section_used (void);
> -static void flush_queued_reg_saves (void);
> static bool clobbers_queued_reg_save (const_rtx);
> static void dwarf2out_frame_debug_expr (rtx, const char *);
>
> @@ -1712,8 +1711,8 @@ queue_reg_save (const char *label, rtx r
>
> /* Output all the entries in QUEUED_REG_SAVES. */
>
> -static void
> -flush_queued_reg_saves (void)
> +void
> +dwarf2out_flush_queued_reg_saves (void)
> {
> struct queued_reg_save *q;
>
> @@ -2458,7 +2457,7 @@ dwarf2out_frame_debug_expr (rtx expr, co
> {
> /* We interpret reg_save differently with stack_realign set.
> Thus we must flush whatever we have queued first. */
> - flush_queued_reg_saves ();
> + dwarf2out_flush_queued_reg_saves ();
>
> gcc_assert (cfa_store.reg == REGNO (XEXP (src, 0)));
> fde->stack_realign = 1;
> @@ -2705,7 +2704,7 @@ dwarf2out_frame_debug (rtx insn, bool af
> size_t i;
>
> /* Flush any queued register saves. */
> - flush_queued_reg_saves ();
> + dwarf2out_flush_queued_reg_saves ();
>
> /* Set up state for generating call frame debug info. */
> lookup_cfa (&cfa);
> @@ -2733,7 +2732,7 @@ dwarf2out_frame_debug (rtx insn, bool af
> }
>
> if (!NONJUMP_INSN_P (insn) || clobbers_queued_reg_save (insn))
> - flush_queued_reg_saves ();
> + dwarf2out_flush_queued_reg_saves ();
>
> if (!RTX_FRAME_RELATED_P (insn))
> {
> @@ -2841,7 +2840,7 @@ dwarf2out_frame_debug (rtx insn, bool af
> We could probably check just once, here, but this is safer than
> removing the check above. */
> if (clobbers_queued_reg_save (insn))
> - flush_queued_reg_saves ();
> + dwarf2out_flush_queued_reg_saves ();
> }
>
> /* Determine if we need to save and restore CFI information around this
> --- gcc/dwarf2out.h.jj 2010-06-28 13:43:38.000000000 +0200
> +++ gcc/dwarf2out.h 2010-09-03 09:03:37.906440532 +0200
> @@ -22,6 +22,7 @@ extern void dwarf2out_decl (tree);
> extern void dwarf2out_frame_debug (rtx, bool);
> extern void dwarf2out_cfi_begin_epilogue (rtx);
> extern void dwarf2out_frame_debug_restore_state (void);
> +extern void dwarf2out_flush_queued_reg_saves (void);
>
> extern void debug_dwarf (void);
> struct die_struct;
> --- gcc/config/i386/i386.c.jj 2010-09-02 20:44:41.194458857 +0200
> +++ gcc/config/i386/i386.c 2010-09-03 09:04:22.728521383 +0200
> @@ -8119,13 +8119,7 @@ output_set_got (rtx dest, rtx label ATTR
> /* Ensure all queued register saves are flushed before the
> call. */
> if (dwarf2out_do_frame ())
> - {
> - rtx insn;
> - start_sequence ();
> - insn = emit_barrier ();
> - end_sequence ();
> - dwarf2out_frame_debug (insn, false);
> - }
> + dwarf2out_flush_queued_reg_saves ();
> #endif
> xops[2] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
> xops[2] = gen_rtx_MEM (QImode, xops[2]);
>
>
> Jakub