This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [rfc] Re-parse display expressions if architecture changes
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: tromey at redhat dot com
- Cc: gdb-patches at sourceware dot org
- Date: Tue, 22 Dec 2009 15:12:10 +0100 (CET)
- Subject: Re: [rfc] Re-parse display expressions if architecture changes
Tom Tromey wrote:
> >>>>> "Ulrich" == Ulrich Weigand <uweigand@de.ibm.com> writes:
>
> Ulrich> The patch below implements this by ensuring the expression is
> Ulrich> re-parsed if the currnet architecture is different from the one
> Ulrich> the expression was originally parsed in.
>
> This seems like a reasonable idea to me.
>
> Ulrich> Any comments? I'm planning to apply this next week.
>
> I think this needs to xfree the old expression to avoid a memory leak.
Oops, thanks for noticing this. Updated patch below.
Bye,
Ulrich
ChangeLog:
* printcmd.c: Include "arch-utils.h".
(do_one_display): Re-parse expression if current architecture changed.
diff -urNp gdb-orig/gdb/printcmd.c gdb-head/gdb/printcmd.c
--- gdb-orig/gdb/printcmd.c 2009-12-18 17:27:13.000000000 +0100
+++ gdb-head/gdb/printcmd.c 2009-12-22 14:23:27.000000000 +0100
@@ -49,6 +49,7 @@
#include "solib.h"
#include "parser-defs.h"
#include "charset.h"
+#include "arch-utils.h"
#ifdef TUI
#include "tui/tui.h" /* For tui_active et.al. */
@@ -1597,6 +1598,20 @@ do_one_display (struct display *d)
if (d->enabled_p == 0)
return;
+ /* The expression carries the architecture that was used at parse time.
+ This is a problem if the expression depends on architecture features
+ (e.g. register numbers), and the current architecture is now different.
+ For example, a display statement like "display/i $pc" is expected to
+ display the PC register of the current architecture, not the arch at
+ the time the display command was given. Therefore, we re-parse the
+ expression if the current architecture has changed. */
+ if (d->exp != NULL && d->exp->gdbarch != get_current_arch ())
+ {
+ xfree (d->exp);
+ d->exp = NULL;
+ d->block = NULL;
+ }
+
if (d->exp == NULL)
{
volatile struct gdb_exception ex;
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com