OSDN Git Service

* printcmd.c: Include "arch-utils.h".
authoruweigand <uweigand>
Mon, 4 Jan 2010 23:55:05 +0000 (23:55 +0000)
committeruweigand <uweigand>
Mon, 4 Jan 2010 23:55:05 +0000 (23:55 +0000)
(do_one_display): Re-parse expression if current architecture changed.

gdb/ChangeLog
gdb/printcmd.c

index 208967f..a8f1278 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-04  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * printcmd.c: Include "arch-utils.h".
+       (do_one_display): Re-parse expression if current architecture changed.
+
 2010-01-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
            Joel Brobecker  <brobecker@adacore.com>
 
index 2960e44..88db08b 100644 (file)
@@ -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;