From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7162 invoked by alias); 19 Feb 2008 21:18:24 -0000 Received: (qmail 7153 invoked by uid 22791); 19 Feb 2008 21:18:23 -0000 X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 19 Feb 2008 21:17:58 +0000 Received: from brahms.sibelius.xs4all.nl (kettenis@localhost.sibelius.xs4all.nl [127.0.0.1]) by brahms.sibelius.xs4all.nl (8.14.1/8.14.1) with ESMTP id m1JLHr9P025699; Tue, 19 Feb 2008 22:17:53 +0100 (CET) Received: (from kettenis@localhost) by brahms.sibelius.xs4all.nl (8.14.1/8.14.1/Submit) id m1JLHqrE011372; Tue, 19 Feb 2008 22:17:52 +0100 (CET) Date: Tue, 19 Feb 2008 21:18:00 -0000 Message-Id: <200802192117.m1JLHqrE011372@brahms.sibelius.xs4all.nl> From: Mark Kettenis To: deuling@de.ibm.com CC: gdb-patches@sourceware.org, uweigand@de.ibm.com In-reply-to: <47B9E3E4.7050804@de.ibm.com> (message from Markus Deuling on Mon, 18 Feb 2008 21:00:36 +0100) Subject: Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep References: <47B2A053.30307@de.ibm.com> <200802181935.m1IJZaBG010057@brahms.sibelius.xs4all.nl> <47B9E3E4.7050804@de.ibm.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-02/txt/msg00321.txt.bz2 > Date: Mon, 18 Feb 2008 21:00:36 +0100 > From: Markus Deuling > > Hi Mark, > > thank you very much for your effort. Maybe you can provide me your > gdb.log file from this testrun? I can do better than that. I've figured out what the problem is ;) Looks like you removed just a little too much target-specific code here. If you keep 'return_reg', things seem to work fine. I think the problem is that the PC generally lives in the RA register in the current frame (so you have to unwind it from the next frame), but that you were looking it up in next frame instead. See the diff below. I also changed it to use trad_frame_addr_p() where appropriate. This diff, together with your Makefile.in changes and ChangeLog is ok with me. Index: alpha-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/alpha-tdep.c,v retrieving revision 1.181 diff -u -p -r1.181 alpha-tdep.c --- alpha-tdep.c 11 Jan 2008 14:43:14 -0000 1.181 +++ alpha-tdep.c 19 Feb 2008 21:11:37 -0000 @@ -40,6 +40,7 @@ #include "osabi.h" #include "block.h" #include "infcall.h" +#include "trad-frame.h" #include "elf-bfd.h" @@ -900,16 +901,6 @@ alpha_sigtramp_frame_sniffer (struct fra return NULL; } -/* Fallback alpha frame unwinder. Uses instruction scanning and knows - something about the traditional layout of alpha stack frames. */ - -struct alpha_heuristic_unwind_cache -{ - CORE_ADDR *saved_regs; - CORE_ADDR vfp; - CORE_ADDR start_pc; - int return_reg; -}; /* Heuristic_proc_start may hunt through the text section for a long time across a 2400 baud serial line. Allows the user to limit this @@ -996,6 +987,17 @@ Otherwise, you told GDB there was a func return 0; } +/* Fallback alpha frame unwinder. Uses instruction scanning and knows + something about the traditional layout of alpha stack frames. */ + +struct alpha_heuristic_unwind_cache +{ + CORE_ADDR vfp; + CORE_ADDR start_pc; + struct trad_frame_saved_reg *saved_regs; + int return_reg; +}; + static struct alpha_heuristic_unwind_cache * alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame, void **this_prologue_cache, @@ -1012,7 +1014,7 @@ alpha_heuristic_frame_unwind_cache (stru info = FRAME_OBSTACK_ZALLOC (struct alpha_heuristic_unwind_cache); *this_prologue_cache = info; - info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS); + info->saved_regs = trad_frame_alloc_saved_regs (next_frame); limit_pc = frame_pc_unwind (next_frame); if (start_pc == 0) @@ -1062,7 +1064,7 @@ alpha_heuristic_frame_unwind_cache (stru All it says is that the function we are scanning reused that register for some computation of its own, and is now saving its result. */ - if (info->saved_regs[reg]) + if (trad_frame_addr_p(info->saved_regs, reg)) continue; if (reg == 31) @@ -1078,7 +1080,7 @@ alpha_heuristic_frame_unwind_cache (stru pointer or not. */ /* Hack: temporarily add one, so that the offset is non-zero and we can tell which registers have save offsets below. */ - info->saved_regs[reg] = (word & 0xffff) + 1; + info->saved_regs[reg].addr = (word & 0xffff) + 1; /* Starting with OSF/1-3.2C, the system libraries are shipped without local symbols, but they still contain procedure @@ -1155,8 +1157,8 @@ alpha_heuristic_frame_unwind_cache (stru /* Convert offsets to absolute addresses. See above about adding one to the offsets to make all detected offsets non-zero. */ for (reg = 0; reg < ALPHA_NUM_REGS; ++reg) - if (info->saved_regs[reg]) - info->saved_regs[reg] += val - 1; + if (trad_frame_addr_p(info->saved_regs, reg)) + info->saved_regs[reg].addr += val - 1; return info; } @@ -1193,39 +1195,8 @@ alpha_heuristic_frame_prev_register (str if (regnum == ALPHA_PC_REGNUM) regnum = info->return_reg; - /* For all registers known to be saved in the current frame, - do the obvious and pull the value out. */ - if (info->saved_regs[regnum]) - { - *optimizedp = 0; - *lvalp = lval_memory; - *addrp = info->saved_regs[regnum]; - *realnump = -1; - if (bufferp != NULL) - get_frame_memory (next_frame, *addrp, bufferp, ALPHA_REGISTER_SIZE); - return; - } - - /* The stack pointer of the previous frame is computed by popping - the current stack frame. */ - if (regnum == ALPHA_SP_REGNUM) - { - *optimizedp = 0; - *lvalp = not_lval; - *addrp = 0; - *realnump = -1; - if (bufferp != NULL) - store_unsigned_integer (bufferp, ALPHA_REGISTER_SIZE, info->vfp); - return; - } - - /* Otherwise assume the next frame has the same register value. */ - *optimizedp = 0; - *lvalp = lval_register; - *addrp = 0; - *realnump = regnum; - if (bufferp) - frame_unwind_register (next_frame, *realnump, bufferp); + trad_frame_get_prev_register (next_frame, info->saved_regs, regnum, + optimizedp, lvalp, addrp, realnump, bufferp); } static const struct frame_unwind alpha_heuristic_frame_unwind = {