X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Ftrad-frame.c;h=30f4d3e5f705801778ef3dedf4e1bc707b791c51;hb=dadef93096fd397c3acf2078bcf6b526ff4e0da4;hp=fc67db860fa7b4f1909501107465105667feca56;hpb=00b25ff323929eaa3b7ddaea20985a4174cf6381;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/trad-frame.c b/gdb/trad-frame.c index fc67db8..30f4d3e 100644 --- a/gdb/trad-frame.c +++ b/gdb/trad-frame.c @@ -1,12 +1,12 @@ /* Traditional frame unwind support, for GDB the GNU Debugger. - Copyright 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2003-2014 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,31 +15,31 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "frame.h" #include "trad-frame.h" #include "regcache.h" +#include "frame-unwind.h" +#include "value.h" struct trad_frame_cache { - struct frame_info *next_frame; + struct frame_info *this_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) +trad_frame_cache_zalloc (struct frame_info *this_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; + this_trad_cache->prev_regs = trad_frame_alloc_saved_regs (this_frame); + this_trad_cache->this_frame = this_frame; return this_trad_cache; } @@ -49,13 +49,14 @@ trad_frame_cache_zalloc (struct frame_info *next_frame) for all potential instruction sequences). */ struct trad_frame_saved_reg * -trad_frame_alloc_saved_regs (struct frame_info *next_frame) +trad_frame_alloc_saved_regs (struct frame_info *this_frame) { int regnum; - struct gdbarch *gdbarch = get_frame_arch (next_frame); - int numregs = NUM_REGS + NUM_PSEUDO_REGS; + struct gdbarch *gdbarch = get_frame_arch (this_frame); + int numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); struct trad_frame_saved_reg *this_saved_regs = FRAME_OBSTACK_CALLOC (numregs, struct trad_frame_saved_reg); + for (regnum = 0; regnum < numregs; regnum++) { this_saved_regs[regnum].realreg = regnum; @@ -64,12 +65,12 @@ trad_frame_alloc_saved_regs (struct frame_info *next_frame) return this_saved_regs; } -enum { REG_VALUE = -1, REG_UNKNOWN = -2 }; +enum { TF_REG_VALUE = -1, TF_REG_UNKNOWN = -2 }; int trad_frame_value_p (struct trad_frame_saved_reg this_saved_regs[], int regnum) { - return (this_saved_regs[regnum].realreg == REG_VALUE); + return (this_saved_regs[regnum].realreg == TF_REG_VALUE); } int @@ -93,11 +94,20 @@ trad_frame_set_value (struct trad_frame_saved_reg this_saved_regs[], { /* Make the REALREG invalid, indicating that the ADDR contains the register's value. */ - this_saved_regs[regnum].realreg = REG_VALUE; + this_saved_regs[regnum].realreg = TF_REG_VALUE; this_saved_regs[regnum].addr = val; } void +trad_frame_set_reg_value (struct trad_frame_cache *this_trad_cache, + int regnum, LONGEST val) +{ + /* External interface for users of trad_frame_cache + (who cannot access the prev_regs object directly). */ + trad_frame_set_value (this_trad_cache->prev_regs, regnum, val); +} + +void trad_frame_set_reg_realreg (struct trad_frame_cache *this_trad_cache, int regnum, int realreg) { @@ -117,70 +127,37 @@ trad_frame_set_unknown (struct trad_frame_saved_reg this_saved_regs[], int regnum) { /* Make the REALREG invalid, indicating that the value is not known. */ - this_saved_regs[regnum].realreg = REG_UNKNOWN; + this_saved_regs[regnum].realreg = TF_REG_UNKNOWN; this_saved_regs[regnum].addr = -1; } -void -trad_frame_get_prev_register (struct frame_info *next_frame, +struct value * +trad_frame_get_prev_register (struct frame_info *this_frame, struct trad_frame_saved_reg this_saved_regs[], - int regnum, int *optimizedp, - enum lval_type *lvalp, CORE_ADDR *addrp, - int *realregp, void *bufferp) + int regnum) { - struct gdbarch *gdbarch = get_frame_arch (next_frame); if (trad_frame_addr_p (this_saved_regs, regnum)) - { - /* The register was saved in memory. */ - *optimizedp = 0; - *lvalp = lval_memory; - *addrp = this_saved_regs[regnum].addr; - *realregp = -1; - if (bufferp != NULL) - { - /* Read the value in from memory. */ - get_frame_memory (next_frame, this_saved_regs[regnum].addr, bufferp, - register_size (gdbarch, regnum)); - } - } + /* The register was saved in memory. */ + return frame_unwind_got_memory (this_frame, regnum, + this_saved_regs[regnum].addr); else if (trad_frame_realreg_p (this_saved_regs, regnum)) - { - *optimizedp = 0; - *lvalp = lval_register; - *addrp = 0; - *realregp = this_saved_regs[regnum].realreg; - /* Ask the next frame to return the value of the register. */ - if (bufferp) - frame_unwind_register (next_frame, (*realregp), bufferp); - } + return frame_unwind_got_register (this_frame, regnum, + this_saved_regs[regnum].realreg); else if (trad_frame_value_p (this_saved_regs, regnum)) - { - /* The register's value is available. */ - *optimizedp = 0; - *lvalp = not_lval; - *addrp = 0; - *realregp = -1; - if (bufferp != NULL) - store_unsigned_integer (bufferp, register_size (gdbarch, regnum), - this_saved_regs[regnum].addr); - } + /* The register's value is available. */ + return frame_unwind_got_constant (this_frame, regnum, + this_saved_regs[regnum].addr); else - { - error ("Register %s not available", - gdbarch_register_name (gdbarch, regnum)); - } + return frame_unwind_got_optimized (this_frame, regnum); } -void +struct value * 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_get_prev_register (next_frame, this_trad_cache->prev_regs, - regnum, optimizedp, lvalp, addrp, realregp, - bufferp); + struct frame_info *this_frame, + int regnum) +{ + return trad_frame_get_prev_register (this_frame, this_trad_cache->prev_regs, + regnum); } void