[RFA] sh-tdep.c: New patch solving gdb1291.exp (was Re: [RFA] Fix PR tdep/1291, SH prologue scanning bug)

Corinna Vinschen
2004-02-25T16:33:44Z

On Feb 19 23:44, Fred Fish wrote:
> This patch fixes the bug reported in PR 1291. It is based on the suggested
> patch included in the PR. I believe it is small enough to not need a
> copyright assignment, but recent events may have changed that. :-(
>
> -Fred
>
> 2004-02-19 Fred Fish <fnf@redhat.com>
>
> Fix for PR tdep/1291 as suggested by inaba@src.ricoh.co.jp
> * sh-tdep.c (IS_MOV_R3): Rename to IS_MOV_IMM_R3 and fix pattern.
> (IS_ADD_R3SP): Rename to IS_ADD_R3_SP for consistency.
> (IS_MOVW_R1): New macro.
> (IS_MOVL_R1): New macro.
> (IS_SUB_R1_SP): New macro.
> (sh_analyze_prologue): Add r1_val local var and initialize to zero.
> Use IS_MOVW_R1, IS_MOVL_R1, and IS_SUB_R1_SP to recognize use of
> stack allocation via constant loaded into r1.

I've looked into this one and found that there's a very simple patch
to solve that issue. Basically the evaluation of the memory address
to access in PC relative addressing was misbehaving. The below patch
evaluates the PC relative memory location now exactly according to the
descriptions of the PC relative addressing modes with 8 bit displacement
in the official SH documentation:

FOO.w @(disp:8,PC):

displacement = (instruction & 0xff) << 1;
address = (PC + 4) + displacement;

FOO.l @(disp:8,PC):

displacement = (instruction & 0xff) << 2;
address = ((PC & 0xfffffffc) + 4) + displacement;

I checked the entire testsuite against sh2, sh2e, sh3, sh4 and sh4-nofpu.
In all cases, the FAIL count has been reduced by exactly one, the FAIL
from gdb1291.exp.

Is that ok to checkin?

Corinna

* sh-tdep.c (sh_analyze_prologue): Align PC relative addressing
to official documentation.

Index: sh-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sh-tdep.c,v
retrieving revision 1.165
diff -u -p -r1.165 sh-tdep.c
--- sh-tdep.c 20 Feb 2004 00:16:16 -0000 1.165
+++ sh-tdep.c 25 Feb 2004 15:47:32 -0000
@@ -440,9 +440,9 @@ sh_analyze_prologue (CORE_ADDR pc, CORE_
if (reg < 14)
{
sav_reg = reg;
- offset = (((inst & 0xff) ^ 0x80) - 0x80) << 1;
+ offset = (inst & 0xff) << 1;
sav_offset =
- read_memory_integer (((pc + 4) & ~3) + offset, 2);
+ read_memory_integer ((pc + 4) + offset, 2);
}
}
}
@@ -450,13 +450,13 @@ sh_analyze_prologue (CORE_ADDR pc, CORE_
{
if (sav_reg < 0)
{
- reg = (inst & 0x0f00) >> 8;
+ reg = GET_TARGET_REG (inst);
if (reg < 14)
{
sav_reg = reg;
- offset = (((inst & 0xff) ^ 0x80) - 0x80) << 1;
+ offset = (inst & 0xff) << 2;
sav_offset =
- read_memory_integer (((pc + 4) & ~3) + offset, 4);
+ read_memory_integer (((pc & 0xfffffffc) + 4) + offset, 4);
}
}
}