This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]