From 0db9b4b7096923a0e101becc6ffc88b75f11f0a1 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Tue, 23 Mar 2004 13:49:50 +0000 Subject: [PATCH] 2004-03-23 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. --- gdb/ChangeLog | 13 ++++++++++++ gdb/Makefile.in | 2 +- gdb/trad-frame.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++- gdb/trad-frame.h | 26 ++++++++++++++++++++++- 4 files changed, 92 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dcffe7055ce..bb23e08d1db 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2004-03-23 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. + 2004-03-22 Andrew Cagney * s390-tdep.c (struct s390_stub_unwind_cache): Rename diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 95f72d5c59f..7b31937cbea 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -756,7 +756,7 @@ target_h = target.h $(bfd_h) $(symtab_h) $(dcache_h) $(memattr_h) 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 diff --git a/gdb/trad-frame.c b/gdb/trad-frame.c index f397f5d8241..f51998d42b8 100644 --- a/gdb/trad-frame.c +++ b/gdb/trad-frame.c @@ -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 @@ -78,6 +97,13 @@ trad_frame_set_value (struct trad_frame_saved_reg this_saved_regs[], this_saved_regs[regnum].addr = val; } +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) @@ -132,3 +158,29 @@ trad_frame_prev_register (struct frame_info *next_frame, 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; +} diff --git a/gdb/trad-frame.h b/gdb/trad-frame.h index 55720c7e836..194f39abdfb 100644 --- a/gdb/trad-frame.h +++ b/gdb/trad-frame.h @@ -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 -- 2.30.2