Multiarch STAB_REG_TO_REGNUM, ECOFF_REG_TO_REGNUM,
[deliverable/binutils-gdb.git] / gdb / gdbarch.sh
index f511bddf2bb20f4e2e5951dd92d7bd659e887378..216a47f852a7c8ce8af298c03a8cbb91858faab4 100755 (executable)
@@ -1,7 +1,7 @@
-#!/usr/local/bin/bash
+#!/bin/sh -u
 
 # Architecture commands for GDB, the GNU debugger.
-# Copyright 1998-1999 Free Software Foundation, Inc.
+# Copyright 1998-2000 Free Software Foundation, Inc.
 #
 # This file is part of GDB.
 #
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-read="class level macro returntype function formal actual attrib default init invalid_p fmt print print_p description"
+compare_new ()
+{
+    file=$1
+    if test ! -r ${file}
+    then
+       echo "${file} missing? cp new-${file} ${file}" 1>&2
+    elif diff -c ${file} new-${file}
+    then
+       echo "${file} unchanged" 1>&2
+    else
+       echo "${file} has changed? cp new-${file} ${file}" 1>&2
+    fi
+}
+
+
+# Format of the input table
+read="class level macro returntype function formal actual attrib staticdefault predefault postdefault invalid_p fmt print print_p description"
+
+do_read ()
+{
+    comment=""
+    class=""
+    while read line
+    do
+       if test "${line}" = ""
+       then
+           continue
+       elif test "${line}" = "#" -a "${comment}" = ""
+       then
+           continue
+       elif expr "${line}" : "#" > /dev/null
+       then
+           comment="${comment}
+${line}"
+       else
+
+           # The semantics of IFS varies between different SH's.  Some
+           # treat ``::' as three fields while some treat it as just too.
+           # Work around this by eliminating ``::'' ....
+           line="`echo "${line}" | sed -e 's/::/: :/g' -e 's/::/: :/g'`"
+
+           OFS="${IFS}" ; IFS="[:]"
+           eval read ${read} <<EOF
+${line}
+EOF
+           IFS="${OFS}"
+
+           # .... and then going back through each field and strip out those
+           # that ended up with just that space character.
+           for r in ${read}
+           do
+               if eval test \"\${${r}}\" = \"\ \"
+               then
+                   eval ${r}=""
+               fi
+           done
+
+           test "${staticdefault}" || staticdefault=0
+           # NOT YET: Breaks BELIEVE_PCC_PROMOTION and confuses non-
+           # multi-arch defaults.
+           # test "${predefault}" || predefault=0
+           test "${fmt}" || fmt="%ld"
+           test "${print}" || print="(long) ${macro}"
+           case "${invalid_p}" in
+               0 ) valid_p=1 ;;
+               "" )
+                   if [ "${predefault}" ]
+                   then
+                       #invalid_p="gdbarch->${function} == ${predefault}"
+                       valid_p="gdbarch->${function} != ${predefault}"
+                   else
+                       #invalid_p="gdbarch->${function} == 0"
+                       valid_p="gdbarch->${function} != 0"
+                   fi
+                   ;;
+               * ) valid_p="!(${invalid_p})"
+           esac
+
+           # PREDEFAULT is a valid fallback definition of MEMBER when
+           # multi-arch is not enabled.  This ensures that the
+           # default value, when multi-arch is the same as the
+           # default value when not multi-arch.  POSTDEFAULT is
+           # always a valid definition of MEMBER as this again
+           # ensures consistency.
+
+           if [ "${postdefault}" != "" ]
+           then
+               fallbackdefault="${postdefault}"
+           elif [ "${predefault}" != "" ]
+           then
+               fallbackdefault="${predefault}"
+           else
+               fallbackdefault=""
+           fi
+
+           #NOT YET: See gdbarch.log for basic verification of
+           # database
+
+           break
+       fi
+    done
+    if [ "${class}" ]
+    then
+       true
+    else
+       false
+    fi
+}
+
+
+fallback_default_p ()
+{
+    [ "${postdefault}" != "" -a "${invalid_p}" != "0" ] \
+       || [ "${predefault}" != "" -a "${invalid_p}" = "0" ]
+}
+
+class_is_variable_p ()
+{
+    [ "${class}" = "v" -o "${class}" = "V" ]
+}
+
+class_is_function_p ()
+{
+    [ "${class}" = "f" -o "${class}" = "F" ]
+}
+
+class_is_predicate_p ()
+{
+    [ "${class}" = "F" -o "${class}" = "V" ]
+}
+
+class_is_info_p ()
+{
+    [ "${class}" = "i" ]
+}
+
 
 # dump out/verify the doco
 for field in ${read}
@@ -28,132 +163,226 @@ 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
+       # F -> function + predicate
+       #   hiding a function + predicate to test function validity
+       # v -> variable
+       #   hiding a variable
+       # V -> variable + predicate
+       #   hiding a variable + predicate to test variables validity
+       # 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.
+
+    staticdefault ) : ;;
+
+       # To help with the GDB startup a static gdbarch object is
+       # created.  STATICDEFAULT is the value to insert into that
+       # static gdbarch object.  Since this a static object only
+       # simple expressions can be used.
 
-    default ) : ;;
+       # If STATICDEFAULT is empty, zero is used.
 
-      # 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.
+    predefault ) : ;;
 
-    init ) : ;;
+       # A initial value to assign to MEMBER of the freshly
+       # malloc()ed gdbarch object.  After the gdbarch object has
+       # been initialized using PREDEFAULT, it is passed to the
+       # target code for further updates.
 
-      # Any initial value to assign to a new gdbarch object after it
-      # as been malloc()ed.  Zero is used by default.
+       # If PREDEFAULT is empty, zero is used.
+
+       # When POSTDEFAULT is empty, a non-empty PREDEFAULT and a zero
+       # INVALID_P will be used as default values when when
+       # multi-arch is disabled.  Specify a zero PREDEFAULT function
+       # to make that fallback call internal_error().
+
+       # Variable declarations can refer to ``gdbarch'' which will
+       # contain the current architecture.  Care should be taken.
+
+    postdefault ) : ;;
+
+       # A value to assign to MEMBER of the new gdbarch object should
+       # the target code fail to change the PREDEFAULT value.  Also
+       # use POSTDEFAULT as the fallback value for the non-
+       # multi-arch case.
+
+       # If POSTDEFAULT is empty, no post update is performed.
+
+       # If both INVALID_P and POSTDEFAULT are non-empty then
+       # INVALID_P will be used to determine if MEMBER should be
+       # changed to POSTDEFAULT.
+
+       # You cannot specify both a zero INVALID_P and a POSTDEFAULT.
+
+       # Variable declarations can refer to ``gdbarch'' which will
+       # contain the current architecture.  Care should be taken.
 
     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 MEMBER or the initialized the member is invalid.
+       # If POSTDEFAULT is non-empty then MEMBER will be updated to
+       # that value.  If POSTDEFAULT is empty then internal_error()
+       # is called.
+
+       # If INVALID_P is empty, a check that MEMBER is no longer
+       # equal to PREDEFAULT is used.
+
+       # The expression ``0'' disables the INVALID_P check making
+       # PREDEFAULT a legitimate value.
+
+       # See also PREDEFAULT and POSTDEFAULT.
 
     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.
+
+       # If FMT is empty, ``%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.
+
+       # If PRINT is empty, ``(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.
+
+       #   () -> Call a custom function to do the dump.
+       #   exp -> Wrap print up in ``if (${print_p}) ...
+       #   ``'' -> No predicate
+
+       # If PRINT_P is empty, ``1'' is always used.
 
     description ) : ;;
 
-      # Currently unused.
+       # Currently unused.
 
     *) exit 1;;
   esac
 done
 
-IFS=:
 
 function_list ()
 {
   # See below (DOCO) for description of each field
-  cat <<EOF |
-i:2:TARGET_ARCHITECTURE:const struct bfd_arch_info *:bfd_arch_info::::&bfd_default_arch_struct:::%s:TARGET_ARCHITECTURE->printable_name:TARGET_ARCHITECTURE != NULL
+  cat <<EOF
+i:2:TARGET_ARCHITECTURE:const struct bfd_arch_info *:bfd_arch_info::::&bfd_default_arch_struct::::%s:TARGET_ARCHITECTURE->printable_name:TARGET_ARCHITECTURE != NULL
 #
 i:2:TARGET_BYTE_ORDER:int:byte_order::::BIG_ENDIAN
+# Number of bits in a char or unsigned char for the target machine.
+# Just like CHAR_BIT in <limits.h> but describes the target machine.
+# v::TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):8::0:
+#
+# Number of bits in a short or unsigned short for the target machine.
+v::TARGET_SHORT_BIT:int:short_bit::::8 * sizeof (short):2*TARGET_CHAR_BIT::0
+# Number of bits in an int or unsigned int for the target machine.
+v::TARGET_INT_BIT:int:int_bit::::8 * sizeof (int):4*TARGET_CHAR_BIT::0
+# Number of bits in a long or unsigned long for the target machine.
+v::TARGET_LONG_BIT:int:long_bit::::8 * sizeof (long):4*TARGET_CHAR_BIT::0
+# Number of bits in a long long or unsigned long long for the target
+# machine.
+v::TARGET_LONG_LONG_BIT:int:long_long_bit::::8 * sizeof (LONGEST):2*TARGET_LONG_BIT::0
+# Number of bits in a float for the target machine.
+v::TARGET_FLOAT_BIT:int:float_bit::::8 * sizeof (float):4*TARGET_CHAR_BIT::0
+# Number of bits in a double for the target machine.
+v::TARGET_DOUBLE_BIT:int:double_bit::::8 * sizeof (double):8*TARGET_CHAR_BIT::0
+# Number of bits in a long double for the target machine.
+v::TARGET_LONG_DOUBLE_BIT:int:long_double_bit::::8 * sizeof (long double):2*TARGET_DOUBLE_BIT::0
+# For most targets, a pointer on the target and its representation as an
+# address in GDB have the same size and "look the same".  For such a
+# target, you need only set TARGET_PTR_BIT / ptr_bit and TARGET_ADDR_BIT
+# / addr_bit will be set from it.
+#
+# If TARGET_PTR_BIT and TARGET_ADDR_BIT are different, you'll probably
+# also need to set POINTER_TO_ADDRESS and ADDRESS_TO_POINTER as well.
 #
-v:1:TARGET_BFD_VMA_BIT:int:bfd_vma_bit::::8 * sizeof (void*):TARGET_ARCHITECTURE->bits_per_address:0
-v:1:TARGET_PTR_BIT:int:ptr_bit::::8 * sizeof (void*):0
-#v:1:TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):0
-v:1:TARGET_SHORT_BIT:int:short_bit::::8 * sizeof (short):0
-v:1:TARGET_INT_BIT:int:int_bit::::8 * sizeof (int):0
-v:1:TARGET_LONG_BIT:int:long_bit::::8 * sizeof (long):0
-v:1:TARGET_LONG_LONG_BIT:int:long_long_bit::::8 * sizeof (LONGEST):0
-v:1:TARGET_FLOAT_BIT:int:float_bit::::8 * sizeof (float):0
-v:1:TARGET_DOUBLE_BIT:int:double_bit::::8 * sizeof (double):0
-v:1:TARGET_LONG_DOUBLE_BIT:int:long_double_bit::::8 * sizeof (long double):0
+# ptr_bit is the size of a pointer on the target
+v::TARGET_PTR_BIT:int:ptr_bit::::8 * sizeof (void*):TARGET_INT_BIT::0
+# addr_bit is the size of a target address as represented in gdb
+v::TARGET_ADDR_BIT:int:addr_bit::::8 * sizeof (void*):0:TARGET_PTR_BIT:
+# Number of bits in a BFD_VMA for the target object file format.
+v::TARGET_BFD_VMA_BIT:int:bfd_vma_bit::::8 * sizeof (void*):TARGET_ARCHITECTURE->bits_per_address::0
 #
-f:1:TARGET_READ_PC:CORE_ADDR:read_pc:int pid:pid::0:0
-f:1:TARGET_WRITE_PC:void:write_pc:CORE_ADDR val, int pid:val, pid::0:0
-f:1:TARGET_READ_FP:CORE_ADDR:read_fp:void:::0:0
-f:1:TARGET_WRITE_FP:void:write_fp:CORE_ADDR val:val::0:0
-f:1:TARGET_READ_SP:CORE_ADDR:read_sp:void:::0:0
-f:1:TARGET_WRITE_SP:void:write_sp:CORE_ADDR val:val::0:0
+v::IEEE_FLOAT:int:ieee_float::::0:0::0:::
+#
+f::TARGET_READ_PC:CORE_ADDR:read_pc:int pid:pid::0:generic_target_read_pc::0
+f::TARGET_WRITE_PC:void:write_pc:CORE_ADDR val, int pid:val, pid::0:generic_target_write_pc::0
+f::TARGET_READ_FP:CORE_ADDR:read_fp:void:::0:generic_target_read_fp::0
+f::TARGET_WRITE_FP:void:write_fp:CORE_ADDR val:val::0:generic_target_write_fp::0
+f::TARGET_READ_SP:CORE_ADDR:read_sp:void:::0:generic_target_read_sp::0
+f::TARGET_WRITE_SP:void:write_sp:CORE_ADDR val:val::0:generic_target_write_sp::0
 #
 v:2:NUM_REGS:int:num_regs::::0:-1
+# This macro gives the number of pseudo-registers that live in the
+# register namespace but do not get fetched or stored on the target.
+# These pseudo-registers may be aliases for other registers,
+# combinations of other registers, or they may be computed by GDB.
+v:2:NUM_PSEUDO_REGS:int:num_pseudo_regs::::0:0::0:::
 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:FP0_REGNUM:int:fp0_regnum::::0:-1::0
+v:2:NPC_REGNUM:int:npc_regnum::::0:-1::0
+v:2:NNPC_REGNUM:int:nnpc_regnum::::0:-1::0
+# Convert stab register number (from \`r\' declaration) to a gdb REGNUM.
+f:2:STAB_REG_TO_REGNUM:int:stab_reg_to_regnum:int stab_regnr:stab_regnr:::no_op_reg_to_regnum::0
+# Provide a default mapping from a ecoff register number to a gdb REGNUM.
+f:2:ECOFF_REG_TO_REGNUM:int:ecoff_reg_to_regnum:int ecoff_regnr:ecoff_regnr:::no_op_reg_to_regnum::0
+# Provide a default mapping from a DWARF register number to a gdb REGNUM.
+f:2:DWARF_REG_TO_REGNUM:int:dwarf_reg_to_regnum:int dwarf_regnr:dwarf_regnr:::no_op_reg_to_regnum::0
+# Convert from an sdb register number to an internal gdb register number.
+# This should be defined in tm.h, if REGISTER_NAMES is not set up
+# to map one to one onto the sdb register numbers.
+f:2:SDB_REG_TO_REGNUM:int:sdb_reg_to_regnum:int sdb_regnr:sdb_regnr:::no_op_reg_to_regnum::0
+f:2:DWARF2_REG_TO_REGNUM:int:dwarf2_reg_to_regnum:int dwarf2_regnr:dwarf2_regnr:::no_op_reg_to_regnum::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
@@ -162,64 +391,82 @@ v:2:MAX_REGISTER_RAW_SIZE:int:max_register_raw_size::::0:-1
 f:2:REGISTER_VIRTUAL_SIZE:int:register_virtual_size:int reg_nr:reg_nr::0:0
 v:2:MAX_REGISTER_VIRTUAL_SIZE:int:max_register_virtual_size::::0:-1
 f:2:REGISTER_VIRTUAL_TYPE:struct type *:register_virtual_type:int reg_nr:reg_nr::0:0
+f:2:DO_REGISTERS_INFO:void:do_registers_info:int reg_nr, int fpregs:reg_nr, fpregs:::do_registers_info::0
+# MAP a GDB RAW register number onto a simulator register number.  See
+# also include/...-sim.h.
+f:2:REGISTER_SIM_REGNO:int:register_sim_regno:int reg_nr:reg_nr:::default_register_sim_regno::0
 #
 v:1:USE_GENERIC_DUMMY_FRAMES:int:use_generic_dummy_frames::::0:-1
 v:2:CALL_DUMMY_LOCATION:int:call_dummy_location::::0:0
-f:2:CALL_DUMMY_ADDRESS:CORE_ADDR:call_dummy_address:void:::0:0:gdbarch->call_dummy_location == AT_ENTRY_POINT && gdbarch->call_dummy_address == 0:
-v:2:CALL_DUMMY_START_OFFSET:CORE_ADDR:call_dummy_start_offset::::0:-1::0x%08lx
-v:2:CALL_DUMMY_BREAKPOINT_OFFSET:CORE_ADDR:call_dummy_breakpoint_offset::::0:-1::0x%08lx
+f:2:CALL_DUMMY_ADDRESS:CORE_ADDR:call_dummy_address:void:::0:0::gdbarch->call_dummy_location == AT_ENTRY_POINT && gdbarch->call_dummy_address == 0
+v:2:CALL_DUMMY_START_OFFSET:CORE_ADDR:call_dummy_start_offset::::0:-1:::0x%08lx
+v:2:CALL_DUMMY_BREAKPOINT_OFFSET:CORE_ADDR:call_dummy_breakpoint_offset::::0:-1:::0x%08lx::CALL_DUMMY_BREAKPOINT_OFFSET_P
 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
+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: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
 #
-v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion::::0:::::#
-v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type::::0:::::#
+v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion:::::::
+v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type:::::::
+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
+# This function is called when the value of a pseudo-register needs to
+# be updated.  Typically it will be defined on a per-architecture
+# basis.
+f:2:FETCH_PSEUDO_REGISTER:void:fetch_pseudo_register:int regnum:regnum:::0::0
+# This function is called when the value of a pseudo-register needs to
+# be set or stored.  Typically it will be defined on a
+# per-architecture basis.
+f:2:STORE_PSEUDO_REGISTER:void:store_pseudo_register:int regnum:regnum:::0::0
+#
+f:2:POINTER_TO_ADDRESS:CORE_ADDR:pointer_to_address:struct type *type, void *buf:type, buf:::unsigned_pointer_to_address::0
+f:2:ADDRESS_TO_POINTER:void:address_to_pointer:struct type *type, void *buf, CORE_ADDR addr:type, buf, addr:::unsigned_address_to_pointer::0
 #
+f:2:RETURN_VALUE_ON_STACK:int:return_value_on_stack:struct type *type:type:::generic_return_value_on_stack_not::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::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: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:PROLOGUE_FRAMELESS_P:int:prologue_frameless_p:CORE_ADDR ip:ip::0:generic_prologue_frameless_p::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
+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
@@ -228,36 +475,59 @@ f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi
 f:2:SAVED_PC_AFTER_CALL:CORE_ADDR:saved_pc_after_call:struct frame_info *frame:frame::0:0
 f:2:FRAME_NUM_ARGS:int:frame_num_args:struct frame_info *frame:frame::0:0
 #
+F:2:STACK_ALIGN:CORE_ADDR:stack_align:CORE_ADDR sp:sp::0:0
+v:1:EXTRA_STACK_ALIGNMENT_NEEDED:int:extra_stack_alignment_needed::::0:1::0:::
+F:2:REG_STRUCT_HAS_ADDR:int:reg_struct_has_addr:int gcc_p, struct type *type:gcc_p, type::0:0
+F:2:SAVE_DUMMY_FRAME_TOS:void:save_dummy_frame_tos:CORE_ADDR sp:sp::0:0
+#
+v:2:TARGET_FLOAT_FORMAT:const struct floatformat *:float_format::::::default_float_format (gdbarch)
+v:2:TARGET_DOUBLE_FORMAT:const struct floatformat *:double_format::::::default_double_format (gdbarch)
+v:2:TARGET_LONG_DOUBLE_FORMAT:const struct floatformat *:long_double_format::::::&floatformat_unknown
+f:2:CONVERT_FROM_FUNC_PTR_ADDR:CORE_ADDR:convert_from_func_ptr_addr:CORE_ADDR addr:addr:::default_convert_from_func_ptr_addr::0
 EOF
-  grep -v '^#'
 }
 
-
-# dump it out
-if true
-then
-  exec > new-gdbarch
-  function_list | while eval read $read
-  do
+#
+# The .log file
+#
+exec > new-gdbarch.log
+function_list | while do_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}
-    print_p=${print_p}
-    description=${description}
 EOF
-  done
-  exec 1>&2
-fi
+    for r in ${read}
+    do
+       eval echo \"\ \ \ \ ${r}=\${${r}}\"
+    done
+#    #fallbackdefault=${fallbackdefault}
+#    #valid_p=${valid_p}
+#EOF
+    if class_is_predicate_p && fallback_default_p
+    then
+       echo "Error: predicate function ${macro} can not have a non- multi-arch default" 1>&2
+       kill $$
+       exit 1
+    fi
+    if [ "${invalid_p}" = "0" -a "${postdefault}" != "" ]
+    then
+       echo "Error: postdefault is useless when invalid_p=0" 1>&2
+       kill $$
+       exit 1
+    fi
+    echo ""
+done
+
+exec 1>&2
+compare_new gdbarch.log
+
 
 copyright ()
 {
 cat <<EOF
+/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
+
 /* Dynamic architecture support for GDB, the GNU debugger.
    Copyright 1998-1999, Free Software Foundation, Inc.
 
@@ -278,17 +548,15 @@ cat <<EOF
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-/* *INDENT-OFF* */ /* \`\`typedef (f)();'' confuses indent */
-
 /* This file was created with the aid of \`\`gdbarch.sh''.
 
-   The bourn shell script \`\`gdbarch.sh'' creates the files
+   The Bourne shell script \`\`gdbarch.sh'' creates the files
    \`\`new-gdbarch.c'' and \`\`new-gdbarch.h and then compares them
    against the existing \`\`gdbarch.[hc]''.  Any differences found
    being reported.
 
    If editing this file, please also run gdbarch.sh and merge any
-   changes into that script. Conversely, when makeing sweeping changes
+   changes into that script. Conversely, when making sweeping changes
    to this file, modifying gdbarch.sh and using its output may prove
    easier. */
 
@@ -309,32 +577,12 @@ struct frame_info;
 struct value;
 
 
-#ifndef GDB_MULTI_ARCH
-#define GDB_MULTI_ARCH 0
-#endif
-
 extern struct gdbarch *current_gdbarch;
 
 
-/* See gdb/doc/gdbint.texi for a discussion of the GDB_MULTI_ARCH
-   macro */
-
-
 /* If any of the following are defined, the target wasn't correctly
    converted. */
 
-#if GDB_MULTI_ARCH
-#if defined (CALL_DUMMY)
-#error "CALL_DUMMY: replaced by CALL_DUMMY_WORDS/SIZEOF_CALL_DUMMY_WORDS"
-#endif
-#endif
-
-#if GDB_MULTI_ARCH
-#if defined (REGISTER_NAMES)
-#error "REGISTER_NAMES: replaced by REGISTER_NAME"
-#endif
-#endif
-
 #if GDB_MULTI_ARCH
 #if defined (EXTRA_FRAME_INFO)
 #error "EXTRA_FRAME_INFO: replaced by struct frame_extra_info"
@@ -349,67 +597,116 @@ extern struct gdbarch *current_gdbarch;
 EOF
 
 # function typedef's
-echo ""
-echo ""
-echo "/* The following are pre-initialized by GDBARCH. */"
-function_list | while eval read $read
+printf "\n"
+printf "\n"
+printf "/* The following are pre-initialized by GDBARCH. */\n"
+function_list | while do_read
 do
-  case "${class}" in
-    "i" )
-       echo ""
-       echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
-       echo "/* set_gdbarch_${function}() - not applicable - pre-initialized. */"
-       echo "#if GDB_MULTI_ARCH"
-       echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
-       echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
-       echo "#endif"
-       echo "#endif"
-       ;;
-  esac
+    if class_is_info_p
+    then
+       printf "\n"
+       printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
+       printf "/* set_gdbarch_${function}() - not applicable - pre-initialized. */\n"
+       printf "#if GDB_MULTI_ARCH\n"
+       printf "#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (${macro})\n"
+       printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
+       printf "#endif\n"
+       printf "#endif\n"
+    fi
 done
 
 # function typedef's
-echo ""
-echo ""
-echo "/* The following are initialized by the target dependant code. */"
-function_list | while eval read $read
+printf "\n"
+printf "\n"
+printf "/* The following are initialized by the target dependent code. */\n"
+function_list | while do_read
 do
-  case "${class}" in
-    "v" )
-       echo ""
-       echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
-       echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, ${returntype} ${function});"
-       echo "#if GDB_MULTI_ARCH"
-       echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
-       echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
-       echo "#endif"
-       echo "#endif"
-       ;;
-    "f" )
-       echo ""
-       echo "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});"
+    if [ "${comment}" ]
+    then
+       echo "${comment}" | sed \
+           -e '2 s,#,/*,' \
+           -e '3,$ s,#,  ,' \
+           -e '$ s,$, */,'
+    fi
+    if class_is_predicate_p
+    then
+       printf "\n"
+       printf "#if defined (${macro})\n"
+       printf "/* Legacy for systems yet to multi-arch ${macro} */\n"
+#      printf "#if (GDB_MULTI_ARCH <= GDB_MULTI_ARCH_PARTIAL) && defined (${macro})\n"
+       printf "#define ${macro}_P() (1)\n"
+       printf "#endif\n"
+       printf "\n"
+       printf "/* Default predicate for non- multi-arch targets. */\n"
+       printf "#if (!GDB_MULTI_ARCH) && !defined (${macro}_P)\n"
+       printf "#define ${macro}_P() (0)\n"
+       printf "#endif\n"
+       printf "\n"
+       printf "extern int gdbarch_${function}_p (struct gdbarch *gdbarch);\n"
+       printf "#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (${macro}_P)\n"
+       printf "#define ${macro}_P() (gdbarch_${function}_p (current_gdbarch))\n"
+       printf "#endif\n"
+    fi
+    if class_is_variable_p
+    then
+       if fallback_default_p || class_is_predicate_p
+       then
+           printf "\n"
+           printf "/* Default (value) for non- multi-arch platforms. */\n"
+           printf "#if (!GDB_MULTI_ARCH) && !defined (${macro})\n"
+           echo "#define ${macro} (${fallbackdefault})" \
+               | sed -e 's/\([^a-z_]\)\(gdbarch[^a-z_]\)/\1current_\2/g'
+           printf "#endif\n"
+       fi
+       printf "\n"
+       printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
+       printf "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, ${returntype} ${function});\n"
+       printf "#if GDB_MULTI_ARCH\n"
+       printf "#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (${macro})\n"
+       printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
+       printf "#endif\n"
+       printf "#endif\n"
+    fi
+    if class_is_function_p
+    then
+       if fallback_default_p || class_is_predicate_p
+       then
+           printf "\n"
+           printf "/* Default (function) for non- multi-arch platforms. */\n"
+           printf "#if (!GDB_MULTI_ARCH) && !defined (${macro})\n"
+           if [ "${fallbackdefault}" = "0" ]
+           then
+               printf "#define ${macro}(${actual}) (internal_error (\"${macro}\"), 0)\n"
+           else
+               # FIXME: Should be passing current_gdbarch through!
+               echo "#define ${macro}(${actual}) (${fallbackdefault} (${actual}))" \
+                   | sed -e 's/\([^a-z_]\)\(gdbarch[^a-z_]\)/\1current_\2/g'
+           fi
+           printf "#endif\n"
+       fi
+       printf "\n"
+       printf "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});\n"
        if [ "${formal}" = "void" ]
        then
-         echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
+         printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
        else
-         echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});"
+         printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});\n"
        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})"
+       printf "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});\n"
+       printf "#if GDB_MULTI_ARCH\n"
+       printf "#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (${macro})\n"
        if [ "${actual}" = "" ]
        then
-         echo "#define ${macro}() (gdbarch_${function} (current_gdbarch))"
+         printf "#define ${macro}() (gdbarch_${function} (current_gdbarch))\n"
        elif [ "${actual}" = "-" ]
        then
-         echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
+         printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
        else
-         echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
+         printf "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))\n"
        fi
-       echo "#endif"
-       echo "#endif"
-       ;;
-  esac
+       printf "#endif\n"
+       printf "#endif\n"
+    fi
 done
 
 # close it off
@@ -427,7 +724,7 @@ extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
 
    The mechanisms below ensures that there is only a loose connection
    between the set-architecture command and the various GDB
-   components.  Each component can independantly register their need
+   components.  Each component can independently register their need
    to maintain architecture specific data with gdbarch.
 
    Pragmatics:
@@ -437,7 +734,7 @@ extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
 
    The more traditional mega-struct containing architecture specific
    data for all the various GDB components was also considered.  Since
-   GDB is built from a variable number of (fairly independant)
+   GDB is built from a variable number of (fairly independent)
    components it was determined that the global aproach was not
    applicable. */
 
@@ -461,12 +758,15 @@ extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
    that the INFO.BYTE_ORDER is non-zero.
 
    The INIT function shall return any of: NULL - indicating that it
-   doesn't reconize the selected architecture; an existing \`\`struct
+   doesn't recognize the selected architecture; an existing \`\`struct
    gdbarch'' from the ARCHES list - indicating that the new
    architecture is just a synonym for an earlier architecture (see
    gdbarch_list_lookup_by_info()); a newly created \`\`struct gdbarch''
-   - that describes the selected architecture (see
-   gdbarch_alloc()). */
+   - that describes the selected architecture (see gdbarch_alloc()).
+
+   The DUMP_TDEP function shall print out all target specific values.
+   Care should be taken to ensure that the function works in both the
+   multi-arch and non- multi-arch cases. */
 
 struct gdbarch_list
 {
@@ -493,9 +793,23 @@ struct gdbarch_info
 };
 
 typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
+typedef void (gdbarch_dump_tdep_ftype) (struct gdbarch *gdbarch, struct ui_file *file);
 
+/* DEPRECATED - use gdbarch_register() */
 extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
 
+extern void gdbarch_register (enum bfd_architecture architecture,
+                              gdbarch_init_ftype *,
+                              gdbarch_dump_tdep_ftype *);
+
+
+/* Return a freshly allocated, NULL terminated, array of the valid
+   architecture names.  Since architectures are registered during the
+   _initialize phase this function only returns useful information
+   once initialization has been completed. */
+
+extern const char **gdbarch_printable_names (void);
+
 
 /* Helper function.  Search the list of ARCHES for a GDBARCH that
    matches the information provided by INFO. */
@@ -511,18 +825,27 @@ extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *ar
 extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
 
 
+/* Helper function.  Free a partially-constructed \`\`struct gdbarch''.
+   It is assumed that the caller freeds the \`\`struct
+   gdbarch_tdep''. */
+
+extern void gdbarch_free (struct gdbarch *);
+
+
 /* Helper function. Force an update of the current architecture.  Used
    by legacy targets that have added their own target specific
    architecture manipulation commands.
 
    The INFO parameter shall be fully initialized (\`\`memset (&INFO,
-   sizeof (info), 0)'' set relevant fields) before gdbarch_update() is
-   called.  gdbarch_update() shall initialize any \`\`default'' fields
-   using information obtained from the previous architecture or
+   sizeof (info), 0)'' set relevant fields) before gdbarch_update_p()
+   is called.  gdbarch_update_p() shall initialize any \`\`default''
+   fields using information obtained from the previous architecture or
    INFO.ABFD (if specified) before calling the corresponding
-   architectures INIT function. */
+   architectures INIT function.
 
-extern int gdbarch_update (struct gdbarch_info info);
+   Returns non-zero if the update succeeds */
+
+extern int gdbarch_update_p (struct gdbarch_info info);
 
 
 
@@ -571,7 +894,7 @@ extern void register_gdbarch_swap (void *data, unsigned long size, gdbarch_swap_
 
 
 
-/* The target-system-dependant byte order is dynamic */
+/* The target-system-dependent byte order is dynamic */
 
 /* TARGET_BYTE_ORDER_SELECTABLE_P determines if the target endianness
    is selectable at runtime.  The user can use the \`\`set endian''
@@ -611,7 +934,7 @@ extern int target_byte_order_auto;
 
 
 
-/* The target-system-dependant BFD architecture is dynamic */
+/* The target-system-dependent BFD architecture is dynamic */
 
 extern int target_architecture_auto;
 #ifndef TARGET_ARCHITECTURE_AUTO
@@ -623,20 +946,13 @@ extern const struct bfd_arch_info *target_architecture;
 #define TARGET_ARCHITECTURE (target_architecture + 0)
 #endif
 
-/* Notify the target dependant backend of a change to the selected
-   architecture. A zero return status indicates that the target did
-   not like the change. */
-
-extern int (*target_architecture_hook) (const struct bfd_arch_info *);
-
 
-
-/* The target-system-dependant disassembler is semi-dynamic */
+/* The target-system-dependent disassembler is semi-dynamic */
 
 #include "dis-asm.h"           /* Get defs for disassemble_info */
 
 extern int dis_asm_read_memory (bfd_vma memaddr, bfd_byte *myaddr,
-                               int len, disassemble_info *info);
+                               unsigned int len, disassemble_info *info);
 
 extern void dis_asm_memory_error (int status, bfd_vma memaddr,
                                  disassemble_info *info);
@@ -659,31 +975,6 @@ extern disassemble_info tm_print_insn_info;
    USE of these macro's is *STRONGLY* discouraged. */
 
 #define GDB_TARGET_IS_D10V (TARGET_ARCHITECTURE->arch == bfd_arch_d10v)
-#ifndef D10V_MAKE_DADDR
-#define D10V_MAKE_DADDR(X) (internal_error ("gdbarch: D10V_MAKE_DADDR"), 0)
-#endif
-#ifndef D10V_MAKE_IADDR
-#define D10V_MAKE_IADDR(X) (internal_error ("gdbarch: D10V_MAKE_IADDR"), 0)
-#endif
-
-
-/* Fallback definition of FRAMELESS_FUNCTION_INVOCATION */
-#ifndef FRAMELESS_FUNCTION_INVOCATION
-#define FRAMELESS_FUNCTION_INVOCATION(FI) (0)
-#endif
-
-
-/* Fallback definition of REGISTER_CONVERTIBLE etc */
-extern int generic_register_convertible_not (int reg_nr);
-#ifndef REGISTER_CONVERTIBLE
-#define REGISTER_CONVERTIBLE(x) (0)
-#endif
-#ifndef REGISTER_CONVERT_TO_VIRTUAL
-#define REGISTER_CONVERT_TO_VIRTUAL(x, y, z, a)
-#endif
-#ifndef REGISTER_CONVERT_TO_RAW
-#define REGISTER_CONVERT_TO_RAW(x, y, z, a)
-#endif
 
 
 /* Fallback definition for EXTRACT_STRUCT_VALUE_ADDRESS */
@@ -697,55 +988,28 @@ extern int generic_register_convertible_not (int reg_nr);
 #endif
 
 
-/* Fallback definition for REGISTER_NAME for systems still defining
-   REGISTER_NAMES. */
-#ifndef REGISTER_NAME
-extern char *gdb_register_names[];
-#define REGISTER_NAME(i) gdb_register_names[i]
-#endif
-
-
-/* Set the dynamic target-system-dependant parameters (architecture,
+/* Set the dynamic target-system-dependent parameters (architecture,
    byte-order, ...) using information found in the BFD */
 
 extern void set_gdbarch_from_file (bfd *);
 
 
-/* Explicitly set the dynamic target-system-dependant parameters based
-   on bfd_architecture and machine. */
-
-extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned long);
-
-
 /* Initialize the current architecture to the "first" one we find on
    our list.  */
 
 extern void initialize_current_architecture (void);
 
-/* Helper function for targets that don't know how my arguments are
-   being passed */
-
-extern int frame_num_args_unknown (struct frame_info *fi);
-
 
 /* gdbarch trace variable */
 extern int gdbarch_debug;
 
-extern void gdbarch_dump (void);
+extern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
 
 #endif
 EOF
 exec 1>&2
 #../move-if-change new-gdbarch.h gdbarch.h
-if ! test -r gdbarch.h
-then
-  echo "gdbarch.h missing? cp new-gdbarch.h gdbarch.h" 1>&2
-elif diff -c gdbarch.h new-gdbarch.h
-then
-  echo "gdbarch.h unchanged" 1>&2
-else
-  echo "gdbarch.h has changed? cp new-gdbarch.h gdbarch.h" 1>&2
-fi
+compare_new gdbarch.h
 
 
 #
@@ -757,6 +1021,7 @@ copyright
 cat <<EOF
 
 #include "defs.h"
+#include "arch-utils.h"
 
 #if GDB_MULTI_ARCH
 #include "gdbcmd.h"
@@ -780,6 +1045,7 @@ cat <<EOF
 #endif
 #include "symcat.h"
 
+#include "floatformat.h"
 
 /* Static function declarations */
 
@@ -806,29 +1072,31 @@ int gdbarch_debug = GDBARCH_DEBUG;
 EOF
 
 # gdbarch open the gdbarch object
-echo ""
-echo "/* Maintain the struct gdbarch object */"
-echo ""
-echo "struct gdbarch"
-echo "{"
-echo "  /* basic architectural information */"
-function_list | while eval read $read
+printf "\n"
+printf "/* Maintain the struct gdbarch object */\n"
+printf "\n"
+printf "struct gdbarch\n"
+printf "{\n"
+printf "  /* basic architectural information */\n"
+function_list | while do_read
 do
-  case "${class}" in
-    "i" ) echo "  ${returntype} ${function};" ;;
-  esac
+    if class_is_info_p
+    then
+       printf "  ${returntype} ${function};\n"
+    fi
 done
-echo ""
-echo "  /* target specific vector. */"
-echo "  struct gdbarch_tdep *tdep;"
-echo ""
-echo "  /* per-architecture data-pointers */"
-echo "  int nr_data;"
-echo "  void **data;"
-echo ""
-echo "  /* per-architecture swap-regions */"
-echo "  struct gdbarch_swap *swap;"
-echo ""
+printf "\n"
+printf "  /* target specific vector. */\n"
+printf "  struct gdbarch_tdep *tdep;\n"
+printf "  gdbarch_dump_tdep_ftype *dump_tdep;\n"
+printf "\n"
+printf "  /* per-architecture data-pointers */\n"
+printf "  int nr_data;\n"
+printf "  void **data;\n"
+printf "\n"
+printf "  /* per-architecture swap-regions */\n"
+printf "  struct gdbarch_swap *swap;\n"
+printf "\n"
 cat <<EOF
   /* Multi-arch values.
 
@@ -845,10 +1113,10 @@ cat <<EOF
      verify_gdbarch(): Confirm that the target updated the field
      correctly.
 
-     gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
+     gdbarch_dump(): Add a fprintf_unfiltered call 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
@@ -857,60 +1125,67 @@ cat <<EOF
      */
 
 EOF
-function_list | while eval read $read
+function_list | while do_read
 do
-  case "${class}" in
-    "v" ) echo "  ${returntype} ${function};" ;;
-    "f" ) echo "  gdbarch_${function}_ftype *${function}${attrib};" ;;
-  esac
+    if class_is_variable_p
+    then
+       printf "  ${returntype} ${function};\n"
+    elif class_is_function_p
+    then
+       printf "  gdbarch_${function}_ftype *${function}${attrib};\n"
+    fi
 done
-echo "};"
+printf "};\n"
 
 # A pre-initialized vector
-echo ""
-echo ""
+printf "\n"
+printf "\n"
 cat <<EOF
 /* The default architecture uses host values (for want of a better
    choice). */
 EOF
-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
+printf "\n"
+printf "extern const struct bfd_arch_info bfd_default_arch_struct;\n"
+printf "\n"
+printf "struct gdbarch startup_gdbarch =\n"
+printf "{\n"
+printf "  /* basic architecture information */\n"
+function_list | while do_read
 do
-  case "${class}" in
-    "i" ) echo "  ${default}," ;;
-  esac
+    if class_is_info_p
+    then
+       printf "  ${staticdefault},\n"
+    fi
 done
 cat <<EOF
-  /* target specific vector */
-  NULL,
+  /* target specific vector and its dump routine */
+  NULL, NULL,
   /*per-architecture data-pointers and swap regions */
   0, NULL, NULL,
   /* Multi-arch values */
 EOF
-function_list | while eval read $read
+function_list | while do_read
 do
-  case "${class}" in
-    "f" | "v" ) echo "  ${default}," ;;
-  esac
+    if class_is_function_p || class_is_variable_p
+    then
+       printf "  ${staticdefault},\n"
+    fi
 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
-echo ""
-echo ""
+printf "\n"
+printf "\n"
 cat <<EOF
-/* Create a new \`\`struct gdbarch'' based in information provided by
+/* Create a new \`\`struct gdbarch'' based on information provided by
    \`\`struct gdbarch_info''. */
 EOF
-echo ""
+printf "\n"
 cat <<EOF
 struct gdbarch *
 gdbarch_alloc (const struct gdbarch_info *info,
@@ -921,25 +1196,25 @@ gdbarch_alloc (const struct gdbarch_info *info,
 
   gdbarch->tdep = tdep;
 EOF
-echo ""
-function_list | while eval read $read
+printf "\n"
+function_list | while do_read
 do
-  case "${class}" in
-    "i" ) echo "  gdbarch->${function} = info->${function};"
-  esac
+    if class_is_info_p
+    then
+       printf "  gdbarch->${function} = info->${function};\n"
+    fi
 done
-echo ""
-echo "  /* Force the explicit initialization of these. */"
-function_list | while eval read $read
+printf "\n"
+printf "  /* Force the explicit initialization of these. */\n"
+function_list | while do_read
 do
-  case "${class}" in
-    "f" | "v" )
-       if [ "${init}" != "" -a "${init}" != "0" ]
+    if class_is_function_p || class_is_variable_p
+    then
+       if [ "${predefault}" != "" -a "${predefault}" != "0" ]
        then
-         echo "  gdbarch->${function} = ${init};"
+         printf "  gdbarch->${function} = ${predefault};\n"
        fi
-       ;;
-  esac
+    fi
 done
 cat <<EOF
   /* gdbarch_alloc() */
@@ -948,17 +1223,35 @@ cat <<EOF
 }
 EOF
 
+# Free a gdbarch struct.
+printf "\n"
+printf "\n"
+cat <<EOF
+/* Free a gdbarch struct.  This should never happen in normal
+   operation --- once you've created a gdbarch, you keep it around.
+   However, if an architecture's init function encounters an error
+   building the structure, it may need to clean up a partially
+   constructed gdbarch.  */
+
+void
+gdbarch_free (struct gdbarch *arch)
+{
+  /* At the moment, this is trivial.  */
+  free (arch);
+}
+EOF
+
 # verify a new architecture
-echo ""
-echo ""
-echo "/* Ensure that all values in a GDBARCH are reasonable. */"
-echo ""
+printf "\n"
+printf "\n"
+printf "/* Ensure that all values in a GDBARCH are reasonable. */\n"
+printf "\n"
 cat <<EOF
 static void
 verify_gdbarch (struct gdbarch *gdbarch)
 {
   /* Only perform sanity checks on a multi-arch target. */
-  if (GDB_MULTI_ARCH <= 0)
+  if (!GDB_MULTI_ARCH)
     return;
   /* fundamental */
   if (gdbarch->byte_order == 0)
@@ -967,167 +1260,228 @@ 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
 do
-  case "${class}" in
-    "f" | "v" )
-       if [ "${invalid_p}" ]
+    if class_is_function_p || class_is_variable_p
+    then
+       if [ "${invalid_p}" = "0" ]
+       then
+           printf "  /* Skip verify of ${function}, invalid_p == 0 */\n"
+       elif class_is_predicate_p
+       then
+           printf "  /* Skip verify of ${function}, has predicate */\n"
+       # FIXME: See do_read for potential simplification
+       elif [ "${invalid_p}" -a "${postdefault}" ]
+       then
+           printf "  if (${invalid_p})\n"
+           printf "    gdbarch->${function} = ${postdefault};\n"
+       elif [ "${predefault}" -a "${postdefault}" ]
+       then
+           printf "  if (gdbarch->${function} == ${predefault})\n"
+           printf "    gdbarch->${function} = ${postdefault};\n"
+       elif [ "${postdefault}" ]
        then
-         echo "  if ((GDB_MULTI_ARCH >= ${level})"
-         echo "      && (${invalid_p}))"
-         echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
-       elif [ "${init}" ]
+           printf "  if (gdbarch->${function} == 0)\n"
+           printf "    gdbarch->${function} = ${postdefault};\n"
+       elif [ "${invalid_p}" ]
        then
-         echo "  if ((GDB_MULTI_ARCH >= ${level})"
-         echo "      && (gdbarch->${function} == ${init}))"
-         echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
+           printf "  if ((GDB_MULTI_ARCH >= ${level})\n"
+           printf "      && (${invalid_p}))\n"
+           printf "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");\n"
+       elif [ "${predefault}" ]
+       then
+           printf "  if ((GDB_MULTI_ARCH >= ${level})\n"
+           printf "      && (gdbarch->${function} == ${predefault}))\n"
+           printf "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");\n"
        fi
-       ;;
-  esac
+    fi
 done
 cat <<EOF
 }
 EOF
 
 # dump the structure
-echo ""
-echo ""
-echo "/* Print out the details of the current architecture. */"
-echo ""
+printf "\n"
+printf "\n"
 cat <<EOF
+/* Print out the details of the current architecture. */
+
+/* NOTE/WARNING: The parameter is called \`\`current_gdbarch'' so that it
+   just happens to match the global variable \`\`current_gdbarch''.  That
+   way macros refering to that variable get the local and not the global
+   version - ulgh.  Once everything is parameterised with gdbarch, this
+   will go away. */
+
 void
-gdbarch_dump (void)
+gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
 {
+  fprintf_unfiltered (file,
+                      "gdbarch_dump: GDB_MULTI_ARCH = %d\\n",
+                      GDB_MULTI_ARCH);
 EOF
-function_list | while eval read $read
+function_list | while do_read
 do
-  case "${class}" in
-    "f" )
-       echo "  fprintf_unfiltered (gdb_stdlog,"
-       echo "                      \"gdbarch_update: ${macro} = 0x%08lx\\n\","
-       echo "                      (long) current_gdbarch->${function}"
-       echo "                      /*${macro} ()*/);"
-       ;;
-    * )
-       test "${fmt}" || fmt="%ld"
-       test "${print}" || print="(long) ${macro}"
-       if [ "${print_p}" = "#" ]
-       then
-         echo "#ifdef ${macro}"
-         echo "  fprintf_unfiltered (gdb_stdlog,"
-         echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
-         echo "                      ${print});"
-         echo "#endif"
-       elif [ "${print_p}" ]
-       then
-         echo "  if (${print_p})"
-         echo "    fprintf_unfiltered (gdb_stdlog,"
-         echo "                        \"gdbarch_update: ${macro} = ${fmt}\\n\","
-         echo "                        ${print});"
-       else
-         echo "  fprintf_unfiltered (gdb_stdlog,"
-         echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
-         echo "                      ${print});"
-       fi
-       ;;
-  esac
+    if [ "${returntype}" = "void" ]
+    then
+       printf "#if defined (${macro}) && GDB_MULTI_ARCH\n"
+       printf "  /* Macro might contain \`[{}]' when not multi-arch */\n"
+    else
+       printf "#ifdef ${macro}\n"
+    fi
+    if class_is_function_p
+    then
+       printf "  fprintf_unfiltered (file,\n"
+       printf "                      \"gdbarch_dump: %%s # %%s\\\\n\",\n"
+       printf "                      \"${macro}(${actual})\",\n"
+       printf "                      XSTRING (${macro} (${actual})));\n"
+    else
+       printf "  fprintf_unfiltered (file,\n"
+       printf "                      \"gdbarch_dump: ${macro} # %%s\\\\n\",\n"
+       printf "                      XSTRING (${macro}));\n"
+    fi
+    printf "#endif\n"
+done
+function_list | while do_read
+do
+    printf "#ifdef ${macro}\n"
+    if [ "${print_p}" = "()" ]
+    then
+       printf "  gdbarch_dump_${function} (current_gdbarch);\n"
+    elif [ "${print_p}" = "0" ]
+    then
+       printf "  /* skip print of ${macro}, print_p == 0. */\n"
+    elif [ "${print_p}" ]
+    then
+       printf "  if (${print_p})\n"
+       printf "    fprintf_unfiltered (file,\n"
+       printf "                        \"gdbarch_dump: ${macro} = %s\\\\n\",\n" "${fmt}"
+       printf "                        ${print});\n"
+    elif class_is_function_p
+    then
+       printf "  if (GDB_MULTI_ARCH)\n"
+       printf "    fprintf_unfiltered (file,\n"
+       printf "                        \"gdbarch_dump: ${macro} = 0x%%08lx\\\\n\",\n"
+       printf "                        (long) current_gdbarch->${function}\n"
+       printf "                        /*${macro} ()*/);\n"
+    else
+       printf "  fprintf_unfiltered (file,\n"
+       printf "                      \"gdbarch_dump: ${macro} = %s\\\\n\",\n" "${fmt}"
+       printf "                      ${print});\n"
+    fi
+    printf "#endif\n"
 done
-echo "}"
+cat <<EOF
+  if (current_gdbarch->dump_tdep != NULL)
+    current_gdbarch->dump_tdep (current_gdbarch, file);
+}
+EOF
 
 
 # GET/SET
-echo ""
+printf "\n"
 cat <<EOF
 struct gdbarch_tdep *
 gdbarch_tdep (struct gdbarch *gdbarch)
 {
   if (gdbarch_debug >= 2)
-    /* FIXME: gdb_std??? */
-    fprintf_unfiltered (gdb_stdlog, "gdbarch_tdep called\n");
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_tdep called\\n");
   return gdbarch->tdep;
 }
 EOF
-echo ""
-function_list | while eval read $read
+printf "\n"
+function_list | while do_read
 do
-  case "${class}" in
-    "f" )
-       echo ""
-       echo "${returntype}"
+    if class_is_predicate_p
+    then
+       printf "\n"
+       printf "int\n"
+       printf "gdbarch_${function}_p (struct gdbarch *gdbarch)\n"
+       printf "{\n"
+       if [ "${valid_p}" ]
+       then
+           printf "  return ${valid_p};\n"
+       else
+           printf "#error \"gdbarch_${function}_p: not defined\"\n"
+       fi
+       printf "}\n"
+    fi
+    if class_is_function_p
+    then
+       printf "\n"
+       printf "${returntype}\n"
        if [ "${formal}" = "void" ]
        then
-         echo "gdbarch_${function} (struct gdbarch *gdbarch)"
+         printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
        else
-         echo "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})"
+         printf "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})\n"
        fi
-       echo "{"
-        echo "  if (gdbarch->${function} == 0)"
-        echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
-       echo "  if (gdbarch_debug >= 2)"
-       echo "    /* FIXME: gdb_std??? */"
-       echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
+       printf "{\n"
+        printf "  if (gdbarch->${function} == 0)\n"
+        printf "    internal_error (\"gdbarch: gdbarch_${function} invalid\");\n"
+       printf "  if (gdbarch_debug >= 2)\n"
+       printf "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
         test "${actual}" = "-" && actual=""
                if [ "${returntype}" = "void" ]
        then
-         echo "  gdbarch->${function} (${actual});"
+         printf "  gdbarch->${function} (${actual});\n"
        else
-         echo "  return gdbarch->${function} (${actual});"
+         printf "  return gdbarch->${function} (${actual});\n"
        fi
-       echo "}"
-       echo ""
-       echo "void"
-       echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
-        echo "            `echo ${function} | sed -e 's/./ /g'`  gdbarch_${function}_ftype ${function})"
-       echo "{"
-       echo "  gdbarch->${function} = ${function};"
-       echo "}"
-       ;;
-    "v" )
-       echo ""
-       echo "${returntype}"
-       echo "gdbarch_${function} (struct gdbarch *gdbarch)"
-       echo "{"
-       if [ "${invalid_p}" ]
+       printf "}\n"
+       printf "\n"
+       printf "void\n"
+       printf "set_gdbarch_${function} (struct gdbarch *gdbarch,\n"
+        printf "            `echo ${function} | sed -e 's/./ /g'`  gdbarch_${function}_ftype ${function})\n"
+       printf "{\n"
+       printf "  gdbarch->${function} = ${function};\n"
+       printf "}\n"
+    elif class_is_variable_p
+    then
+       printf "\n"
+       printf "${returntype}\n"
+       printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
+       printf "{\n"
+       if [ "${invalid_p}" = "0" ]
        then
-         echo "  if (${invalid_p})"
-         echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
-       elif [ "${init}" ]
+           printf "  /* Skip verify of ${function}, invalid_p == 0 */\n"
+       elif [ "${invalid_p}" ]
        then
-         echo "  if (gdbarch->${function} == ${init})"
-         echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
+         printf "  if (${invalid_p})\n"
+         printf "    internal_error (\"gdbarch: gdbarch_${function} invalid\");\n"
+       elif [ "${predefault}" ]
+       then
+         printf "  if (gdbarch->${function} == ${predefault})\n"
+         printf "    internal_error (\"gdbarch: gdbarch_${function} invalid\");\n"
        fi
-       echo "  if (gdbarch_debug >= 2)"
-       echo "    /* FIXME: gdb_std??? */"
-       echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
-       echo "  return gdbarch->${function};"
-       echo "}"
-       echo ""
-       echo "void"
-       echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
-        echo "            `echo ${function} | sed -e 's/./ /g'`  ${returntype} ${function})"
-       echo "{"
-       echo "  gdbarch->${function} = ${function};"
-       echo "}"
-       ;;
-    "i" )
-       echo ""
-       echo "${returntype}"
-       echo "gdbarch_${function} (struct gdbarch *gdbarch)"
-       echo "{"
-       echo "  if (gdbarch_debug >= 2)"
-       echo "    /* FIXME: gdb_std??? */"
-       echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
-       echo "  return gdbarch->${function};"
-       echo "}"
-       ;;
-  esac
+       printf "  if (gdbarch_debug >= 2)\n"
+       printf "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
+       printf "  return gdbarch->${function};\n"
+       printf "}\n"
+       printf "\n"
+       printf "void\n"
+       printf "set_gdbarch_${function} (struct gdbarch *gdbarch,\n"
+        printf "            `echo ${function} | sed -e 's/./ /g'`  ${returntype} ${function})\n"
+       printf "{\n"
+       printf "  gdbarch->${function} = ${function};\n"
+       printf "}\n"
+    elif class_is_info_p
+    then
+       printf "\n"
+       printf "${returntype}\n"
+       printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
+       printf "{\n"
+       printf "  if (gdbarch_debug >= 2)\n"
+       printf "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
+       printf "  return gdbarch->${function};\n"
+       printf "}\n"
+    fi
 done
 
 # All the trailing guff
 cat <<EOF
 
 
-/* Keep a registrary of per-architecture data-pointers required by GDB
+/* Keep a registry of per-architecture data-pointers required by GDB
    modules. */
 
 struct gdbarch_data
@@ -1142,13 +1496,13 @@ struct gdbarch_data_registration
   struct gdbarch_data_registration *next;
 };
 
-struct gdbarch_data_registrary
+struct gdbarch_data_registry
 {
   int nr;
   struct gdbarch_data_registration *registrations;
 };
 
-struct gdbarch_data_registrary gdbarch_data_registrary =
+struct gdbarch_data_registry gdbarch_data_registry =
 {
   0, NULL,
 };
@@ -1157,14 +1511,14 @@ struct gdbarch_data *
 register_gdbarch_data (gdbarch_data_ftype *init)
 {
   struct gdbarch_data_registration **curr;
-  for (curr = &gdbarch_data_registrary.registrations;
+  for (curr = &gdbarch_data_registry.registrations;
        (*curr) != NULL;
        curr = &(*curr)->next);
   (*curr) = XMALLOC (struct gdbarch_data_registration);
   (*curr)->next = NULL;
   (*curr)->init = init;
   (*curr)->data = XMALLOC (struct gdbarch_data);
-  (*curr)->data->index = gdbarch_data_registrary.nr++;
+  (*curr)->data->index = gdbarch_data_registry.nr++;
   return (*curr)->data;
 }
 
@@ -1175,9 +1529,9 @@ static void
 init_gdbarch_data (struct gdbarch *gdbarch)
 {
   struct gdbarch_data_registration *rego;
-  gdbarch->nr_data = gdbarch_data_registrary.nr + 1;
+  gdbarch->nr_data = gdbarch_data_registry.nr + 1;
   gdbarch->data = xmalloc (sizeof (void*) * gdbarch->nr_data);
-  for (rego = gdbarch_data_registrary.registrations;
+  for (rego = gdbarch_data_registry.registrations;
        rego != NULL;
        rego = rego->next)
     {
@@ -1191,8 +1545,7 @@ init_gdbarch_data (struct gdbarch *gdbarch)
    data-pointer. */
 
 void *
-gdbarch_data (data)
-     struct gdbarch_data *data;
+gdbarch_data (struct gdbarch_data *data)
 {
   if (data->index >= current_gdbarch->nr_data)
     internal_error ("gdbarch_data: request for non-existant data.");
@@ -1201,7 +1554,7 @@ gdbarch_data (data)
 
 
 
-/* Keep a registrary of swaped data required by GDB modules. */
+/* Keep a registry of swapped data required by GDB modules. */
 
 struct gdbarch_swap
 {
@@ -1218,13 +1571,13 @@ struct gdbarch_swap_registration
   struct gdbarch_swap_registration *next;
 };
 
-struct gdbarch_swap_registrary
+struct gdbarch_swap_registry
 {
   int nr;
   struct gdbarch_swap_registration *registrations;
 };
 
-struct gdbarch_swap_registrary gdbarch_swap_registrary = 
+struct gdbarch_swap_registry gdbarch_swap_registry = 
 {
   0, NULL,
 };
@@ -1235,7 +1588,7 @@ register_gdbarch_swap (void *data,
                       gdbarch_swap_ftype *init)
 {
   struct gdbarch_swap_registration **rego;
-  for (rego = &gdbarch_swap_registrary.registrations;
+  for (rego = &gdbarch_swap_registry.registrations;
        (*rego) != NULL;
        rego = &(*rego)->next);
   (*rego) = XMALLOC (struct gdbarch_swap_registration);
@@ -1251,7 +1604,7 @@ init_gdbarch_swap (struct gdbarch *gdbarch)
 {
   struct gdbarch_swap_registration *rego;
   struct gdbarch_swap **curr = &gdbarch->swap;
-  for (rego = gdbarch_swap_registrary.registrations;
+  for (rego = gdbarch_swap_registry.registrations;
        rego != NULL;
        rego = rego->next)
     {
@@ -1290,32 +1643,78 @@ swapin_gdbarch_swap (struct gdbarch *gdbarch)
 }
 
 
-/* Keep a registrary of the architectures known by GDB. */
+/* Keep a registry of the architectures known by GDB. */
 
-struct gdbarch_init_registration
+struct gdbarch_registration
 {
   enum bfd_architecture bfd_architecture;
   gdbarch_init_ftype *init;
+  gdbarch_dump_tdep_ftype *dump_tdep;
   struct gdbarch_list *arches;
-  struct gdbarch_init_registration *next;
+  struct gdbarch_registration *next;
 };
 
-static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
+static struct gdbarch_registration *gdbarch_registry = NULL;
+
+static void
+append_name (const char ***buf, int *nr, const char *name)
+{
+  *buf = xrealloc (*buf, sizeof (char**) * (*nr + 1));
+  (*buf)[*nr] = name;
+  *nr += 1;
+}
+
+const char **
+gdbarch_printable_names (void)
+{
+  if (GDB_MULTI_ARCH)
+    {
+      /* Accumulate a list of names based on the registed list of
+         architectures. */
+      enum bfd_architecture a;
+      int nr_arches = 0;
+      const char **arches = NULL;
+      struct gdbarch_registration *rego;
+      for (rego = gdbarch_registry;
+          rego != NULL;
+          rego = rego->next)
+       {
+         const struct bfd_arch_info *ap;
+         ap = bfd_lookup_arch (rego->bfd_architecture, 0);
+         if (ap == NULL)
+           internal_error ("gdbarch_architecture_names: multi-arch unknown");
+         do
+           {
+             append_name (&arches, &nr_arches, ap->printable_name);
+             ap = ap->next;
+           }
+         while (ap != NULL);
+       }
+      append_name (&arches, &nr_arches, NULL);
+      return arches;
+    }
+  else
+    /* Just return all the architectures that BFD knows.  Assume that
+       the legacy architecture framework supports them. */
+    return bfd_arch_list ();
+}
+
 
 void
-register_gdbarch_init (enum bfd_architecture bfd_architecture,
-                       gdbarch_init_ftype *init)
+gdbarch_register (enum bfd_architecture bfd_architecture,
+                  gdbarch_init_ftype *init,
+                 gdbarch_dump_tdep_ftype *dump_tdep)
 {
-  struct gdbarch_init_registration **curr;
+  struct gdbarch_registration **curr;
   const struct bfd_arch_info *bfd_arch_info;
-  /* Check that BFD reconizes this architecture */
+  /* Check that BFD recognizes this architecture */
   bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
   if (bfd_arch_info == NULL)
     {
       internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
     }
   /* Check that we haven't seen this architecture before */
-  for (curr = &gdbarch_init_registrary;
+  for (curr = &gdbarch_registry;
        (*curr) != NULL;
        curr = &(*curr)->next)
     {
@@ -1329,13 +1728,26 @@ register_gdbarch_init (enum bfd_architecture bfd_architecture,
                        bfd_arch_info->printable_name,
                        (long) init);
   /* Append it */
-  (*curr) = XMALLOC (struct gdbarch_init_registration);
+  (*curr) = XMALLOC (struct gdbarch_registration);
   (*curr)->bfd_architecture = bfd_architecture;
   (*curr)->init = init;
+  (*curr)->dump_tdep = dump_tdep;
   (*curr)->arches = NULL;
   (*curr)->next = NULL;
+  /* When non- multi-arch, install whatever target dump routine we've
+     been provided - hopefully that routine has been written correctly
+     and works regardless of multi-arch. */
+  if (!GDB_MULTI_ARCH && dump_tdep != NULL
+      && startup_gdbarch.dump_tdep == NULL)
+    startup_gdbarch.dump_tdep = dump_tdep;
+}
+
+void
+register_gdbarch_init (enum bfd_architecture bfd_architecture,
+                      gdbarch_init_ftype *init)
+{
+  gdbarch_register (bfd_architecture, init, NULL);
 }
-  
 
 
 /* Look for an architecture using gdbarch_info.  Base search on only
@@ -1361,11 +1773,11 @@ gdbarch_list_lookup_by_info (struct gdbarch_list *arches,
    failed. */
 
 int
-gdbarch_update (struct gdbarch_info info)
+gdbarch_update_p (struct gdbarch_info info)
 {
   struct gdbarch *new_gdbarch;
   struct gdbarch_list **list;
-  struct gdbarch_init_registration *rego;
+  struct gdbarch_registration *rego;
 
   /* Fill in any missing bits. Most important is the bfd_architecture
      which is used to select the target architecture. */
@@ -1399,38 +1811,40 @@ gdbarch_update (struct gdbarch_info info)
   /* A default for abfd? */
 
   /* Find the target that knows about this architecture. */
-  for (rego = gdbarch_init_registrary;
-       rego != NULL && rego->bfd_architecture != info.bfd_architecture;
-       rego = rego->next);
+  for (rego = gdbarch_registry;
+       rego != NULL;
+       rego = rego->next)
+    if (rego->bfd_architecture == info.bfd_architecture)
+      break;
   if (rego == NULL)
     {
       if (gdbarch_debug)
-       fprintf_unfiltered (gdb_stdlog, "gdbarch_update: No matching architecture\n");
+       fprintf_unfiltered (gdb_stdlog, "gdbarch_update: No matching architecture\\n");
       return 0;
     }
 
   if (gdbarch_debug)
     {
       fprintf_unfiltered (gdb_stdlog,
-                         "gdbarch_update: info.bfd_architecture %d (%s)\n",
+                         "gdbarch_update: info.bfd_architecture %d (%s)\\n",
                          info.bfd_architecture,
                          bfd_lookup_arch (info.bfd_architecture, 0)->printable_name);
       fprintf_unfiltered (gdb_stdlog,
-                         "gdbarch_update: info.bfd_arch_info %s\n",
+                         "gdbarch_update: info.bfd_arch_info %s\\n",
                          (info.bfd_arch_info != NULL
                           ? info.bfd_arch_info->printable_name
                           : "(null)"));
       fprintf_unfiltered (gdb_stdlog,
-                         "gdbarch_update: info.byte_order %d (%s)\n",
+                         "gdbarch_update: info.byte_order %d (%s)\\n",
                          info.byte_order,
                          (info.byte_order == BIG_ENDIAN ? "big"
                           : info.byte_order == LITTLE_ENDIAN ? "little"
                           : "default"));
       fprintf_unfiltered (gdb_stdlog,
-                         "gdbarch_update: info.abfd 0x%lx\n",
+                         "gdbarch_update: info.abfd 0x%lx\\n",
                          (long) info.abfd);
       fprintf_unfiltered (gdb_stdlog,
-                         "gdbarch_update: info.tdep_info 0x%lx\n",
+                         "gdbarch_update: info.tdep_info 0x%lx\\n",
                          (long) info.tdep_info);
     }
 
@@ -1441,7 +1855,7 @@ gdbarch_update (struct gdbarch_info info)
   if (new_gdbarch == NULL)
     {
       if (gdbarch_debug)
-       fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Target rejected architecture\n");
+       fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Target rejected architecture\\n");
       return 0;
     }
 
@@ -1449,7 +1863,7 @@ gdbarch_update (struct gdbarch_info info)
   if (current_gdbarch == new_gdbarch)
     {
       if (gdbarch_debug)
-       fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Architecture 0x%08lx (%s) unchanged\n",
+       fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Architecture 0x%08lx (%s) unchanged\\n",
                            (long) new_gdbarch,
                            new_gdbarch->bfd_arch_info->printable_name);
       return 1;
@@ -1466,7 +1880,8 @@ gdbarch_update (struct gdbarch_info info)
       if ((*list)->gdbarch == new_gdbarch)
        {
          if (gdbarch_debug)
-           fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Previous architecture 0x%08lx (%s) selected\n",
+           fprintf_unfiltered (gdb_stdlog,
+                                "gdbarch_update: Previous architecture 0x%08lx (%s) selected\\n",
                                (long) new_gdbarch,
                                new_gdbarch->bfd_arch_info->printable_name);
          current_gdbarch = new_gdbarch;
@@ -1474,7 +1889,7 @@ gdbarch_update (struct gdbarch_info info)
          return 1;
        }
     }
-    
+
   /* Append this new architecture to this targets list. */
   (*list) = XMALLOC (struct gdbarch_list);
   (*list)->next = NULL;
@@ -1485,13 +1900,14 @@ gdbarch_update (struct gdbarch_info info)
   if (gdbarch_debug)
     {
       fprintf_unfiltered (gdb_stdlog,
-                         "gdbarch_update: New architecture 0x%08lx (%s) selected\n",
+                         "gdbarch_update: New architecture 0x%08lx (%s) selected\\n",
                          (long) new_gdbarch,
                          new_gdbarch->bfd_arch_info->printable_name);
-      gdbarch_dump ();
     }
   
-  /* Check that the newly installed architecture is valid.  */
+  /* Check that the newly installed architecture is valid.  Plug in
+     any post init values.  */
+  new_gdbarch->dump_tdep = rego->dump_tdep;
   verify_gdbarch (new_gdbarch);
 
   /* Initialize the per-architecture memory (swap) areas.
@@ -1504,365 +1920,13 @@ gdbarch_update (struct gdbarch_info info)
      must be updated before these modules are called. */
   init_gdbarch_data (new_gdbarch);
   
-  return 1;
-}
-
-
-
-/* Functions to manipulate the endianness of the target.  */
-
-#ifdef TARGET_BYTE_ORDER_SELECTABLE
-/* compat - Catch old targets that expect a selectable byte-order to
-   default to BIG_ENDIAN */
-#ifndef TARGET_BYTE_ORDER_DEFAULT
-#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
-#endif
-#endif
-#if !TARGET_BYTE_ORDER_SELECTABLE_P
-#ifndef TARGET_BYTE_ORDER_DEFAULT
-/* compat - Catch old non byte-order selectable targets that do not
-   define TARGET_BYTE_ORDER_DEFAULT and instead expect
-   TARGET_BYTE_ORDER to be used as the default.  For targets that
-   defined neither TARGET_BYTE_ORDER nor TARGET_BYTE_ORDER_DEFAULT the
-   below will get a strange compiler warning. */
-#define TARGET_BYTE_ORDER_DEFAULT TARGET_BYTE_ORDER
-#endif
-#endif
-#ifndef TARGET_BYTE_ORDER_DEFAULT
-#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN /* arbitrary */
-#endif
-int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
-int target_byte_order_auto = 1;
-
-/* Chain containing the \"set endian\" commands.  */
-static struct cmd_list_element *endianlist = NULL;
-
-/* Called by \`\`show endian''.  */
-static void
-show_endian (char *args, int from_tty)
-{
-  char *msg =
-    (TARGET_BYTE_ORDER_AUTO
-     ? "The target endianness is set automatically (currently %s endian)\n"
-     : "The target is assumed to be %s endian\n");
-  printf_unfiltered (msg, (TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
-}
-
-/* Called if the user enters \`\`set endian'' without an argument.  */
-static void
-set_endian (char *args, int from_tty)
-{
-  printf_unfiltered ("\"set endian\" must be followed by \"auto\", \"big\" or \"little\".\n");
-  show_endian (args, from_tty);
-}
-
-/* Called by \`\`set endian big''.  */
-static void
-set_endian_big (char *args, int from_tty)
-{
-  if (TARGET_BYTE_ORDER_SELECTABLE_P)
-    {
-      target_byte_order = BIG_ENDIAN;
-      target_byte_order_auto = 0;
-      if (GDB_MULTI_ARCH)
-       {
-         struct gdbarch_info info;
-         memset (&info, 0, sizeof info);
-         info.byte_order = BIG_ENDIAN;
-         gdbarch_update (info);
-       }
-    }
-  else
-    {
-      printf_unfiltered ("Byte order is not selectable.");
-      show_endian (args, from_tty);
-    }
-}
-
-/* Called by \`\`set endian little''.  */
-static void
-set_endian_little (char *args, int from_tty)
-{
-  if (TARGET_BYTE_ORDER_SELECTABLE_P)
-    {
-      target_byte_order = LITTLE_ENDIAN;
-      target_byte_order_auto = 0;
-      if (GDB_MULTI_ARCH)
-       {
-         struct gdbarch_info info;
-         memset (&info, 0, sizeof info);
-         info.byte_order = LITTLE_ENDIAN;
-         gdbarch_update (info);
-       }
-    }
-  else
-    {
-      printf_unfiltered ("Byte order is not selectable.");
-      show_endian (args, from_tty);
-    }
-}
-
-/* Called by \`\`set endian auto''.  */
-static void
-set_endian_auto (char *args, int from_tty)
-{
-  if (TARGET_BYTE_ORDER_SELECTABLE_P)
-    {
-      target_byte_order_auto = 1;
-    }
-  else
-    {
-      printf_unfiltered ("Byte order is not selectable.");
-      show_endian (args, from_tty);
-    }
-}
-
-/* Set the endianness from a BFD.  */
-static void
-set_endian_from_file (bfd *abfd)
-{
-  if (TARGET_BYTE_ORDER_SELECTABLE_P)
-    {
-      int want;
-      
-      if (bfd_big_endian (abfd))
-       want = BIG_ENDIAN;
-      else
-       want = LITTLE_ENDIAN;
-      if (TARGET_BYTE_ORDER_AUTO)
-       target_byte_order = want;
-      else if (TARGET_BYTE_ORDER != want)
-       warning ("%s endian file does not match %s endian target.",
-                want == BIG_ENDIAN ? "big" : "little",
-                TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
-    }
-  else
-    {
-      if (bfd_big_endian (abfd)
-         ? TARGET_BYTE_ORDER != BIG_ENDIAN
-         : TARGET_BYTE_ORDER == BIG_ENDIAN)
-       warning ("%s endian file does not match %s endian target.",
-                bfd_big_endian (abfd) ? "big" : "little",
-                TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
-    }
-}
-
-
-
-/* Functions to manipulate the architecture of the target */
-
-enum set_arch { set_arch_auto, set_arch_manual };
-
-int target_architecture_auto = 1;
-extern const struct bfd_arch_info bfd_default_arch_struct;
-const struct bfd_arch_info *target_architecture = &bfd_default_arch_struct;
-int (*target_architecture_hook) (const struct bfd_arch_info *ap);
-
-static void show_endian (char *, int);
-static void set_endian (char *, int);
-static void set_endian_big (char *, int);
-static void set_endian_little (char *, int);
-static void set_endian_auto (char *, int);
-static void set_endian_from_file (bfd *);
-static int arch_ok (const struct bfd_arch_info *arch);
-static void set_arch (const struct bfd_arch_info *arch, enum set_arch type);
-static void show_architecture (char *, int);
-static void set_architecture (char *, int);
-static void info_architecture (char *, int);
-static void set_architecture_from_file (bfd *);
-
-/* Do the real work of changing the current architecture */
-
-static int
-arch_ok (const struct bfd_arch_info *arch)
-{
-  /* Should be performing the more basic check that the binary is
-     compatible with GDB. */
-  /* Check with the target that the architecture is valid. */
-  return (target_architecture_hook == NULL
-         || target_architecture_hook (arch));
-}
-
-static void
-set_arch (const struct bfd_arch_info *arch,
-          enum set_arch type)
-{
-  switch (type)
-    {
-    case set_arch_auto:
-      if (!arch_ok (arch))
-       warning ("Target may not support %s architecture",
-                arch->printable_name);
-      target_architecture = arch;
-      break;
-    case set_arch_manual:
-      if (!arch_ok (arch))
-       {
-         printf_unfiltered ("Target does not support \`%s' architecture.\n",
-                            arch->printable_name);
-       }
-      else
-       {
-         target_architecture_auto = 0;
-         target_architecture = arch;
-       }
-      break;
-    }
   if (gdbarch_debug)
-    gdbarch_dump ();
-}
-
-/* Called if the user enters \`\`show architecture'' without an argument. */
-static void
-show_architecture (char *args, int from_tty)
-{
-  const char *arch;
-  arch = TARGET_ARCHITECTURE->printable_name;
-  if (target_architecture_auto)
-    printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
-  else
-    printf_filtered ("The target architecture is assumed to be %s\n", arch);
-}
+    gdbarch_dump (current_gdbarch, gdb_stdlog);
 
-/* Called if the user enters \`\`set architecture'' with or without an
-   argument. */
-static void
-set_architecture (char *args, int from_tty)
-{
-  if (args == NULL)
-    {
-      printf_unfiltered ("\"set architecture\" must be followed by \"auto\" or an architecture name.\n");
-    }
-  else if (strcmp (args, "auto") == 0)
-    {
-      target_architecture_auto = 1;
-    }
-  else if (GDB_MULTI_ARCH)
-    {
-      const struct bfd_arch_info *arch = bfd_scan_arch (args);
-      if (arch == NULL)
-       printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
-      else
-       {
-         struct gdbarch_info info;
-         memset (&info, 0, sizeof info);
-         info.bfd_arch_info = arch;
-         if (gdbarch_update (info))
-           target_architecture_auto = 0;
-         else
-           printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
-       }
-    }
-  else
-    {
-      const struct bfd_arch_info *arch = bfd_scan_arch (args);
-      if (arch != NULL)
-       set_arch (arch, set_arch_manual);
-      else
-       printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
-    }
-}
-
-/* Called if the user enters \`\`info architecture'' without an argument. */
-static void
-info_architecture (char *args, int from_tty)
-{
-  enum bfd_architecture a;
-  if (GDB_MULTI_ARCH)
-    {
-      if (gdbarch_init_registrary != NULL)
-       {
-         struct gdbarch_init_registration *rego;
-         printf_filtered ("Available architectures are:\n");
-         for (rego = gdbarch_init_registrary;
-              rego != NULL;
-              rego = rego->next)
-           {
-             const struct bfd_arch_info *ap;
-             ap = bfd_lookup_arch (rego->bfd_architecture, 0);
-             if (ap != NULL)
-               {
-                 do
-                   {
-                     printf_filtered (" %s", ap->printable_name);
-                     ap = ap->next;
-                   }
-                 while (ap != NULL);
-                 printf_filtered ("\n");
-               }
-           }
-       }
-      else
-       {
-         printf_filtered ("There are no available architectures.\n");
-       }
-      return;
-    }
-  printf_filtered ("Available architectures are:\n");
-  for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
-    {
-      const struct bfd_arch_info *ap = bfd_lookup_arch (a, 0);
-      if (ap != NULL)
-       {
-         do
-           {
-             printf_filtered (" %s", ap->printable_name);
-             ap = ap->next;
-           }
-         while (ap != NULL);
-         printf_filtered ("\n");
-       }
-    }
-}
-
-/* Set the architecture from arch/machine */
-void
-set_architecture_from_arch_mach (arch, mach)
-     enum bfd_architecture arch;
-     unsigned long mach;
-{
-  const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
-  if (wanted != NULL)
-    set_arch (wanted, set_arch_manual);
-  else
-    internal_error ("gdbarch: hardwired architecture/machine not reconized");
-}
-
-/* Set the architecture from a BFD */
-static void
-set_architecture_from_file (bfd *abfd)
-{
-  const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
-  if (target_architecture_auto)
-    {
-      set_arch (wanted, set_arch_auto);
-    }
-  else if (wanted != target_architecture)
-    {
-      warning ("%s architecture file may be incompatible with %s target.",
-              wanted->printable_name,
-              target_architecture->printable_name);
-    }
-}
-
-
-/* Misc helper functions for targets. */
-
-int
-frame_num_args_unknown (fi)
-     struct frame_info *fi;
-{
-  return -1;
+  return 1;
 }
 
 
-int
-generic_register_convertible_not (num)
-     int num;
-{
-  return 0;
-}
-  
 /* Disassembler */
 
 /* Pointer to the target-dependent disassembly function.  */
@@ -1870,86 +1934,12 @@ int (*tm_print_insn) (bfd_vma, disassemble_info *);
 disassemble_info tm_print_insn_info;
 
 
-
-/* Set the dynamic target-system-dependant parameters (architecture,
-   byte-order) using information found in the BFD */
-
-void
-set_gdbarch_from_file (abfd)
-     bfd *abfd;
-{
-  if (GDB_MULTI_ARCH)
-    {
-      struct gdbarch_info info;
-      memset (&info, 0, sizeof info);
-      info.abfd = abfd;
-      gdbarch_update (info);
-      return;
-    }
-  set_architecture_from_file (abfd);
-  set_endian_from_file (abfd);
-}
-
-
-#if defined (CALL_DUMMY)
-/* FIXME - this should go away */
-LONGEST call_dummy_words[] = CALL_DUMMY;
-int sizeof_call_dummy_words = sizeof (call_dummy_words);
-#endif
-
-
-/* Initialize the current architecture.  */
-void
-initialize_current_architecture ()
-{
-  if (GDB_MULTI_ARCH)
-    {
-      struct gdbarch_init_registration *rego;
-      const struct bfd_arch_info *chosen = NULL;
-      for (rego = gdbarch_init_registrary; rego != NULL; rego = rego->next)
-       {
-         const struct bfd_arch_info *ap
-           = bfd_lookup_arch (rego->bfd_architecture, 0);
-
-         /* Choose the first architecture alphabetically.  */
-         if (chosen == NULL
-             || strcmp (ap->printable_name, chosen->printable_name) < 0)
-           chosen = ap;
-       }
-
-      if (chosen != NULL)
-       {
-         struct gdbarch_info info;
-         memset (&info, 0, sizeof info);
-         info.bfd_arch_info = chosen;
-         gdbarch_update (info);
-       }
-    }
-}
-
 extern void _initialize_gdbarch (void);
+
 void
-_initialize_gdbarch ()
+_initialize_gdbarch (void)
 {
-  add_prefix_cmd ("endian", class_support, set_endian,
-                 "Set endianness of target.",
-                 &endianlist, "set endian ", 0, &setlist);
-  add_cmd ("big", class_support, set_endian_big,
-          "Set target as being big endian.", &endianlist);
-  add_cmd ("little", class_support, set_endian_little,
-          "Set target as being little endian.", &endianlist);
-  add_cmd ("auto", class_support, set_endian_auto,
-          "Select target endianness automatically.", &endianlist);
-  add_cmd ("endian", class_support, show_endian,
-          "Show endianness of target.", &showlist);
-
-  add_cmd ("architecture", class_support, set_architecture,
-          "Set architecture of target.", &setlist);
-  add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
-  add_cmd ("architecture", class_support, show_architecture,
-          "Show architecture of target.", &showlist);
-  add_cmd ("architecture", class_support, info_architecture,
-          "List supported target architectures", &infolist);
+  struct cmd_list_element *c;
 
   INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
   tm_print_insn_info.flavour = bfd_target_unknown_flavour;
@@ -1957,25 +1947,26 @@ _initialize_gdbarch ()
   tm_print_insn_info.memory_error_func = dis_asm_memory_error;
   tm_print_insn_info.print_address_func = dis_asm_print_address;
 
-  add_show_from_set (add_set_cmd ("archdebug",
+  add_show_from_set (add_set_cmd ("arch",
                                  class_maintenance,
                                  var_zinteger,
                                  (char *)&gdbarch_debug,
-                                 "Set architecture debugging.\n\\
-When non-zero, architecture debugging is enabled.", &setlist),
-                    &showlist);
+                                 "Set architecture debugging.\\n\\
+When non-zero, architecture debugging is enabled.", &setdebuglist),
+                    &showdebuglist);
+  c = add_set_cmd ("archdebug",
+                  class_maintenance,
+                  var_zinteger,
+                  (char *)&gdbarch_debug,
+                  "Set architecture debugging.\\n\\
+When non-zero, architecture debugging is enabled.", &setlist);
+
+  deprecate_cmd (c, "set debug arch");
+  deprecate_cmd (add_show_from_set (c, &showlist), "show debug arch");
 }
 EOF
 
 # close things off
 exec 1>&2
 #../move-if-change new-gdbarch.c gdbarch.c
-if ! test -r gdbarch.c
-then
-  echo "gdbarch.c missing? cp new-gdbarch.c gdbarch.c" 1>&2
-elif diff -c gdbarch.c new-gdbarch.c
-then
-  echo "gdbarch.c unchanged" 1>&2
-else
-  echo "gdbarch.c has changed? cp new-gdbarch.c gdbarch.c" 1>&2
-fi
+compare_new gdbarch.c
This page took 0.053177 seconds and 4 git commands to generate.