* dwarf2expr.c (unsigned_address_type): Add forward declaration.

(dwarf2_read_address): Sign extend return address as required by
	target architecture.
This commit is contained in:
Kevin Buettner 2007-04-27 22:34:56 +00:00
parent 89a7ee67c5
commit ace186d47a
2 changed files with 36 additions and 3 deletions

View file

@ -1,3 +1,9 @@
2007-04-27 Kevin Buettner <kevinb@redhat.com>
* dwarf2expr.c (unsigned_address_type): Add forward declaration.
(dwarf2_read_address): Sign extend return address as required by
target architecture.
2007-04-27 Kevin Buettner <kevinb@redhat.com> 2007-04-27 Kevin Buettner <kevinb@redhat.com>
* solib-frv.c (lm_base): Bail out if the main executable has * solib-frv.c (lm_base): Bail out if the main executable has

View file

@ -33,6 +33,7 @@
static void execute_stack_op (struct dwarf_expr_context *, static void execute_stack_op (struct dwarf_expr_context *,
gdb_byte *, gdb_byte *); gdb_byte *, gdb_byte *);
static struct type *unsigned_address_type (void);
/* Create a new context for the expression evaluator. */ /* Create a new context for the expression evaluator. */
@ -205,9 +206,35 @@ dwarf2_read_address (gdb_byte *buf, gdb_byte *buf_end, int *bytes_read)
error (_("dwarf2_read_address: Corrupted DWARF expression.")); error (_("dwarf2_read_address: Corrupted DWARF expression."));
*bytes_read = TARGET_ADDR_BIT / TARGET_CHAR_BIT; *bytes_read = TARGET_ADDR_BIT / TARGET_CHAR_BIT;
/* NOTE: cagney/2003-05-22: This extract is assuming that a DWARF 2
address is always unsigned. That may or may not be true. */ /* For most architectures, calling extract_unsigned_integer() alone
result = extract_unsigned_integer (buf, TARGET_ADDR_BIT / TARGET_CHAR_BIT); is sufficient for extracting an address. However, some
architectures (e.g. MIPS) use signed addresses and using
extract_unsigned_integer() will not produce a correct
result. Turning the unsigned integer into a value and then
decomposing that value as an address will cause
gdbarch_integer_to_address() to be invoked for those
architectures which require it. Thus, using value_as_address()
will produce the correct result for both types of architectures.
One concern regarding the use of values for this purpose is
efficiency. Obviously, these extra calls will take more time to
execute and creating a value takes more space, space which will
have to be garbage collected at a later time. If constructing
and then decomposing a value for this purpose proves to be too
inefficient, then gdbarch_integer_to_address() can be called
directly.
The use of `unsigned_address_type' in the code below refers to
the type of buf and has no bearing on the signedness of the
address being returned. */
result = value_as_address (value_from_longest
(unsigned_address_type (),
extract_unsigned_integer
(buf,
TARGET_ADDR_BIT / TARGET_CHAR_BIT)));
return result; return result;
} }