diff options
author | Jason Merrill <merrill@gnu.org> | 1996-11-02 00:58:36 +0000 |
---|---|---|
committer | Jason Merrill <merrill@gnu.org> | 1996-11-02 00:58:36 +0000 |
commit | 810429b72c7c30f77a6b72c3553d06ed62b24026 (patch) | |
tree | 7f05dd70f20d7f135190b03d785d97ed5f839219 /gcc/dwarf2out.c | |
parent | 0e1c7fc777c69ec6b11e213ef5ba7143523f6c26 (diff) | |
download | gcc-810429b72c7c30f77a6b72c3553d06ed62b24026.zip gcc-810429b72c7c30f77a6b72c3553d06ed62b24026.tar.gz gcc-810429b72c7c30f77a6b72c3553d06ed62b24026.tar.bz2 |
x
From-SVN: r13091
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index f0e2ae4..b122e0b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -5096,13 +5096,15 @@ based_loc_descr (reg, offset) long int offset; { register dw_loc_descr_ref loc_result; - register unsigned fp_reg = (frame_pointer_needed) - ? FRAME_POINTER_REGNUM - : STACK_POINTER_REGNUM; + /* For the "frame base", we use the frame pointer or stack pointer + registers, since the RTL for local variables is relative to one of + them. */ + register unsigned fp_reg = DBX_REGISTER_NUMBER (frame_pointer_needed + ? FRAME_POINTER_REGNUM + : STACK_POINTER_REGNUM); if (reg == fp_reg) { - loc_result = new_loc_descr (DW_OP_fbreg, - offset - current_funcdef_frame_size, 0); + loc_result = new_loc_descr (DW_OP_fbreg, offset, 0); } else if (reg >= 0 && reg <= 31) { @@ -6662,11 +6664,14 @@ gen_subprogram_die (decl, context_die) add_AT_fde_ref (subr_die, DW_AT_MIPS_fde, current_funcdef_fde); #endif - /* Define the frame pointer location for this routine. */ - fp_reg = (frame_pointer_needed) ? FRAME_POINTER_REGNUM - : STACK_POINTER_REGNUM; + /* Define the "frame base" location for this routine. We use the + frame pointer or stack pointer registers, since the RTL for local + variables is relative to one of them. */ + fp_reg = DBX_REGISTER_NUMBER (frame_pointer_needed + ? FRAME_POINTER_REGNUM + : STACK_POINTER_REGNUM); assert (fp_reg >= 0 && fp_reg <= 31); - fp_loc = new_loc_descr (DW_OP_breg0 + fp_reg, current_funcdef_frame_size); + fp_loc = new_loc_descr (DW_OP_reg0 + fp_reg); add_AT_loc (subr_die, DW_AT_frame_base, fp_loc); #ifdef DWARF_GNU_EXTENSIONS @@ -7890,7 +7895,8 @@ dwarfout_begin_function () /* On entry, the Call Frame Address is in the stack pointer register. */ cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_def_cfa; - cfi->dw_cfi_oprnd1.dw_cfi_reg_num = STACK_POINTER_REGNUM; + cfi->dw_cfi_oprnd1.dw_cfi_reg_num + = DBX_REGISTER_NUMBER (STACK_POINTER_REGNUM); cfi->dw_cfi_oprnd2.dw_cfi_offset = 0; add_cfi (&fde->dw_fde_cfi, cfi); @@ -7904,9 +7910,9 @@ dwarfout_begin_function () or an offset from the stack pointer. */ cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_def_cfa; - cfi->dw_cfi_oprnd1.dw_cfi_reg_num = (frame_pointer_needed) - ? FRAME_POINTER_REGNUM - : STACK_POINTER_REGNUM; + cfi->dw_cfi_oprnd1.dw_cfi_reg_num + = DBX_REGISTER_NUMBER (frame_pointer_needed ? FRAME_POINTER_REGNUM + : STACK_POINTER_REGNUM); offset = current_frame_info.total_size; cfi->dw_cfi_oprnd2.dw_cfi_offset = offset; add_cfi (&fde->dw_fde_cfi, cfi); @@ -7921,8 +7927,10 @@ dwarfout_begin_function () /* Restore the stack register from the frame pointer. */ cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_register; - cfi->dw_cfi_oprnd1.dw_cfi_reg_num = STACK_POINTER_REGNUM; - cfi->dw_cfi_oprnd2.dw_cfi_reg_num = FRAME_POINTER_REGNUM; + cfi->dw_cfi_oprnd1.dw_cfi_reg_num + = DBX_REGISTER_NUMBER (STACK_POINTER_REGNUM); + cfi->dw_cfi_oprnd2.dw_cfi_reg_num + = DBX_REGISTER_NUMBER (FRAME_POINTER_REGNUM); add_cfi (&fde->dw_fde_cfi, cfi); } @@ -7947,7 +7955,8 @@ dwarfout_begin_function () assert (offset >= 0); cfi = new_cfi (); cfi->dw_cfi_opc = DW_CFA_offset; - cfi->dw_cfi_oprnd1.dw_cfi_reg_num = FRAME_POINTER_REGNUM; + cfi->dw_cfi_oprnd1.dw_cfi_reg_num + = DBX_REGISTER_NUMBER (FRAME_POINTER_REGNUM); cfi->dw_cfi_oprnd2.dw_cfi_offset = offset; add_cfi (&fde->dw_fde_cfi, cfi); } |