From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16484 invoked by alias); 22 Mar 2004 01:24:47 -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 16467 invoked from network); 22 Mar 2004 01:24:46 -0000 Received: from unknown (HELO localhost.redhat.com) (66.30.197.194) by sources.redhat.com with SMTP; 22 Mar 2004 01:24:46 -0000 Received: from gnu.org (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 418FD2B9B; Sun, 21 Mar 2004 20:24:43 -0500 (EST) Message-ID: <405E405A.90203@gnu.org> Date: Mon, 22 Mar 2004 01:24:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-GB; rv:1.4.1) Gecko/20040217 MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [patch/rfc] trad_frame_cache Content-Type: multipart/mixed; boundary="------------020106010801020106050803" X-SW-Source: 2004-03/txt/msg00488.txt.bz2 This is a multi-part message in MIME format. --------------020106010801020106050803 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 445 Hello, This patch adds a successor to "struct trad_frame_saved_reg" - "struct trad_frame_cache". Unlike the former, the latter: - has space for a frame ID and ABI base - is opaque For the moment I've included a minimal set of methods), more will follow. My signal trampoline code uses this as a common template for describing the location of registers saved in a signal trampoline. Comments? I'll look to commit in a few days, Andrew --------------020106010801020106050803 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 5071 2004-03-21 Andrew Cagney * Makefile.in (trad_frame_h): Add $(frame_h). * trad-frame.h: Update copyright. Include "frame.h". (struct trad_frame_cache, trad_frame_cache_zalloc): Declare. (trad_frame_set_id, trad_frame_get_id): Declare. (trad_frame_set_reg_addr, trad_frame_get_register): Declare. * trad-frame.c: Update copyright. (struct trad_frame_cache): Define. (trad_frame_cache_zalloc): New function. (trad_frame_set_id, trad_frame_get_id): New functions. (trad_frame_set_reg_addr, trad_frame_get_register): New functions. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.526 diff -u -r1.526 Makefile.in --- Makefile.in 21 Mar 2004 22:34:11 -0000 1.526 +++ Makefile.in 22 Mar 2004 01:13:54 -0000 @@ -756,7 +756,7 @@ terminal_h = terminal.h top_h = top.h tracepoint_h = tracepoint.h -trad_frame_h = trad-frame.h +trad_frame_h = trad-frame.h $(frame_h) typeprint_h = typeprint.h ui_file_h = ui-file.h ui_out_h = ui-out.h Index: trad-frame.c =================================================================== RCS file: /cvs/src/src/gdb/trad-frame.c,v retrieving revision 1.4 diff -u -r1.4 trad-frame.c --- trad-frame.c 20 Aug 2003 22:30:17 -0000 1.4 +++ trad-frame.c 22 Mar 2004 01:13:54 -0000 @@ -1,6 +1,6 @@ /* Traditional frame unwind support, for GDB the GNU Debugger. - Copyright 2003 Free Software Foundation, Inc. + Copyright 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -24,6 +24,25 @@ #include "trad-frame.h" #include "regcache.h" +struct trad_frame_cache +{ + struct frame_info *next_frame; + CORE_ADDR this_base; + struct trad_frame_saved_reg *prev_regs; + struct frame_id this_id; +}; + +struct trad_frame_cache * +trad_frame_cache_zalloc (struct frame_info *next_frame) +{ + struct trad_frame_cache *this_trad_cache; + + this_trad_cache = FRAME_OBSTACK_ZALLOC (struct trad_frame_cache); + this_trad_cache->prev_regs = trad_frame_alloc_saved_regs (next_frame); + this_trad_cache->next_frame = next_frame; + return this_trad_cache; +} + /* A traditional frame is unwound by analysing the function prologue and using the information gathered to track registers. For non-optimized frames, the technique is reliable (just need to check @@ -79,6 +98,13 @@ } void +trad_frame_set_reg_addr (struct trad_frame_cache *this_trad_cache, + int regnum, CORE_ADDR addr) +{ + this_trad_cache->prev_regs[regnum].addr = addr; +} + +void trad_frame_set_unknown (struct trad_frame_saved_reg this_saved_regs[], int regnum) { @@ -131,4 +157,30 @@ error ("Register %s not available", gdbarch_register_name (gdbarch, regnum)); } +} + +void +trad_frame_get_register (struct trad_frame_cache *this_trad_cache, + struct frame_info *next_frame, + int regnum, int *optimizedp, + enum lval_type *lvalp, CORE_ADDR *addrp, + int *realregp, void *bufferp) +{ + trad_frame_prev_register (next_frame, this_trad_cache->prev_regs, + regnum, optimizedp, lvalp, addrp, realregp, + bufferp); +} + +void +trad_frame_set_id (struct trad_frame_cache *this_trad_cache, + struct frame_id this_id) +{ + this_trad_cache->this_id = this_id; +} + +void +trad_frame_get_id (struct trad_frame_cache *this_trad_cache, + struct frame_id *this_id) +{ + (*this_id) = this_trad_cache->this_id; } Index: trad-frame.h =================================================================== RCS file: /cvs/src/src/gdb/trad-frame.h,v retrieving revision 1.4 diff -u -r1.4 trad-frame.h --- trad-frame.h 1 Jul 2003 13:25:19 -0000 1.4 +++ trad-frame.h 22 Mar 2004 01:13:54 -0000 @@ -1,6 +1,6 @@ /* Traditional frame unwind support, for GDB the GNU Debugger. - Copyright 2003 Free Software Foundation, Inc. + Copyright 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -22,7 +22,31 @@ #ifndef TRAD_FRAME_H #define TRAD_FRAME_H +#include "frame.h" /* For "struct frame_id". */ + struct frame_info; +struct trad_frame_cache; + +/* A simple, or traditional frame cache. + + The entire cache is populated in a single pass and then generic + routines are used to extract the various cache values. */ + +struct trad_frame_cache *trad_frame_cache_zalloc (struct frame_info *next_frame); + +/* This frame's ID. */ +void trad_frame_set_id (struct trad_frame_cache *this_trad_cache, + struct frame_id this_id); +void trad_frame_get_id (struct trad_frame_cache *this_trad_cache, + struct frame_id *this_id); + +void trad_frame_set_reg_unknown (struct trad_frame_cache *this_trad_cache, + int regnum, CORE_ADDR addr); +void trad_frame_get_register (struct trad_frame_cache *this_trad_cache, + struct frame_info *next_frame, + int regnum, int *optimizedp, + enum lval_type *lvalp, CORE_ADDR *addrp, + int *realregp, void *bufferp); /* A traditional saved regs table, indexed by REGNUM, encoding where the value of REGNUM for the previous frame can be found in this --------------020106010801020106050803--