Commit aae75261 by James Van Artsdalen

*** empty log message ***

From-SVN: r609
parent 79aa5346
...@@ -614,6 +614,8 @@ function_prologue (file, size) ...@@ -614,6 +614,8 @@ function_prologue (file, size)
register int regno; register int regno;
int limit; int limit;
rtx xops[4]; rtx xops[4];
int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
|| current_function_uses_const_pool);
xops[0] = stack_pointer_rtx; xops[0] = stack_pointer_rtx;
xops[1] = frame_pointer_rtx; xops[1] = frame_pointer_rtx;
...@@ -639,14 +641,13 @@ function_prologue (file, size) ...@@ -639,14 +641,13 @@ function_prologue (file, size)
limit = (frame_pointer_needed ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM); limit = (frame_pointer_needed ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM);
for (regno = limit - 1; regno >= 0; regno--) for (regno = limit - 1; regno >= 0; regno--)
if ((regs_ever_live[regno] && ! call_used_regs[regno]) if ((regs_ever_live[regno] && ! call_used_regs[regno])
|| (current_function_uses_pic_offset_table || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
&& regno == PIC_OFFSET_TABLE_REGNUM))
{ {
xops[0] = gen_rtx (REG, SImode, regno); xops[0] = gen_rtx (REG, SImode, regno);
output_asm_insn ("push%L0 %0", xops); output_asm_insn ("push%L0 %0", xops);
} }
if (current_function_uses_pic_offset_table) if (pic_reg_used)
{ {
xops[0] = pic_offset_table_rtx; xops[0] = pic_offset_table_rtx;
xops[1] = (rtx) gen_label_rtx (); xops[1] = (rtx) gen_label_rtx ();
...@@ -675,6 +676,8 @@ simple_386_epilogue () ...@@ -675,6 +676,8 @@ simple_386_epilogue ()
int nregs = 0; int nregs = 0;
int reglimit = (frame_pointer_needed int reglimit = (frame_pointer_needed
? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM); ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM);
int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
|| current_function_uses_const_pool);
#ifdef NON_SAVING_SETJMP #ifdef NON_SAVING_SETJMP
if (NON_SAVING_SETJMP && current_function_calls_setjmp) if (NON_SAVING_SETJMP && current_function_calls_setjmp)
...@@ -686,8 +689,7 @@ simple_386_epilogue () ...@@ -686,8 +689,7 @@ simple_386_epilogue ()
for (regno = reglimit - 1; regno >= 0; regno--) for (regno = reglimit - 1; regno >= 0; regno--)
if ((regs_ever_live[regno] && ! call_used_regs[regno]) if ((regs_ever_live[regno] && ! call_used_regs[regno])
|| (current_function_uses_pic_offset_table || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
&& regno == PIC_OFFSET_TABLE_REGNUM))
nregs++; nregs++;
return nregs == 0 || ! frame_pointer_needed; return nregs == 0 || ! frame_pointer_needed;
...@@ -706,6 +708,8 @@ function_epilogue (file, size) ...@@ -706,6 +708,8 @@ function_epilogue (file, size)
register int nregs, limit; register int nregs, limit;
int offset; int offset;
rtx xops[3]; rtx xops[3];
int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
|| current_function_uses_const_pool);
/* Compute the number of registers to pop */ /* Compute the number of registers to pop */
...@@ -717,8 +721,7 @@ function_epilogue (file, size) ...@@ -717,8 +721,7 @@ function_epilogue (file, size)
for (regno = limit - 1; regno >= 0; regno--) for (regno = limit - 1; regno >= 0; regno--)
if ((regs_ever_live[regno] && ! call_used_regs[regno]) if ((regs_ever_live[regno] && ! call_used_regs[regno])
|| (current_function_uses_pic_offset_table || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
&& regno == PIC_OFFSET_TABLE_REGNUM))
nregs++; nregs++;
/* sp is often unreliable so we must go off the frame pointer, /* sp is often unreliable so we must go off the frame pointer,
...@@ -744,8 +747,7 @@ function_epilogue (file, size) ...@@ -744,8 +747,7 @@ function_epilogue (file, size)
for (regno = 0; regno < limit; regno++) for (regno = 0; regno < limit; regno++)
if ((regs_ever_live[regno] && ! call_used_regs[regno]) if ((regs_ever_live[regno] && ! call_used_regs[regno])
|| (current_function_uses_pic_offset_table || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
&& regno == PIC_OFFSET_TABLE_REGNUM))
{ {
xops[0] = gen_rtx (REG, SImode, regno); xops[0] = gen_rtx (REG, SImode, regno);
output_asm_insn ("pop%L0 %0", xops); output_asm_insn ("pop%L0 %0", xops);
...@@ -754,8 +756,7 @@ function_epilogue (file, size) ...@@ -754,8 +756,7 @@ function_epilogue (file, size)
else else
for (regno = 0; regno < limit; regno++) for (regno = 0; regno < limit; regno++)
if ((regs_ever_live[regno] && ! call_used_regs[regno]) if ((regs_ever_live[regno] && ! call_used_regs[regno])
|| (current_function_uses_pic_offset_table || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
&& regno == PIC_OFFSET_TABLE_REGNUM))
{ {
xops[0] = gen_rtx (REG, SImode, regno); xops[0] = gen_rtx (REG, SImode, regno);
xops[1] = adj_offsettable_operand (AT_BP (Pmode), offset); xops[1] = adj_offsettable_operand (AT_BP (Pmode), offset);
......
...@@ -138,6 +138,9 @@ extern int flag_pic; ...@@ -138,6 +138,9 @@ extern int flag_pic;
/* This is nonzero if the current function uses pic_offset_table_rtx. */ /* This is nonzero if the current function uses pic_offset_table_rtx. */
extern int current_function_uses_pic_offset_table; extern int current_function_uses_pic_offset_table;
/* This is nonzero if the current function uses the constant pool. */
extern int current_function_uses_const_pool;
/* The line number of the beginning of the current function. /* The line number of the beginning of the current function.
sdbout.c needs this so that it can output relative linenumbers. */ sdbout.c needs this so that it can output relative linenumbers. */
......
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