This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] gdbarch fixes to defaults (cleanup part 2)


Hello,

The attatched patch fixes a rather painful bug in the gdbarch code where
it would allow the specification of default architecture vector methods
but then always consider that default to be illegal.

It should now correctly handle the two cases:

	o	user specified default that is legal

	o	user specified default that is illegal

Hopefully this will make it easier people changing an existing target to
a gdbarch.  This patch also adds defaults for a number of recently added
targets.

The remaining parts to this series of patches will:

	o	Make gdbarch.[hc] responsible for
		default architecture vector when
		multi-arch is disabled.

	o	Move more code to gdbarch-utils.[hc]

They are less important.

For the sake of readability, I've included the patches to gdbarch.[hc]
(they are far easier to read than gdbarch.sh :-).

Its been tested on d10v-elf (multiarch) and Solaris 2.5.1 native.

	Andrew
Fri Mar 31 08:59:58 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* gdbarch-utils.h, gdbarch-utils.c: New files.
	* Makefile.in (SFILES, COMMON_OBS): Update.
	(gdbarch_utils_h) Define.
	(gdbarch-utils.o): Add dependencies.
	
	* gdbarch.c, gdbarch.sh: Include "gdbarch-utils.h". Fix code
 	handling default method values.
	(startup_gdbarch): Rename default_gdbarch, name misleading.
	(breakpoint_from_pc): Default to legacy_breakpoint_from_pc.
	(register_name): Default to legacy_register_name.
	(call_dummy_words): Default to legacy_call_dummy_words.
	(sizeof_call_dummy_words): Default to
 	legacy_sizeof_call_dummy_words.
	(register_convertible): Default to
 	generic_register_convertible_not.
	(breakpoint_from_pc): Default to legacy_breakpoint_from_pc.
	(remote_translate_xfer_address): Default to
 	generic_remote_translate_xfer_address.
	(frameless_function_invocation): Default to
 	generic_frameless_function_invocation_not.

Index: gdbarch.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.c,v
retrieving revision 1.6
diff -p -r1.6 gdbarch.c
*** gdbarch.c	2000/03/30 05:32:23	1.6
--- gdbarch.c	2000/03/31 22:49:48
***************
*** 34,39 ****
--- 34,40 ----
  
  
  #include "defs.h"
+ #include "gdbarch-utils.h"
  
  #if GDB_MULTI_ARCH
  #include "gdbcmd.h"
*************** struct gdbarch
*** 117,123 ****
       gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
       field is dumped out
  
!      ``default_gdbarch()'': Append an initial value to the static
       variable (base values on the host's c-type system).
  
       get_gdbarch(): Implement the set/get functions (probably using
--- 118,124 ----
       gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
       field is dumped out
  
!      ``startup_gdbarch()'': Append an initial value to the static
       variable (base values on the host's c-type system).
  
       get_gdbarch(): Implement the set/get functions (probably using
*************** struct gdbarch
*** 216,222 ****
  
  extern const struct bfd_arch_info bfd_default_arch_struct;
  
! struct gdbarch default_gdbarch = {
    /* basic architecture information */
    &bfd_default_arch_struct,
    BIG_ENDIAN,
--- 217,223 ----
  
  extern const struct bfd_arch_info bfd_default_arch_struct;
  
! struct gdbarch startup_gdbarch = {
    /* basic architecture information */
    &bfd_default_arch_struct,
    BIG_ENDIAN,
*************** struct gdbarch default_gdbarch = {
*** 308,316 ****
    0,
    0,
    0,
!   /* default_gdbarch() */
  };
! struct gdbarch *current_gdbarch = &default_gdbarch;
  
  
  /* Create a new ``struct gdbarch'' based in information provided by
--- 309,317 ----
    0,
    0,
    0,
!   /* startup_gdbarch() */
  };
! struct gdbarch *current_gdbarch = &startup_gdbarch;
  
  
  /* Create a new ``struct gdbarch'' based in information provided by
*************** gdbarch_alloc (const struct gdbarch_info
*** 334,339 ****
--- 335,341 ----
    gdbarch->sp_regnum = -1;
    gdbarch->fp_regnum = -1;
    gdbarch->pc_regnum = -1;
+   gdbarch->register_name = legacy_register_name;
    gdbarch->register_size = -1;
    gdbarch->register_bytes = -1;
    gdbarch->max_register_raw_size = -1;
*************** gdbarch_alloc (const struct gdbarch_info
*** 344,356 ****
--- 346,364 ----
    gdbarch->call_dummy_breakpoint_offset_p = -1;
    gdbarch->call_dummy_length = -1;
    gdbarch->call_dummy_p = -1;
+   gdbarch->call_dummy_words = legacy_call_dummy_words;
+   gdbarch->sizeof_call_dummy_words = legacy_sizeof_call_dummy_words;
    gdbarch->call_dummy_stack_adjust_p = -1;
    gdbarch->coerce_float_to_double = default_coerce_float_to_double;
+   gdbarch->register_convertible = generic_register_convertible_not;
+   gdbarch->breakpoint_from_pc = legacy_breakpoint_from_pc;
    gdbarch->memory_insert_breakpoint = default_memory_insert_breakpoint;
    gdbarch->memory_remove_breakpoint = default_memory_remove_breakpoint;
    gdbarch->decr_pc_after_break = -1;
    gdbarch->function_start_offset = -1;
+   gdbarch->remote_translate_xfer_address = generic_remote_translate_xfer_address;
    gdbarch->frame_args_skip = -1;
+   gdbarch->frameless_function_invocation = generic_frameless_function_invocation_not;
    /* gdbarch_alloc() */
  
    return gdbarch;
*************** verify_gdbarch (struct gdbarch *gdbarch)
*** 384,393 ****
    if (gdbarch->bfd_arch_info == NULL)
      internal_error ("verify_gdbarch: bfd_arch_info unset");
    /* Check those that need to be defined for the given multi-arch level. */
    if ((GDB_MULTI_ARCH >= 1)
-       && (0))
-     internal_error ("gdbarch: verify_gdbarch: bfd_vma_bit invalid");
-   if ((GDB_MULTI_ARCH >= 1)
        && (gdbarch->ptr_bit == 0))
      internal_error ("gdbarch: verify_gdbarch: ptr_bit invalid");
    if ((GDB_MULTI_ARCH >= 1)
--- 392,399 ----
    if (gdbarch->bfd_arch_info == NULL)
      internal_error ("verify_gdbarch: bfd_arch_info unset");
    /* Check those that need to be defined for the given multi-arch level. */
+   /* Skip verify of bfd_vma_bit, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 1)
        && (gdbarch->ptr_bit == 0))
      internal_error ("gdbarch: verify_gdbarch: ptr_bit invalid");
    if ((GDB_MULTI_ARCH >= 1)
*************** verify_gdbarch (struct gdbarch *gdbarch)
*** 441,449 ****
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->pc_regnum == -1))
      internal_error ("gdbarch: verify_gdbarch: pc_regnum invalid");
!   if ((GDB_MULTI_ARCH >= 2)
!       && (gdbarch->register_name == 0))
!     internal_error ("gdbarch: verify_gdbarch: register_name invalid");
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->register_size == -1))
      internal_error ("gdbarch: verify_gdbarch: register_size invalid");
--- 447,453 ----
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->pc_regnum == -1))
      internal_error ("gdbarch: verify_gdbarch: pc_regnum invalid");
!   /* Skip verify of register_name, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->register_size == -1))
      internal_error ("gdbarch: verify_gdbarch: register_size invalid");
*************** verify_gdbarch (struct gdbarch *gdbarch)
*** 495,500 ****
--- 499,506 ----
    if ((GDB_MULTI_ARCH >= 1)
        && (gdbarch->call_dummy_p == -1))
      internal_error ("gdbarch: verify_gdbarch: call_dummy_p invalid");
+   /* Skip verify of call_dummy_words, invalid_p == 0 */
+   /* Skip verify of sizeof_call_dummy_words, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 1)
        && (gdbarch->call_dummy_stack_adjust_p == -1))
      internal_error ("gdbarch: verify_gdbarch: call_dummy_stack_adjust_p invalid");
*************** verify_gdbarch (struct gdbarch *gdbarch)
*** 504,525 ****
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->fix_call_dummy == 0))
      internal_error ("gdbarch: verify_gdbarch: fix_call_dummy invalid");
!   if ((GDB_MULTI_ARCH >= 2)
!       && (gdbarch->coerce_float_to_double == default_coerce_float_to_double))
!     internal_error ("gdbarch: verify_gdbarch: coerce_float_to_double invalid");
    if ((GDB_MULTI_ARCH >= 1)
        && (gdbarch->get_saved_register == 0))
      internal_error ("gdbarch: verify_gdbarch: get_saved_register invalid");
!   if ((GDB_MULTI_ARCH >= 1)
!       && (gdbarch->register_convertible == 0))
!     internal_error ("gdbarch: verify_gdbarch: register_convertible invalid");
    if ((GDB_MULTI_ARCH >= 2)
-       && (gdbarch->register_convert_to_virtual == 0))
-     internal_error ("gdbarch: verify_gdbarch: register_convert_to_virtual invalid");
-   if ((GDB_MULTI_ARCH >= 2)
-       && (gdbarch->register_convert_to_raw == 0))
-     internal_error ("gdbarch: verify_gdbarch: register_convert_to_raw invalid");
-   if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->extract_return_value == 0))
      internal_error ("gdbarch: verify_gdbarch: extract_return_value invalid");
    if ((GDB_MULTI_ARCH >= 1)
--- 510,523 ----
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->fix_call_dummy == 0))
      internal_error ("gdbarch: verify_gdbarch: fix_call_dummy invalid");
!   /* Skip verify of coerce_float_to_double, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 1)
        && (gdbarch->get_saved_register == 0))
      internal_error ("gdbarch: verify_gdbarch: get_saved_register invalid");
!   /* Skip verify of register_convertible, invalid_p == 0 */
!   /* Skip verify of register_convert_to_virtual, invalid_p == 0 */
!   /* Skip verify of register_convert_to_raw, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->extract_return_value == 0))
      internal_error ("gdbarch: verify_gdbarch: extract_return_value invalid");
    if ((GDB_MULTI_ARCH >= 1)
*************** verify_gdbarch (struct gdbarch *gdbarch)
*** 534,546 ****
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->pop_frame == 0))
      internal_error ("gdbarch: verify_gdbarch: pop_frame invalid");
    if ((GDB_MULTI_ARCH >= 2)
-       && (gdbarch->d10v_make_daddr == 0))
-     internal_error ("gdbarch: verify_gdbarch: d10v_make_daddr invalid");
-   if ((GDB_MULTI_ARCH >= 2)
-       && (gdbarch->d10v_make_iaddr == 0))
-     internal_error ("gdbarch: verify_gdbarch: d10v_make_iaddr invalid");
-   if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->d10v_daddr_p == 0))
      internal_error ("gdbarch: verify_gdbarch: d10v_daddr_p invalid");
    if ((GDB_MULTI_ARCH >= 2)
--- 532,540 ----
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->pop_frame == 0))
      internal_error ("gdbarch: verify_gdbarch: pop_frame invalid");
+   /* Skip verify of d10v_make_daddr, invalid_p == 0 */
+   /* Skip verify of d10v_make_iaddr, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->d10v_daddr_p == 0))
      internal_error ("gdbarch: verify_gdbarch: d10v_daddr_p invalid");
    if ((GDB_MULTI_ARCH >= 2)
*************** verify_gdbarch (struct gdbarch *gdbarch)
*** 576,605 ****
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->inner_than == 0))
      internal_error ("gdbarch: verify_gdbarch: inner_than invalid");
    if ((GDB_MULTI_ARCH >= 2)
-       && (gdbarch->breakpoint_from_pc == 0))
-     internal_error ("gdbarch: verify_gdbarch: breakpoint_from_pc invalid");
-   if ((GDB_MULTI_ARCH >= 2)
-       && (0))
-     internal_error ("gdbarch: verify_gdbarch: memory_insert_breakpoint invalid");
-   if ((GDB_MULTI_ARCH >= 2)
-       && (0))
-     internal_error ("gdbarch: verify_gdbarch: memory_remove_breakpoint invalid");
-   if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->decr_pc_after_break == -1))
      internal_error ("gdbarch: verify_gdbarch: decr_pc_after_break invalid");
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->function_start_offset == -1))
      internal_error ("gdbarch: verify_gdbarch: function_start_offset invalid");
!   if ((GDB_MULTI_ARCH >= 2)
!       && (gdbarch->remote_translate_xfer_address == 0))
!     internal_error ("gdbarch: verify_gdbarch: remote_translate_xfer_address invalid");
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->frame_args_skip == -1))
      internal_error ("gdbarch: verify_gdbarch: frame_args_skip invalid");
!   if ((GDB_MULTI_ARCH >= 2)
!       && (gdbarch->frameless_function_invocation == 0))
!     internal_error ("gdbarch: verify_gdbarch: frameless_function_invocation invalid");
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->frame_chain == 0))
      internal_error ("gdbarch: verify_gdbarch: frame_chain invalid");
--- 570,589 ----
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->inner_than == 0))
      internal_error ("gdbarch: verify_gdbarch: inner_than invalid");
+   /* Skip verify of breakpoint_from_pc, invalid_p == 0 */
+   /* Skip verify of memory_insert_breakpoint, invalid_p == 0 */
+   /* Skip verify of memory_remove_breakpoint, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->decr_pc_after_break == -1))
      internal_error ("gdbarch: verify_gdbarch: decr_pc_after_break invalid");
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->function_start_offset == -1))
      internal_error ("gdbarch: verify_gdbarch: function_start_offset invalid");
!   /* Skip verify of remote_translate_xfer_address, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->frame_args_skip == -1))
      internal_error ("gdbarch: verify_gdbarch: frame_args_skip invalid");
!   /* Skip verify of frameless_function_invocation, invalid_p == 0 */
    if ((GDB_MULTI_ARCH >= 2)
        && (gdbarch->frame_chain == 0))
      internal_error ("gdbarch: verify_gdbarch: frame_chain invalid");
*************** gdbarch_byte_order (struct gdbarch *gdba
*** 971,978 ****
  int
  gdbarch_bfd_vma_bit (struct gdbarch *gdbarch)
  {
!   if (0)
!     internal_error ("gdbarch: gdbarch_bfd_vma_bit invalid");
    if (gdbarch_debug >= 2)
      fprintf_unfiltered (gdb_stdlog, "gdbarch_bfd_vma_bit called\n");
    return gdbarch->bfd_vma_bit;
--- 955,961 ----
  int
  gdbarch_bfd_vma_bit (struct gdbarch *gdbarch)
  {
!   /* Skip verify of bfd_vma_bit, invalid_p == 0 */
    if (gdbarch_debug >= 2)
      fprintf_unfiltered (gdb_stdlog, "gdbarch_bfd_vma_bit called\n");
    return gdbarch->bfd_vma_bit;
*************** set_gdbarch_call_dummy_p (struct gdbarch
*** 1600,1605 ****
--- 1583,1589 ----
  LONGEST *
  gdbarch_call_dummy_words (struct gdbarch *gdbarch)
  {
+   /* Skip verify of call_dummy_words, invalid_p == 0 */
    if (gdbarch_debug >= 2)
      fprintf_unfiltered (gdb_stdlog, "gdbarch_call_dummy_words called\n");
    return gdbarch->call_dummy_words;
*************** set_gdbarch_call_dummy_words (struct gdb
*** 1615,1620 ****
--- 1599,1605 ----
  int
  gdbarch_sizeof_call_dummy_words (struct gdbarch *gdbarch)
  {
+   /* Skip verify of sizeof_call_dummy_words, invalid_p == 0 */
    if (gdbarch_debug >= 2)
      fprintf_unfiltered (gdb_stdlog, "gdbarch_sizeof_call_dummy_words called\n");
    return gdbarch->sizeof_call_dummy_words;
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.17
diff -p -r1.17 Makefile.in
*** Makefile.in	2000/03/28 21:19:04	1.17
--- Makefile.in	2000/03/31 22:49:44
*************** SFILES = ax-general.c ax-gdb.c bcache.c 
*** 466,472 ****
  	demangle.c dwarfread.c dwarf2read.c elfread.c environ.c eval.c \
  	event-loop.c event-top.c \
  	expprint.c f-exp.y f-lang.c f-typeprint.c f-valprint.c \
! 	findvar.c gdbarch.c gdbtypes.c \
  	inf-loop.c infcmd.c inflow.c infrun.c language.c \
  	kod.c kod-cisco.c \
  	ui-out.c cli-out.c \
--- 466,472 ----
  	demangle.c dwarfread.c dwarf2read.c elfread.c environ.c eval.c \
  	event-loop.c event-top.c \
  	expprint.c f-exp.y f-lang.c f-typeprint.c f-valprint.c \
! 	findvar.c gdbarch.c gdbarch-utils.c gdbtypes.c \
  	inf-loop.c infcmd.c inflow.c infrun.c language.c \
  	kod.c kod-cisco.c \
  	ui-out.c cli-out.c \
*************** remote_h =	remote.h
*** 548,553 ****
--- 548,554 ----
  version_h = 	version.h
  ui_out_h =      ui-out.h
  cli_out_h =	cli-out.h
+ gdbarch_utils_h = gdbarch-utils.h
  
  # Header files that need to have srcdir added.  Note that in the cases
  # where we use a macro like $(gdbcmd_h), things are carefully arranged
*************** COMMON_OBS = version.o blockframe.o brea
*** 605,611 ****
  	symtab.o symfile.o symmisc.o infcmd.o infrun.o command.o \
  	expprint.o environ.o \
  	event-loop.o event-top.o inf-loop.o \
! 	gdbarch.o gdbtypes.o copying.o $(DEPFILES) \
  	mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \
  	kod.o kod-cisco.o \
  	gdb-events.o \
--- 606,612 ----
  	symtab.o symfile.o symmisc.o infcmd.o infrun.o command.o \
  	expprint.o environ.o \
  	event-loop.o event-top.o inf-loop.o \
! 	gdbarch.o gdbarch-utils.o gdbtypes.o copying.o $(DEPFILES) \
  	mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \
  	kod.o kod-cisco.o \
  	gdb-events.o \
*************** tracepoint.o: tracepoint.c $(defs_h) $(s
*** 1353,1358 ****
--- 1354,1362 ----
  
  gdbarch.o: gdbarch.c $(defs_h) $(bfd_h) $(gdbcmd_h)
  
+ gdbarch-utils.o: gdbarch-utils.c $(defs_h) $(bfd_h) $(gdbcmd_h) \
+ 	$(gdbarch_utils_h)
+ 
  gdbtypes.o: gdbtypes.c $(bfd_h) complaints.h $(defs_h) $(expression_h) \
  	$(gdbtypes_h) language.h objfiles.h symfile.h $(symtab_h) target.h \
  	$(value_h) gdb_string.h
*************** minsyms.o: minsyms.c $(bfd_h) $(defs_h) 
*** 1522,1527 ****
--- 1526,1532 ----
  mips-nat.o: mips-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) 
  
  mips-tdep.o: mips-tdep.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
+ 	$(gdbarch_utils_h) \
  	$(inferior_h) language.h objfiles.h symfile.h gdb_string.h
  
  mipsread.o: mipsread.c buildsym.h complaints.h $(bfd_h) $(defs_h) \
Index: gdbarch-utils.c
===================================================================
RCS file: gdbarch-utils.c
diff -N gdbarch-utils.c
*** /dev/null	Tue May  5 13:32:27 1998
--- gdbarch-utils.c	Fri Mar 31 14:49:44 2000
***************
*** 0 ****
--- 1,137 ----
+ /* Dynamic architecture support for GDB, the GNU debugger.
+    Copyright 1998-1999, 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 "defs.h"
+ 
+ #if GDB_MULTI_ARCH
+ #include "gdbcmd.h"
+ #include "inferior.h"		/* enum CALL_DUMMY_LOCATION et.al. */
+ #else
+ /* Just include everything in sight so that the every old definition
+    of macro is visible. */
+ #include "gdb_string.h"
+ #include <ctype.h>
+ #include "symtab.h"
+ #include "frame.h"
+ #include "inferior.h"
+ #include "breakpoint.h"
+ #include "gdb_wait.h"
+ #include "gdbcore.h"
+ #include "gdbcmd.h"
+ #include "target.h"
+ #include "gdbthread.h"
+ #include "annotate.h"
+ #include "symfile.h"		/* for overlay functions */
+ #endif
+ 
+ /* Convenience macro for allocting typesafe memory. */
+ 
+ #ifndef XMALLOC
+ #define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
+ #endif
+ 
+ 
+ /* Use the program counter to determine the contents and size
+    of a breakpoint instruction.  If no target-dependent macro
+    BREAKPOINT_FROM_PC has been defined to implement this function,
+    assume that the breakpoint doesn't depend on the PC, and
+    use the values of the BIG_BREAKPOINT and LITTLE_BREAKPOINT macros.
+    Return a pointer to a string of bytes that encode a breakpoint
+    instruction, stores the length of the string to *lenptr,
+    and optionally adjust the pc to point to the correct memory location
+    for inserting the breakpoint.  */
+ 
+ unsigned char *
+ legacy_breakpoint_from_pc (CORE_ADDR * pcptr, int *lenptr)
+ {
+   /* {BIG_,LITTLE_}BREAKPOINT is the sequence of bytes we insert for a
+      breakpoint.  On some machines, breakpoints are handled by the
+      target environment and we don't have to worry about them here.  */
+ #ifdef BIG_BREAKPOINT
+   if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+     {
+       static unsigned char big_break_insn[] = BIG_BREAKPOINT;
+       *lenptr = sizeof (big_break_insn);
+       return big_break_insn;
+     }
+ #endif
+ #ifdef LITTLE_BREAKPOINT
+   if (TARGET_BYTE_ORDER != BIG_ENDIAN)
+     {
+       static unsigned char little_break_insn[] = LITTLE_BREAKPOINT;
+       *lenptr = sizeof (little_break_insn);
+       return little_break_insn;
+     }
+ #endif
+ #ifdef BREAKPOINT
+   {
+     static unsigned char break_insn[] = BREAKPOINT;
+     *lenptr = sizeof (break_insn);
+     return break_insn;
+   }
+ #endif
+   *lenptr = 0;
+   return NULL;
+ }
+ 
+ int
+ generic_frameless_function_invocation_not (struct frame_info *fi)
+ {
+   return 0;
+ }
+ 
+ char *
+ legacy_register_name (int i)
+ {
+ #ifdef REGISTER_NAMES
+   static char *names[] = REGISTER_NAMES;
+   if (i < 0 || i >= (sizeof (names) / sizeof (*names)))
+     return NULL;
+   else
+     return names[i];
+ #else
+   internal_error ("legacy_register_name: called.");
+   return NULL;
+ #endif
+ }
+ 
+ #if defined (CALL_DUMMY)
+ LONGEST legacy_call_dummy_words[] = CALL_DUMMY;
+ #else
+ LONGEST legacy_call_dummy_words[1];
+ #endif
+ int legacy_sizeof_call_dummy_words = sizeof (legacy_call_dummy_words);
+ 
+ void
+ generic_remote_translate_xfer_address (CORE_ADDR gdb_addr, int gdb_len,
+ 				       CORE_ADDR * rem_addr, int *rem_len)
+ {
+   *rem_addr = gdb_addr;
+   *rem_len = gdb_len;
+ }
+ 
+ /* */
+ 
+ extern initialize_file_ftype __initialize_gdbarch_utils;
+ 
+ void
+ __initialize_gdbarch_utils (void)
+ {
+ }
Index: gdbarch-utils.h
===================================================================
RCS file: gdbarch-utils.h
diff -N gdbarch-utils.h
*** /dev/null	Tue May  5 13:32:27 1998
--- gdbarch-utils.h	Fri Mar 31 14:49:44 2000
***************
*** 0 ****
--- 1,52 ----
+ /* Dynamic architecture support for GDB, the GNU debugger.
+    Copyright 1998-2000, 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 GDBARCH_UTILS_H
+ #define GDBARCH_UTILS_H
+ 
+ /* gdbarch trace variable */
+ extern int gdbarch_debug;
+ 
+ /* Fallback for register convertible. */
+ extern gdbarch_register_convertible_ftype generic_register_convertible_not;
+ 
+ /* Helper function for targets that don't know how my arguments are
+    being passed */
+ extern gdbarch_frame_num_args_ftype frame_num_args_unknown;
+ 
+ /* Implementation of breakpoint from PC using any of the deprecated
+    macros BREAKPOINT, LITTLE_BREAKPOINT, BIG_BREAPOINT.  For legacy
+    targets that don't yet implement their own breakpoint_from_pc(). */
+ extern gdbarch_breakpoint_from_pc_ftype legacy_breakpoint_from_pc;
+ 
+ /* Frameless functions not identifable. */
+ extern gdbarch_frameless_function_invocation_ftype generic_frameless_function_invocation_not;
+ 
+ /* Map onto old REGISTER_NAMES. */
+ extern char *legacy_register_name (int i);
+ 
+ /* Backward compatible call_dummy_words. */
+ extern LONGEST legacy_call_dummy_words[];
+ extern int legacy_sizeof_call_dummy_words;
+ 
+ /* Typical remote_translate_xfer_address */
+ extern gdbarch_remote_translate_xfer_address_ftype generic_remote_translate_xfer_address;
+ 
+ #endif
Index: gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.6
diff -p -r1.6 gdbarch.sh
*** gdbarch.sh	2000/03/30 05:32:23	1.6
--- gdbarch.sh	2000/03/31 22:49:53
*************** compare_new ()
*** 34,41 ****
  }
  
  
  # Format of the input table
! read="class level macro returntype function formal actual attrib default init invalid_p fmt print print_p description"
  
  # dump out/verify the doco
  for field in ${read}
--- 34,65 ----
  }
  
  
+ # DEFAULT is a valid fallback definition of a MACRO when
+ # multi-arch is not enabled.
+ default_is_fallback_p ()
+ {
+     [ "${default}" != "" -a "${invalid_p}" = "0" ]
+     # FIXME: cagney - not until after 5.0
+     false
+ }
+ 
  # Format of the input table
! read="class level macro returntype function formal actual attrib startup default invalid_p fmt print print_p description"
! 
! do_read ()
! {
!     if eval read $read
!     then
! 	test "${startup}" || startup=0
! 	test "${fmt}" || fmt="%ld"
! 	test "${print}" || print="(long) ${macro}"
! 	#test "${default}" || default=0
! 	:
!     else
! 	false
!     fi
! }
! 
  
  # dump out/verify the doco
  for field in ${read}
*************** do
*** 44,133 ****
  
      class ) : ;;
  
!       # # -> line disable
!       # f -> function
!       #   hiding a function
!       # v -> variable
!       #   hiding a variable
!       # i -> set from info
!       #   hiding something from the ``struct info'' object
  
      level ) : ;;
  
!       # See GDB_MULTI_ARCH description.  Having GDB_MULTI_ARCH >=
!       # LEVEL is a predicate on checking that a given method is
!       # initialized (using INVALID_P).
  
      macro ) : ;;
  
!       # The name of the MACRO that this method is to be accessed by.
  
      returntype ) : ;;
  
!       # For functions, the return type; for variables, the data type
  
      function ) : ;;
  
!       # For functions, the member function name; for variables, the
!       # variable name.  Member function names are always prefixed with
!       # ``gdbarch_'' for name-space purity.
  
      formal ) : ;;
  
!       # The formal argument list.  It is assumed that the formal
!       # argument list includes the actual name of each list element.
!       # A function with no arguments shall have ``void'' as the formal
!       # argument list.
  
      actual ) : ;;
  
!       # The list of actual arguments.  The arguments specified shall
!       # match the FORMAL list given above.  Functions with out
!       # arguments leave this blank.
  
      attrib ) : ;;
  
!       # Any GCC attributes that should be attached to the function
!       # declaration.  At present this field is unused.
  
!     default ) : ;;
  
!       # To help with the GDB startup a default static gdbarch object
!       # is created.  DEFAULT is the value to insert into the static
!       # gdbarch object. If empty ZERO is used.
  
!     init ) : ;;
  
!       # Any initial value to assign to a new gdbarch object after it
!       # as been malloc()ed.  Zero is used by default.
  
      invalid_p ) : ;;
  
!       # A predicate equation that validates MEMBER. Non-zero is returned
!       # if the code creating the new architecture failed to initialize
!       # the MEMBER or initialized the member to something invalid.
!       # By default, a check that the value is no longer equal to INIT
!       # is performed.  The equation ``0'' disables the invalid_p check.
  
      fmt ) : ;;
  
!       # printf style format string that can be used to print out the
!       # MEMBER.  The default is to assume "%ld" is safe.  Sometimes
!       # "%s" is useful.  For functions, this is ignored and the
!       # function address is printed.
  
      print ) : ;;
  
!       # An optional equation that converts the MEMBER into a value
!       # suitable for that FMT.  By default it is assumed that the
!       # member's MACRO cast to long is safe.
  
      print_p ) : ;;
  
!       # An optional indicator for any predicte to wrap around the
!       # print member code.
!       #   # -> Wrap print up in ``#ifdef MACRO''
!       #   exp -> Wrap print up in ``if (${print_p}) ...
  
      description ) : ;;
  
--- 68,169 ----
  
      class ) : ;;
  
! 	# # -> line disable
! 	# f -> function
! 	#   hiding a function
! 	# v -> variable
! 	#   hiding a variable
! 	# i -> set from info
! 	#   hiding something from the ``struct info'' object
  
      level ) : ;;
  
! 	# See GDB_MULTI_ARCH description.  Having GDB_MULTI_ARCH >=
! 	# LEVEL is a predicate on checking that a given method is
! 	# initialized (using INVALID_P).
  
      macro ) : ;;
  
! 	# The name of the MACRO that this method is to be accessed by.
  
      returntype ) : ;;
  
! 	# For functions, the return type; for variables, the data type
  
      function ) : ;;
  
! 	# For functions, the member function name; for variables, the
! 	# variable name.  Member function names are always prefixed with
! 	# ``gdbarch_'' for name-space purity.
  
      formal ) : ;;
  
! 	# The formal argument list.  It is assumed that the formal
! 	# argument list includes the actual name of each list element.
! 	# A function with no arguments shall have ``void'' as the
! 	# formal argument list.
  
      actual ) : ;;
  
! 	# The list of actual arguments.  The arguments specified shall
! 	# match the FORMAL list given above.  Functions with out
! 	# arguments leave this blank.
  
      attrib ) : ;;
  
! 	# Any GCC attributes that should be attached to the function
! 	# declaration.  At present this field is unused.
  
!     startup ) : ;;
  
! 	# To help with the GDB startup a static gdbarch object is
! 	# created.  STARTUP is the value to insert into that static
! 	# gdbarch object.
  
! 	# By default ``0'' is used.
  
!     default ) : ;;
  
+ 	# Any initial value to assign to a new gdbarch object after it
+ 	# as been malloc()ed.  Zero is used by default.
+ 
+ 	# Specify a non-empty DEFAULT and a zero INVALID_P to create a
+ 	# fallback value or function for when multi-arch is disabled.
+ 	# Specify a zero DEFAULT function to make that fallback
+ 	# illegal to call.
+ 
      invalid_p ) : ;;
  
! 	# A predicate equation that validates MEMBER. Non-zero is
! 	# returned if the code creating the new architecture failed to
! 	# initialize the MEMBER or initialized the member to something
! 	# invalid. By default, a check that the value is no longer
! 	# equal to DEFAULT ips performed.  The equation ``0'' disables
! 	# the invalid_p check.
  
      fmt ) : ;;
+ 
+ 	# printf style format string that can be used to print out the
+ 	# MEMBER.  Sometimes "%s" is useful.  For functions, this is
+ 	# ignored and the function address is printed.
  
! 	# By default ```%ld'' is used.  
  
      print ) : ;;
  
! 	# An optional equation that casts MEMBER to a value suitable
! 	# for formatting by FMT.
  
+ 	# By default ``(long)'' is used.
+ 
      print_p ) : ;;
+ 
+ 	# An optional indicator for any predicte to wrap around the
+ 	# print member code.
  
! 	#   # -> Wrap print up in ``#ifdef MACRO''
! 	#   exp -> Wrap print up in ``if (${print_p}) ...
! 	#   ``'' -> No predicate
  
      description ) : ;;
  
*************** v:2:NUM_REGS:int:num_regs::::0:-1
*** 169,175 ****
  v:2:SP_REGNUM:int:sp_regnum::::0:-1
  v:2:FP_REGNUM:int:fp_regnum::::0:-1
  v:2:PC_REGNUM:int:pc_regnum::::0:-1
! f:2:REGISTER_NAME:char *:register_name:int regnr:regnr::0:0
  v:2:REGISTER_SIZE:int:register_size::::0:-1
  v:2:REGISTER_BYTES:int:register_bytes::::0:-1
  f:2:REGISTER_BYTE:int:register_byte:int reg_nr:reg_nr::0:0
--- 205,211 ----
  v:2:SP_REGNUM:int:sp_regnum::::0:-1
  v:2:FP_REGNUM:int:fp_regnum::::0:-1
  v:2:PC_REGNUM:int:pc_regnum::::0:-1
! f:2:REGISTER_NAME:char *:register_name:int regnr:regnr:::legacy_register_name:0
  v:2:REGISTER_SIZE:int:register_size::::0:-1
  v:2:REGISTER_BYTES:int:register_bytes::::0:-1
  f:2:REGISTER_BYTE:int:register_byte:int reg_nr:reg_nr::0:0
*************** v:1:CALL_DUMMY_BREAKPOINT_OFFSET_P:int:c
*** 188,242 ****
  v:2:CALL_DUMMY_LENGTH:int:call_dummy_length::::0:-1::::CALL_DUMMY_LOCATION == BEFORE_TEXT_END || CALL_DUMMY_LOCATION == AFTER_TEXT_END
  f:2:PC_IN_CALL_DUMMY:int:pc_in_call_dummy:CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address:pc, sp, frame_address::0:0
  v:1:CALL_DUMMY_P:int:call_dummy_p::::0:-1
! v:2:CALL_DUMMY_WORDS:LONGEST *:call_dummy_words::::0:::0x%08lx
! v:2:SIZEOF_CALL_DUMMY_WORDS:int:sizeof_call_dummy_words::::0:::0x%08lx
  v:1:CALL_DUMMY_STACK_ADJUST_P:int:call_dummy_stack_adjust_p::::0:-1::0x%08lx
  v:2:CALL_DUMMY_STACK_ADJUST:int:call_dummy_stack_adjust::::0::gdbarch->call_dummy_stack_adjust_p && gdbarch->call_dummy_stack_adjust == 0:0x%08lx::CALL_DUMMY_STACK_ADJUST_P
  f:2:FIX_CALL_DUMMY:void:fix_call_dummy:char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, struct value **args, struct type *type, int gcc_p:dummy, pc, fun, nargs, args, type, gcc_p::0:0
  #
  v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion::::0:::::#
  v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type::::0:::::#
! f:2:COERCE_FLOAT_TO_DOUBLE:int:coerce_float_to_double:struct type *formal, struct type *actual:formal, actual:::default_coerce_float_to_double
  f:1:GET_SAVED_REGISTER:void:get_saved_register:char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval:raw_buffer, optimized, addrp, frame, regnum, lval::generic_get_saved_register:0
  #
! f:1:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr::0:0
! f:2:REGISTER_CONVERT_TO_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to::0:0
! f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to::0:0
  #
  f:2:EXTRACT_RETURN_VALUE:void:extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf::0:0
  f:1:PUSH_ARGUMENTS:CORE_ADDR:push_arguments:int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:nargs, args, sp, struct_return, struct_addr::0:0
! f:2:PUSH_DUMMY_FRAME:void:push_dummy_frame:void:-::0:0
! f:1:PUSH_RETURN_ADDRESS:CORE_ADDR:push_return_address:CORE_ADDR pc, CORE_ADDR sp:pc, sp::0:0
! f:2:POP_FRAME:void:pop_frame:void:-::0:0
  #
  # I wish that these would just go away....
! f:2:D10V_MAKE_DADDR:CORE_ADDR:d10v_make_daddr:CORE_ADDR x:x::0:0
! f:2:D10V_MAKE_IADDR:CORE_ADDR:d10v_make_iaddr:CORE_ADDR x:x::0:0
! f:2:D10V_DADDR_P:int:d10v_daddr_p:CORE_ADDR x:x::0:0
! f:2:D10V_IADDR_P:int:d10v_iaddr_p:CORE_ADDR x:x::0:0
! f:2:D10V_CONVERT_DADDR_TO_RAW:CORE_ADDR:d10v_convert_daddr_to_raw:CORE_ADDR x:x::0:0
! f:2:D10V_CONVERT_IADDR_TO_RAW:CORE_ADDR:d10v_convert_iaddr_to_raw:CORE_ADDR x:x::0:0
  #
! f:2:STORE_STRUCT_RETURN:void:store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp::0:0
! f:2:STORE_RETURN_VALUE:void:store_return_value:struct type *type, char *valbuf:type, valbuf::0:0
! f:2:EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:extract_struct_value_address:char *regbuf:regbuf::0:0
! f:2:USE_STRUCT_CONVENTION:int:use_struct_convention:int gcc_p, struct type *value_type:gcc_p, value_type::0:0
  #
  f:2:FRAME_INIT_SAVED_REGS:void:frame_init_saved_regs:struct frame_info *frame:frame::0:0
! f:2:INIT_EXTRA_FRAME_INFO:void:init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame::0:0
  #
  f:2:SKIP_PROLOGUE:CORE_ADDR:skip_prologue:CORE_ADDR ip:ip::0:0
  f:2:INNER_THAN:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs::0:0
! f:2:BREAKPOINT_FROM_PC:unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr::0:0
  f:2:MEMORY_INSERT_BREAKPOINT:int:memory_insert_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_insert_breakpoint:0
  f:2:MEMORY_REMOVE_BREAKPOINT:int:memory_remove_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_remove_breakpoint:0
  v:2:DECR_PC_AFTER_BREAK:CORE_ADDR:decr_pc_after_break::::0:-1
  v:2:FUNCTION_START_OFFSET:CORE_ADDR:function_start_offset::::0:-1
  #
! f:2:REMOTE_TRANSLATE_XFER_ADDRESS:void:remote_translate_xfer_address:CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:gdb_addr, gdb_len, rem_addr, rem_len::0:0
  #
  v:2:FRAME_ARGS_SKIP:CORE_ADDR:frame_args_skip::::0:-1
! f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi::0:0
  f:2:FRAME_CHAIN:CORE_ADDR:frame_chain:struct frame_info *frame:frame::0:0
  f:1:FRAME_CHAIN_VALID:int:frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe::0:0
  f:2:FRAME_SAVED_PC:CORE_ADDR:frame_saved_pc:struct frame_info *fi:fi::0:0
--- 224,278 ----
  v:2:CALL_DUMMY_LENGTH:int:call_dummy_length::::0:-1::::CALL_DUMMY_LOCATION == BEFORE_TEXT_END || CALL_DUMMY_LOCATION == AFTER_TEXT_END
  f:2:PC_IN_CALL_DUMMY:int:pc_in_call_dummy:CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address:pc, sp, frame_address::0:0
  v:1:CALL_DUMMY_P:int:call_dummy_p::::0:-1
! v:2:CALL_DUMMY_WORDS:LONGEST *:call_dummy_words::::0:legacy_call_dummy_words:0:0x%08lx
! v:2:SIZEOF_CALL_DUMMY_WORDS:int:sizeof_call_dummy_words::::0:legacy_sizeof_call_dummy_words:0:0x%08lx
  v:1:CALL_DUMMY_STACK_ADJUST_P:int:call_dummy_stack_adjust_p::::0:-1::0x%08lx
  v:2:CALL_DUMMY_STACK_ADJUST:int:call_dummy_stack_adjust::::0::gdbarch->call_dummy_stack_adjust_p && gdbarch->call_dummy_stack_adjust == 0:0x%08lx::CALL_DUMMY_STACK_ADJUST_P
  f:2:FIX_CALL_DUMMY:void:fix_call_dummy:char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, struct value **args, struct type *type, int gcc_p:dummy, pc, fun, nargs, args, type, gcc_p::0:0
  #
  v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion::::0:::::#
  v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type::::0:::::#
! f:2:COERCE_FLOAT_TO_DOUBLE:int:coerce_float_to_double:struct type *formal, struct type *actual:formal, actual:::default_coerce_float_to_double:0
  f:1:GET_SAVED_REGISTER:void:get_saved_register:char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval:raw_buffer, optimized, addrp, frame, regnum, lval::generic_get_saved_register:0
  #
! f:1:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr:::generic_register_convertible_not:0
! f:2:REGISTER_CONVERT_TO_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to:::0:0
! f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to:::0:0
  #
  f:2:EXTRACT_RETURN_VALUE:void:extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf::0:0
  f:1:PUSH_ARGUMENTS:CORE_ADDR:push_arguments:int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:nargs, args, sp, struct_return, struct_addr::0:0
! f:2:PUSH_DUMMY_FRAME:void:push_dummy_frame:void:-:::0
! f:1:PUSH_RETURN_ADDRESS:CORE_ADDR:push_return_address:CORE_ADDR pc, CORE_ADDR sp:pc, sp:::0
! f:2:POP_FRAME:void:pop_frame:void:-:::0
  #
  # I wish that these would just go away....
! f:2:D10V_MAKE_DADDR:CORE_ADDR:d10v_make_daddr:CORE_ADDR x:x:::0:0
! f:2:D10V_MAKE_IADDR:CORE_ADDR:d10v_make_iaddr:CORE_ADDR x:x:::0:0
! f:2:D10V_DADDR_P:int:d10v_daddr_p:CORE_ADDR x:x:::0
! f:2:D10V_IADDR_P:int:d10v_iaddr_p:CORE_ADDR x:x:::0
! f:2:D10V_CONVERT_DADDR_TO_RAW:CORE_ADDR:d10v_convert_daddr_to_raw:CORE_ADDR x:x:::0
! f:2:D10V_CONVERT_IADDR_TO_RAW:CORE_ADDR:d10v_convert_iaddr_to_raw:CORE_ADDR x:x:::0
  #
! f:2:STORE_STRUCT_RETURN:void:store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp:::0
! f:2:STORE_RETURN_VALUE:void:store_return_value:struct type *type, char *valbuf:type, valbuf:::0
! f:2:EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:extract_struct_value_address:char *regbuf:regbuf:::0
! f:2:USE_STRUCT_CONVENTION:int:use_struct_convention:int gcc_p, struct type *value_type:gcc_p, value_type:::0
  #
  f:2:FRAME_INIT_SAVED_REGS:void:frame_init_saved_regs:struct frame_info *frame:frame::0:0
! f:2:INIT_EXTRA_FRAME_INFO:void:init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame:::0
  #
  f:2:SKIP_PROLOGUE:CORE_ADDR:skip_prologue:CORE_ADDR ip:ip::0:0
  f:2:INNER_THAN:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs::0:0
! f:2:BREAKPOINT_FROM_PC:unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr:::legacy_breakpoint_from_pc:0
  f:2:MEMORY_INSERT_BREAKPOINT:int:memory_insert_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_insert_breakpoint:0
  f:2:MEMORY_REMOVE_BREAKPOINT:int:memory_remove_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_remove_breakpoint:0
  v:2:DECR_PC_AFTER_BREAK:CORE_ADDR:decr_pc_after_break::::0:-1
  v:2:FUNCTION_START_OFFSET:CORE_ADDR:function_start_offset::::0:-1
  #
! f:2:REMOTE_TRANSLATE_XFER_ADDRESS:void:remote_translate_xfer_address:CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:gdb_addr, gdb_len, rem_addr, rem_len:::generic_remote_translate_xfer_address:0
  #
  v:2:FRAME_ARGS_SKIP:CORE_ADDR:frame_args_skip::::0:-1
! f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi:::generic_frameless_function_invocation_not:0
  f:2:FRAME_CHAIN:CORE_ADDR:frame_chain:struct frame_info *frame:frame::0:0
  f:1:FRAME_CHAIN_VALID:int:frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe::0:0
  f:2:FRAME_SAVED_PC:CORE_ADDR:frame_saved_pc:struct frame_info *fi:fi::0:0
*************** EOF
*** 254,267 ****
  if true
  then
    exec > new-gdbarch
!   function_list | while eval read $read
    do
      cat <<EOF
  ${class} ${macro}(${actual})
    ${returntype} ${function} ($formal)${attrib}
      level=${level}
      default=${default}
-     init=${init}
      invalid_p=${invalid_p}
      fmt=${fmt}
      print=${print}
--- 290,303 ----
  if true
  then
    exec > new-gdbarch
!   function_list | while do_read # eval read $read
    do
      cat <<EOF
  ${class} ${macro}(${actual})
    ${returntype} ${function} ($formal)${attrib}
      level=${level}
+     startup=${startup}
      default=${default}
      invalid_p=${invalid_p}
      fmt=${fmt}
      print=${print}
*************** EOF
*** 369,375 ****
  echo ""
  echo ""
  echo "/* The following are pre-initialized by GDBARCH. */"
! function_list | while eval read $read
  do
    case "${class}" in
      "i" )
--- 405,411 ----
  echo ""
  echo ""
  echo "/* The following are pre-initialized by GDBARCH. */"
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "i" )
*************** done
*** 389,395 ****
  echo ""
  echo ""
  echo "/* The following are initialized by the target dependant code. */"
! function_list | while eval read $read
  do
    case "${class}" in
      "v" )
--- 425,431 ----
  echo ""
  echo ""
  echo "/* The following are initialized by the target dependant code. */"
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "v" )
*************** do
*** 412,418 ****
  	  echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});"
  	fi
  	echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});"
! 	echo "#if GDB_MULTI_ARCH"
  	echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
  	if [ "${actual}" = "" ]
  	then
--- 448,457 ----
  	  echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});"
  	fi
  	echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});"
! 	if ! default_is_fallback_p
! 	then
! 	    echo "#if GDB_MULTI_ARCH"
! 	fi
  	echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
  	if [ "${actual}" = "" ]
  	then
*************** do
*** 423,430 ****
  	else
  	  echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
  	fi
- 	echo "#endif"
  	echo "#endif"
  	;;
    esac
  done
--- 462,472 ----
  	else
  	  echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
  	fi
  	echo "#endif"
+ 	if ! default_is_fallback_p
+ 	then
+ 	    echo "#endif"
+ 	fi
  	;;
    esac
  done
*************** copyright
*** 770,775 ****
--- 812,818 ----
  cat <<EOF
  
  #include "defs.h"
+ #include "gdbarch-utils.h"
  
  #if GDB_MULTI_ARCH
  #include "gdbcmd.h"
*************** echo ""
*** 825,831 ****
  echo "struct gdbarch"
  echo "{"
  echo "  /* basic architectural information */"
! function_list | while eval read $read
  do
    case "${class}" in
      "i" ) echo "  ${returntype} ${function};" ;;
--- 868,874 ----
  echo "struct gdbarch"
  echo "{"
  echo "  /* basic architectural information */"
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "i" ) echo "  ${returntype} ${function};" ;;
*************** cat <<EOF
*** 861,867 ****
       gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
       field is dumped out
  
!      \`\`default_gdbarch()'': Append an initial value to the static
       variable (base values on the host's c-type system).
  
       get_gdbarch(): Implement the set/get functions (probably using
--- 904,910 ----
       gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
       field is dumped out
  
!      \`\`startup_gdbarch()'': Append an initial value to the static
       variable (base values on the host's c-type system).
  
       get_gdbarch(): Implement the set/get functions (probably using
*************** cat <<EOF
*** 870,876 ****
       */
  
  EOF
! function_list | while eval read $read
  do
    case "${class}" in
      "v" ) echo "  ${returntype} ${function};" ;;
--- 913,919 ----
       */
  
  EOF
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "v" ) echo "  ${returntype} ${function};" ;;
*************** EOF
*** 889,905 ****
  echo ""
  echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
  echo ""
! echo "struct gdbarch default_gdbarch = {"
  echo "  /* basic architecture information */"
! function_list | while eval read $read
  do
    case "${class}" in
      "i" ) 
!       if [ "${default}" = "" ]; then
!         echo "  0,"
!       else
!         echo "  ${default},"
!       fi
      ;;
    esac
  done
--- 932,944 ----
  echo ""
  echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
  echo ""
! echo "struct gdbarch startup_gdbarch = {"
  echo "  /* basic architecture information */"
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "i" ) 
!       echo "  ${startup},"
      ;;
    esac
  done
*************** cat <<EOF
*** 910,931 ****
    0, NULL, NULL,
    /* Multi-arch values */
  EOF
! function_list | while eval read $read
  do
    case "${class}" in
      "f" | "v" )
!       if [ "${default}" = "" ]; then
!         echo "  0,"
!       else
!         echo "  ${default},"
!       fi
      ;;
    esac
  done
  cat <<EOF
!   /* default_gdbarch() */
  };
! struct gdbarch *current_gdbarch = &default_gdbarch;
  EOF
  
  # Create a new gdbarch struct
--- 949,966 ----
    0, NULL, NULL,
    /* Multi-arch values */
  EOF
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "f" | "v" )
!       echo "  ${startup},"
      ;;
    esac
  done
  cat <<EOF
!   /* startup_gdbarch() */
  };
! struct gdbarch *current_gdbarch = &startup_gdbarch;
  EOF
  
  # Create a new gdbarch struct
*************** gdbarch_alloc (const struct gdbarch_info
*** 947,953 ****
    gdbarch->tdep = tdep;
  EOF
  echo ""
! function_list | while eval read $read
  do
    case "${class}" in
      "i" ) echo "  gdbarch->${function} = info->${function};"
--- 982,988 ----
    gdbarch->tdep = tdep;
  EOF
  echo ""
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "i" ) echo "  gdbarch->${function} = info->${function};"
*************** do
*** 955,967 ****
  done
  echo ""
  echo "  /* Force the explicit initialization of these. */"
! function_list | while eval read $read
  do
    case "${class}" in
      "f" | "v" )
! 	if [ "${init}" != "" -a "${init}" != "0" ]
  	then
! 	  echo "  gdbarch->${function} = ${init};"
  	fi
  	;;
    esac
--- 990,1002 ----
  done
  echo ""
  echo "  /* Force the explicit initialization of these. */"
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "f" | "v" )
! 	if [ "${default}" != "" -a "${default}" != "0" ]
  	then
! 	  echo "  gdbarch->${function} = ${default};"
  	fi
  	;;
    esac
*************** verify_gdbarch (struct gdbarch *gdbarch)
*** 1009,1028 ****
      internal_error ("verify_gdbarch: bfd_arch_info unset");
    /* Check those that need to be defined for the given multi-arch level. */
  EOF
! function_list | while eval read $read
  do
    case "${class}" in
      "f" | "v" )
!  	if [ "${invalid_p}" ]
  	then
! 	  echo "  if ((GDB_MULTI_ARCH >= ${level})"
! 	  echo "      && (${invalid_p}))"
! 	  echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
! 	elif [ "${init}" ]
  	then
! 	  echo "  if ((GDB_MULTI_ARCH >= ${level})"
! 	  echo "      && (gdbarch->${function} == ${init}))"
! 	  echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
  	fi
  	;;
    esac
--- 1044,1066 ----
      internal_error ("verify_gdbarch: bfd_arch_info unset");
    /* Check those that need to be defined for the given multi-arch level. */
  EOF
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "f" | "v" )
! 	if [ "${invalid_p}" = "0" ]
! 	then
! 	    echo "  /* Skip verify of ${function}, invalid_p == 0 */"
!  	elif [ "${invalid_p}" ]
  	then
! 	    echo "  if ((GDB_MULTI_ARCH >= ${level})"
! 	    echo "      && (${invalid_p}))"
! 	    echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
! 	elif [ "${default}" ]
  	then
! 	    echo "  if ((GDB_MULTI_ARCH >= ${level})"
! 	    echo "      && (gdbarch->${function} == ${default}))"
! 	    echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
  	fi
  	;;
    esac
*************** void
*** 1041,1047 ****
  gdbarch_dump (void)
  {
  EOF
! function_list | while eval read $read
  do
    case "${class}" in
      "f" )
--- 1079,1085 ----
  gdbarch_dump (void)
  {
  EOF
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "f" )
*************** do
*** 1051,1058 ****
  	echo "                      /*${macro} ()*/);"
  	;;
      * )
- 	test "${fmt}" || fmt="%ld"
- 	test "${print}" || print="(long) ${macro}"
  	if [ "${print_p}" = "#" ]
  	then
  	  echo "#ifdef ${macro}"
--- 1089,1094 ----
*************** gdbarch_tdep (struct gdbarch *gdbarch)
*** 1089,1095 ****
  }
  EOF
  echo ""
! function_list | while eval read $read
  do
    case "${class}" in
      "f" )
--- 1125,1131 ----
  }
  EOF
  echo ""
! function_list | while do_read # eval read $read
  do
    case "${class}" in
      "f" )
*************** do
*** 1102,1107 ****
--- 1138,1156 ----
  	  echo "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})"
  	fi
  	echo "{"
+ 	if default_is_fallback_p && [ "${default}" != "0" ]
+ 	then
+ 	    echo "  if (GDB_MULTI_ARCH == 0)"
+ 	    if [ "${returntype}" = "void" ]
+ 	    then
+ 		echo "    {"
+ 		echo "      ${default} (${actual});"
+ 		echo "      return;"
+ 		echo "    }"
+ 	    else
+ 		echo "    return ${default} (${actual});"
+ 	    fi
+ 	fi
          echo "  if (gdbarch->${function} == 0)"
          echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
  	echo "  if (gdbarch_debug >= 2)"
*************** do
*** 1127,1139 ****
  	echo "${returntype}"
  	echo "gdbarch_${function} (struct gdbarch *gdbarch)"
  	echo "{"
! 	if [ "${invalid_p}" ]
  	then
  	  echo "  if (${invalid_p})"
  	  echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
! 	elif [ "${init}" ]
  	then
! 	  echo "  if (gdbarch->${function} == ${init})"
  	  echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
  	fi
  	echo "  if (gdbarch_debug >= 2)"
--- 1176,1191 ----
  	echo "${returntype}"
  	echo "gdbarch_${function} (struct gdbarch *gdbarch)"
  	echo "{"
! 	if [ "${invalid_p}" = "0" ]
! 	then
! 	    echo "  /* Skip verify of ${function}, invalid_p == 0 */"
! 	elif [ "${invalid_p}" ]
  	then
  	  echo "  if (${invalid_p})"
  	  echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
! 	elif [ "${default}" ]
  	then
! 	  echo "  if (gdbarch->${function} == ${default})"
  	  echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
  	fi
  	echo "  if (gdbarch_debug >= 2)"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]