From: Ulrich Weigand Date: Wed, 22 Nov 2006 13:44:45 +0000 (+0000) Subject: * findvar.c (address_from_register): New function. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0b2b0195d1b3b75d9fd0e5313466a0141790071d;p=binutils-gdb.git * findvar.c (address_from_register): New function. * value.h (address_from_register): Add prototype. * dwarf2loc.c (dwarf_expr_read_reg): Use address_from_register. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6171628abca..b3f4b41de57 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2006-11-22 Ulrich Weigand + + * findvar.c (address_from_register): New function. + * value.h (address_from_register): Add prototype. + * dwarf2loc.c (dwarf_expr_read_reg): Use address_from_register. + 2006-11-22 Vladimir Prus * breakpoint.c: Include "memattr.h". diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index f4f725ee438..1b29dc9a0b0 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -115,24 +115,17 @@ struct dwarf_expr_baton /* Helper functions for dwarf2_evaluate_loc_desc. */ /* Using the frame specified in BATON, return the value of register - REGNUM, treated as an unsigned integer. */ + REGNUM, treated as a pointer. */ static CORE_ADDR dwarf_expr_read_reg (void *baton, int dwarf_regnum) { struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton; CORE_ADDR result; - gdb_byte *buf; - int regnum, regsize; + int regnum; regnum = DWARF2_REG_TO_REGNUM (dwarf_regnum); - regsize = register_size (current_gdbarch, regnum); - buf = alloca (regsize); - - frame_register_read (debaton->frame, regnum, buf); - /* NOTE: cagney/2003-05-22: This extract is assuming that a DWARF 2 - address is always unsigned. That may or may not be true. */ - result = extract_unsigned_integer (buf, regsize); - + result = address_from_register (builtin_type_void_data_ptr, + regnum, debaton->frame); return result; } diff --git a/gdb/findvar.c b/gdb/findvar.c index 0cda35e75ad..9edd1518d91 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -728,6 +728,26 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) return v; } +/* Return contents of register REGNUM in frame FRAME as address, + interpreted as value of type TYPE. Will abort if register + value is not available. */ + +CORE_ADDR +address_from_register (struct type *type, int regnum, struct frame_info *frame) +{ + struct value *value; + CORE_ADDR result; + + value = value_from_register (type, regnum, frame); + gdb_assert (value); + + result = value_as_address (value); + release_value (value); + value_free (value); + + return result; +} + /* Given a struct symbol for a variable or function, and a stack frame id, diff --git a/gdb/value.h b/gdb/value.h index 87129d61216..001761a83c6 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -282,6 +282,9 @@ extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr); extern struct value *value_from_register (struct type *type, int regnum, struct frame_info *frame); +extern CORE_ADDR address_from_register (struct type *type, int regnum, + struct frame_info *frame); + extern struct value *value_of_variable (struct symbol *var, struct block *b); extern struct value *value_of_register (int regnum, struct frame_info *frame);