summaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-01 11:11:46 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-01 11:11:46 +0000
commit9a0ee3cc840e36faea31147d10311726fb1f1100 (patch)
tree6579da1567c8fbce75c5f0740cfa440d6aa784ba /gcc/dwarf2out.c
parent4a4538f788d28e78ed146d939f3a15cdbe5ac971 (diff)
downloadgcc-9a0ee3cc840e36faea31147d10311726fb1f1100.tar.gz
PR debug/44694
* dwarf2out.c (reg_loc_descriptor): For eliminated arg_pointer_rtx or frame_pointer_rtx use DW_OP_fbreg offset DW_OP_stack_value. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@161662 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r--gcc/dwarf2out.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 3faa1754859..6decc6f050e 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -12999,6 +12999,26 @@ reg_loc_descriptor (rtx rtl, enum var_init_status initialized)
if (REGNO (rtl) >= FIRST_PSEUDO_REGISTER)
return 0;
+ /* We only use "frame base" when we're sure we're talking about the
+ post-prologue local stack frame. We do this by *not* running
+ register elimination until this point, and recognizing the special
+ argument pointer and soft frame pointer rtx's.
+ Use DW_OP_fbreg offset DW_OP_stack_value in this case. */
+ if ((rtl == arg_pointer_rtx || rtl == frame_pointer_rtx)
+ && eliminate_regs (rtl, VOIDmode, NULL_RTX) != rtl)
+ {
+ dw_loc_descr_ref result = NULL;
+
+ if (dwarf_version >= 4 || !dwarf_strict)
+ {
+ result = mem_loc_descriptor (rtl, VOIDmode, initialized);
+ if (result)
+ add_loc_descr (&result,
+ new_loc_descr (DW_OP_stack_value, 0, 0));
+ }
+ return result;
+ }
+
regs = targetm.dwarf_register_span (rtl);
if (hard_regno_nregs[REGNO (rtl)][GET_MODE (rtl)] > 1 || regs)