From 704e9165595fdc491ff1a9f467dc4d7a64c949fd Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Mon, 4 Jan 2010 14:55:08 +0000 Subject: [PATCH] * printcmd.c: Include "arch-utils.h". (do_one_display): Re-parse expression if current architecture changed. --- gdb/ChangeLog | 5 +++++ gdb/printcmd.c | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 208967f9614..a8f1278cda5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2010-01-04 Ulrich Weigand + + * printcmd.c: Include "arch-utils.h". + (do_one_display): Re-parse expression if current architecture changed. + 2010-01-03 Jan Kratochvil Joel Brobecker diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 2960e44d8b5..88db08b01ce 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -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. */ @@ -1606,6 +1607,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; -- 2.30.2