Commit 999646c1 by Richard Henderson Committed by Richard Henderson

dwarf2cfi: Convert queued_reg_save to a VEC.

Also, allocate it in the heap instead of garbage collected.

        * dwarf2cfi.c (queued_reg_save): Reorder for packing.  Don't GTY.
        (queued_reg_saves): Don't GTY.  Change to a VEC.
        (queue_reg_save): Update to match.
        (dwarf2out_flush_queued_reg_saves): Likewise.
        (clobbers_queued_reg_save): Likewise.
        (reg_saved_in): Likewise.
        (execute_dwarf2_frame): Free queued_reg_saves.

From-SVN: r176702
parent ce363ef2
2011-07-23 Richard Henderson <rth@redhat.com> 2011-07-23 Richard Henderson <rth@redhat.com>
* dwarf2cfi.c (queued_reg_save): Reorder for packing. Don't GTY.
(queued_reg_saves): Don't GTY. Change to a VEC.
(queue_reg_save): Update to match.
(dwarf2out_flush_queued_reg_saves): Likewise.
(clobbers_queued_reg_save): Likewise.
(reg_saved_in): Likewise.
(execute_dwarf2_frame): Free queued_reg_saves.
2011-07-23 Richard Henderson <rth@redhat.com>
* dwarf2cfi.c (dw_cfi_row_ref): Remove. Update all users. * dwarf2cfi.c (dw_cfi_row_ref): Remove. Update all users.
2011-07-23 Richard Henderson <rth@redhat.com> 2011-07-23 Richard Henderson <rth@redhat.com>
......
...@@ -1091,14 +1091,16 @@ dwarf2out_notice_stack_adjust (rtx insn, bool after_p) ...@@ -1091,14 +1091,16 @@ dwarf2out_notice_stack_adjust (rtx insn, bool after_p)
of the prologue or (b) the register is clobbered. This clusters of the prologue or (b) the register is clobbered. This clusters
register saves so that there are fewer pc advances. */ register saves so that there are fewer pc advances. */
struct GTY(()) queued_reg_save { typedef struct {
struct queued_reg_save *next;
rtx reg; rtx reg;
HOST_WIDE_INT cfa_offset;
rtx saved_reg; rtx saved_reg;
}; HOST_WIDE_INT cfa_offset;
} queued_reg_save;
static GTY(()) struct queued_reg_save *queued_reg_saves; DEF_VEC_O (queued_reg_save);
DEF_VEC_ALLOC_O (queued_reg_save, heap);
static VEC(queued_reg_save, heap) *queued_reg_saves;
/* The caller's ORIG_REG is saved in SAVED_IN_REG. */ /* The caller's ORIG_REG is saved in SAVED_IN_REG. */
typedef struct GTY(()) reg_saved_in_data { typedef struct GTY(()) reg_saved_in_data {
...@@ -1170,24 +1172,21 @@ record_reg_saved_in_reg (rtx dest, rtx src) ...@@ -1170,24 +1172,21 @@ record_reg_saved_in_reg (rtx dest, rtx src)
static void static void
queue_reg_save (rtx reg, rtx sreg, HOST_WIDE_INT offset) queue_reg_save (rtx reg, rtx sreg, HOST_WIDE_INT offset)
{ {
struct queued_reg_save *q; queued_reg_save *q;
size_t i;
/* Duplicates waste space, but it's also necessary to remove them /* Duplicates waste space, but it's also necessary to remove them
for correctness, since the queue gets output in reverse order. */ for correctness, since the queue gets output in reverse order. */
for (q = queued_reg_saves; q != NULL; q = q->next) FOR_EACH_VEC_ELT (queued_reg_save, queued_reg_saves, i, q)
if (compare_reg_or_pc (q->reg, reg)) if (compare_reg_or_pc (q->reg, reg))
break; goto found;
if (q == NULL) q = VEC_safe_push (queued_reg_save, heap, queued_reg_saves, NULL);
{
q = ggc_alloc_queued_reg_save ();
q->next = queued_reg_saves;
queued_reg_saves = q;
}
found:
q->reg = reg; q->reg = reg;
q->cfa_offset = offset;
q->saved_reg = sreg; q->saved_reg = sreg;
q->cfa_offset = offset;
} }
/* Output all the entries in QUEUED_REG_SAVES. */ /* Output all the entries in QUEUED_REG_SAVES. */
...@@ -1195,9 +1194,10 @@ queue_reg_save (rtx reg, rtx sreg, HOST_WIDE_INT offset) ...@@ -1195,9 +1194,10 @@ queue_reg_save (rtx reg, rtx sreg, HOST_WIDE_INT offset)
static void static void
dwarf2out_flush_queued_reg_saves (void) dwarf2out_flush_queued_reg_saves (void)
{ {
struct queued_reg_save *q; queued_reg_save *q;
size_t i;
for (q = queued_reg_saves; q; q = q->next) FOR_EACH_VEC_ELT (queued_reg_save, queued_reg_saves, i, q)
{ {
unsigned int reg, sreg; unsigned int reg, sreg;
...@@ -1214,7 +1214,7 @@ dwarf2out_flush_queued_reg_saves (void) ...@@ -1214,7 +1214,7 @@ dwarf2out_flush_queued_reg_saves (void)
reg_save (reg, sreg, q->cfa_offset); reg_save (reg, sreg, q->cfa_offset);
} }
queued_reg_saves = NULL; VEC_truncate (queued_reg_save, queued_reg_saves, 0);
} }
/* Does INSN clobber any register which QUEUED_REG_SAVES lists a saved /* Does INSN clobber any register which QUEUED_REG_SAVES lists a saved
...@@ -1225,17 +1225,18 @@ dwarf2out_flush_queued_reg_saves (void) ...@@ -1225,17 +1225,18 @@ dwarf2out_flush_queued_reg_saves (void)
static bool static bool
clobbers_queued_reg_save (const_rtx insn) clobbers_queued_reg_save (const_rtx insn)
{ {
struct queued_reg_save *q; queued_reg_save *q;
size_t iq;
for (q = queued_reg_saves; q; q = q->next) FOR_EACH_VEC_ELT (queued_reg_save, queued_reg_saves, iq, q)
{ {
size_t i; size_t ir;
reg_saved_in_data *rir; reg_saved_in_data *rir;
if (modified_in_p (q->reg, insn)) if (modified_in_p (q->reg, insn))
return true; return true;
FOR_EACH_VEC_ELT (reg_saved_in_data, regs_saved_in_regs, i, rir) FOR_EACH_VEC_ELT (reg_saved_in_data, regs_saved_in_regs, ir, rir)
if (compare_reg_or_pc (q->reg, rir->orig_reg) if (compare_reg_or_pc (q->reg, rir->orig_reg)
&& modified_in_p (rir->saved_in_reg, insn)) && modified_in_p (rir->saved_in_reg, insn))
return true; return true;
...@@ -1250,11 +1251,11 @@ static rtx ...@@ -1250,11 +1251,11 @@ static rtx
reg_saved_in (rtx reg) reg_saved_in (rtx reg)
{ {
unsigned int regn = REGNO (reg); unsigned int regn = REGNO (reg);
struct queued_reg_save *q; queued_reg_save *q;
reg_saved_in_data *rir; reg_saved_in_data *rir;
size_t i; size_t i;
for (q = queued_reg_saves; q; q = q->next) FOR_EACH_VEC_ELT (queued_reg_save, queued_reg_saves, i, q)
if (q->saved_reg && regn == REGNO (q->saved_reg)) if (q->saved_reg && regn == REGNO (q->saved_reg))
return q->reg; return q->reg;
...@@ -2770,7 +2771,7 @@ execute_dwarf2_frame (void) ...@@ -2770,7 +2771,7 @@ execute_dwarf2_frame (void)
XDELETEVEC (barrier_args_size); XDELETEVEC (barrier_args_size);
barrier_args_size = NULL; barrier_args_size = NULL;
regs_saved_in_regs = NULL; regs_saved_in_regs = NULL;
queued_reg_saves = NULL; VEC_free (queued_reg_save, heap, queued_reg_saves);
free_cfi_row (cur_row); free_cfi_row (cur_row);
cur_row = NULL; cur_row = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment