* corefile.c (specify_exec_file_hook): Allow arbitrary number of
authorMark Alexander <marka@cygnus>
Mon, 22 Apr 1996 22:31:10 +0000 (22:31 +0000)
committerMark Alexander <marka@cygnus>
Mon, 22 Apr 1996 22:31:10 +0000 (22:31 +0000)
  hooks.
(call_extra_exec_file_hooks): New function.
* h8300-tdep.c: Lint; add .h files to provide missing declarations,
remove unused variables.
(set_machine_hook): New function.
(_initialize_h8300m): Initialize it.

PR 8849.

gdb/ChangeLog
gdb/corefile.c
gdb/h8300-tdep.c

index 1c1899b0d75846da674199fa7c77f6cdd8f76ff7..1765eaa91eca17867d509670efd258cd9d119505 100644 (file)
@@ -1,3 +1,13 @@
+Mon Apr 22 14:54:45 1996  Mark Alexander  <marka@superball.cygnus.com>
+
+       * corefile.c (specify_exec_file_hook): Allow arbitrary number of
+       hooks.
+       (call_extra_exec_file_hooks): New function.
+       * h8300-tdep.c: Lint; add .h files to provide missing declarations,
+       remove unused variables.
+       (set_machine_hook): New function.
+       (_initialize_h8300m): Initialize it.
+
 Fri Apr 19 15:03:49 1996  Ian Lance Taylor  <ian@cygnus.com>
 
        * remote-mips.c (encoding): Don't specify size, to avoid bug in
index a916bf8ac8134285540b087335cd4589d92b756e..65ea357db971a376a6697b145f686858fde39b9f 100644 (file)
@@ -36,9 +36,23 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 extern char registers[];
 
-/* Hook for `exec_file_command' command to call.  */
+/* Local function declarations.  */
 
-void (*exec_file_display_hook) PARAMS ((char *)) = NULL;
+static void call_extra_exec_file_hooks PARAMS ((char *filename));
+
+/* You can have any number of hooks for `exec_file_command' command to call.
+   If there's only one hook, it is set in exec_file_display hook.
+   If there are two or more hooks, they are set in exec_file_extra_hooks[],
+   and exec_file_display_hook is set to a function that calls all of them.
+   This extra complexity is needed to preserve compatibility with
+   old code that assumed that only one hook could be set, and which called
+   exec_file_display_hook directly.  */
+
+typedef void (*hook_type) PARAMS ((char *));
+
+hook_type exec_file_display_hook;              /* the original hook */
+static hook_type *exec_file_extra_hooks;       /* array of additional hooks */
+static int exec_file_hook_count = 0;           /* size of array */
 
 /* Binary file diddling handle for the core file.  */
 
@@ -67,6 +81,19 @@ core_file_command (filename, from_tty)
 }
 
 \f
+/* If there are two or more functions that wish to hook into exec_file_command,
+ * this function will call all of the hook functions. */
+
+static void
+call_extra_exec_file_hooks (filename)
+     char *filename;
+{
+  int i;
+
+  for (i = 0; i < exec_file_hook_count; i++)
+    (*exec_file_extra_hooks[i])(filename);
+}
+
 /* Call this to specify the hook for exec_file_command to call back.
    This is called from the x-window display code.  */
 
@@ -74,7 +101,33 @@ void
 specify_exec_file_hook (hook)
      void (*hook) PARAMS ((char *));
 {
-  exec_file_display_hook = hook;
+  hook_type *new_array;
+
+  if (exec_file_display_hook != NULL)
+    {
+      /* There's already a hook installed.  Arrange to have both it
+       * and the subsequent hooks called. */
+      if (exec_file_hook_count == 0)
+       {
+         /* If this is the first extra hook, initialize the hook array. */
+         exec_file_extra_hooks = (hook_type *) xmalloc (sizeof(hook_type));
+         exec_file_extra_hooks[0] = exec_file_display_hook;
+         exec_file_display_hook = call_extra_exec_file_hooks;
+         exec_file_hook_count = 1;
+       }
+
+      /* Grow the hook array by one and add the new hook to the end.
+         Yes, it's inefficient to grow it by one each time but since
+         this is hardly ever called it's not a big deal.  */
+      exec_file_hook_count++;
+      new_array =
+       (hook_type *) xrealloc (exec_file_extra_hooks,
+                               exec_file_hook_count * sizeof(hook_type));
+      exec_file_extra_hooks = new_array;
+      exec_file_extra_hooks[exec_file_hook_count - 1] = hook;
+    }
+  else
+    exec_file_display_hook = hook;
 }
 
 /* The exec file must be closed before running an inferior.
index 954e25816349b455a68336fc3a90567062b52065..32581e99dc724707d6bca402f1dd0c5ec921ff11 100644 (file)
@@ -29,6 +29,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "dis-asm.h"
 #include "gdbcmd.h"
 #include "gdbtypes.h"
+#include "gdbcore.h"
+#include "gdb_string.h"
+#include "value.h"
+
 
 #undef NUM_REGS
 #define NUM_REGS 11
@@ -52,7 +56,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define IS_MOVK_R5(x) (x==0x7905)
 #define IS_SUB_R5SP(x) (x==0x1957)
 
+/* Local function declarations.  */
+
 static CORE_ADDR examine_prologue ();
+static void set_machine_hook PARAMS ((char *filename));
 
 void frame_find_saved_regs ();
 CORE_ADDR 
@@ -137,9 +144,6 @@ frame_find_saved_regs (fi, fsr)
      struct frame_info *fi;
      struct frame_saved_regs *fsr;
 {
-  register CORE_ADDR next_addr;
-  register CORE_ADDR *saved_regs;
-  register int regnum;
   register struct frame_saved_regs *cache_fsr;
   extern struct obstack frame_cache_obstack;
   CORE_ADDR ip;
@@ -212,12 +216,8 @@ examine_prologue (ip, limit, after_prolog_fp, fsr, fi)
 {
   register CORE_ADDR next_ip;
   int r;
-  int i;
   int have_fp = 0;
-  register int src;
-  register struct pic_prologue_code *pcode;
   INSN_WORD insn_word;
-  int size, offset;
   /* Number of things pushed onto stack, starts at 2/4, 'cause the
      PC is already there */
   unsigned int reg_save_depth = h8300hmode ? 4 : 2;
@@ -378,7 +378,7 @@ h8300_pop_frame ()
   for (regnum = 0; regnum < 8; regnum++)
     {
       if (fsr.regs[regnum])
-       write_register (regnum, read_memory_integer(fsr.regs[regnum]), BINWORD);
+       write_register (regnum, read_memory_integer(fsr.regs[regnum], BINWORD));
 
       flush_cached_frames ();
     }
@@ -410,6 +410,19 @@ set_machine (args, from_tty)
   help_list (setmemorylist, "set memory ", -1, gdb_stdout);
 }
 
+/* set_machine_hook is called as the exec file is being opened, but
+   before the symbol file is opened.  This allows us to set the
+   h8300hmode flag based on the machine type specified in the exec
+   file.  This in turn will cause subsequently defined pointer types
+   to be 16 or 32 bits as appropriate for the machine.  */
+
+static void
+set_machine_hook (filename)
+     char *filename;
+{
+  h8300hmode = (bfd_get_mach (exec_bfd) == bfd_mach_h8300h);
+}
+
 void
 _initialize_h8300m ()
 {
@@ -422,6 +435,10 @@ _initialize_h8300m ()
 
   add_cmd ("h8300h", class_support, h8300h_command,
           "Set machine to be H8/300H.", &setmemorylist);
+
+  /* Add a hook to set the machine type when we're loading a file. */
+
+  specify_exec_file_hook(set_machine_hook);
 }