From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16407 invoked by alias); 20 Feb 2003 16:18:19 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 16400 invoked from network); 20 Feb 2003 16:18:19 -0000 Received: from unknown (HELO mx1.redhat.com) (172.16.49.200) by 172.16.49.205 with SMTP; 20 Feb 2003 16:18:19 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h1KGIJN06387 for ; Thu, 20 Feb 2003 11:18:19 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h1KGIHf25829; Thu, 20 Feb 2003 11:18:17 -0500 Received: from localhost.localdomain (vpn50-1.rdu.redhat.com [172.16.50.1]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h1KGIGt25706; Thu, 20 Feb 2003 11:18:16 -0500 Received: (from kev@localhost) by localhost.localdomain (8.11.6/8.11.6) id h1KGIBH07860; Thu, 20 Feb 2003 09:18:11 -0700 Date: Thu, 20 Feb 2003 16:18:00 -0000 From: Kevin Buettner Message-Id: <1030220161810.ZM7859@localhost.localdomain> In-Reply-To: Andrew Cagney "Re: frame_register_unwind(): "frame != NULL" assertion failure" (Feb 18, 5:55pm) References: <1030213212349.ZM2427@localhost.localdomain> <20030213212904.GA14115@nevyn.them.org> <1030213213526.ZM2489@localhost.localdomain> <1030213214819.ZM2541@localhost.localdomain> <1030213232706.ZM8198@localhost.localdomain> <3E4D042F.3060102@redhat.com> <20030214151451.GC30416@nevyn.them.org> <3E5101BA.5000504@redhat.com> <1030218015926.ZM1309@localhost.localdomain> <3E52B9F2.8050405@redhat.com> To: Andrew Cagney Subject: Re: frame_register_unwind(): "frame != NULL" assertion failure Cc: gdb@sources.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-02/txt/msg00415.txt.bz2 On Feb 18, 5:55pm, Andrew Cagney wrote: > Change this call: > > frame_register_unwind (get_next_frame (frame), regnum, optimizedp, lvalp, > addrp, &realnum, raw_buffer); > > to instead call: > > static void > generic_unwind_get_saved_register (char *raw_buffer, > int *optimizedp, > CORE_ADDR *addrp, > struct frame_info *frame, > int regnum, > enum lval_type *lvalp) > > (note that the get_next_frame(frame) call isn't needed - that function > does not have a well chosen name). The function frame_register() would > be better but because that knows about old style get_saved_register code > it would result in infinite recursion :-( That works. How does this look? * frame.c (generic_unwind_get_saved_register): Make non-static. * frame.h (generic_unwind_get_saved_register): Declare. * mips-tdep.c (read_next_frame_reg): Fetch register from current regcache when frame is NULL. (mips_init_extra_frame_info): Pass NULL explicitly for parameter that must be NULL. (mips_get_saved_register): Call generic_unwind_get_saved_register() instead of frame_register_unwind(). Index: frame.c =================================================================== RCS file: /cvs/src/src/gdb/frame.c,v retrieving revision 1.66 diff -u -p -r1.66 frame.c --- frame.c 2 Feb 2003 20:31:43 -0000 1.66 +++ frame.c 20 Feb 2003 16:01:58 -0000 @@ -307,7 +307,7 @@ frame_read_signed_register (struct frame frame_unwind_signed_register (frame->next, regnum, val); } -static void +void generic_unwind_get_saved_register (char *raw_buffer, int *optimizedp, CORE_ADDR *addrp, Index: frame.h =================================================================== RCS file: /cvs/src/src/gdb/frame.h,v retrieving revision 1.66 diff -u -p -r1.66 frame.h --- frame.h 2 Feb 2003 20:31:43 -0000 1.66 +++ frame.h 20 Feb 2003 16:01:58 -0000 @@ -553,6 +553,13 @@ extern void generic_fix_call_dummy (char int nargs, struct value **args, struct type *type, int gcc_p); +void generic_unwind_get_saved_register (char *raw_buffer, + int *optimizedp, + CORE_ADDR *addrp, + struct frame_info *frame, + int regnum, + enum lval_type *lvalp); + /* The function generic_get_saved_register() has been made obsolete. GET_SAVED_REGISTER now defaults to the recursive equivalent - generic_unwind_get_saved_register() - so there is no need to even Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.161 diff -u -p -r1.161 mips-tdep.c --- mips-tdep.c 28 Jan 2003 16:31:11 -0000 1.161 +++ mips-tdep.c 20 Feb 2003 16:01:59 -0000 @@ -1589,20 +1589,28 @@ read_next_frame_reg (struct frame_info * int realnum; enum lval_type lval; void *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE); - frame_register_unwind (fi, regno, &optimized, &lval, &addr, &realnum, - raw_buffer); - /* FIXME: cagney/2002-09-13: This is just soooo bad. The MIPS - should have a pseudo register range that correspons to the ABI's, - rather than the ISA's, view of registers. These registers would - then implicitly describe their size and hence could be used - without the below munging. */ - if (lval == lval_memory) - { - if (regno < 32) - { - /* Only MIPS_SAVED_REGSIZE bytes of GP registers are - saved. */ - return read_memory_integer (addr, MIPS_SAVED_REGSIZE); + + if (fi == NULL) + { + regcache_cooked_read (current_regcache, regno, raw_buffer); + } + else + { + frame_register_unwind (fi, regno, &optimized, &lval, &addr, &realnum, + raw_buffer); + /* FIXME: cagney/2002-09-13: This is just soooo bad. The MIPS + should have a pseudo register range that correspons to the ABI's, + rather than the ISA's, view of registers. These registers would + then implicitly describe their size and hence could be used + without the below munging. */ + if (lval == lval_memory) + { + if (regno < 32) + { + /* Only MIPS_SAVED_REGSIZE bytes of GP registers are + saved. */ + return read_memory_integer (addr, MIPS_SAVED_REGSIZE); + } } } @@ -2473,11 +2481,16 @@ mips_init_extra_frame_info (int fromleaf if (get_frame_type (fci) == DUMMY_FRAME) return; - /* Use proc_desc calculated in frame_chain */ + /* Use proc_desc calculated in frame_chain. When there is no + next frame, i.e, get_next_frame (fci) == NULL, we call + find_proc_desc () to calculate it, passing an explicit + NULL as the frame parameter. */ proc_desc = get_next_frame (fci) ? cached_proc_desc - : find_proc_desc (get_frame_pc (fci), get_next_frame (fci), 1); + : find_proc_desc (get_frame_pc (fci), + NULL /* i.e, get_next_frame (fci) */, + 1); frame_extra_info_zalloc (fci, sizeof (struct frame_extra_info)); @@ -5481,7 +5494,6 @@ mips_get_saved_register (char *raw_buffe CORE_ADDR addrx; enum lval_type lvalx; int optimizedx; - int realnum; if (!target_has_registers) error ("No registers."); @@ -5493,8 +5505,8 @@ mips_get_saved_register (char *raw_buffe lvalp = &lvalx; if (optimizedp == NULL) optimizedp = &optimizedx; - frame_register_unwind (get_next_frame (frame), regnum, optimizedp, lvalp, - addrp, &realnum, raw_buffer); + generic_unwind_get_saved_register (raw_buffer, optimizedp, addrp, frame, + regnum, lvalp); /* FIXME: cagney/2002-09-13: This is just so bad. The MIPS should have a pseudo register range that correspons to the ABI's, rather than the ISA's, view of registers. These registers would then