* infrun.c (normal_stop): Don't call
[deliverable/binutils-gdb.git] / gdb / regcache.c
index 05dc4bb77a24c89642f4ebfdbf8cb05ae3a942f1..6366e11cb205f09bde526577306cff06b520b94a 100644 (file)
@@ -1,13 +1,13 @@
 /* Cache and manage the values of registers for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1987, 1989, 1991, 1994, 1995, 1996, 1998, 2000, 2001,
-   2002, 2004, 2007 Free Software Foundation, Inc.
+   2002, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,9 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "inferior.h"
@@ -94,11 +92,11 @@ init_regcache_descr (struct gdbarch *gdbarch)
   /* Total size of the register space.  The raw registers are mapped
      directly onto the raw register cache while the pseudo's are
      either mapped onto raw-registers or memory.  */
-  descr->nr_cooked_registers = gdbarch_num_regs (current_gdbarch)
-                              + gdbarch_num_pseudo_regs (current_gdbarch);
-  descr->sizeof_cooked_register_valid_p = gdbarch_num_regs (current_gdbarch)
+  descr->nr_cooked_registers = gdbarch_num_regs (gdbarch)
+                              + gdbarch_num_pseudo_regs (gdbarch);
+  descr->sizeof_cooked_register_valid_p = gdbarch_num_regs (gdbarch)
                                          + gdbarch_num_pseudo_regs 
-                                             (current_gdbarch);
+                                             (gdbarch);
 
   /* Fill in a table of register types.  */
   descr->register_type
@@ -108,7 +106,7 @@ init_regcache_descr (struct gdbarch *gdbarch)
 
   /* Construct a strictly RAW register cache.  Don't allow pseudo's
      into the register cache.  */
-  descr->nr_raw_registers = gdbarch_num_regs (current_gdbarch);
+  descr->nr_raw_registers = gdbarch_num_regs (gdbarch);
 
   /* FIXME: cagney/2002-08-13: Overallocate the register_valid_p
      array.  This pretects GDB from erant code that accesses elements
@@ -176,8 +174,8 @@ register_size (struct gdbarch *gdbarch, int regnum)
   struct regcache_descr *descr = regcache_descr (gdbarch);
   int size;
   gdb_assert (regnum >= 0
-             && regnum < (gdbarch_num_regs (current_gdbarch)
-                          + gdbarch_num_pseudo_regs (current_gdbarch)));
+             && regnum < (gdbarch_num_regs (gdbarch)
+                          + gdbarch_num_pseudo_regs (gdbarch)));
   size = descr->sizeof_register[regnum];
   return size;
 }
@@ -455,6 +453,16 @@ regcache_observer_target_changed (struct target_ops *target)
   registers_changed ();
 }
 
+/* Update global variables old ptids to hold NEW_PTID if they were
+   holding OLD_PTID.  */
+static void
+regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid)
+{
+  if (current_regcache != NULL
+      && ptid_equal (current_regcache->ptid, old_ptid))
+    current_regcache->ptid = new_ptid;
+}
+
 /* Low level examining and depositing of registers.
 
    The caller is responsible for making sure that the inferior is
@@ -474,6 +482,9 @@ registers_changed (void)
   regcache_xfree (current_regcache);
   current_regcache = NULL;
 
+  /* Need to forget about any frames we have cached, too. */
+  reinit_frame_cache ();
+
   /* Force cleanup of any alloca areas if using C alloca instead of
      a builtin alloca.  This particular call is used to clean up
      areas allocated by low level target code which may build up
@@ -644,7 +655,7 @@ regcache_raw_write (struct regcache *regcache, int regnum,
 
   /* On the sparc, writing %g0 is a no-op, so we don't even want to
      change the registers array if something writes to this register.  */
-  if (gdbarch_cannot_store_register (current_gdbarch, regnum))
+  if (gdbarch_cannot_store_register (get_regcache_arch (regcache), regnum))
     return;
 
   /* If we have a valid copy of the register, and new value == old
@@ -763,18 +774,6 @@ regcache_cooked_write_part (struct regcache *regcache, int regnum,
                      regcache_cooked_read, regcache_cooked_write);
 }
 
-/* Hack to keep code that view the register buffer as raw bytes
-   working.  */
-
-int
-register_offset_hack (struct gdbarch *gdbarch, int regnum)
-{
-  struct regcache_descr *descr = regcache_descr (gdbarch);
-  gdb_assert (regnum >= 0 && regnum < descr->nr_cooked_registers);
-  return descr->register_offset[regnum];
-}
-
-
 /* Supply register REGNUM, whose contents are stored in BUF, to REGCACHE.  */
 
 void
@@ -816,22 +815,11 @@ regcache_raw_collect (const struct regcache *regcache, int regnum, void *buf)
 }
 
 
-/* read_pc, write_pc, etc.  Special handling for register PC.  */
-
-/* NOTE: cagney/2001-02-18: The functions read_pc_pid(), read_pc() and
-   read_sp(), will eventually be replaced by per-frame methods.
-   Instead of relying on the global INFERIOR_PTID, they will use the
-   contextual information provided by the FRAME.  These functions do
-   not belong in the register cache.  */
-
-/* NOTE: cagney/2003-06-07: The functions generic_target_write_pc(),
-   write_pc_pid() and write_pc(), all need to be replaced by something
-   that does not rely on global state.  But what?  */
+/* Special handling for register PC.  */
 
 CORE_ADDR
-read_pc_pid (ptid_t ptid)
+regcache_read_pc (struct regcache *regcache)
 {
-  struct regcache *regcache = get_thread_regcache (ptid);
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
   CORE_ADDR pc_val;
@@ -839,46 +827,45 @@ read_pc_pid (ptid_t ptid)
   if (gdbarch_read_pc_p (gdbarch))
     pc_val = gdbarch_read_pc (gdbarch, regcache);
   /* Else use per-frame method on get_current_frame.  */
-  else if (gdbarch_pc_regnum (current_gdbarch) >= 0)
+  else if (gdbarch_pc_regnum (gdbarch) >= 0)
     {
       ULONGEST raw_val;
       regcache_cooked_read_unsigned (regcache,
-                                    gdbarch_pc_regnum (current_gdbarch),
+                                    gdbarch_pc_regnum (gdbarch),
                                     &raw_val);
-      pc_val = gdbarch_addr_bits_remove (current_gdbarch, raw_val);
+      pc_val = gdbarch_addr_bits_remove (gdbarch, raw_val);
     }
   else
-    internal_error (__FILE__, __LINE__, _("read_pc_pid: Unable to find PC"));
-
+    internal_error (__FILE__, __LINE__,
+                   _("regcache_read_pc: Unable to find PC"));
   return pc_val;
 }
 
 CORE_ADDR
 read_pc (void)
 {
-  return read_pc_pid (inferior_ptid);
+  return regcache_read_pc (get_current_regcache ());
 }
 
 void
-write_pc_pid (CORE_ADDR pc, ptid_t ptid)
+regcache_write_pc (struct regcache *regcache, CORE_ADDR pc)
 {
-  struct regcache *regcache = get_thread_regcache (ptid);
   struct gdbarch *gdbarch = get_regcache_arch (regcache);
 
   if (gdbarch_write_pc_p (gdbarch))
     gdbarch_write_pc (gdbarch, regcache, pc);
-  if (gdbarch_pc_regnum (current_gdbarch) >= 0)
+  else if (gdbarch_pc_regnum (gdbarch) >= 0)
     regcache_cooked_write_unsigned (regcache,
-                                   gdbarch_pc_regnum (current_gdbarch), pc);
+                                   gdbarch_pc_regnum (gdbarch), pc);
   else
     internal_error (__FILE__, __LINE__,
-                   _("write_pc_pid: Unable to update PC"));
+                   _("regcache_write_pc: Unable to update PC"));
 }
 
 void
 write_pc (CORE_ADDR pc)
 {
-  write_pc_pid (pc, inferior_ptid);
+  regcache_write_pc (get_current_regcache (), pc);
 }
 
 
@@ -940,14 +927,14 @@ regcache_dump (struct regcache *regcache, struct ui_file *file,
   fprintf_unfiltered (file, "sizeof_raw_register_valid_p %ld\n",
                      regcache->descr->sizeof_raw_register_valid_p);
   fprintf_unfiltered (file, "gdbarch_num_regs %d\n", 
-                     gdbarch_num_regs (current_gdbarch));
+                     gdbarch_num_regs (gdbarch));
   fprintf_unfiltered (file, "gdbarch_num_pseudo_regs %d\n",
-                     gdbarch_num_pseudo_regs (current_gdbarch));
+                     gdbarch_num_pseudo_regs (gdbarch));
 #endif
 
   gdb_assert (regcache->descr->nr_cooked_registers
-             == (gdbarch_num_regs (current_gdbarch)
-                 + gdbarch_num_pseudo_regs (current_gdbarch)));
+             == (gdbarch_num_regs (gdbarch)
+                 + gdbarch_num_pseudo_regs (gdbarch)));
 
   for (regnum = -1; regnum < regcache->descr->nr_cooked_registers; regnum++)
     {
@@ -956,7 +943,7 @@ regcache_dump (struct regcache *regcache, struct ui_file *file,
        fprintf_unfiltered (file, " %-10s", "Name");
       else
        {
-         const char *p = gdbarch_register_name (current_gdbarch, regnum);
+         const char *p = gdbarch_register_name (gdbarch, regnum);
          if (p == NULL)
            p = "";
          else if (p[0] == '\0')
@@ -973,11 +960,11 @@ regcache_dump (struct regcache *regcache, struct ui_file *file,
       /* Relative number.  */
       if (regnum < 0)
        fprintf_unfiltered (file, " %4s", "Rel");
-      else if (regnum < gdbarch_num_regs (current_gdbarch))
+      else if (regnum < gdbarch_num_regs (gdbarch))
        fprintf_unfiltered (file, " %4d", regnum);
       else
        fprintf_unfiltered (file, " %4d",
-                           (regnum - gdbarch_num_regs (current_gdbarch)));
+                           (regnum - gdbarch_num_regs (gdbarch)));
 
       /* Offset.  */
       if (regnum < 0)
@@ -1052,7 +1039,7 @@ regcache_dump (struct regcache *regcache, struct ui_file *file,
              regcache_raw_read (regcache, regnum, buf);
              fprintf_unfiltered (file, "0x");
              dump_endian_bytes (file,
-                                gdbarch_byte_order (current_gdbarch), buf,
+                                gdbarch_byte_order (gdbarch), buf,
                                 regcache->descr->sizeof_register[regnum]);
            }
        }
@@ -1067,7 +1054,7 @@ regcache_dump (struct regcache *regcache, struct ui_file *file,
              regcache_cooked_read (regcache, regnum, buf);
              fprintf_unfiltered (file, "0x");
              dump_endian_bytes (file,
-                                gdbarch_byte_order (current_gdbarch), buf,
+                                gdbarch_byte_order (gdbarch), buf,
                                 regcache->descr->sizeof_register[regnum]);
            }
        }
@@ -1114,14 +1101,16 @@ static void
 regcache_print (char *args, enum regcache_dump_what what_to_dump)
 {
   if (args == NULL)
-    regcache_dump (current_regcache, gdb_stdout, what_to_dump);
+    regcache_dump (get_current_regcache (), gdb_stdout, what_to_dump);
   else
     {
+      struct cleanup *cleanups;
       struct ui_file *file = gdb_fopen (args, "w");
       if (file == NULL)
        perror_with_name (_("maintenance print architecture"));
-      regcache_dump (current_regcache, file, what_to_dump);    
-      ui_file_delete (file);
+      cleanups = make_cleanup_ui_file_delete (file);
+      regcache_dump (get_current_regcache (), file, what_to_dump);
+      do_cleanups (cleanups);
     }
 }
 
@@ -1157,6 +1146,7 @@ _initialize_regcache (void)
   regcache_descr_handle = gdbarch_data_register_post_init (init_regcache_descr);
 
   observer_attach_target_changed (regcache_observer_target_changed);
+  observer_attach_thread_ptid_changed (regcache_thread_ptid_changed);
 
   add_com ("flushregs", class_maintenance, reg_flush_command,
           _("Force gdb to flush its register cache (maintainer command)"));
This page took 0.033495 seconds and 4 git commands to generate.