This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PING][PATCH] Fix for prologue processing on PowerPC
- From: Nikola Prica <nikola dot prica at rt-rk dot com>
- To: Kevin Buettner <kevinb at redhat dot com>
- Cc: gdb-patches at sourceware dot org, "Ananthakrishna Sowda (asowda)" <asowda at cisco dot com>, "Ivan Baev (ibaev)" <ibaev at cisco dot com>, 'Nemanja Popov' <nemanja dot popov at rt-rk dot com>, Djordje Todorovic <Djordje dot Todorovic at rt-rk dot com>
- Date: Thu, 9 Nov 2017 19:15:06 +0100
- Subject: Re: [PING][PATCH] Fix for prologue processing on PowerPC
- Authentication-results: sourceware.org; auth=none
- References: <f90d189e-7ec5-34f9-c776-8af42a3c07a6@rt-rk.com> <e3274bee-eb2d-3706-3af0-59f28c9c0899@rt-rk.com> <20171108095850.394a48ca@pinnacle.lan>
Hi Kevin,
lr_reg could be also set to -2 in part of code which is reachable after
shifting removal.
/* Invalidate lr_reg, but don't set it to -1.
That would mean that it had never been set. */
lr_reg = -2;
This part of the code which depends of non shifted lr_reg, and the part
where shifting is removed are only two places where lr_reg is changed.
As so, I've added last condition to set fdata->lr_register on -1 if
lim_pc is not reached.
If it seems fine now could you pleas commit it because I don't have
rights to do it.
Thanks,
Nikola Prica
From: Prica <nprica@rt-rk.com>
Date: Thu, 9 Nov 2017 13:10:48 +0100
Subject: Fix for prologue processing on PowerPC
One of conditions in skip_prologue() is never visited because it
expects non shifted `lr_reg`. That condition is supposed to set PC
offset. When body of this condition is visited PC offset is set and
there will be no need to look for it in next frames nor to use frame
unwind directives.
gdb/ChangeLog:
*rs6000-tdep.c (skip_prologue): Remove shifting for lr_reg
and assign shifted lr_reg to fdata->lr_register when lr_reg is
set. If iteration do not hit lim_pc lr_register is set as -1.
---
gdb/rs6000-tdep.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index 6c44995..6f05ef5 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -1655,9 +1655,12 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR
pc, CORE_ADDR lim_pc,
remember just the first one, but skip over additional
ones. */
if (lr_reg == -1)
- lr_reg = (op & 0x03e00000) >> 21;
- if (lr_reg == 0)
- r0_contains_arg = 0;
+ {
+ lr_reg = (op & 0x03e00000);
+ fdata->lr_register = lr_reg >> 21;
+ if (lr_reg == 0)
+ r0_contains_arg = 0;
+ }
continue;
}
else if ((op & 0xfc1fffff) == 0x7c000026)
@@ -2180,8 +2183,8 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR
pc, CORE_ADDR lim_pc,
}
#endif /* 0 */
- if (pc == lim_pc && lr_reg >= 0)
- fdata->lr_register = lr_reg;
+ if (pc != lim_pc)
+ fdata->lr_register = -1;
fdata->offset = -fdata->offset;
return last_prologue_pc;
--
2.7.4