* gdbarch.sh (gdbarch_update_p): Swap out the old architecture
authorAndrew Cagney <cagney@redhat.com>
Wed, 1 May 2002 22:02:20 +0000 (22:02 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 1 May 2002 22:02:20 +0000 (22:02 +0000)
before probing for a new one.  Detect errorenous gdbarch_init
functions.
* gdbarch.c: Regenerate.

gdb/ChangeLog
gdb/gdbarch.c
gdb/gdbarch.sh

index 90c06f41137568fd9ffc9903f373e869a0d9dbe7..8a235ddc936a6cd382497aa296e9b4bcec147a19 100644 (file)
@@ -1,3 +1,10 @@
+2002-05-02  Andrew Cagney  <cagney@redhat.com>
+
+       * gdbarch.sh (gdbarch_update_p): Swap out the old architecture
+       before probing for a new one.  Detect errorenous gdbarch_init
+       functions.
+       * gdbarch.c: Regenerate.
+
 2002-05-01  Andrew Cagney  <cagney@redhat.com>
 
        * config/mn10200/tm-mn10200.h: Include "symfile.h" and "symtab.h".
index f7248fc75fe3a148aa175b46ac779e4ad6c866ae..ff5072d589409070d9ed1f2c4f797180dd370e51 100644 (file)
@@ -4887,6 +4887,7 @@ int
 gdbarch_update_p (struct gdbarch_info info)
 {
   struct gdbarch *new_gdbarch;
+  struct gdbarch *old_gdbarch;
   struct gdbarch_registration *rego;
 
   /* Fill in missing parts of the INFO struct using a number of
@@ -4955,30 +4956,40 @@ gdbarch_update_p (struct gdbarch_info info)
       return 0;
     }
 
+  /* Swap the data belonging to the old target out.  This stops the
+     ->init() function trying to refer to the previous architecture.  */
+  swapout_gdbarch_swap (current_gdbarch);
+  init_gdbarch_swap (current_gdbarch);
+  old_gdbarch = current_gdbarch;
+  current_gdbarch = NULL;
+
   /* Ask the target for a replacement architecture. */
   new_gdbarch = rego->init (info, rego->arches);
 
-  /* Did the target like it?  No. Reject the change. */
+  /* Did the target like it?  No. Reject the change and revert to the
+     old architecture.  */
   if (new_gdbarch == NULL)
     {
       if (gdbarch_debug)
        fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Target rejected architecture\n");
+      swapin_gdbarch_swap (old_gdbarch);
+      current_gdbarch = old_gdbarch;
       return 0;
     }
 
-  /* Did the architecture change?  No. Do nothing. */
-  if (current_gdbarch == new_gdbarch)
+  /* Did the architecture change?  No.  Oops, put the old architecture
+     back.  */
+  if (old_gdbarch == new_gdbarch)
     {
       if (gdbarch_debug)
        fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Architecture 0x%08lx (%s) unchanged\n",
                            (long) new_gdbarch,
                            new_gdbarch->bfd_arch_info->printable_name);
+      swapin_gdbarch_swap (old_gdbarch);
+      current_gdbarch = old_gdbarch;
       return 1;
     }
 
-  /* Swap all data belonging to the old target out */
-  swapout_gdbarch_swap (current_gdbarch);
-
   /* Is this a pre-existing architecture?  Yes. Move it to the front
      of the list of architectures (keeping the list sorted Most
      Recently Used) and then copy it in.  */
@@ -5035,14 +5046,10 @@ gdbarch_update_p (struct gdbarch_info info)
   new_gdbarch->dump_tdep = rego->dump_tdep;
   verify_gdbarch (new_gdbarch);
 
-  /* Initialize the per-architecture memory (swap) areas.
-     CURRENT_GDBARCH must be update before these modules are
-     called. */
-  init_gdbarch_swap (new_gdbarch);
-  
-  /* Initialize the per-architecture data-pointer of all parties that
-     registered an interest in this architecture.  CURRENT_GDBARCH
-     must be updated before these modules are called. */
+  /* Initialize the per-architecture data-pointers and swap areas for
+     all parties that registered an interest in this architecture.
+     CURRENT_GDBARCH must be updated before these modules are called.
+     The swap area's will have already been initialized to zero.  */
   init_gdbarch_data (new_gdbarch);
   architecture_changed_event ();
 
index e1442f312ac617b5970403abbfcaa60811b3ad2e..f99d29ab81241804b18b358db0827b8de0fcfaba 100755 (executable)
@@ -2079,6 +2079,7 @@ int
 gdbarch_update_p (struct gdbarch_info info)
 {
   struct gdbarch *new_gdbarch;
+  struct gdbarch *old_gdbarch;
   struct gdbarch_registration *rego;
 
   /* Fill in missing parts of the INFO struct using a number of
@@ -2147,30 +2148,40 @@ gdbarch_update_p (struct gdbarch_info info)
       return 0;
     }
 
+  /* Swap the data belonging to the old target out.  This stops the
+     ->init() function trying to refer to the previous architecture.  */
+  swapout_gdbarch_swap (current_gdbarch);
+  init_gdbarch_swap (current_gdbarch);
+  old_gdbarch = current_gdbarch;
+  current_gdbarch = NULL;
+
   /* Ask the target for a replacement architecture. */
   new_gdbarch = rego->init (info, rego->arches);
 
-  /* Did the target like it?  No. Reject the change. */
+  /* Did the target like it?  No. Reject the change and revert to the
+     old architecture.  */
   if (new_gdbarch == NULL)
     {
       if (gdbarch_debug)
        fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Target rejected architecture\\n");
+      swapin_gdbarch_swap (old_gdbarch);
+      current_gdbarch = old_gdbarch;
       return 0;
     }
 
-  /* Did the architecture change?  No. Do nothing. */
-  if (current_gdbarch == new_gdbarch)
+  /* Did the architecture change?  No.  Oops, put the old architecture
+     back.  */
+  if (old_gdbarch == new_gdbarch)
     {
       if (gdbarch_debug)
        fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Architecture 0x%08lx (%s) unchanged\\n",
                            (long) new_gdbarch,
                            new_gdbarch->bfd_arch_info->printable_name);
+      swapin_gdbarch_swap (old_gdbarch);
+      current_gdbarch = old_gdbarch;
       return 1;
     }
 
-  /* Swap all data belonging to the old target out */
-  swapout_gdbarch_swap (current_gdbarch);
-
   /* Is this a pre-existing architecture?  Yes. Move it to the front
      of the list of architectures (keeping the list sorted Most
      Recently Used) and then copy it in.  */
@@ -2227,14 +2238,10 @@ gdbarch_update_p (struct gdbarch_info info)
   new_gdbarch->dump_tdep = rego->dump_tdep;
   verify_gdbarch (new_gdbarch);
 
-  /* Initialize the per-architecture memory (swap) areas.
-     CURRENT_GDBARCH must be update before these modules are
-     called. */
-  init_gdbarch_swap (new_gdbarch);
-  
-  /* Initialize the per-architecture data-pointer of all parties that
-     registered an interest in this architecture.  CURRENT_GDBARCH
-     must be updated before these modules are called. */
+  /* Initialize the per-architecture data-pointers and swap areas for
+     all parties that registered an interest in this architecture.
+     CURRENT_GDBARCH must be updated before these modules are called.
+     The swap area's will have already been initialized to zero.  */
   init_gdbarch_data (new_gdbarch);
   architecture_changed_event ();