This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [PATCH] Use read_memory_unsigned_integer when reading to CORE_ADDR
On Sun, Oct 06, 2002 at 12:41:42PM -0400, Klee Dienes wrote:
> On Sunday, October 6, 2002, at 11:09 AM, Daniel Jacobowitz wrote:
>
> >
> >Might want to use alloca (TYPE_LENGTH (builtin_type_void_data_ptr)).
>
> Love to; I had been under the (apparently mistaken) impression that
> alloca was deprecated for new code.
Check the "Coding" chapter of gdbint.texinfo:
GDB can use the non-portable function `alloca' for the allocation of
small temporary values (such as strings).
I think at least one of the other GNU tools doesn't like alloca -
probably it's GCC and binutils both.
> >>Aside from the intimidating comments in findvar.c, this would seem a
> >>good candidate for extract_address ... though a similar modification
> >>would have to be made to it to handle the sign-extension as well.
> >>
> >>Or alternately, I could just leave well-enough alone, and be careful
> >>to
> >>truncate CORE_ADDRs to 32 bits in our target xfer_memory code (or the
> >>MIPS code could sign-extend it in the same place).
> >
> >Well, I think a general read_memory_typed_address (returning CORE_ADDR,
> >and honoroing POINTER_TO_ADDRESS) would be the way to go here.
>
> That sounds good to me; how about the following? I removed the patch
> to symfile.c, as it's commented out anyway, and probably not worth the
> effort. My one concern is that I don't currently have a good system to
> test the part of the patch that affects blockframe.c.
Can't the Apple tools group lodge a formal complaint about Apple Mail,
or something? :) Your patch is line wrapped.
Other than that, I can't approve this sort of patch, but it looks like
exactly what I wanted. Thanks for bearing with me.
>
> 2002-10-06 Klee Dienes <kdienes@apple.com>
>
> * findvar.c (read_memory_typed_address): New function.
> * gdbcore.h (read_memory_typed_address): Add prototype.
> * blockframe.c (sigtramp_saved_pc): Use
> read_memory_typed_address to read a value destined for a
> CORE_ADDR, not read_memory_integer.
> * f-valprint.c (f77_get_dynamic_upperbound): Ditto.
> (f77_get_dynamic_lowerbound): Ditto.
>
> diff -u /home/klee/source/cygnus.cygnus/gdb/gdbcore.h ./gdbcore.h
> --- /home/klee/source/cygnus.cygnus/gdb/gdbcore.h Wed Dec 19 15:54:26
> 2001
> +++ ./gdbcore.h Sun Oct 6 09:18:11 2002
> @@ -64,8 +64,15 @@
>
> /* Read a null-terminated string from the debuggee's memory, given
> address,
> * a buffer into which to place the string, and the maximum available
> space */
> +
> extern void read_memory_string (CORE_ADDR, char *, int);
>
> +/* Read the pointer of type TYPE at BUF, and return the address it
> + represents. */
> +
> +CORE_ADDR
> +read_memory_typed_address (CORE_ADDR addr, struct type *type);
> +
> /* This takes a char *, not void *. This is probably right, because
> passing in an int * or whatever is wrong with respect to
> byteswapping, alignment, different sizes for host vs. target types,
> diff -u /home/klee/source/cygnus.cygnus/gdb/corefile.c ./corefile.c
> --- /home/klee/source/cygnus.cygnus/gdb/corefile.c Thu May 30 15:41:24
> 2002
> +++ ./corefile.c Sun Oct 6 09:18:11 2002
> @@ -356,6 +356,14 @@
> }
> }
>
> +CORE_ADDR
> +read_memory_typed_address (CORE_ADDR addr, struct type *type)
> +{
> + char *buf = alloca (TYPE_LENGTH (type));
> + read_memory (addr, buf, TYPE_LENGTH (type));
> + return extract_typed_address (buf, type);
> +}
> +
> /* Same as target_write_memory, but report an error if can't write. */
> void
> write_memory (CORE_ADDR memaddr, char *myaddr, int len)
> diff -u /home/klee/source/cygnus.cygnus/gdb/blockframe.c ./blockframe.c
> --- /home/klee/source/cygnus.cygnus/gdb/blockframe.c Mon Sep 30
> 18:24:01 2002
> +++ ./blockframe.c Sun Oct 6 09:35:42 2002
> @@ -1035,19 +1035,17 @@
> buf = alloca (ptrbytes);
> /* Get sigcontext address, it is the third parameter on the stack.
> */
> if (frame->next)
> - sigcontext_addr = read_memory_integer (FRAME_ARGS_ADDRESS
> (frame->next)
> - + FRAME_ARGS_SKIP
> - + sigcontext_offs,
> - ptrbytes);
> + sigcontext_addr = read_memory_typed_address
> + (FRAME_ARGS_ADDRESS (frame->next) + FRAME_ARGS_SKIP +
> sigcontext_offs,
> + builtin_type_void_data_ptr);
> else
> - sigcontext_addr = read_memory_integer (read_register (SP_REGNUM)
> - + sigcontext_offs,
> - ptrbytes);
> + sigcontext_addr = read_memory_typed_address
> + (read_register (SP_REGNUM) + sigcontext_offs,
> builtin_type_void_data_ptr);
>
> /* Don't cause a memory_error when accessing sigcontext in case the
> stack
> layout has changed or the stack is corrupt. */
> target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf,
> ptrbytes);
> - return extract_unsigned_integer (buf, ptrbytes);
> + return extract_typed_address (buf, builtin_type_void_data_ptr);
> }
> #endif /* SIGCONTEXT_PC_OFFSET */
>
> diff -u /home/klee/source/cygnus.cygnus/gdb/f-valprint.c ./f-valprint.c
> --- /home/klee/source/cygnus.cygnus/gdb/f-valprint.c Tue Mar 6
> 18:57:08 2001
> +++ ./f-valprint.c Sun Oct 6 09:18:11 2002
> @@ -102,9 +102,9 @@
> if (current_frame_addr > 0)
> {
> ptr_to_lower_bound =
> - read_memory_integer (current_frame_addr +
> - TYPE_ARRAY_LOWER_BOUND_VALUE (type),
> - 4);
> + read_memory_typed_address (current_frame_addr +
> + TYPE_ARRAY_LOWER_BOUND_VALUE (type),
> + builtin_type_void_data_ptr);
> *lower_bound = read_memory_integer (ptr_to_lower_bound, 4);
> }
> else
> @@ -165,9 +165,9 @@
> if (current_frame_addr > 0)
> {
> ptr_to_upper_bound =
> - read_memory_integer (current_frame_addr +
> - TYPE_ARRAY_UPPER_BOUND_VALUE (type),
> - 4);
> + read_memory_typed_address (current_frame_addr +
> + TYPE_ARRAY_UPPER_BOUND_VALUE (type),
> + builtin_type_void_data_ptr);
> *upper_bound = read_memory_integer (ptr_to_upper_bound, 4);
> }
> else
>
>
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer