* ns32k-tdep.c: include gdbtypes.h, inferior.h, regcache.h,
authorJason Thorpe <thorpej@netbsd.org>
Mon, 27 May 2002 01:05:16 +0000 (01:05 +0000)
committerJason Thorpe <thorpej@netbsd.org>
Mon, 27 May 2002 01:05:16 +0000 (01:05 +0000)
target.s, arch-utils.h, ns32k-tdep.h.  Make many functions
static.  Rename some register numbers to put them in ns32k-tdep
private namespace.
(ns32k_get_saved_register, ns32k_gdbarch_init_32082,
ns32k_gdbarch_init_32382, ns32k_gdbarch_init, ns32k_dump_tdep): New
functions.
(_initialize_ns32k_tdep): Use gdbarch_register.
* ns32k-tdep.h: New file.
* ns32knbsd-tdep.c: New file.
* config/ns32k/nbsdaout.mt (TDEPFILES): Add ns32knbsd-tdep.o.
* config/ns32k/tm-nbsd.h: Include "ns32k/tm-ns32k.h".
(IN_SOLIB_CALL_TRAMPOLINE, REGISTER_NAME, NUM_REGS,
REGISTER_BYTES, REGISTER_BYTE): Remove.
* config/ns32k/tm-ns32k.h: New file.
* config/ns32k/tm-umax.h: Remove.

gdb/ChangeLog
gdb/config/ns32k/nbsdaout.mt
gdb/config/ns32k/tm-nbsd.h
gdb/config/ns32k/tm-ns32k.h [new file with mode: 0644]
gdb/config/ns32k/tm-umax.h [deleted file]
gdb/ns32k-tdep.c
gdb/ns32k-tdep.h [new file with mode: 0644]
gdb/ns32knbsd-tdep.c [new file with mode: 0644]

index dfb3443..655cd00 100644 (file)
@@ -1,5 +1,24 @@
 2002-05-26  Jason Thorpe  <thorpej@wasabisystems.com>
 
+       * ns32k-tdep.c: include gdbtypes.h, inferior.h, regcache.h,
+       target.s, arch-utils.h, ns32k-tdep.h.  Make many functions
+       static.  Rename some register numbers to put them in ns32k-tdep
+       private namespace.
+       (ns32k_get_saved_register, ns32k_gdbarch_init_32082,
+       ns32k_gdbarch_init_32382, ns32k_gdbarch_init, ns32k_dump_tdep): New
+       functions.
+       (_initialize_ns32k_tdep): Use gdbarch_register.
+       * ns32k-tdep.h: New file.
+       * ns32knbsd-tdep.c: New file.
+       * config/ns32k/nbsdaout.mt (TDEPFILES): Add ns32knbsd-tdep.o.
+       * config/ns32k/tm-nbsd.h: Include "ns32k/tm-ns32k.h".
+       (IN_SOLIB_CALL_TRAMPOLINE, REGISTER_NAME, NUM_REGS,
+       REGISTER_BYTES, REGISTER_BYTE): Remove.
+       * config/ns32k/tm-ns32k.h: New file.
+       * config/ns32k/tm-umax.h: Remove.
+
+2002-05-26  Jason Thorpe  <thorpej@wasabisystems.com>
+
        * ns32k-tdep.c (ns32k_saved_pc_after_call,
        ns32k_store_struct_return, ns32k_extract_return_value,
        ns32k_store_return_value, ns32k_extract_struct_value_address): New
index 14d37f9..24418f4 100644 (file)
@@ -1,3 +1,3 @@
 # Target: PC532 running NetBSD
-TDEPFILES= ns32k-tdep.o
+TDEPFILES= ns32k-tdep.o ns32knbsd-tdep.o
 TM_FILE= tm-nbsd.h
index 5081c35..88b4e22 100644 (file)
 
 /* Most definitions from umax could be used. */
 
-#include "ns32k/tm-umax.h"
-
-/* Return non-zero if we are in a shared library trampoline code stub. */
-#define IN_SOLIB_CALL_TRAMPOLINE(pc, name) \
-  (name && !strcmp(name, "_DYNAMIC"))
+#include "ns32k/tm-ns32k.h"
 
 /* Saved Pc.  Get it from sigcontext if within sigtramp.  */
 
 /* Offset to saved PC in sigcontext, from <machine/signal.h>.  */
 #define SIGCONTEXT_PC_OFFSET 20
 
-/* tm-umax.h assumes a 32082 fpu. We have a 32382 fpu. */
-
-#undef REGISTER_NAME
-#define REGISTER_NAME(REGNUM) ns32k_register_name_32382((REGNUM))
-
-#undef NUM_REGS
-#define NUM_REGS               29
-
-/* Total amount of space needed to store our copies of the machine's
-   register state, the array `registers'.  */
-#undef REGISTER_BYTES
-#define REGISTER_BYTES \
-  ((NUM_REGS - 4) * REGISTER_RAW_SIZE(R0_REGNUM) \
-   + 8            * REGISTER_RAW_SIZE(LP0_REGNUM))
-
-#undef  REGISTER_BYTE
-#define REGISTER_BYTE(N) ns32k_register_byte_32382 ((N))
-
 #endif /* TM_NBSD_H */
diff --git a/gdb/config/ns32k/tm-ns32k.h b/gdb/config/ns32k/tm-ns32k.h
new file mode 100644 (file)
index 0000000..cd15942
--- /dev/null
@@ -0,0 +1,39 @@
+/* Definitions to make GDB run on an encore under umax 4.2
+   Copyright 1987, 1989, 1991, 1993, 1994, 1998, 1999, 2000, 2001, 2002
+   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
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef TM_NS32K_H
+#define TM_NS32K_H
+
+#define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL
+
+/* Need to get function ends by adding this to epilogue address from .bf
+   record, not using x_fsize field.  */
+#define FUNCTION_EPILOGUE_SIZE 4
+
+/* Address of end of stack space.  */
+
+#ifndef STACK_END_ADDR
+#define STACK_END_ADDR (0xfffff000)
+#endif
+
+#define NUM_GENERAL_REGS       8
+
+#endif /* TM_NS32K_H */
diff --git a/gdb/config/ns32k/tm-umax.h b/gdb/config/ns32k/tm-umax.h
deleted file mode 100644 (file)
index 0ddd6d1..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/* Definitions to make GDB run on an encore under umax 4.2
-   Copyright 1987, 1989, 1991, 1993, 1994, 1998, 1999, 2000, 2001, 2002
-   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
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#include "regcache.h"
-
-struct value;
-struct type;
-
-/* Need to get function ends by adding this to epilogue address from .bf
-   record, not using x_fsize field.  */
-#define FUNCTION_EPILOGUE_SIZE 4
-
-/* Offset from address of function to start of its code.
-   Zero on most machines.  */
-
-#define FUNCTION_START_OFFSET 0
-
-/* Advance PC across any function entry prologue instructions
-   to reach some "real" code.  */
-
-extern CORE_ADDR umax_skip_prologue (CORE_ADDR);
-#define SKIP_PROLOGUE(pc) (umax_skip_prologue (pc))
-
-CORE_ADDR ns32k_saved_pc_after_call (struct frame_info *);
-#define SAVED_PC_AFTER_CALL(frame) ns32k_saved_pc_after_call ((frame))
-
-/* Address of end of stack space.  */
-
-#ifndef STACK_END_ADDR
-#define STACK_END_ADDR (0xfffff000)
-#endif
-
-/* Stack grows downward.  */
-
-#define INNER_THAN(lhs,rhs) core_addr_lessthan ((lhs), (rhs))
-
-extern const unsigned char *ns32k_breakpoint_from_pc (CORE_ADDR *, int *);
-#define BREAKPOINT_FROM_PC(PCP, LENP) ns32k_breakpoint_from_pc ((PCP), (LENP))
-
-/* Amount PC must be decremented by after a breakpoint.
-   This is often the number of bytes in BREAKPOINT
-   but not always.  */
-
-#define DECR_PC_AFTER_BREAK 0
-
-/* Say how long (ordinary) registers are.  This is a piece of bogosity
-   used in push_word and a few other places; REGISTER_RAW_SIZE is the
-   real way to know how big a register is.  */
-
-#define REGISTER_SIZE 4
-
-/* Number of machine registers */
-
-#define NUM_REGS               25
-
-#define NUM_GENERAL_REGS       8
-
-extern char *ns32k_register_name_32082 (int);
-extern char *ns32k_register_name_32382 (int);
-
-#define REGISTER_NAME(REGNUM) ns32k_register_name_32082(REGNUM)
-
-/* Register numbers of various important registers.
-   Note that some of these values are "real" register numbers,
-   and correspond to the general registers of the machine,
-   and some are "phony" register numbers which are too large
-   to be actual register numbers as far as the user is concerned
-   but do serve to get the desired values when passed to read_register.  */
-
-#define        R0_REGNUM 0             /* General register 0 */
-#define FP0_REGNUM 8           /* Floating point register 0 */
-#define SP_REGNUM 16           /* Contains address of top of stack */
-#define AP_REGNUM FP_REGNUM
-#define FP_REGNUM 17           /* Contains address of executing stack frame */
-#define PC_REGNUM 18           /* Contains program counter */
-#define PS_REGNUM 19           /* Contains processor status */
-#define FPS_REGNUM 20          /* Floating point status register */
-#define LP0_REGNUM 21          /* Double register 0 (same as FP0) */
-
-/* Total amount of space needed to store our copies of the machine's
-   register state, the array `registers'.  */
-#define REGISTER_BYTES \
-  ((NUM_REGS - 4) * REGISTER_RAW_SIZE(R0_REGNUM) \
-   + 4            * REGISTER_RAW_SIZE(LP0_REGNUM))
-
-/* Index within `registers' of the first byte of the space for
-   register N.  */
-extern int ns32k_register_byte_32082 (int);
-extern int ns32k_register_byte_32382 (int);
-#define REGISTER_BYTE(N) ns32k_register_byte_32082 ((N))
-
-extern int ns32k_register_raw_size (int);
-#define REGISTER_RAW_SIZE(N) ns32k_register_raw_size ((N))
-
-extern int ns32k_register_virtual_size (int);
-#define REGISTER_VIRTUAL_SIZE(N) ns32k_register_virtual_size ((N))
-
-/* Largest value REGISTER_RAW_SIZE can have.  */
-
-#define MAX_REGISTER_RAW_SIZE 8
-
-/* Largest value REGISTER_VIRTUAL_SIZE can have.  */
-
-#define MAX_REGISTER_VIRTUAL_SIZE 8
-
-struct type *ns32k_register_virtual_type (int);
-#define REGISTER_VIRTUAL_TYPE(N) ns32k_register_virtual_type ((N))
-
-extern void ns32k_store_struct_return (CORE_ADDR, CORE_ADDR);
-#define STORE_STRUCT_RETURN(ADDR, SP) \
-  ns32k_store_struct_return ((ADDR), (SP))
-
-extern void ns32k_extract_return_value (struct type *, char *, char *);
-#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
-  ns32k_extract_return_value ((TYPE), (REGBUF), (VALBUF))
-
-extern void ns32k_store_return_value (struct type *, char *);
-#define STORE_RETURN_VALUE(TYPE,VALBUF) \
-  ns32k_store_return_value ((TYPE), (VALBUF))
-
-extern CORE_ADDR ns32k_extract_struct_value_address (char *);
-#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
-  ns32k_extract_struct_value_address ((REGBUF))
-\f
-/* Describe the pointer in each stack frame to the previous stack frame
-   (its caller).  */
-
-CORE_ADDR ns32k_frame_chain (struct frame_info *);
-#define FRAME_CHAIN(thisframe) ns32k_frame_chain ((thisframe))
-
-CORE_ADDR ns32k_frame_saved_pc (struct frame_info *);
-#define FRAME_SAVED_PC(FRAME) ns32k_frame_saved_pc ((FRAME))
-
-CORE_ADDR ns32k_frame_args_address (struct frame_info *);
-#define FRAME_ARGS_ADDRESS(fi) ns32k_frame_args_address ((fi))
-
-CORE_ADDR ns32k_frame_locals_address (struct frame_info *);
-#define FRAME_LOCALS_ADDRESS(fi) ns32k_frame_locals_address ((fi))
-
-/* Return number of args passed to a frame.
-   Can return -1, meaning no way to tell.  */
-
-extern int umax_frame_num_args (struct frame_info *);
-#define FRAME_NUM_ARGS(fi) (umax_frame_num_args ((fi)))
-
-/* Return number of bytes at start of arglist that are not really args.  */
-
-#define FRAME_ARGS_SKIP 8
-
-void ns32k_frame_init_saved_regs (struct frame_info *);
-#define FRAME_INIT_SAVED_REGS(FI) ns32k_frame_init_saved_regs ((FI))
-
-\f
-/* Things needed for making the inferior call functions.  */
-
-extern void ns32k_push_dummy_frame (void);
-#define PUSH_DUMMY_FRAME ns32k_push_dummy_frame ()
-
-extern void ns32k_pop_frame (void);
-#define POP_FRAME ns32k_pop_frame ()
-
-extern LONGEST ns32k_call_dummy_words[];
-#define CALL_DUMMY_WORDS ns32k_call_dummy_words
-
-extern int sizeof_ns32k_call_dummy_words;
-#define SIZEOF_CALL_DUMMY_WORDS sizeof_ns32k_call_dummy_words
-
-#define CALL_DUMMY_START_OFFSET        3
-
-extern void ns32k_fix_call_dummy (char *, CORE_ADDR, CORE_ADDR, int,
-                                  struct value **, struct type *, int);
-#define FIX_CALL_DUMMY(dummy, pc, fun, nargs, args, type, gcc_p) \
-  ns32k_fix_call_dummy ((dummy), (pc), (fun), (nargs), (args), (type), (gcc_p))
index 752e075..5d4a885 100644 (file)
@@ -1,4 +1,4 @@
-/* Print NS 32000 instructions for GDB, the GNU debugger.
+/* Target dependent code for the NS32000, for GDB.
    Copyright 1986, 1988, 1991, 1992, 1994, 1995, 1998, 1999, 2000, 2001,
    2002 Free Software Foundation, Inc.
 
 
 #include "defs.h"
 #include "frame.h"
+#include "gdbtypes.h"
 #include "gdbcore.h"
+#include "inferior.h"
+#include "regcache.h"
+#include "target.h"
+
+#include "arch-utils.h"
+
+#include "ns32k-tdep.h"
 
 static int sign_extend (int value, int bits);
 static CORE_ADDR ns32k_get_enter_addr (CORE_ADDR);
 static int ns32k_localcount (CORE_ADDR enter_pc);
 static void flip_bytes (void *, int);
 
-char *
+static char *
 ns32k_register_name_32082 (int regno)
 {
   static char *register_names[] =
@@ -47,7 +55,7 @@ ns32k_register_name_32082 (int regno)
   return (register_names[regno]);
 }
 
-char *
+static char *
 ns32k_register_name_32382 (int regno)
 {
   static char *register_names[] =
@@ -67,16 +75,16 @@ ns32k_register_name_32382 (int regno)
   return (register_names[regno]);
 }
 
-int
+static int
 ns32k_register_byte_32082 (int regno)
 {
-  if (regno >= LP0_REGNUM)
-    return (LP0_REGNUM * 4) + ((regno - LP0_REGNUM) * 8);
+  if (regno >= NS32K_LP0_REGNUM)
+    return (NS32K_LP0_REGNUM * 4) + ((regno - NS32K_LP0_REGNUM) * 8);
 
   return (regno * 4);
 }
 
-int
+static int
 ns32k_register_byte_32382 (int regno)
 {
   /* This is a bit yuk.  The even numbered double precision floating
@@ -85,27 +93,27 @@ ns32k_register_byte_32382 (int regno)
      registers are at the end.  Doing it this way is compatible for both
      32081 and 32381 equipped machines.  */
 
-  return ((regno < LP0_REGNUM ? regno
-           : (regno - LP0_REGNUM) & 1 ? regno - 1
-           : (regno - LP0_REGNUM + FP0_REGNUM)) * 4);
+  return ((regno < NS32K_LP0_REGNUM ? regno
+           : (regno - NS32K_LP0_REGNUM) & 1 ? regno - 1
+           : (regno - NS32K_LP0_REGNUM + FP0_REGNUM)) * 4);
 }
 
-int
+static int
 ns32k_register_raw_size (int regno)
 {
   /* All registers are 4 bytes, except for the doubled floating
      registers.  */
 
-  return ((regno >= LP0_REGNUM) ? 8 : 4);
+  return ((regno >= NS32K_LP0_REGNUM) ? 8 : 4);
 }
 
-int
+static int
 ns32k_register_virtual_size (int regno)
 {
-  return ((regno >= LP0_REGNUM) ? 8 : 4);
+  return ((regno >= NS32K_LP0_REGNUM) ? 8 : 4);
 }
 
-struct type *
+static struct type *
 ns32k_register_virtual_type (int regno)
 {
   if (regno < FP0_REGNUM)
@@ -114,7 +122,7 @@ ns32k_register_virtual_type (int regno)
   if (regno < FP0_REGNUM + 8)
     return (builtin_type_float);
 
-  if (regno < LP0_REGNUM)
+  if (regno < NS32K_LP0_REGNUM)
     return (builtin_type_int); 
 
   return (builtin_type_double);
@@ -125,7 +133,7 @@ ns32k_register_virtual_type (int regno)
    the new frame is not set up until the new function executes some
    instructions.  */
 
-CORE_ADDR
+static CORE_ADDR
 ns32k_saved_pc_after_call (struct frame_info *frame)
 {
   return (read_memory_integer (read_register (SP_REGNUM), 4));
@@ -134,7 +142,7 @@ ns32k_saved_pc_after_call (struct frame_info *frame)
 /* Advance PC across any function entry prologue instructions
    to reach some "real" code.  */
 
-CORE_ADDR
+static CORE_ADDR
 umax_skip_prologue (CORE_ADDR pc)
 {
   register unsigned char op = read_memory_integer (pc, 1);
@@ -151,7 +159,7 @@ umax_skip_prologue (CORE_ADDR pc)
   return pc;
 }
 \f
-const unsigned char *
+static const unsigned char *
 ns32k_breakpoint_from_pc (CORE_ADDR *pcp, int *lenp)
 {
   static const unsigned char breakpoint_insn[] = { 0xf2 };
@@ -166,7 +174,7 @@ ns32k_breakpoint_from_pc (CORE_ADDR *pcp, int *lenp)
    so this will often not work properly.  If the arg names
    are known, it's likely most of them will be printed. */
 
-int
+static int
 umax_frame_num_args (struct frame_info *fi)
 {
   int numargs;
@@ -292,7 +300,7 @@ ns32k_get_enter_addr (CORE_ADDR pc)
   return enter_addr;           /* pc is between enter and exit */
 }
 
-CORE_ADDR
+static CORE_ADDR
 ns32k_frame_chain (struct frame_info *frame)
 {
   /* In the case of the NS32000 series, the frame's nominal address is the
@@ -305,7 +313,7 @@ ns32k_frame_chain (struct frame_info *frame)
   return (read_memory_integer (frame->frame, 4));
 }
 
-CORE_ADDR
+static CORE_ADDR
 ns32k_frame_saved_pc (struct frame_info *frame)
 {
   if (frame->signal_handler_caller)
@@ -314,7 +322,7 @@ ns32k_frame_saved_pc (struct frame_info *frame)
   return (read_memory_integer (frame->frame + 4, 4));
 }
 
-CORE_ADDR
+static CORE_ADDR
 ns32k_frame_args_address (struct frame_info *frame)
 {
   if (ns32k_get_enter_addr (frame->pc) > 1)
@@ -323,18 +331,63 @@ ns32k_frame_args_address (struct frame_info *frame)
   return (read_register (SP_REGNUM) - 4);
 }
 
-CORE_ADDR
+static CORE_ADDR
 ns32k_frame_locals_address (struct frame_info *frame)
 {
   return (frame->frame);
 }
 
+static void
+ns32k_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
+                          struct frame_info *frame, int regnum,
+                         enum lval_type *lval)
+{
+  CORE_ADDR addr;
+
+  if (!target_has_registers)
+    error ("No registers.");
+
+  /* Normal systems don't optimize out things with register numbers.  */
+  if (optimized != NULL)
+    *optimized = 0;
+  addr = find_saved_register (frame, regnum);
+  if (addr != 0)
+    {
+      if (lval != NULL)
+       *lval = lval_memory;
+      if (regnum == SP_REGNUM)
+       {
+         if (raw_buffer != NULL)
+           {
+             /* Put it back in target format.  */
+             store_address (raw_buffer, REGISTER_RAW_SIZE (regnum),
+                            (LONGEST) addr);
+           }
+         if (addrp != NULL)
+           *addrp = 0;
+         return;
+       }
+      if (raw_buffer != NULL)
+       target_read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
+    }
+  else
+    {
+      if (lval != NULL)
+       *lval = lval_register;
+      addr = REGISTER_BYTE (regnum);
+      if (raw_buffer != NULL)
+       read_register_gen (regnum, raw_buffer);
+    }
+  if (addrp != NULL)
+    *addrp = addr;
+}
+
 /* Code to initialize the addresses of the saved registers of frame described
    by FRAME_INFO.  This includes special registers such as pc and fp saved in
    special ways in the stack frame.  sp is even more special: the address we
    return for it IS the sp for the next frame.  */
 
-void
+static void
 ns32k_frame_init_saved_regs (struct frame_info *frame)
 {
   int regmask, regnum;
@@ -371,7 +424,7 @@ ns32k_frame_init_saved_regs (struct frame_info *frame)
     }
 }
 
-void
+static void
 ns32k_push_dummy_frame (void)
 {
   CORE_ADDR sp = read_register (SP_REGNUM);
@@ -387,7 +440,7 @@ ns32k_push_dummy_frame (void)
   write_register (SP_REGNUM, sp);
 }
 
-void
+static void
 ns32k_pop_frame (void)
 {
   struct frame_info *frame = get_current_frame ();
@@ -417,19 +470,19 @@ ns32k_pop_frame (void)
 
    It is 16 bytes long.  */
 
-LONGEST ns32k_call_dummy_words[] =
+static LONGEST ns32k_call_dummy_words[] =
 {
   0x7f00ff82,
   0x0201c0ae,
   0x01a57f03,
   0xf2040302
 };
-int sizeof_ns32k_call_dummy_words = sizeof (ns32k_call_dummy_words);
+static int sizeof_ns32k_call_dummy_words = sizeof (ns32k_call_dummy_words);
 
 #define NS32K_CALL_DUMMY_ADDR         5
 #define NS32K_CALL_DUMMY_NARGS        11
 
-void
+static void
 ns32k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
                       struct value **args, struct type *type, int gcc_p)
 {
@@ -444,13 +497,13 @@ ns32k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
   store_unsigned_integer (dummy + NS32K_CALL_DUMMY_NARGS, 4, flipped);
 }
 \f
-void
+static void
 ns32k_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
 {
   /* On this machine, this is a no-op (Encore Umax didn't use GCC).  */
 }
 
-void
+static void
 ns32k_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
 {
   memcpy (valbuf,
@@ -458,21 +511,163 @@ ns32k_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
                                  FP0_REGNUM : 0), TYPE_LENGTH (valtype));
 }
 
-void
+static void
 ns32k_store_return_value (struct type *valtype, char *valbuf)
 {
   write_register_bytes (TYPE_CODE (valtype) == TYPE_CODE_FLT ?
                        FP0_REGNUM : 0, valbuf, TYPE_LENGTH (valtype));
 }
 
-CORE_ADDR
+static CORE_ADDR
 ns32k_extract_struct_value_address (char *regbuf)
 {
   return (extract_address (regbuf + REGISTER_BYTE (0), REGISTER_RAW_SIZE (0)));
 }
 \f
 void
+ns32k_gdbarch_init_32082 (struct gdbarch *gdbarch)
+{
+  set_gdbarch_num_regs (gdbarch, NS32K_NUM_REGS_32082);
+
+  set_gdbarch_register_name (gdbarch, ns32k_register_name_32082);
+  set_gdbarch_register_bytes (gdbarch, NS32K_REGISTER_BYTES_32082);
+  set_gdbarch_register_byte (gdbarch, ns32k_register_byte_32082);
+}
+
+void
+ns32k_gdbarch_init_32382 (struct gdbarch *gdbarch)
+{
+  set_gdbarch_num_regs (gdbarch, NS32K_NUM_REGS_32382);
+
+  set_gdbarch_register_name (gdbarch, ns32k_register_name_32382);
+  set_gdbarch_register_bytes (gdbarch, NS32K_REGISTER_BYTES_32382);
+  set_gdbarch_register_byte (gdbarch, ns32k_register_byte_32382);
+}
+
+/* Initialize the current architecture based on INFO.  If possible, re-use an
+   architecture from ARCHES, which is a list of architectures already created
+   during this debugging session.
+
+   Called e.g. at program startup, when reading a core file, and when reading
+   a binary file.  */
+
+static struct gdbarch *
+ns32k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+{
+  struct gdbarch_tdep *tdep;
+  struct gdbarch *gdbarch;
+  enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
+
+  /* Try to determine the OS ABI of the object we are loading.  */
+  if (info.abfd != NULL)
+    {
+      osabi = gdbarch_lookup_osabi (info.abfd);
+    }
+
+  /* Find a candidate among extant architectures.  */
+  for (arches = gdbarch_list_lookup_by_info (arches, &info);
+       arches != NULL;
+       arches = gdbarch_list_lookup_by_info (arches->next, &info))
+    {
+      /* Make sure the OS ABI selection matches.  */
+      tdep = gdbarch_tdep (arches->gdbarch);
+      if (tdep && tdep->osabi == osabi)
+       return arches->gdbarch;
+    }
+
+  tdep = xmalloc (sizeof (struct gdbarch_tdep));
+  gdbarch = gdbarch_alloc (&info, tdep);
+
+  tdep->osabi = osabi;
+
+  /* Register info */
+  ns32k_gdbarch_init_32082 (gdbarch);
+  set_gdbarch_num_regs (gdbarch, NS32K_SP_REGNUM);
+  set_gdbarch_num_regs (gdbarch, NS32K_FP_REGNUM);
+  set_gdbarch_num_regs (gdbarch, NS32K_PC_REGNUM);
+  set_gdbarch_num_regs (gdbarch, NS32K_PS_REGNUM);
+
+  set_gdbarch_register_size (gdbarch, NS32K_REGISTER_SIZE);
+  set_gdbarch_register_raw_size (gdbarch, ns32k_register_raw_size);
+  set_gdbarch_max_register_raw_size (gdbarch, NS32K_MAX_REGISTER_RAW_SIZE);
+  set_gdbarch_register_virtual_size (gdbarch, ns32k_register_virtual_size);
+  set_gdbarch_max_register_virtual_size (gdbarch,
+                                         NS32K_MAX_REGISTER_VIRTUAL_SIZE);
+  set_gdbarch_register_virtual_type (gdbarch, ns32k_register_virtual_type);
+
+  /* Frame and stack info */
+  set_gdbarch_skip_prologue (gdbarch, umax_skip_prologue);
+  set_gdbarch_saved_pc_after_call (gdbarch, ns32k_saved_pc_after_call);
+
+  set_gdbarch_frame_num_args (gdbarch, umax_frame_num_args);
+  set_gdbarch_frameless_function_invocation (gdbarch,
+                                   generic_frameless_function_invocation_not);
+  
+  set_gdbarch_frame_chain (gdbarch, ns32k_frame_chain);
+  set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
+  set_gdbarch_frame_saved_pc (gdbarch, ns32k_frame_saved_pc);
+
+  set_gdbarch_frame_args_address (gdbarch, ns32k_frame_args_address);
+  set_gdbarch_frame_locals_address (gdbarch, ns32k_frame_locals_address);
+
+  set_gdbarch_frame_init_saved_regs (gdbarch, ns32k_frame_init_saved_regs);
+
+  set_gdbarch_frame_args_skip (gdbarch, 8);
+
+  set_gdbarch_get_saved_register (gdbarch, ns32k_get_saved_register);
+
+  set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
+
+  /* Return value info */
+  set_gdbarch_store_struct_return (gdbarch, ns32k_store_struct_return);
+  set_gdbarch_extract_return_value (gdbarch, ns32k_extract_return_value);
+  set_gdbarch_store_return_value (gdbarch, ns32k_store_return_value);
+  set_gdbarch_extract_struct_value_address (gdbarch,
+                                            ns32k_extract_struct_value_address);
+
+  /* Call dummy info */
+  set_gdbarch_push_dummy_frame (gdbarch, ns32k_push_dummy_frame);
+  set_gdbarch_pop_frame (gdbarch, ns32k_pop_frame);
+  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
+  set_gdbarch_call_dummy_p (gdbarch, 1);
+  set_gdbarch_call_dummy_words (gdbarch, ns32k_call_dummy_words);
+  set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof_ns32k_call_dummy_words);
+  set_gdbarch_fix_call_dummy (gdbarch, ns32k_fix_call_dummy);
+  set_gdbarch_call_dummy_start_offset (gdbarch, 3);
+  set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 0);
+  set_gdbarch_use_generic_dummy_frames (gdbarch, 0);
+  set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_on_stack);
+  set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
+
+  /* Breakpoint info */
+  set_gdbarch_decr_pc_after_break (gdbarch, 0);
+  set_gdbarch_breakpoint_from_pc (gdbarch, ns32k_breakpoint_from_pc);
+
+  /* Misc info */
+  set_gdbarch_function_start_offset (gdbarch, 0);
+
+  /* Hook in OS ABI-specific overrides, if they have been registered.  */
+  gdbarch_init_osabi (info, gdbarch, osabi);
+
+  return (gdbarch);
+}
+
+static void
+ns32k_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+  if (tdep == NULL)
+    return;
+
+  fprintf_unfiltered (file, "ns32k_dump_tdep: OS ABI = %s\n",
+                     gdbarch_osabi_name (tdep->osabi));
+}
+
+void
 _initialize_ns32k_tdep (void)
 {
+  gdbarch_register (bfd_arch_ns32k, ns32k_gdbarch_init, ns32k_dump_tdep);
+
   tm_print_insn = print_insn_ns32k;
 }
diff --git a/gdb/ns32k-tdep.h b/gdb/ns32k-tdep.h
new file mode 100644 (file)
index 0000000..c046324
--- /dev/null
@@ -0,0 +1,66 @@
+/* Target-dependent definitions for GDB on NS32000 systems.
+   Copyright 1987, 1989, 1991, 1993, 1994, 1998, 1999, 2000, 2001, 2002
+   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
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef NS32K_TDEP_H
+#define NS32K_TDEP_H
+
+#include "osabi.h"
+
+/* Register numbers of various important registers.
+   Note that some of these values are "real" register numbers,
+   and correspond to the general registers of the machine,
+   and some are "phony" register numbers which are too large
+   to be actual register numbers as far as the user is concerned
+   but do serve to get the desired values when passed to read_register.  */
+
+#define NS32K_R0_REGNUM   0    /* General register 0 */
+#define NS32K_FP0_REGNUM  8    /* Floating point register 0 */
+#define NS32K_SP_REGNUM          16    /* Contains address of top of stack */
+#define NS32K_AP_REGNUM   NS32K_FP_REGNUM
+#define NS32K_FP_REGNUM   17   /* Contains address of executing stack frame */
+#define NS32K_PC_REGNUM   18   /* Contains program counter */
+#define NS32K_PS_REGNUM   19   /* Contains processor status */
+#define NS32K_FPS_REGNUM  20   /* Floating point status register */
+#define NS32K_LP0_REGNUM  21   /* Double register 0 (same as FP0) */
+
+#define NS32K_NUM_REGS_32082 25
+#define NS32K_REGISTER_BYTES_32082 \
+  ((NS32K_NUM_REGS_32082 - 4) * 4 /* size of general purpose regs */ \
+   + 4                        * 8 /* size of floating point regs */)
+
+#define NS32K_NUM_REGS_32382 29
+#define NS32K_REGISTER_BYTES_32382 \
+  ((NS32K_NUM_REGS_32382 - 4) * 4 /* size of general purpose regs */ \
+   + 8                        * 8 /* size of floating point regs */)
+
+#define NS32K_REGISTER_SIZE             4
+#define NS32K_MAX_REGISTER_RAW_SIZE     8
+#define NS32K_MAX_REGISTER_VIRTUAL_SIZE 8
+
+struct gdbarch_tdep
+{
+  enum gdb_osabi osabi;
+};
+
+void ns32k_gdbarch_init_32082 (struct gdbarch *);
+void ns32k_gdbarch_init_32382 (struct gdbarch *);
+
+#endif /* NS32K_TDEP_H */
diff --git a/gdb/ns32knbsd-tdep.c b/gdb/ns32knbsd-tdep.c
new file mode 100644 (file)
index 0000000..1ca0b3b
--- /dev/null
@@ -0,0 +1,70 @@
+/* Target-dependent code for NS32000 systems running NetBSD.
+   Copyright 2002 Free Software Foundation, Inc. 
+   Contributed by Wasabi Systems, 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
+   (at your option) any later version.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "defs.h"
+
+#include "ns32k-tdep.h"
+
+static int
+ns32knbsd_aout_in_solib_call_trampoline (CORE_ADDR pc, char *name)
+{
+  if (strcmp (name, "_DYNAMIC") == 0)
+    return 1;
+
+  return 0;
+}
+
+static void
+ns32knbsd_init_abi_common (struct gdbarch_info info,
+                           struct gdbarch *gdbarch)
+{
+  /* We only support machines with the 32382 FPU.  */
+  ns32k_gdbarch_init_32382 (gdbarch);
+}
+
+static void
+ns32knbsd_init_abi_aout (struct gdbarch_info info,
+                         struct gdbarch *gdbarch)
+{
+  ns32knbsd_init_abi_common (info, gdbarch);
+
+  set_gdbarch_in_solib_call_trampoline (gdbarch,
+                                     ns32knbsd_aout_in_solib_call_trampoline);
+}
+
+static enum gdb_osabi
+ns32knbsd_aout_osabi_sniffer (bfd *abfd)
+{
+  if (strcmp (bfd_get_target (abfd), "a.out-ns32k-netbsd") == 0)
+    return GDB_OSABI_NETBSD_AOUT;
+
+  return GDB_OSABI_UNKNOWN;
+}
+
+void
+_initialize_ns32knbsd_tdep (void)
+{
+  gdbarch_register_osabi_sniffer (bfd_arch_ns32k, bfd_target_aout_flavour,
+                                 ns32knbsd_aout_osabi_sniffer);
+
+  gdbarch_register_osabi (bfd_arch_ns32k, GDB_OSABI_NETBSD_AOUT,
+                         ns32knbsd_init_abi_aout);
+}