From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18211 invoked by alias); 6 Oct 2002 16:41:45 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 18203 invoked from network); 6 Oct 2002 16:41:45 -0000 Received: from unknown (HELO mail-out1.apple.com) (17.254.0.52) by sources.redhat.com with SMTP; 6 Oct 2002 16:41:45 -0000 Received: from mailgate1.apple.com (A17-128-100-225.apple.com [17.128.100.225]) by mail-out1.apple.com (8.11.3/8.11.3) with ESMTP id g96Gfji13585 for ; Sun, 6 Oct 2002 09:41:45 -0700 (PDT) Received: from scv1.apple.com (scv1.apple.com) by mailgate1.apple.com (Content Technologies SMTPRS 4.2.5) with ESMTP id ; Sun, 6 Oct 2002 09:41:36 -0700 Received: from molly.local. (vpn-scv-x1-34.apple.com [17.219.193.34]) by scv1.apple.com (8.11.3/8.11.3) with ESMTP id g96Gfhb20426; Sun, 6 Oct 2002 09:41:44 -0700 (PDT) Date: Sun, 06 Oct 2002 09:41:00 -0000 Subject: Re: [PATCH] Use read_memory_unsigned_integer when reading to CORE_ADDR Content-Type: text/plain; charset=US-ASCII; format=flowed Mime-Version: 1.0 (Apple Message framework v543) Cc: gdb-patches@sources.redhat.com To: Daniel Jacobowitz From: Klee Dienes In-Reply-To: <20021006150934.GA23448@nevyn.them.org> Message-Id: <7E7F8836-D94A-11D6-9563-00039396EEB8@apple.com> Content-Transfer-Encoding: 7bit X-SW-Source: 2002-10/txt/msg00159.txt.bz2 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. >> 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. 2002-10-06 Klee Dienes * 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