From: Mark Kettenis <kettenis@chello.nl>
To: gdb@sources.redhat.com
Cc: gdb-patches@sources.redhat.com
Subject: [RFC] Implementation of DW_OP_deref and DW_OP_deref_size operators
Date: Thu, 04 Jul 2002 16:00:00 -0000 [thread overview]
Message-ID: <200207042202.g64M2hT62589@elgar.kettenis.dyndns.org> (raw)
After staring for a while at some compiler warnings resulting from an
attempt to make an i386 x x86-64 cross-debugger, and failing to
understand the code that implements the DW_OP_deref and
DW_OP_deref_size operators I think I've found out what's wrong.
These expressions are supposed to dereference pointers. In GDB this
means that they should look at the address indicated by the pointer
they're dereferencing *in the target*. The current code is trying to
dereference a pointer in GDB. If we look at the history of this code
it is perfectly understandable. It is largely copied from the
unwinder that comes with GCC. This unwinder is supposed to be linked
into the program that contains the DWARF2 code, so in that context it
makes sense to lookup pointers in the program this code is running in.
Does this sound reasonable?
To fix this, I propose the following patch.
Ok, to check this in?
Mark
Index: ChangeLog
from Mark Kettenis <kettenis@gnu.org>
* dwarf2cfi.c (execute_stack_op): Fix implementation of the
DW_OP_deref and DW_OP_deref_size operators by letting do their
lookup in the target.
Index: dwarf2cfi.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2cfi.c,v
retrieving revision 1.12
diff -u -p -r1.12 dwarf2cfi.c
--- dwarf2cfi.c 4 Jul 2002 14:43:51 -0000 1.12
+++ dwarf2cfi.c 4 Jul 2002 21:50:39 -0000
@@ -21,6 +21,7 @@
Boston, MA 02111-1307, USA. */
#include "defs.h"
+#include "gdbcore.h"
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
@@ -1119,32 +1120,21 @@ execute_stack_op (struct objfile *objfil
{
case DW_OP_deref:
{
- char *ptr = (char *) result;
- result = read_pointer (objfile->obfd, &ptr);
+ int len = TARGET_ADDR_BIT / TARGET_CHAR_BIT;
+ if (len != 4 && len != 8)
+ internal_error (__FILE__, __LINE__,
+ "execute_stack_op error");
+ result = read_memory_unsigned_integer (result, len);
}
break;
case DW_OP_deref_size:
{
- char *ptr = (char *) result;
- switch (*op_ptr++)
- {
- case 1:
- result = read_1u (objfile->obfd, &ptr);
- break;
- case 2:
- result = read_2u (objfile->obfd, &ptr);
- break;
- case 4:
- result = read_4u (objfile->obfd, &ptr);
- break;
- case 8:
- result = read_8u (objfile->obfd, &ptr);
- break;
- default:
- internal_error (__FILE__, __LINE__,
- "execute_stack_op error");
- }
+ int len = *op_ptr++;
+ if (len != 1 && len != 2 && len != 4 && len !=8)
+ internal_error (__FILE__, __LINE__,
+ "execute_stack_op error");
+ result = read_memory_unsigned_integer (result, len);
}
break;
next reply other threads:[~2002-07-04 22:02 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-04 16:00 Mark Kettenis [this message]
2002-07-04 18:34 ` Michal Ludvig
2002-07-04 20:23 ` Jim Blandy
2002-07-04 20:34 ` Jim Blandy
2002-07-05 19:10 ` Mark Kettenis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200207042202.g64M2hT62589@elgar.kettenis.dyndns.org \
--to=kettenis@chello.nl \
--cc=gdb-patches@sources.redhat.com \
--cc=gdb@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox