* gdbarch-utils.h, gdbarch-utils.c: New files.
authorAndrew Cagney <cagney@redhat.com>
Mon, 3 Apr 2000 00:00:32 +0000 (00:00 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 3 Apr 2000 00:00:32 +0000 (00:00 +0000)
* 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.

gdb/ChangeLog
gdb/Makefile.in
gdb/gdbarch-utils.c [new file with mode: 0644]
gdb/gdbarch-utils.h [new file with mode: 0644]
gdb/gdbarch.c
gdb/gdbarch.sh

index be1a291..9ff5673 100644 (file)
@@ -1,3 +1,26 @@
+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.
+
 2000-04-02  Mark Kettenis  <kettenis@gnu.org>
 
        * i386-linux-nat.c: Add copyright notice.
index 857b28b..d036ce1 100644 (file)
@@ -466,7 +466,7 @@ SFILES = ax-general.c ax-gdb.c bcache.c blockframe.c breakpoint.c \
        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 \
+       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 \
@@ -548,6 +548,7 @@ remote_h =  remote.h
 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
@@ -605,7 +606,7 @@ COMMON_OBS = version.o blockframe.o breakpoint.o findvar.o stack.o thread.o \
        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) \
+       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 \
@@ -1353,6 +1354,9 @@ tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(tracepoint_h) \
 
 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
@@ -1522,6 +1526,7 @@ minsyms.o: minsyms.c $(bfd_h) $(defs_h) objfiles.h symfile.h \
 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) \
diff --git a/gdb/gdbarch-utils.c b/gdb/gdbarch-utils.c
new file mode 100644 (file)
index 0000000..9048bd7
--- /dev/null
@@ -0,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)
+{
+}
diff --git a/gdb/gdbarch-utils.h b/gdb/gdbarch-utils.h
new file mode 100644 (file)
index 0000000..57da8ce
--- /dev/null
@@ -0,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 bae8734..4425e08 100644 (file)
@@ -34,6 +34,7 @@
 
 
 #include "defs.h"
+#include "gdbarch-utils.h"
 
 #if GDB_MULTI_ARCH
 #include "gdbcmd.h"
@@ -117,7 +118,7 @@ struct gdbarch
      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
+     ``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
@@ -216,7 +217,7 @@ struct gdbarch
 
 extern const struct bfd_arch_info bfd_default_arch_struct;
 
-struct gdbarch default_gdbarch = {
+struct gdbarch startup_gdbarch = {
   /* basic architecture information */
   &bfd_default_arch_struct,
   BIG_ENDIAN,
@@ -308,9 +309,9 @@ struct gdbarch default_gdbarch = {
   0,
   0,
   0,
-  /* default_gdbarch() */
+  /* startup_gdbarch() */
 };
-struct gdbarch *current_gdbarch = &default_gdbarch;
+struct gdbarch *current_gdbarch = &startup_gdbarch;
 
 
 /* Create a new ``struct gdbarch'' based in information provided by
@@ -334,6 +335,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
   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;
@@ -344,13 +346,19 @@ gdbarch_alloc (const struct gdbarch_info *info,
   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;
@@ -384,9 +392,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   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");
+  /* 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");
@@ -441,9 +447,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   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");
+  /* 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");
@@ -495,6 +499,8 @@ verify_gdbarch (struct gdbarch *gdbarch)
   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");
@@ -504,21 +510,13 @@ verify_gdbarch (struct gdbarch *gdbarch)
   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");
+  /* 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");
-  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");
+  /* 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");
@@ -534,12 +532,8 @@ verify_gdbarch (struct gdbarch *gdbarch)
   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");
+  /* 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");
@@ -576,30 +570,20 @@ verify_gdbarch (struct gdbarch *gdbarch)
   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");
+  /* 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");
-  if ((GDB_MULTI_ARCH >= 2)
-      && (gdbarch->remote_translate_xfer_address == 0))
-    internal_error ("gdbarch: verify_gdbarch: remote_translate_xfer_address 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");
-  if ((GDB_MULTI_ARCH >= 2)
-      && (gdbarch->frameless_function_invocation == 0))
-    internal_error ("gdbarch: verify_gdbarch: frameless_function_invocation 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");
@@ -971,8 +955,7 @@ gdbarch_byte_order (struct gdbarch *gdbarch)
 int
 gdbarch_bfd_vma_bit (struct gdbarch *gdbarch)
 {
-  if (0)
-    internal_error ("gdbarch: gdbarch_bfd_vma_bit invalid");
+  /* 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;
@@ -1600,6 +1583,7 @@ set_gdbarch_call_dummy_p (struct gdbarch *gdbarch,
 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;
@@ -1615,6 +1599,7 @@ set_gdbarch_call_dummy_words (struct gdbarch *gdbarch,
 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 01520d6..8a907cc 100755 (executable)
@@ -34,8 +34,32 @@ compare_new ()
 }
 
 
+# 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 default init invalid_p fmt print print_p description"
+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}
@@ -44,90 +68,102 @@ do
 
     class ) : ;;
 
-      # # -> line disable
-      # f -> function
-      #   hiding a function
-      # v -> variable
-      #   hiding a variable
-      # i -> set from info
-      #   hiding something from the ``struct info'' object
+       # # -> 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).
+       # 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.
+       # The name of the MACRO that this method is to be accessed by.
 
     returntype ) : ;;
 
-      # For functions, the return type; for variables, the data type
+       # 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.
+       # 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.
+       # 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.
+       # 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.
+       # Any GCC attributes that should be attached to the function
+       # declaration.  At present this field is unused.
 
-    default ) : ;;
+    startup ) : ;;
 
-      # 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.
+       # To help with the GDB startup a static gdbarch object is
+       # created.  STARTUP is the value to insert into that static
+       # gdbarch object.
 
-    init ) : ;;
+       # By default ``0'' is used.
 
-      # Any initial value to assign to a new gdbarch object after it
-      # as been malloc()ed.  Zero is used by default.
+    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 INIT
-      # is performed.  The equation ``0'' disables the invalid_p check.
+       # 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.  The default is to assume "%ld" is safe.  Sometimes
-      # "%s" is useful.  For functions, this is ignored and the
-      # function address is printed.
+       # 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 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.
+       # 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}) ...
+       # 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 ) : ;;
 
@@ -169,7 +205,7 @@ v:2:NUM_REGS:int:num_regs::::0:-1
 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
+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
@@ -188,55 +224,55 @@ v:1:CALL_DUMMY_BREAKPOINT_OFFSET_P:int:call_dummy_breakpoint_offset_p::::0:-1
 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: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
+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::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: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: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
+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: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: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: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: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: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::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::0:0
+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::0:0
+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
@@ -254,14 +290,14 @@ EOF
 if true
 then
   exec > new-gdbarch
-  function_list | while eval read $read
+  function_list | while do_read # eval read $read
   do
     cat <<EOF
 ${class} ${macro}(${actual})
   ${returntype} ${function} ($formal)${attrib}
     level=${level}
+    startup=${startup}
     default=${default}
-    init=${init}
     invalid_p=${invalid_p}
     fmt=${fmt}
     print=${print}
@@ -369,7 +405,7 @@ EOF
 echo ""
 echo ""
 echo "/* The following are pre-initialized by GDBARCH. */"
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "i" )
@@ -389,7 +425,7 @@ done
 echo ""
 echo ""
 echo "/* The following are initialized by the target dependant code. */"
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "v" )
@@ -412,7 +448,10 @@ do
          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"
+       if ! default_is_fallback_p
+       then
+           echo "#if GDB_MULTI_ARCH"
+       fi
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        if [ "${actual}" = "" ]
        then
@@ -424,7 +463,10 @@ do
          echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
        fi
        echo "#endif"
-       echo "#endif"
+       if ! default_is_fallback_p
+       then
+           echo "#endif"
+       fi
        ;;
   esac
 done
@@ -770,6 +812,7 @@ copyright
 cat <<EOF
 
 #include "defs.h"
+#include "gdbarch-utils.h"
 
 #if GDB_MULTI_ARCH
 #include "gdbcmd.h"
@@ -825,7 +868,7 @@ echo ""
 echo "struct gdbarch"
 echo "{"
 echo "  /* basic architectural information */"
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "i" ) echo "  ${returntype} ${function};" ;;
@@ -861,7 +904,7 @@ cat <<EOF
      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
+     \`\`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
@@ -870,7 +913,7 @@ cat <<EOF
      */
 
 EOF
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "v" ) echo "  ${returntype} ${function};" ;;
@@ -889,17 +932,13 @@ EOF
 echo ""
 echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
 echo ""
-echo "struct gdbarch default_gdbarch = {"
+echo "struct gdbarch startup_gdbarch = {"
 echo "  /* basic architecture information */"
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "i" ) 
-      if [ "${default}" = "" ]; then
-        echo "  0,"
-      else
-        echo "  ${default},"
-      fi
+      echo "  ${startup},"
     ;;
   esac
 done
@@ -910,22 +949,18 @@ cat <<EOF
   0, NULL, NULL,
   /* Multi-arch values */
 EOF
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "f" | "v" )
-      if [ "${default}" = "" ]; then
-        echo "  0,"
-      else
-        echo "  ${default},"
-      fi
+      echo "  ${startup},"
     ;;
   esac
 done
 cat <<EOF
-  /* default_gdbarch() */
+  /* startup_gdbarch() */
 };
-struct gdbarch *current_gdbarch = &default_gdbarch;
+struct gdbarch *current_gdbarch = &startup_gdbarch;
 EOF
 
 # Create a new gdbarch struct
@@ -947,7 +982,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
   gdbarch->tdep = tdep;
 EOF
 echo ""
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "i" ) echo "  gdbarch->${function} = info->${function};"
@@ -955,13 +990,13 @@ do
 done
 echo ""
 echo "  /* Force the explicit initialization of these. */"
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "f" | "v" )
-       if [ "${init}" != "" -a "${init}" != "0" ]
+       if [ "${default}" != "" -a "${default}" != "0" ]
        then
-         echo "  gdbarch->${function} = ${init};"
+         echo "  gdbarch->${function} = ${default};"
        fi
        ;;
   esac
@@ -1009,20 +1044,23 @@ verify_gdbarch (struct gdbarch *gdbarch)
     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
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "f" | "v" )
-       if [ "${invalid_p}" ]
+       if [ "${invalid_p}" = "0" ]
        then
-         echo "  if ((GDB_MULTI_ARCH >= ${level})"
-         echo "      && (${invalid_p}))"
-         echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
-       elif [ "${init}" ]
+           echo "  /* Skip verify of ${function}, invalid_p == 0 */"
+       elif [ "${invalid_p}" ]
        then
-         echo "  if ((GDB_MULTI_ARCH >= ${level})"
-         echo "      && (gdbarch->${function} == ${init}))"
-         echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
+           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
@@ -1041,7 +1079,7 @@ void
 gdbarch_dump (void)
 {
 EOF
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "f" )
@@ -1051,8 +1089,6 @@ do
        echo "                      /*${macro} ()*/);"
        ;;
     * )
-       test "${fmt}" || fmt="%ld"
-       test "${print}" || print="(long) ${macro}"
        if [ "${print_p}" = "#" ]
        then
          echo "#ifdef ${macro}"
@@ -1089,7 +1125,7 @@ gdbarch_tdep (struct gdbarch *gdbarch)
 }
 EOF
 echo ""
-function_list | while eval read $read
+function_list | while do_read # eval read $read
 do
   case "${class}" in
     "f" )
@@ -1102,6 +1138,19 @@ do
          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)"
@@ -1127,13 +1176,16 @@ do
        echo "${returntype}"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
        echo "{"
-       if [ "${invalid_p}" ]
+       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 [ "${init}" ]
+       elif [ "${default}" ]
        then
-         echo "  if (gdbarch->${function} == ${init})"
+         echo "  if (gdbarch->${function} == ${default})"
          echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
        fi
        echo "  if (gdbarch_debug >= 2)"