From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32576 invoked by alias); 9 Aug 2002 00:37:17 -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 32568 invoked from network); 9 Aug 2002 00:37:16 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 9 Aug 2002 00:37:16 -0000 Received: from int-mx2.corp.redhat.com (nat-pool-rdu.redhat.com [172.16.52.200] (may be forged)) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id g790O3l25084 for ; Thu, 8 Aug 2002 20:24:03 -0400 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 g790bDu00835 for ; Thu, 8 Aug 2002 20:37:13 -0400 Received: from romulus.sfbay.redhat.com (remus.sfbay.redhat.com [172.16.27.252]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id g790bCe13212 for ; Thu, 8 Aug 2002 17:37:12 -0700 Received: (from kev@localhost) by romulus.sfbay.redhat.com (8.11.6/8.11.6) id g790bA226328 for gdb-patches@sources.redhat.com; Thu, 8 Aug 2002 17:37:10 -0700 Date: Thu, 08 Aug 2002 17:37:00 -0000 From: Kevin Buettner Message-Id: <1020809003710.ZM26327@localhost.localdomain> To: gdb-patches@sources.redhat.com Subject: [RFA] Rewrite mips_get_saved_register() MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-08/txt/msg00198.txt.bz2 This patch depends on the following (as of yet) unapproved patches: http://sources.redhat.com/ml/gdb-patches/2002-08/msg00189.html http://sources.redhat.com/ml/gdb-patches/2002-08/msg00195.html http://sources.redhat.com/ml/gdb-patches/2002-08/msg00196.html Okay to commit? * mips-tdep.c (mips_get_saved_register): Rewrite to use frame_register_unwind() instead of find_saved_register(). Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.93 diff -u -p -r1.93 mips-tdep.c --- mips-tdep.c 8 Aug 2002 23:32:52 -0000 1.93 +++ mips-tdep.c 9 Aug 2002 00:26:00 -0000 @@ -4241,53 +4246,48 @@ mips_get_saved_register (char *raw_buffe int regnum, enum lval_type *lval) { - CORE_ADDR addr; + int realnum; + int scratch_optimized; + enum lval_type scratch_lval; + CORE_ADDR scratch_addr; if (!target_has_registers) error ("No registers."); - /* Normal systems don't optimize out things with register numbers. */ - if (optimized != NULL) - *optimized = 0; - addr = find_saved_register (frame, regnum); - if (addr != 0) - { - if (lval != NULL) - *lval = lval_memory; - if (regnum == SP_REGNUM) - { - if (raw_buffer != NULL) - { - /* Put it back in target format. */ - store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), - (LONGEST) addr); - } - if (addrp != NULL) - *addrp = 0; - return; - } - if (raw_buffer != NULL) - { - LONGEST val; - if (regnum < 32) - /* Only MIPS_SAVED_REGSIZE bytes of GP registers are - saved. */ - val = read_memory_integer (addr, MIPS_SAVED_REGSIZE); - else - val = read_memory_integer (addr, REGISTER_RAW_SIZE (regnum)); - store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), val); - } - } - else - { - if (lval != NULL) - *lval = lval_register; - addr = REGISTER_BYTE (regnum); - if (raw_buffer != NULL) - read_register_gen (regnum, raw_buffer); + /* frame_register_unwind() requires ``optimized'', ``lval'', ``addrp'', + and ``realnum'' to be non-NULL. So use the scratch variables, if + necessary. (Note that realnum isn't a problem since we pass the + address of local storage directly.) */ + if (optimized == NULL) + optimized = &scratch_optimized; + if (addrp == NULL) + addrp = &scratch_addr; + if (lval == NULL) + lval = &scratch_lval; + + /* Fetch register REGNUM from an inner (callee) frame. */ + frame_register_unwind (get_next_frame (frame), regnum, optimized, + lval, addrp, &realnum, raw_buffer); + + /* Only MIPS_SAVED_REGSIZE bytes of GP registers are saved on the + stack. If this differs from the raw size, then frame_register_unwind() + fetched too much. Adjust value fetched and save back into the buffer. + (The excess is thus discarded.) + + The SP register is handled specially. Its value will have been + set correctly by frame_register_unwind(), so don't attempt to adjust + it. */ + if (*addrp != 0 /* Register must be saved on stack, */ + && regnum < 32 /* must be a GP register, */ + && regnum != SP_REGNUM /* but not SP. */ + && MIPS_SAVED_REGSIZE < REGISTER_RAW_SIZE (regnum)) + { + LONGEST val; + + val = extract_signed_integer (raw_buffer, MIPS_SAVED_REGSIZE); + store_signed_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), + val); } - if (addrp != NULL) - *addrp = addr; } /* Immediately after a function call, return the saved pc.