From 93a406efd79552eba7fc55ed3b7f293cdcf324ef Mon Sep 17 00:00:00 2001 From: Prica Date: Tue, 19 Sep 2017 17:52:35 +0200 Subject: [PATCH] PowerPC, fix for prologue processing 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. --- gdb/rs6000-tdep.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 95b2ca7..7f64901 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -1652,11 +1652,14 @@ 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; - continue; + if (lr_reg == -1) + { + lr_reg = (op & 0x03e00000); + fdata->lr_register = lr_reg >> 21; + } + if (lr_reg == 0) + r0_contains_arg = 0; + continue; } else if ((op & 0xfc1fffff) == 0x7c000026) { /* mfcr Rx */ @@ -2178,9 +2181,6 @@ 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; - fdata->offset = -fdata->offset; return last_prologue_pc; } -- 2.7.4