From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15208 invoked by alias); 25 Feb 2004 16:33:44 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 15195 invoked from network); 25 Feb 2004 16:33:42 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 25 Feb 2004 16:33:42 -0000 Received: from int-mx2.corp.redhat.com (nat-pool-rdu-dmz.redhat.com [172.16.52.200] (may be forged)) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id i1PGXgb02207 for ; Wed, 25 Feb 2004 11:33:42 -0500 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx2.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i1PGXfM06303 for ; Wed, 25 Feb 2004 11:33:41 -0500 Received: from cygbert.vinschen.de (vpn50-37.rdu.redhat.com [172.16.50.37]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id i1PGXdX00558 for ; Wed, 25 Feb 2004 08:33:40 -0800 Received: by cygbert.vinschen.de (Postfix, from userid 500) id 84C37580C7; Wed, 25 Feb 2004 17:33:36 +0100 (CET) Date: Wed, 25 Feb 2004 16:33:00 -0000 From: Corinna Vinschen To: gdb-patches@sources.redhat.com Subject: [RFA] sh-tdep.c: New patch solving gdb1291.exp (was Re: [RFA] Fix PR tdep/1291, SH prologue scanning bug) Message-ID: <20040225163336.GY1587@cygbert.vinschen.de> Reply-To: gdb-patches@sources.redhat.com Mail-Followup-To: gdb-patches@sources.redhat.com References: <200402192344.38974.fnf@ninemoons.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200402192344.38974.fnf@ninemoons.com> User-Agent: Mutt/1.4.2i X-SW-Source: 2004-02/txt/msg00728.txt.bz2 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 > > 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); } } } -- Corinna Vinschen Cygwin Developer Red Hat, Inc.