OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [gdbarch.sh] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
#!/usr/local/bin/bash
#!/usr/local/bin/bash
 
 
# Architecture commands for GDB, the GNU debugger.
# Architecture commands for GDB, the GNU debugger.
# Copyright 1998-2000 Free Software Foundation, Inc.
# Copyright 1998-2000 Free Software Foundation, Inc.
#
#
# This file is part of GDB.
# This file is part of GDB.
#
#
# This program is free software; you can redistribute it and/or modify
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 
compare_new ()
compare_new ()
{
{
    file=$1
    file=$1
    if ! test -r ${file}
    if ! test -r ${file}
    then
    then
        echo "${file} missing? cp new-${file} ${file}" 1>&2
        echo "${file} missing? cp new-${file} ${file}" 1>&2
    elif diff -c ${file} new-${file}
    elif diff -c ${file} new-${file}
    then
    then
        echo "${file} unchanged" 1>&2
        echo "${file} unchanged" 1>&2
    else
    else
        echo "${file} has changed? cp new-${file} ${file}" 1>&2
        echo "${file} has changed? cp new-${file} ${file}" 1>&2
    fi
    fi
}
}
 
 
 
 
# DEFAULT is a valid fallback definition of a MACRO when
# DEFAULT is a valid fallback definition of a MACRO when
# multi-arch is not enabled.
# multi-arch is not enabled.
default_is_fallback_p ()
default_is_fallback_p ()
{
{
    [ "${default}" != "" -a "${invalid_p}" = "0" ]
    [ "${default}" != "" -a "${invalid_p}" = "0" ]
    # FIXME: cagney - not until after 5.0
    # FIXME: cagney - not until after 5.0
    false
    false
}
}
 
 
# Format of the input table
# Format of the input table
read="class level macro returntype function formal actual attrib startup default invalid_p fmt print print_p description"
read="class level macro returntype function formal actual attrib startup default invalid_p fmt print print_p description"
 
 
do_read ()
do_read ()
{
{
    if eval read $read
    if eval read $read
    then
    then
        test "${startup}" || startup=0
        test "${startup}" || startup=0
        test "${fmt}" || fmt="%ld"
        test "${fmt}" || fmt="%ld"
        test "${print}" || print="(long) ${macro}"
        test "${print}" || print="(long) ${macro}"
        #test "${default}" || default=0
        #test "${default}" || default=0
        :
        :
    else
    else
        false
        false
    fi
    fi
}
}
 
 
 
 
# dump out/verify the doco
# dump out/verify the doco
for field in ${read}
for field in ${read}
do
do
  case ${field} in
  case ${field} in
 
 
    class ) : ;;
    class ) : ;;
 
 
        # # -> line disable
        # # -> line disable
        # f -> function
        # f -> function
        #   hiding a function
        #   hiding a function
        # v -> variable
        # v -> variable
        #   hiding a variable
        #   hiding a variable
        # i -> set from info
        # i -> set from info
        #   hiding something from the ``struct info'' object
        #   hiding something from the ``struct info'' object
 
 
    level ) : ;;
    level ) : ;;
 
 
        # See GDB_MULTI_ARCH description.  Having GDB_MULTI_ARCH >=
        # See GDB_MULTI_ARCH description.  Having GDB_MULTI_ARCH >=
        # LEVEL is a predicate on checking that a given method is
        # LEVEL is a predicate on checking that a given method is
        # initialized (using INVALID_P).
        # initialized (using INVALID_P).
 
 
    macro ) : ;;
    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 ) : ;;
    returntype ) : ;;
 
 
        # For functions, the return type; for variables, the data type
        # For functions, the return type; for variables, the data type
 
 
    function ) : ;;
    function ) : ;;
 
 
        # For functions, the member function name; for variables, the
        # For functions, the member function name; for variables, the
        # variable name.  Member function names are always prefixed with
        # variable name.  Member function names are always prefixed with
        # ``gdbarch_'' for name-space purity.
        # ``gdbarch_'' for name-space purity.
 
 
    formal ) : ;;
    formal ) : ;;
 
 
        # The formal argument list.  It is assumed that the formal
        # The formal argument list.  It is assumed that the formal
        # argument list includes the actual name of each list element.
        # argument list includes the actual name of each list element.
        # A function with no arguments shall have ``void'' as the
        # A function with no arguments shall have ``void'' as the
        # formal argument list.
        # formal argument list.
 
 
    actual ) : ;;
    actual ) : ;;
 
 
        # The list of actual arguments.  The arguments specified shall
        # The list of actual arguments.  The arguments specified shall
        # match the FORMAL list given above.  Functions with out
        # match the FORMAL list given above.  Functions with out
        # arguments leave this blank.
        # arguments leave this blank.
 
 
    attrib ) : ;;
    attrib ) : ;;
 
 
        # Any GCC attributes that should be attached to the function
        # Any GCC attributes that should be attached to the function
        # declaration.  At present this field is unused.
        # declaration.  At present this field is unused.
 
 
    startup ) : ;;
    startup ) : ;;
 
 
        # To help with the GDB startup a static gdbarch object is
        # To help with the GDB startup a static gdbarch object is
        # created.  STARTUP is the value to insert into that static
        # created.  STARTUP is the value to insert into that static
        # gdbarch object.
        # gdbarch object.
 
 
        # By default ``0'' is used.
        # By default ``0'' is used.
 
 
    default ) : ;;
    default ) : ;;
 
 
        # Any initial value to assign to a new gdbarch object after it
        # Any initial value to assign to a new gdbarch object after it
        # as been malloc()ed.  Zero is used by default.
        # as been malloc()ed.  Zero is used by default.
 
 
        # Specify a non-empty DEFAULT and a zero INVALID_P to create a
        # Specify a non-empty DEFAULT and a zero INVALID_P to create a
        # fallback value or function for when multi-arch is disabled.
        # fallback value or function for when multi-arch is disabled.
        # Specify a zero DEFAULT function to make that fallback
        # Specify a zero DEFAULT function to make that fallback
        # illegal to call.
        # illegal to call.
 
 
    invalid_p ) : ;;
    invalid_p ) : ;;
 
 
        # A predicate equation that validates MEMBER. Non-zero is
        # A predicate equation that validates MEMBER. Non-zero is
        # returned if the code creating the new architecture failed to
        # returned if the code creating the new architecture failed to
        # initialize the MEMBER or initialized the member to something
        # initialize the MEMBER or initialized the member to something
        # invalid. By default, a check that the value is no longer
        # invalid. By default, a check that the value is no longer
        # equal to DEFAULT ips performed.  The equation ``0'' disables
        # equal to DEFAULT ips performed.  The equation ``0'' disables
        # the invalid_p check.
        # the invalid_p check.
 
 
    fmt ) : ;;
    fmt ) : ;;
 
 
        # printf style format string that can be used to print out the
        # printf style format string that can be used to print out the
        # MEMBER.  Sometimes "%s" is useful.  For functions, this is
        # MEMBER.  Sometimes "%s" is useful.  For functions, this is
        # ignored and the function address is printed.
        # ignored and the function address is printed.
 
 
        # By default ```%ld'' is used.
        # By default ```%ld'' is used.
 
 
    print ) : ;;
    print ) : ;;
 
 
        # An optional equation that casts MEMBER to a value suitable
        # An optional equation that casts MEMBER to a value suitable
        # for formatting by FMT.
        # for formatting by FMT.
 
 
        # By default ``(long)'' is used.
        # By default ``(long)'' is used.
 
 
    print_p ) : ;;
    print_p ) : ;;
 
 
        # An optional indicator for any predicte to wrap around the
        # An optional indicator for any predicte to wrap around the
        # print member code.
        # print member code.
 
 
        #   # -> Wrap print up in ``#ifdef MACRO''
        #   # -> Wrap print up in ``#ifdef MACRO''
        #   exp -> Wrap print up in ``if (${print_p}) ...
        #   exp -> Wrap print up in ``if (${print_p}) ...
        #   ``'' -> No predicate
        #   ``'' -> No predicate
 
 
    description ) : ;;
    description ) : ;;
 
 
      # Currently unused.
      # Currently unused.
 
 
    *) exit 1;;
    *) exit 1;;
  esac
  esac
done
done
 
 
IFS=:
IFS=:
 
 
function_list ()
function_list ()
{
{
  # See below (DOCO) for description of each field
  # See below (DOCO) for description of each field
  cat <<EOF |
  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_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
i:2:TARGET_BYTE_ORDER:int:byte_order::::BIG_ENDIAN
#
#
v:1:TARGET_BFD_VMA_BIT:int:bfd_vma_bit::::8 * sizeof (void*):TARGET_ARCHITECTURE->bits_per_address:0
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_PTR_BIT:int:ptr_bit::::8 * sizeof (void*):0
#v:1:TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):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_SHORT_BIT:int:short_bit::::8 * sizeof (short):0
v:1:TARGET_INT_BIT:int:int_bit::::8 * sizeof (int):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_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_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_FLOAT_BIT:int:float_bit::::8 * sizeof (float):0
v:1:TARGET_DOUBLE_BIT:int:double_bit::::8 * sizeof (double):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
v:1:TARGET_LONG_DOUBLE_BIT:int:long_double_bit::::8 * sizeof (long double):0
#
#
f:1:TARGET_READ_PC:CORE_ADDR:read_pc:int pid:pid::0: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_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_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_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_READ_SP:CORE_ADDR:read_sp:void:::0:0
f:1:TARGET_WRITE_SP:void:write_sp:CORE_ADDR val:val::0:0
f:1:TARGET_WRITE_SP:void:write_sp:CORE_ADDR val:val::0:0
#
#
v:2:NUM_REGS:int:num_regs::::0:-1
v:2:NUM_REGS:int:num_regs::::0:-1
v:2:SP_REGNUM:int:sp_regnum::::0:-1
v:2:SP_REGNUM:int:sp_regnum::::0:-1
v:2:FP_REGNUM:int:fp_regnum::::0:-1
v:2:FP_REGNUM:int:fp_regnum::::0:-1
v:2:PC_REGNUM:int:pc_regnum::::0:-1
v:2:PC_REGNUM:int:pc_regnum::::0:-1
f:2:REGISTER_NAME:char *:register_name:int regnr:regnr:::legacy_register_name:0
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_SIZE:int:register_size::::0:-1
v:2:REGISTER_BYTES:int:register_bytes::::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
f:2:REGISTER_BYTE:int:register_byte:int reg_nr:reg_nr::0:0
f:2:REGISTER_RAW_SIZE:int:register_raw_size:int reg_nr:reg_nr::0:0
f:2:REGISTER_RAW_SIZE:int:register_raw_size:int reg_nr:reg_nr::0:0
v:2:MAX_REGISTER_RAW_SIZE:int:max_register_raw_size::::0:-1
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
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
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:REGISTER_VIRTUAL_TYPE:struct type *:register_virtual_type:int reg_nr:reg_nr::0:0
#
#
v:1:USE_GENERIC_DUMMY_FRAMES:int:use_generic_dummy_frames::::0:-1
v:1:USE_GENERIC_DUMMY_FRAMES:int:use_generic_dummy_frames::::0:-1
v:2:CALL_DUMMY_LOCATION:int:call_dummy_location::::0:0
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:
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_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
v:2:CALL_DUMMY_BREAKPOINT_OFFSET:CORE_ADDR:call_dummy_breakpoint_offset::::0:-1::0x%08lx
v:1:CALL_DUMMY_BREAKPOINT_OFFSET_P:int:call_dummy_breakpoint_offset_p::::0:-1
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
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:1:CALL_DUMMY_P:int:call_dummy_p::::0:-1
v:2:CALL_DUMMY_WORDS:LONGEST *:call_dummy_words::::0:legacy_call_dummy_words:0:0x%08lx
v:2: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: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: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
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
f:2:FIX_CALL_DUMMY:void:fix_call_dummy:char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, struct value **args, struct type *type, int gcc_p:dummy, pc, fun, nargs, args, type, gcc_p::0:0
#
#
v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion::::0:::::#
v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion::::0:::::#
v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type::::0:::::#
v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type::::0:::::#
f:2:COERCE_FLOAT_TO_DOUBLE:int:coerce_float_to_double:struct type *formal, struct type *actual:formal, actual:::default_coerce_float_to_double:0
f: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:GET_SAVED_REGISTER:void:get_saved_register:char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval:raw_buffer, optimized, addrp, frame, regnum, lval::generic_get_saved_register:0
#
#
f:1:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr:::generic_register_convertible_not:0
f: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_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to:::0:0
f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to:::0:0
f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to:::0:0
#
#
f:2:EXTRACT_RETURN_VALUE:void:extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf::0:0
f: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:1:PUSH_ARGUMENTS:CORE_ADDR:push_arguments:int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:nargs, args, sp, struct_return, struct_addr::0:0
f:2:PUSH_DUMMY_FRAME:void:push_dummy_frame:void:-:::0
f: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: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
f:2:POP_FRAME:void:pop_frame:void:-:::0
#
#
# I wish that these would just go away....
# 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_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_MAKE_IADDR:CORE_ADDR:d10v_make_iaddr:CORE_ADDR x:x:::0:0
f:2:D10V_DADDR_P:int:d10v_daddr_p:CORE_ADDR x:x:::0
f:2:D10V_DADDR_P:int:d10v_daddr_p:CORE_ADDR x:x:::0
f:2:D10V_IADDR_P:int:d10v_iaddr_p:CORE_ADDR x:x:::0
f:2:D10V_IADDR_P:int:d10v_iaddr_p:CORE_ADDR x:x:::0
f:2:D10V_CONVERT_DADDR_TO_RAW:CORE_ADDR:d10v_convert_daddr_to_raw:CORE_ADDR x:x:::0
f:2:D10V_CONVERT_DADDR_TO_RAW:CORE_ADDR:d10v_convert_daddr_to_raw:CORE_ADDR x:x:::0
f:2:D10V_CONVERT_IADDR_TO_RAW:CORE_ADDR:d10v_convert_iaddr_to_raw:CORE_ADDR x:x:::0
f:2:D10V_CONVERT_IADDR_TO_RAW:CORE_ADDR:d10v_convert_iaddr_to_raw:CORE_ADDR x:x:::0
#
#
f:2:STORE_STRUCT_RETURN:void:store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp:::0
f:2:STORE_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: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: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: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:FRAME_INIT_SAVED_REGS:void:frame_init_saved_regs:struct frame_info *frame:frame::0:0
f:2:INIT_EXTRA_FRAME_INFO:void:init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame:::0
f:2: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:SKIP_PROLOGUE:CORE_ADDR:skip_prologue:CORE_ADDR ip:ip::0:0
f:2:INNER_THAN:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs::0:0
f:2:INNER_THAN:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs::0:0
f:2:BREAKPOINT_FROM_PC:unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr:::legacy_breakpoint_from_pc:0
f:2: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_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: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:DECR_PC_AFTER_BREAK:CORE_ADDR:decr_pc_after_break::::0:-1
v:2:FUNCTION_START_OFFSET:CORE_ADDR:function_start_offset::::0:-1
v:2:FUNCTION_START_OFFSET:CORE_ADDR:function_start_offset::::0:-1
#
#
f:2:REMOTE_TRANSLATE_XFER_ADDRESS:void:remote_translate_xfer_address:CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:gdb_addr, gdb_len, rem_addr, rem_len:::generic_remote_translate_xfer_address:0
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
v:2:FRAME_ARGS_SKIP:CORE_ADDR:frame_args_skip::::0:-1
f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi:::generic_frameless_function_invocation_not:0
f:2: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: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: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
f:2:FRAME_SAVED_PC:CORE_ADDR:frame_saved_pc:struct frame_info *fi:fi::0:0
f:2:FRAME_ARGS_ADDRESS:CORE_ADDR:frame_args_address:struct frame_info *fi:fi::0:0
f:2:FRAME_ARGS_ADDRESS:CORE_ADDR:frame_args_address:struct frame_info *fi:fi::0:0
f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi::0:0
f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi::0:0
f:2:SAVED_PC_AFTER_CALL:CORE_ADDR:saved_pc_after_call:struct frame_info *frame:frame::0:0
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:FRAME_NUM_ARGS:int:frame_num_args:struct frame_info *frame:frame::0:0
#
#
EOF
EOF
  grep -v '^#'
  grep -v '^#'
}
}
 
 
 
 
# dump it out
# dump it out
if true
if true
then
then
  exec > new-gdbarch
  exec > new-gdbarch
  function_list | while do_read # eval read $read
  function_list | while do_read # eval read $read
  do
  do
    cat <<EOF
    cat <<EOF
${class} ${macro}(${actual})
${class} ${macro}(${actual})
  ${returntype} ${function} ($formal)${attrib}
  ${returntype} ${function} ($formal)${attrib}
    level=${level}
    level=${level}
    startup=${startup}
    startup=${startup}
    default=${default}
    default=${default}
    invalid_p=${invalid_p}
    invalid_p=${invalid_p}
    fmt=${fmt}
    fmt=${fmt}
    print=${print}
    print=${print}
    print_p=${print_p}
    print_p=${print_p}
    description=${description}
    description=${description}
EOF
EOF
  done
  done
  exec 1>&2
  exec 1>&2
fi
fi
 
 
copyright ()
copyright ()
{
{
cat <<EOF
cat <<EOF
/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
 
 
/* Dynamic architecture support for GDB, the GNU debugger.
/* Dynamic architecture support for GDB, the GNU debugger.
   Copyright 1998-1999, Free Software Foundation, Inc.
   Copyright 1998-1999, Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
/* This file was created with the aid of \`\`gdbarch.sh''.
/* This file was created with the aid of \`\`gdbarch.sh''.
 
 
   The bourn shell script \`\`gdbarch.sh'' creates the files
   The bourn shell script \`\`gdbarch.sh'' creates the files
   \`\`new-gdbarch.c'' and \`\`new-gdbarch.h and then compares them
   \`\`new-gdbarch.c'' and \`\`new-gdbarch.h and then compares them
   against the existing \`\`gdbarch.[hc]''.  Any differences found
   against the existing \`\`gdbarch.[hc]''.  Any differences found
   being reported.
   being reported.
 
 
   If editing this file, please also run gdbarch.sh and merge any
   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 makeing sweeping changes
   to this file, modifying gdbarch.sh and using its output may prove
   to this file, modifying gdbarch.sh and using its output may prove
   easier. */
   easier. */
 
 
EOF
EOF
}
}
 
 
#
#
# The .h file
# The .h file
#
#
 
 
exec > new-gdbarch.h
exec > new-gdbarch.h
copyright
copyright
cat <<EOF
cat <<EOF
#ifndef GDBARCH_H
#ifndef GDBARCH_H
#define GDBARCH_H
#define GDBARCH_H
 
 
struct frame_info;
struct frame_info;
struct value;
struct value;
 
 
 
 
#ifndef GDB_MULTI_ARCH
#ifndef GDB_MULTI_ARCH
#define GDB_MULTI_ARCH 0
#define GDB_MULTI_ARCH 0
#endif
#endif
 
 
extern struct gdbarch *current_gdbarch;
extern struct gdbarch *current_gdbarch;
 
 
 
 
/* See gdb/doc/gdbint.texi for a discussion of the GDB_MULTI_ARCH
/* See gdb/doc/gdbint.texi for a discussion of the GDB_MULTI_ARCH
   macro */
   macro */
 
 
 
 
/* If any of the following are defined, the target wasn't correctly
/* If any of the following are defined, the target wasn't correctly
   converted. */
   converted. */
 
 
#if GDB_MULTI_ARCH
#if GDB_MULTI_ARCH
#if defined (CALL_DUMMY)
#if defined (CALL_DUMMY)
#error "CALL_DUMMY: replaced by CALL_DUMMY_WORDS/SIZEOF_CALL_DUMMY_WORDS"
#error "CALL_DUMMY: replaced by CALL_DUMMY_WORDS/SIZEOF_CALL_DUMMY_WORDS"
#endif
#endif
#endif
#endif
 
 
#if GDB_MULTI_ARCH
#if GDB_MULTI_ARCH
#if defined (REGISTER_NAMES)
#if defined (REGISTER_NAMES)
#error "REGISTER_NAMES: replaced by REGISTER_NAME"
#error "REGISTER_NAMES: replaced by REGISTER_NAME"
#endif
#endif
#endif
#endif
 
 
#if GDB_MULTI_ARCH
#if GDB_MULTI_ARCH
#if defined (EXTRA_FRAME_INFO)
#if defined (EXTRA_FRAME_INFO)
#error "EXTRA_FRAME_INFO: replaced by struct frame_extra_info"
#error "EXTRA_FRAME_INFO: replaced by struct frame_extra_info"
#endif
#endif
#endif
#endif
 
 
#if GDB_MULTI_ARCH
#if GDB_MULTI_ARCH
#if defined (FRAME_FIND_SAVED_REGS)
#if defined (FRAME_FIND_SAVED_REGS)
#error "FRAME_FIND_SAVED_REGS: replaced by FRAME_INIT_SAVED_REGS"
#error "FRAME_FIND_SAVED_REGS: replaced by FRAME_INIT_SAVED_REGS"
#endif
#endif
#endif
#endif
EOF
EOF
 
 
# function typedef's
# function typedef's
echo ""
echo ""
echo ""
echo ""
echo "/* The following are pre-initialized by GDBARCH. */"
echo "/* The following are pre-initialized by GDBARCH. */"
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "i" )
    "i" )
        echo ""
        echo ""
        echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
        echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
        echo "/* set_gdbarch_${function}() - not applicable - pre-initialized. */"
        echo "/* set_gdbarch_${function}() - not applicable - pre-initialized. */"
        echo "#if GDB_MULTI_ARCH"
        echo "#if GDB_MULTI_ARCH"
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
        echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
        echo "#endif"
        echo "#endif"
        echo "#endif"
        echo "#endif"
        ;;
        ;;
  esac
  esac
done
done
 
 
# function typedef's
# function typedef's
echo ""
echo ""
echo ""
echo ""
echo "/* The following are initialized by the target dependant code. */"
echo "/* The following are initialized by the target dependant code. */"
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "v" )
    "v" )
        echo ""
        echo ""
        echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
        echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
        echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, ${returntype} ${function});"
        echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, ${returntype} ${function});"
        echo "#if GDB_MULTI_ARCH"
        echo "#if GDB_MULTI_ARCH"
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
        echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
        echo "#endif"
        echo "#endif"
        echo "#endif"
        echo "#endif"
        ;;
        ;;
    "f" )
    "f" )
        echo ""
        echo ""
        echo "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});"
        echo "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});"
        if [ "${formal}" = "void" ]
        if [ "${formal}" = "void" ]
        then
        then
          echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
          echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
        else
        else
          echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});"
          echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});"
        fi
        fi
        echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});"
        echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});"
        if ! default_is_fallback_p
        if ! default_is_fallback_p
        then
        then
            echo "#if GDB_MULTI_ARCH"
            echo "#if GDB_MULTI_ARCH"
        fi
        fi
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
        if [ "${actual}" = "" ]
        if [ "${actual}" = "" ]
        then
        then
          echo "#define ${macro}() (gdbarch_${function} (current_gdbarch))"
          echo "#define ${macro}() (gdbarch_${function} (current_gdbarch))"
        elif [ "${actual}" = "-" ]
        elif [ "${actual}" = "-" ]
        then
        then
          echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
          echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
        else
        else
          echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
          echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
        fi
        fi
        echo "#endif"
        echo "#endif"
        if ! default_is_fallback_p
        if ! default_is_fallback_p
        then
        then
            echo "#endif"
            echo "#endif"
        fi
        fi
        ;;
        ;;
  esac
  esac
done
done
 
 
# close it off
# close it off
cat <<EOF
cat <<EOF
 
 
extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
 
 
 
 
/* Mechanism for co-ordinating the selection of a specific
/* Mechanism for co-ordinating the selection of a specific
   architecture.
   architecture.
 
 
   GDB targets (*-tdep.c) can register an interest in a specific
   GDB targets (*-tdep.c) can register an interest in a specific
   architecture.  Other GDB components can register a need to maintain
   architecture.  Other GDB components can register a need to maintain
   per-architecture data.
   per-architecture data.
 
 
   The mechanisms below ensures that there is only a loose connection
   The mechanisms below ensures that there is only a loose connection
   between the set-architecture command and the various GDB
   between the set-architecture command and the various GDB
   components.  Each component can independantly register their need
   components.  Each component can independantly register their need
   to maintain architecture specific data with gdbarch.
   to maintain architecture specific data with gdbarch.
 
 
   Pragmatics:
   Pragmatics:
 
 
   Previously, a single TARGET_ARCHITECTURE_HOOK was provided.  It
   Previously, a single TARGET_ARCHITECTURE_HOOK was provided.  It
   didn't scale.
   didn't scale.
 
 
   The more traditional mega-struct containing architecture specific
   The more traditional mega-struct containing architecture specific
   data for all the various GDB components was also considered.  Since
   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 independant)
   components it was determined that the global aproach was not
   components it was determined that the global aproach was not
   applicable. */
   applicable. */
 
 
 
 
/* Register a new architectural family with GDB.
/* Register a new architectural family with GDB.
 
 
   Register support for the specified ARCHITECTURE with GDB.  When
   Register support for the specified ARCHITECTURE with GDB.  When
   gdbarch determines that the specified architecture has been
   gdbarch determines that the specified architecture has been
   selected, the corresponding INIT function is called.
   selected, the corresponding INIT function is called.
 
 
   --
   --
 
 
   The INIT function takes two parameters: INFO which contains the
   The INIT function takes two parameters: INFO which contains the
   information available to gdbarch about the (possibly new)
   information available to gdbarch about the (possibly new)
   architecture; ARCHES which is a list of the previously created
   architecture; ARCHES which is a list of the previously created
   \`\`struct gdbarch'' for this architecture.
   \`\`struct gdbarch'' for this architecture.
 
 
   The INIT function parameter INFO shall, as far as possible, be
   The INIT function parameter INFO shall, as far as possible, be
   pre-initialized with information obtained from INFO.ABFD or
   pre-initialized with information obtained from INFO.ABFD or
   previously selected architecture (if similar).  INIT shall ensure
   previously selected architecture (if similar).  INIT shall ensure
   that the INFO.BYTE_ORDER is non-zero.
   that the INFO.BYTE_ORDER is non-zero.
 
 
   The INIT function shall return any of: NULL - indicating that it
   The INIT function shall return any of: NULL - indicating that it
   doesn't reconize the selected architecture; an existing \`\`struct
   doesn't reconize the selected architecture; an existing \`\`struct
   gdbarch'' from the ARCHES list - indicating that the new
   gdbarch'' from the ARCHES list - indicating that the new
   architecture is just a synonym for an earlier architecture (see
   architecture is just a synonym for an earlier architecture (see
   gdbarch_list_lookup_by_info()); a newly created \`\`struct gdbarch''
   gdbarch_list_lookup_by_info()); a newly created \`\`struct gdbarch''
   - that describes the selected architecture (see
   - that describes the selected architecture (see
   gdbarch_alloc()). */
   gdbarch_alloc()). */
 
 
struct gdbarch_list
struct gdbarch_list
{
{
  struct gdbarch *gdbarch;
  struct gdbarch *gdbarch;
  struct gdbarch_list *next;
  struct gdbarch_list *next;
};
};
 
 
struct gdbarch_info
struct gdbarch_info
{
{
  /* Use default: bfd_arch_unknown (ZERO). */
  /* Use default: bfd_arch_unknown (ZERO). */
  enum bfd_architecture bfd_architecture;
  enum bfd_architecture bfd_architecture;
 
 
  /* Use default: NULL (ZERO). */
  /* Use default: NULL (ZERO). */
  const struct bfd_arch_info *bfd_arch_info;
  const struct bfd_arch_info *bfd_arch_info;
 
 
  /* Use default: 0 (ZERO). */
  /* Use default: 0 (ZERO). */
  int byte_order;
  int byte_order;
 
 
  /* Use default: NULL (ZERO). */
  /* Use default: NULL (ZERO). */
  bfd *abfd;
  bfd *abfd;
 
 
  /* Use default: NULL (ZERO). */
  /* Use default: NULL (ZERO). */
  struct gdbarch_tdep_info *tdep_info;
  struct gdbarch_tdep_info *tdep_info;
};
};
 
 
typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
 
 
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
 
 
 
 
/* Helper function.  Search the list of ARCHES for a GDBARCH that
/* Helper function.  Search the list of ARCHES for a GDBARCH that
   matches the information provided by INFO. */
   matches the information provided by INFO. */
 
 
extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *arches,  const struct gdbarch_info *info);
extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *arches,  const struct gdbarch_info *info);
 
 
 
 
/* Helper function.  Create a preliminary \`\`struct gdbarch''.  Perform
/* Helper function.  Create a preliminary \`\`struct gdbarch''.  Perform
   basic initialization using values obtained from the INFO andTDEP
   basic initialization using values obtained from the INFO andTDEP
   parameters.  set_gdbarch_*() functions are called to complete the
   parameters.  set_gdbarch_*() functions are called to complete the
   initialization of the object. */
   initialization of the object. */
 
 
extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
 
 
 
 
/* Helper function.  Free a partially-constructed \`\`struct gdbarch''.  */
/* Helper function.  Free a partially-constructed \`\`struct gdbarch''.  */
extern void gdbarch_free (struct gdbarch *);
extern void gdbarch_free (struct gdbarch *);
 
 
 
 
/* Helper function. Force an update of the current architecture.  Used
/* Helper function. Force an update of the current architecture.  Used
   by legacy targets that have added their own target specific
   by legacy targets that have added their own target specific
   architecture manipulation commands.
   architecture manipulation commands.
 
 
   The INFO parameter shall be fully initialized (\`\`memset (&INFO,
   The INFO parameter shall be fully initialized (\`\`memset (&INFO,
   sizeof (info), 0)'' set relevant fields) before gdbarch_update() is
   sizeof (info), 0)'' set relevant fields) before gdbarch_update() is
   called.  gdbarch_update() shall initialize any \`\`default'' fields
   called.  gdbarch_update() shall initialize any \`\`default'' fields
   using information obtained from the previous architecture or
   using information obtained from the previous architecture or
   INFO.ABFD (if specified) before calling the corresponding
   INFO.ABFD (if specified) before calling the corresponding
   architectures INIT function. */
   architectures INIT function. */
 
 
extern int gdbarch_update (struct gdbarch_info info);
extern int gdbarch_update (struct gdbarch_info info);
 
 
 
 
 
 
/* Register per-architecture data-pointer.
/* Register per-architecture data-pointer.
 
 
   Reserve space for a per-architecture data-pointer.  An identifier
   Reserve space for a per-architecture data-pointer.  An identifier
   for the reserved data-pointer is returned.  That identifer should
   for the reserved data-pointer is returned.  That identifer should
   be saved in a local static.
   be saved in a local static.
 
 
   When a new architecture is selected, INIT() is called.  When a
   When a new architecture is selected, INIT() is called.  When a
   previous architecture is re-selected, the per-architecture
   previous architecture is re-selected, the per-architecture
   data-pointer for that previous architecture is restored (INIT() is
   data-pointer for that previous architecture is restored (INIT() is
   not called).
   not called).
 
 
   INIT() shall return the initial value for the per-architecture
   INIT() shall return the initial value for the per-architecture
   data-pointer for the current architecture.
   data-pointer for the current architecture.
 
 
   Multiple registrarants for any architecture are allowed (and
   Multiple registrarants for any architecture are allowed (and
   strongly encouraged).  */
   strongly encouraged).  */
 
 
typedef void *(gdbarch_data_ftype) (void);
typedef void *(gdbarch_data_ftype) (void);
extern struct gdbarch_data *register_gdbarch_data (gdbarch_data_ftype *init);
extern struct gdbarch_data *register_gdbarch_data (gdbarch_data_ftype *init);
 
 
/* Return the value of the per-architecture data-pointer for the
/* Return the value of the per-architecture data-pointer for the
   current architecture. */
   current architecture. */
 
 
extern void *gdbarch_data (struct gdbarch_data*);
extern void *gdbarch_data (struct gdbarch_data*);
 
 
 
 
 
 
/* Register per-architecture memory region.
/* Register per-architecture memory region.
 
 
   Provide a memory-region swap mechanism.  Per-architecture memory
   Provide a memory-region swap mechanism.  Per-architecture memory
   region are created.  These memory regions are swapped whenever the
   region are created.  These memory regions are swapped whenever the
   architecture is changed.  For a new architecture, the memory region
   architecture is changed.  For a new architecture, the memory region
   is initialized with zero (0) and the INIT function is called.
   is initialized with zero (0) and the INIT function is called.
 
 
   Memory regions are swapped / initialized in the order that they are
   Memory regions are swapped / initialized in the order that they are
   registered.  NULL DATA and/or INIT values can be specified.
   registered.  NULL DATA and/or INIT values can be specified.
 
 
   New code should use register_gdbarch_data(). */
   New code should use register_gdbarch_data(). */
 
 
typedef void (gdbarch_swap_ftype) (void);
typedef void (gdbarch_swap_ftype) (void);
extern void register_gdbarch_swap (void *data, unsigned long size, gdbarch_swap_ftype *init);
extern void register_gdbarch_swap (void *data, unsigned long size, gdbarch_swap_ftype *init);
#define REGISTER_GDBARCH_SWAP(VAR) register_gdbarch_swap (&(VAR), sizeof ((VAR)), NULL)
#define REGISTER_GDBARCH_SWAP(VAR) register_gdbarch_swap (&(VAR), sizeof ((VAR)), NULL)
 
 
 
 
 
 
/* The target-system-dependant byte order is dynamic */
/* The target-system-dependant byte order is dynamic */
 
 
/* TARGET_BYTE_ORDER_SELECTABLE_P determines if the target endianness
/* TARGET_BYTE_ORDER_SELECTABLE_P determines if the target endianness
   is selectable at runtime.  The user can use the \`\`set endian''
   is selectable at runtime.  The user can use the \`\`set endian''
   command to change it.  TARGET_BYTE_ORDER_AUTO is nonzero when
   command to change it.  TARGET_BYTE_ORDER_AUTO is nonzero when
   target_byte_order should be auto-detected (from the program image
   target_byte_order should be auto-detected (from the program image
   say). */
   say). */
 
 
#if GDB_MULTI_ARCH
#if GDB_MULTI_ARCH
/* Multi-arch GDB is always bi-endian. */
/* Multi-arch GDB is always bi-endian. */
#define TARGET_BYTE_ORDER_SELECTABLE_P 1
#define TARGET_BYTE_ORDER_SELECTABLE_P 1
#endif
#endif
 
 
#ifndef TARGET_BYTE_ORDER_SELECTABLE_P
#ifndef TARGET_BYTE_ORDER_SELECTABLE_P
/* compat - Catch old targets that define TARGET_BYTE_ORDER_SLECTABLE
/* compat - Catch old targets that define TARGET_BYTE_ORDER_SLECTABLE
   when they should have defined TARGET_BYTE_ORDER_SELECTABLE_P 1 */
   when they should have defined TARGET_BYTE_ORDER_SELECTABLE_P 1 */
#ifdef TARGET_BYTE_ORDER_SELECTABLE
#ifdef TARGET_BYTE_ORDER_SELECTABLE
#define TARGET_BYTE_ORDER_SELECTABLE_P 1
#define TARGET_BYTE_ORDER_SELECTABLE_P 1
#else
#else
#define TARGET_BYTE_ORDER_SELECTABLE_P 0
#define TARGET_BYTE_ORDER_SELECTABLE_P 0
#endif
#endif
#endif
#endif
 
 
extern int target_byte_order;
extern int target_byte_order;
#ifdef TARGET_BYTE_ORDER_SELECTABLE
#ifdef TARGET_BYTE_ORDER_SELECTABLE
/* compat - Catch old targets that define TARGET_BYTE_ORDER_SELECTABLE
/* compat - Catch old targets that define TARGET_BYTE_ORDER_SELECTABLE
   and expect defs.h to re-define TARGET_BYTE_ORDER. */
   and expect defs.h to re-define TARGET_BYTE_ORDER. */
#undef TARGET_BYTE_ORDER
#undef TARGET_BYTE_ORDER
#endif
#endif
#ifndef TARGET_BYTE_ORDER
#ifndef TARGET_BYTE_ORDER
#define TARGET_BYTE_ORDER (target_byte_order + 0)
#define TARGET_BYTE_ORDER (target_byte_order + 0)
#endif
#endif
 
 
extern int target_byte_order_auto;
extern int target_byte_order_auto;
#ifndef TARGET_BYTE_ORDER_AUTO
#ifndef TARGET_BYTE_ORDER_AUTO
#define TARGET_BYTE_ORDER_AUTO (target_byte_order_auto + 0)
#define TARGET_BYTE_ORDER_AUTO (target_byte_order_auto + 0)
#endif
#endif
 
 
 
 
 
 
/* The target-system-dependant BFD architecture is dynamic */
/* The target-system-dependant BFD architecture is dynamic */
 
 
extern int target_architecture_auto;
extern int target_architecture_auto;
#ifndef TARGET_ARCHITECTURE_AUTO
#ifndef TARGET_ARCHITECTURE_AUTO
#define TARGET_ARCHITECTURE_AUTO (target_architecture_auto + 0)
#define TARGET_ARCHITECTURE_AUTO (target_architecture_auto + 0)
#endif
#endif
 
 
extern const struct bfd_arch_info *target_architecture;
extern const struct bfd_arch_info *target_architecture;
#ifndef TARGET_ARCHITECTURE
#ifndef TARGET_ARCHITECTURE
#define TARGET_ARCHITECTURE (target_architecture + 0)
#define TARGET_ARCHITECTURE (target_architecture + 0)
#endif
#endif
 
 
/* Notify the target dependant backend of a change to the selected
/* Notify the target dependant backend of a change to the selected
   architecture. A zero return status indicates that the target did
   architecture. A zero return status indicates that the target did
   not like the change. */
   not like the change. */
 
 
extern int (*target_architecture_hook) (const struct bfd_arch_info *);
extern int (*target_architecture_hook) (const struct bfd_arch_info *);
 
 
 
 
 
 
/* The target-system-dependant disassembler is semi-dynamic */
/* The target-system-dependant disassembler is semi-dynamic */
 
 
#include "dis-asm.h"            /* Get defs for disassemble_info */
#include "dis-asm.h"            /* Get defs for disassemble_info */
 
 
extern int dis_asm_read_memory (bfd_vma memaddr, bfd_byte *myaddr,
extern int dis_asm_read_memory (bfd_vma memaddr, bfd_byte *myaddr,
                                unsigned int len, disassemble_info *info);
                                unsigned int len, disassemble_info *info);
 
 
extern void dis_asm_memory_error (int status, bfd_vma memaddr,
extern void dis_asm_memory_error (int status, bfd_vma memaddr,
                                  disassemble_info *info);
                                  disassemble_info *info);
 
 
extern void dis_asm_print_address (bfd_vma addr,
extern void dis_asm_print_address (bfd_vma addr,
                                   disassemble_info *info);
                                   disassemble_info *info);
 
 
extern int (*tm_print_insn) (bfd_vma, disassemble_info*);
extern int (*tm_print_insn) (bfd_vma, disassemble_info*);
extern disassemble_info tm_print_insn_info;
extern disassemble_info tm_print_insn_info;
#ifndef TARGET_PRINT_INSN
#ifndef TARGET_PRINT_INSN
#define TARGET_PRINT_INSN(vma, info) (*tm_print_insn) (vma, info)
#define TARGET_PRINT_INSN(vma, info) (*tm_print_insn) (vma, info)
#endif
#endif
#ifndef TARGET_PRINT_INSN_INFO
#ifndef TARGET_PRINT_INSN_INFO
#define TARGET_PRINT_INSN_INFO (&tm_print_insn_info)
#define TARGET_PRINT_INSN_INFO (&tm_print_insn_info)
#endif
#endif
 
 
 
 
 
 
/* Explicit test for D10V architecture.
/* Explicit test for D10V architecture.
   USE of these macro's is *STRONGLY* discouraged. */
   USE of these macro's is *STRONGLY* discouraged. */
 
 
#define GDB_TARGET_IS_D10V (TARGET_ARCHITECTURE->arch == bfd_arch_d10v)
#define GDB_TARGET_IS_D10V (TARGET_ARCHITECTURE->arch == bfd_arch_d10v)
#ifndef D10V_MAKE_DADDR
#ifndef D10V_MAKE_DADDR
#define D10V_MAKE_DADDR(X) (internal_error ("gdbarch: D10V_MAKE_DADDR"), 0)
#define D10V_MAKE_DADDR(X) (internal_error ("gdbarch: D10V_MAKE_DADDR"), 0)
#endif
#endif
#ifndef D10V_MAKE_IADDR
#ifndef D10V_MAKE_IADDR
#define D10V_MAKE_IADDR(X) (internal_error ("gdbarch: D10V_MAKE_IADDR"), 0)
#define D10V_MAKE_IADDR(X) (internal_error ("gdbarch: D10V_MAKE_IADDR"), 0)
#endif
#endif
 
 
 
 
/* Fallback definition of FRAMELESS_FUNCTION_INVOCATION */
/* Fallback definition of FRAMELESS_FUNCTION_INVOCATION */
#ifndef FRAMELESS_FUNCTION_INVOCATION
#ifndef FRAMELESS_FUNCTION_INVOCATION
#define FRAMELESS_FUNCTION_INVOCATION(FI) (0)
#define FRAMELESS_FUNCTION_INVOCATION(FI) (0)
#endif
#endif
 
 
 
 
/* Fallback definition of REGISTER_CONVERTIBLE etc */
/* Fallback definition of REGISTER_CONVERTIBLE etc */
extern int generic_register_convertible_not (int reg_nr);
extern int generic_register_convertible_not (int reg_nr);
#ifndef REGISTER_CONVERTIBLE
#ifndef REGISTER_CONVERTIBLE
#define REGISTER_CONVERTIBLE(x) (0)
#define REGISTER_CONVERTIBLE(x) (0)
#endif
#endif
#ifndef REGISTER_CONVERT_TO_VIRTUAL
#ifndef REGISTER_CONVERT_TO_VIRTUAL
#define REGISTER_CONVERT_TO_VIRTUAL(x, y, z, a)
#define REGISTER_CONVERT_TO_VIRTUAL(x, y, z, a)
#endif
#endif
#ifndef REGISTER_CONVERT_TO_RAW
#ifndef REGISTER_CONVERT_TO_RAW
#define REGISTER_CONVERT_TO_RAW(x, y, z, a)
#define REGISTER_CONVERT_TO_RAW(x, y, z, a)
#endif
#endif
 
 
 
 
/* Fallback definition for EXTRACT_STRUCT_VALUE_ADDRESS */
/* Fallback definition for EXTRACT_STRUCT_VALUE_ADDRESS */
#ifndef EXTRACT_STRUCT_VALUE_ADDRESS
#ifndef EXTRACT_STRUCT_VALUE_ADDRESS
#define EXTRACT_STRUCT_VALUE_ADDRESS_P (0)
#define EXTRACT_STRUCT_VALUE_ADDRESS_P (0)
#define EXTRACT_STRUCT_VALUE_ADDRESS(X) (internal_error ("gdbarch: EXTRACT_STRUCT_VALUE_ADDRESS"), 0)
#define EXTRACT_STRUCT_VALUE_ADDRESS(X) (internal_error ("gdbarch: EXTRACT_STRUCT_VALUE_ADDRESS"), 0)
#else
#else
#ifndef EXTRACT_STRUCT_VALUE_ADDRESS_P
#ifndef EXTRACT_STRUCT_VALUE_ADDRESS_P
#define EXTRACT_STRUCT_VALUE_ADDRESS_P (1)
#define EXTRACT_STRUCT_VALUE_ADDRESS_P (1)
#endif
#endif
#endif
#endif
 
 
 
 
/* Fallback definition for REGISTER_NAME for systems still defining
/* Fallback definition for REGISTER_NAME for systems still defining
   REGISTER_NAMES. */
   REGISTER_NAMES. */
#ifndef REGISTER_NAME
#ifndef REGISTER_NAME
extern char *gdb_register_names[];
extern char *gdb_register_names[];
#define REGISTER_NAME(i) gdb_register_names[i]
#define REGISTER_NAME(i) gdb_register_names[i]
#endif
#endif
 
 
 
 
/* Set the dynamic target-system-dependant parameters (architecture,
/* Set the dynamic target-system-dependant parameters (architecture,
   byte-order, ...) using information found in the BFD */
   byte-order, ...) using information found in the BFD */
 
 
extern void set_gdbarch_from_file (bfd *);
extern void set_gdbarch_from_file (bfd *);
 
 
 
 
/* Explicitly set the dynamic target-system-dependant parameters based
/* Explicitly set the dynamic target-system-dependant parameters based
   on bfd_architecture and machine. */
   on bfd_architecture and machine. */
 
 
extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned long);
extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned long);
 
 
 
 
/* Initialize the current architecture to the "first" one we find on
/* Initialize the current architecture to the "first" one we find on
   our list.  */
   our list.  */
 
 
extern void initialize_current_architecture (void);
extern void initialize_current_architecture (void);
 
 
/* Helper function for targets that don't know how my arguments are
/* Helper function for targets that don't know how my arguments are
   being passed */
   being passed */
 
 
extern int frame_num_args_unknown (struct frame_info *fi);
extern int frame_num_args_unknown (struct frame_info *fi);
 
 
 
 
/* gdbarch trace variable */
/* gdbarch trace variable */
extern int gdbarch_debug;
extern int gdbarch_debug;
 
 
extern void gdbarch_dump (void);
extern void gdbarch_dump (void);
 
 
#endif
#endif
EOF
EOF
exec 1>&2
exec 1>&2
#../move-if-change new-gdbarch.h gdbarch.h
#../move-if-change new-gdbarch.h gdbarch.h
compare_new gdbarch.h
compare_new gdbarch.h
 
 
 
 
#
#
# C file
# C file
#
#
 
 
exec > new-gdbarch.c
exec > new-gdbarch.c
copyright
copyright
cat <<EOF
cat <<EOF
 
 
#include "defs.h"
#include "defs.h"
#include "gdbarch-utils.h"
#include "gdbarch-utils.h"
 
 
#if GDB_MULTI_ARCH
#if GDB_MULTI_ARCH
#include "gdbcmd.h"
#include "gdbcmd.h"
#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */
#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */
#else
#else
/* Just include everything in sight so that the every old definition
/* Just include everything in sight so that the every old definition
   of macro is visible. */
   of macro is visible. */
#include "gdb_string.h"
#include "gdb_string.h"
#include <ctype.h>
#include <ctype.h>
#include "symtab.h"
#include "symtab.h"
#include "frame.h"
#include "frame.h"
#include "inferior.h"
#include "inferior.h"
#include "breakpoint.h"
#include "breakpoint.h"
#include "gdb_wait.h"
#include "gdb_wait.h"
#include "gdbcore.h"
#include "gdbcore.h"
#include "gdbcmd.h"
#include "gdbcmd.h"
#include "target.h"
#include "target.h"
#include "gdbthread.h"
#include "gdbthread.h"
#include "annotate.h"
#include "annotate.h"
#include "symfile.h"            /* for overlay functions */
#include "symfile.h"            /* for overlay functions */
#endif
#endif
#include "symcat.h"
#include "symcat.h"
 
 
 
 
/* Static function declarations */
/* Static function declarations */
 
 
static void verify_gdbarch (struct gdbarch *gdbarch);
static void verify_gdbarch (struct gdbarch *gdbarch);
static void init_gdbarch_data (struct gdbarch *);
static void init_gdbarch_data (struct gdbarch *);
static void init_gdbarch_swap (struct gdbarch *);
static void init_gdbarch_swap (struct gdbarch *);
static void swapout_gdbarch_swap (struct gdbarch *);
static void swapout_gdbarch_swap (struct gdbarch *);
static void swapin_gdbarch_swap (struct gdbarch *);
static void swapin_gdbarch_swap (struct gdbarch *);
 
 
/* Convenience macro for allocting typesafe memory. */
/* Convenience macro for allocting typesafe memory. */
 
 
#ifndef XMALLOC
#ifndef XMALLOC
#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
#endif
#endif
 
 
 
 
/* Non-zero if we want to trace architecture code.  */
/* Non-zero if we want to trace architecture code.  */
 
 
#ifndef GDBARCH_DEBUG
#ifndef GDBARCH_DEBUG
#define GDBARCH_DEBUG 0
#define GDBARCH_DEBUG 0
#endif
#endif
int gdbarch_debug = GDBARCH_DEBUG;
int gdbarch_debug = GDBARCH_DEBUG;
 
 
EOF
EOF
 
 
# gdbarch open the gdbarch object
# gdbarch open the gdbarch object
echo ""
echo ""
echo "/* Maintain the struct gdbarch object */"
echo "/* Maintain the struct gdbarch object */"
echo ""
echo ""
echo "struct gdbarch"
echo "struct gdbarch"
echo "{"
echo "{"
echo "  /* basic architectural information */"
echo "  /* basic architectural information */"
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "i" ) echo "  ${returntype} ${function};" ;;
    "i" ) echo "  ${returntype} ${function};" ;;
  esac
  esac
done
done
echo ""
echo ""
echo "  /* target specific vector. */"
echo "  /* target specific vector. */"
echo "  struct gdbarch_tdep *tdep;"
echo "  struct gdbarch_tdep *tdep;"
echo ""
echo ""
echo "  /* per-architecture data-pointers */"
echo "  /* per-architecture data-pointers */"
echo "  int nr_data;"
echo "  int nr_data;"
echo "  void **data;"
echo "  void **data;"
echo ""
echo ""
echo "  /* per-architecture swap-regions */"
echo "  /* per-architecture swap-regions */"
echo "  struct gdbarch_swap *swap;"
echo "  struct gdbarch_swap *swap;"
echo ""
echo ""
cat <<EOF
cat <<EOF
  /* Multi-arch values.
  /* Multi-arch values.
 
 
     When extending this structure you must:
     When extending this structure you must:
 
 
     Add the field below.
     Add the field below.
 
 
     Declare set/get functions and define the corresponding
     Declare set/get functions and define the corresponding
     macro in gdbarch.h.
     macro in gdbarch.h.
 
 
     gdbarch_alloc(): If zero/NULL is not a suitable default,
     gdbarch_alloc(): If zero/NULL is not a suitable default,
     initialize the new field.
     initialize the new field.
 
 
     verify_gdbarch(): Confirm that the target updated the field
     verify_gdbarch(): Confirm that the target updated the field
     correctly.
     correctly.
 
 
     gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
     gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
     field is dumped out
     field is dumped out
 
 
     \`\`startup_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).
     variable (base values on the host's c-type system).
 
 
     get_gdbarch(): Implement the set/get functions (probably using
     get_gdbarch(): Implement the set/get functions (probably using
     the macro's as shortcuts).
     the macro's as shortcuts).
 
 
     */
     */
 
 
EOF
EOF
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "v" ) echo "  ${returntype} ${function};" ;;
    "v" ) echo "  ${returntype} ${function};" ;;
    "f" ) echo "  gdbarch_${function}_ftype *${function}${attrib};" ;;
    "f" ) echo "  gdbarch_${function}_ftype *${function}${attrib};" ;;
  esac
  esac
done
done
echo "};"
echo "};"
 
 
# A pre-initialized vector
# A pre-initialized vector
echo ""
echo ""
echo ""
echo ""
cat <<EOF
cat <<EOF
/* The default architecture uses host values (for want of a better
/* The default architecture uses host values (for want of a better
   choice). */
   choice). */
EOF
EOF
echo ""
echo ""
echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
echo ""
echo ""
echo "struct gdbarch startup_gdbarch = {"
echo "struct gdbarch startup_gdbarch = {"
echo "  /* basic architecture information */"
echo "  /* basic architecture information */"
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "i" )
    "i" )
      echo "  ${startup},"
      echo "  ${startup},"
    ;;
    ;;
  esac
  esac
done
done
cat <<EOF
cat <<EOF
  /* target specific vector */
  /* target specific vector */
  NULL,
  NULL,
  /*per-architecture data-pointers and swap regions */
  /*per-architecture data-pointers and swap regions */
  0, NULL, NULL,
  0, NULL, NULL,
  /* Multi-arch values */
  /* Multi-arch values */
EOF
EOF
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "f" | "v" )
    "f" | "v" )
      echo "  ${startup},"
      echo "  ${startup},"
    ;;
    ;;
  esac
  esac
done
done
cat <<EOF
cat <<EOF
  /* startup_gdbarch() */
  /* startup_gdbarch() */
};
};
struct gdbarch *current_gdbarch = &startup_gdbarch;
struct gdbarch *current_gdbarch = &startup_gdbarch;
EOF
EOF
 
 
# Create a new gdbarch struct
# Create a new gdbarch struct
echo ""
echo ""
echo ""
echo ""
cat <<EOF
cat <<EOF
/* Create a new \`\`struct gdbarch'' based in information provided by
/* Create a new \`\`struct gdbarch'' based in information provided by
   \`\`struct gdbarch_info''. */
   \`\`struct gdbarch_info''. */
EOF
EOF
echo ""
echo ""
cat <<EOF
cat <<EOF
struct gdbarch *
struct gdbarch *
gdbarch_alloc (const struct gdbarch_info *info,
gdbarch_alloc (const struct gdbarch_info *info,
               struct gdbarch_tdep *tdep)
               struct gdbarch_tdep *tdep)
{
{
  struct gdbarch *gdbarch = XMALLOC (struct gdbarch);
  struct gdbarch *gdbarch = XMALLOC (struct gdbarch);
  memset (gdbarch, 0, sizeof (*gdbarch));
  memset (gdbarch, 0, sizeof (*gdbarch));
 
 
  gdbarch->tdep = tdep;
  gdbarch->tdep = tdep;
EOF
EOF
echo ""
echo ""
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "i" ) echo "  gdbarch->${function} = info->${function};"
    "i" ) echo "  gdbarch->${function} = info->${function};"
  esac
  esac
done
done
echo ""
echo ""
echo "  /* Force the explicit initialization of these. */"
echo "  /* Force the explicit initialization of these. */"
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "f" | "v" )
    "f" | "v" )
        if [ "${default}" != "" -a "${default}" != "0" ]
        if [ "${default}" != "" -a "${default}" != "0" ]
        then
        then
          echo "  gdbarch->${function} = ${default};"
          echo "  gdbarch->${function} = ${default};"
        fi
        fi
        ;;
        ;;
  esac
  esac
done
done
cat <<EOF
cat <<EOF
  /* gdbarch_alloc() */
  /* gdbarch_alloc() */
 
 
  return gdbarch;
  return gdbarch;
}
}
EOF
EOF
 
 
# Free a gdbarch struct.
# Free a gdbarch struct.
echo ""
echo ""
echo ""
echo ""
cat <<EOF
cat <<EOF
/* Free a gdbarch struct.  This should never happen in normal
/* Free a gdbarch struct.  This should never happen in normal
   operation --- once you've created a gdbarch, you keep it around.
   operation --- once you've created a gdbarch, you keep it around.
   However, if an architecture's init function encounters an error
   However, if an architecture's init function encounters an error
   building the structure, it may need to clean up a partially
   building the structure, it may need to clean up a partially
   constructed gdbarch.  */
   constructed gdbarch.  */
void
void
gdbarch_free (struct gdbarch *arch)
gdbarch_free (struct gdbarch *arch)
{
{
  /* At the moment, this is trivial.  */
  /* At the moment, this is trivial.  */
  free (arch);
  free (arch);
}
}
EOF
EOF
 
 
# verify a new architecture
# verify a new architecture
echo ""
echo ""
echo ""
echo ""
echo "/* Ensure that all values in a GDBARCH are reasonable. */"
echo "/* Ensure that all values in a GDBARCH are reasonable. */"
echo ""
echo ""
cat <<EOF
cat <<EOF
static void
static void
verify_gdbarch (struct gdbarch *gdbarch)
verify_gdbarch (struct gdbarch *gdbarch)
{
{
  /* Only perform sanity checks on a multi-arch target. */
  /* Only perform sanity checks on a multi-arch target. */
  if (GDB_MULTI_ARCH <= 0)
  if (GDB_MULTI_ARCH <= 0)
    return;
    return;
  /* fundamental */
  /* fundamental */
  if (gdbarch->byte_order == 0)
  if (gdbarch->byte_order == 0)
    internal_error ("verify_gdbarch: byte-order unset");
    internal_error ("verify_gdbarch: byte-order unset");
  if (gdbarch->bfd_arch_info == NULL)
  if (gdbarch->bfd_arch_info == NULL)
    internal_error ("verify_gdbarch: bfd_arch_info unset");
    internal_error ("verify_gdbarch: bfd_arch_info unset");
  /* Check those that need to be defined for the given multi-arch level. */
  /* Check those that need to be defined for the given multi-arch level. */
EOF
EOF
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "f" | "v" )
    "f" | "v" )
        if [ "${invalid_p}" = "0" ]
        if [ "${invalid_p}" = "0" ]
        then
        then
            echo "  /* Skip verify of ${function}, invalid_p == 0 */"
            echo "  /* Skip verify of ${function}, invalid_p == 0 */"
        elif [ "${invalid_p}" ]
        elif [ "${invalid_p}" ]
        then
        then
            echo "  if ((GDB_MULTI_ARCH >= ${level})"
            echo "  if ((GDB_MULTI_ARCH >= ${level})"
            echo "      && (${invalid_p}))"
            echo "      && (${invalid_p}))"
            echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
            echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
        elif [ "${default}" ]
        elif [ "${default}" ]
        then
        then
            echo "  if ((GDB_MULTI_ARCH >= ${level})"
            echo "  if ((GDB_MULTI_ARCH >= ${level})"
            echo "      && (gdbarch->${function} == ${default}))"
            echo "      && (gdbarch->${function} == ${default}))"
            echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
            echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
        fi
        fi
        ;;
        ;;
  esac
  esac
done
done
cat <<EOF
cat <<EOF
}
}
EOF
EOF
 
 
# dump the structure
# dump the structure
echo ""
echo ""
echo ""
echo ""
echo "/* Print out the details of the current architecture. */"
echo "/* Print out the details of the current architecture. */"
echo ""
echo ""
cat <<EOF
cat <<EOF
void
void
gdbarch_dump (void)
gdbarch_dump (void)
{
{
EOF
EOF
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "f" )
    "f" )
        echo "  fprintf_unfiltered (gdb_stdlog,"
        echo "  fprintf_unfiltered (gdb_stdlog,"
        echo "                      \"gdbarch_update: ${macro} = 0x%08lx\\n\","
        echo "                      \"gdbarch_update: ${macro} = 0x%08lx\\n\","
        echo "                      (long) current_gdbarch->${function}"
        echo "                      (long) current_gdbarch->${function}"
        echo "                      /*${macro} ()*/);"
        echo "                      /*${macro} ()*/);"
        ;;
        ;;
    * )
    * )
        if [ "${print_p}" = "#" ]
        if [ "${print_p}" = "#" ]
        then
        then
          echo "#ifdef ${macro}"
          echo "#ifdef ${macro}"
          echo "  fprintf_unfiltered (gdb_stdlog,"
          echo "  fprintf_unfiltered (gdb_stdlog,"
          echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
          echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
          echo "                      ${print});"
          echo "                      ${print});"
          echo "#endif"
          echo "#endif"
        elif [ "${print_p}" ]
        elif [ "${print_p}" ]
        then
        then
          echo "  if (${print_p})"
          echo "  if (${print_p})"
          echo "    fprintf_unfiltered (gdb_stdlog,"
          echo "    fprintf_unfiltered (gdb_stdlog,"
          echo "                        \"gdbarch_update: ${macro} = ${fmt}\\n\","
          echo "                        \"gdbarch_update: ${macro} = ${fmt}\\n\","
          echo "                        ${print});"
          echo "                        ${print});"
        else
        else
          echo "  fprintf_unfiltered (gdb_stdlog,"
          echo "  fprintf_unfiltered (gdb_stdlog,"
          echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
          echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
          echo "                      ${print});"
          echo "                      ${print});"
        fi
        fi
        ;;
        ;;
  esac
  esac
done
done
echo "}"
echo "}"
 
 
 
 
# GET/SET
# GET/SET
echo ""
echo ""
cat <<EOF
cat <<EOF
struct gdbarch_tdep *
struct gdbarch_tdep *
gdbarch_tdep (struct gdbarch *gdbarch)
gdbarch_tdep (struct gdbarch *gdbarch)
{
{
  if (gdbarch_debug >= 2)
  if (gdbarch_debug >= 2)
    fprintf_unfiltered (gdb_stdlog, "gdbarch_tdep called\n");
    fprintf_unfiltered (gdb_stdlog, "gdbarch_tdep called\n");
  return gdbarch->tdep;
  return gdbarch->tdep;
}
}
EOF
EOF
echo ""
echo ""
function_list | while do_read # eval read $read
function_list | while do_read # eval read $read
do
do
  case "${class}" in
  case "${class}" in
    "f" )
    "f" )
        echo ""
        echo ""
        echo "${returntype}"
        echo "${returntype}"
        if [ "${formal}" = "void" ]
        if [ "${formal}" = "void" ]
        then
        then
          echo "gdbarch_${function} (struct gdbarch *gdbarch)"
          echo "gdbarch_${function} (struct gdbarch *gdbarch)"
        else
        else
          echo "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})"
          echo "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})"
        fi
        fi
        echo "{"
        echo "{"
        if default_is_fallback_p && [ "${default}" != "0" ]
        if default_is_fallback_p && [ "${default}" != "0" ]
        then
        then
            echo "  if (GDB_MULTI_ARCH == 0)"
            echo "  if (GDB_MULTI_ARCH == 0)"
            if [ "${returntype}" = "void" ]
            if [ "${returntype}" = "void" ]
            then
            then
                echo "    {"
                echo "    {"
                echo "      ${default} (${actual});"
                echo "      ${default} (${actual});"
                echo "      return;"
                echo "      return;"
                echo "    }"
                echo "    }"
            else
            else
                echo "    return ${default} (${actual});"
                echo "    return ${default} (${actual});"
            fi
            fi
        fi
        fi
        echo "  if (gdbarch->${function} == 0)"
        echo "  if (gdbarch->${function} == 0)"
        echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
        echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
        echo "  if (gdbarch_debug >= 2)"
        echo "  if (gdbarch_debug >= 2)"
        echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
        echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
        test "${actual}" = "-" && actual=""
        test "${actual}" = "-" && actual=""
        if [ "${returntype}" = "void" ]
        if [ "${returntype}" = "void" ]
        then
        then
          echo "  gdbarch->${function} (${actual});"
          echo "  gdbarch->${function} (${actual});"
        else
        else
          echo "  return gdbarch->${function} (${actual});"
          echo "  return gdbarch->${function} (${actual});"
        fi
        fi
        echo "}"
        echo "}"
        echo ""
        echo ""
        echo "void"
        echo "void"
        echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
        echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
        echo "            `echo ${function} | sed -e 's/./ /g'`  gdbarch_${function}_ftype ${function})"
        echo "            `echo ${function} | sed -e 's/./ /g'`  gdbarch_${function}_ftype ${function})"
        echo "{"
        echo "{"
        echo "  gdbarch->${function} = ${function};"
        echo "  gdbarch->${function} = ${function};"
        echo "}"
        echo "}"
        ;;
        ;;
    "v" )
    "v" )
        echo ""
        echo ""
        echo "${returntype}"
        echo "${returntype}"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
        echo "{"
        echo "{"
        if [ "${invalid_p}" = "0" ]
        if [ "${invalid_p}" = "0" ]
        then
        then
            echo "  /* Skip verify of ${function}, invalid_p == 0 */"
            echo "  /* Skip verify of ${function}, invalid_p == 0 */"
        elif [ "${invalid_p}" ]
        elif [ "${invalid_p}" ]
        then
        then
          echo "  if (${invalid_p})"
          echo "  if (${invalid_p})"
          echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
          echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
        elif [ "${default}" ]
        elif [ "${default}" ]
        then
        then
          echo "  if (gdbarch->${function} == ${default})"
          echo "  if (gdbarch->${function} == ${default})"
          echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
          echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
        fi
        fi
        echo "  if (gdbarch_debug >= 2)"
        echo "  if (gdbarch_debug >= 2)"
        echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
        echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
        echo "  return gdbarch->${function};"
        echo "  return gdbarch->${function};"
        echo "}"
        echo "}"
        echo ""
        echo ""
        echo "void"
        echo "void"
        echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
        echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
        echo "            `echo ${function} | sed -e 's/./ /g'`  ${returntype} ${function})"
        echo "            `echo ${function} | sed -e 's/./ /g'`  ${returntype} ${function})"
        echo "{"
        echo "{"
        echo "  gdbarch->${function} = ${function};"
        echo "  gdbarch->${function} = ${function};"
        echo "}"
        echo "}"
        ;;
        ;;
    "i" )
    "i" )
        echo ""
        echo ""
        echo "${returntype}"
        echo "${returntype}"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
        echo "{"
        echo "{"
        echo "  if (gdbarch_debug >= 2)"
        echo "  if (gdbarch_debug >= 2)"
        echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
        echo "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
        echo "  return gdbarch->${function};"
        echo "  return gdbarch->${function};"
        echo "}"
        echo "}"
        ;;
        ;;
  esac
  esac
done
done
 
 
# All the trailing guff
# All the trailing guff
cat <<EOF
cat <<EOF
 
 
 
 
/* Keep a registrary of per-architecture data-pointers required by GDB
/* Keep a registrary of per-architecture data-pointers required by GDB
   modules. */
   modules. */
 
 
struct gdbarch_data
struct gdbarch_data
{
{
  int index;
  int index;
};
};
 
 
struct gdbarch_data_registration
struct gdbarch_data_registration
{
{
  gdbarch_data_ftype *init;
  gdbarch_data_ftype *init;
  struct gdbarch_data *data;
  struct gdbarch_data *data;
  struct gdbarch_data_registration *next;
  struct gdbarch_data_registration *next;
};
};
 
 
struct gdbarch_data_registrary
struct gdbarch_data_registrary
{
{
  int nr;
  int nr;
  struct gdbarch_data_registration *registrations;
  struct gdbarch_data_registration *registrations;
};
};
 
 
struct gdbarch_data_registrary gdbarch_data_registrary =
struct gdbarch_data_registrary gdbarch_data_registrary =
{
{
  0, NULL,
  0, NULL,
};
};
 
 
struct gdbarch_data *
struct gdbarch_data *
register_gdbarch_data (gdbarch_data_ftype *init)
register_gdbarch_data (gdbarch_data_ftype *init)
{
{
  struct gdbarch_data_registration **curr;
  struct gdbarch_data_registration **curr;
  for (curr = &gdbarch_data_registrary.registrations;
  for (curr = &gdbarch_data_registrary.registrations;
       (*curr) != NULL;
       (*curr) != NULL;
       curr = &(*curr)->next);
       curr = &(*curr)->next);
  (*curr) = XMALLOC (struct gdbarch_data_registration);
  (*curr) = XMALLOC (struct gdbarch_data_registration);
  (*curr)->next = NULL;
  (*curr)->next = NULL;
  (*curr)->init = init;
  (*curr)->init = init;
  (*curr)->data = XMALLOC (struct gdbarch_data);
  (*curr)->data = XMALLOC (struct gdbarch_data);
  (*curr)->data->index = gdbarch_data_registrary.nr++;
  (*curr)->data->index = gdbarch_data_registrary.nr++;
  return (*curr)->data;
  return (*curr)->data;
}
}
 
 
 
 
/* Walk through all the registered users initializing each in turn. */
/* Walk through all the registered users initializing each in turn. */
 
 
static void
static void
init_gdbarch_data (struct gdbarch *gdbarch)
init_gdbarch_data (struct gdbarch *gdbarch)
{
{
  struct gdbarch_data_registration *rego;
  struct gdbarch_data_registration *rego;
  gdbarch->nr_data = gdbarch_data_registrary.nr + 1;
  gdbarch->nr_data = gdbarch_data_registrary.nr + 1;
  gdbarch->data = xmalloc (sizeof (void*) * gdbarch->nr_data);
  gdbarch->data = xmalloc (sizeof (void*) * gdbarch->nr_data);
  for (rego = gdbarch_data_registrary.registrations;
  for (rego = gdbarch_data_registrary.registrations;
       rego != NULL;
       rego != NULL;
       rego = rego->next)
       rego = rego->next)
    {
    {
      if (rego->data->index < gdbarch->nr_data)
      if (rego->data->index < gdbarch->nr_data)
        gdbarch->data[rego->data->index] = rego->init ();
        gdbarch->data[rego->data->index] = rego->init ();
    }
    }
}
}
 
 
 
 
/* Return the current value of the specified per-architecture
/* Return the current value of the specified per-architecture
   data-pointer. */
   data-pointer. */
 
 
void *
void *
gdbarch_data (data)
gdbarch_data (data)
     struct gdbarch_data *data;
     struct gdbarch_data *data;
{
{
  if (data->index >= current_gdbarch->nr_data)
  if (data->index >= current_gdbarch->nr_data)
    internal_error ("gdbarch_data: request for non-existant data.");
    internal_error ("gdbarch_data: request for non-existant data.");
  return current_gdbarch->data[data->index];
  return current_gdbarch->data[data->index];
}
}
 
 
 
 
 
 
/* Keep a registrary of swaped data required by GDB modules. */
/* Keep a registrary of swaped data required by GDB modules. */
 
 
struct gdbarch_swap
struct gdbarch_swap
{
{
  void *swap;
  void *swap;
  struct gdbarch_swap_registration *source;
  struct gdbarch_swap_registration *source;
  struct gdbarch_swap *next;
  struct gdbarch_swap *next;
};
};
 
 
struct gdbarch_swap_registration
struct gdbarch_swap_registration
{
{
  void *data;
  void *data;
  unsigned long sizeof_data;
  unsigned long sizeof_data;
  gdbarch_swap_ftype *init;
  gdbarch_swap_ftype *init;
  struct gdbarch_swap_registration *next;
  struct gdbarch_swap_registration *next;
};
};
 
 
struct gdbarch_swap_registrary
struct gdbarch_swap_registrary
{
{
  int nr;
  int nr;
  struct gdbarch_swap_registration *registrations;
  struct gdbarch_swap_registration *registrations;
};
};
 
 
struct gdbarch_swap_registrary gdbarch_swap_registrary =
struct gdbarch_swap_registrary gdbarch_swap_registrary =
{
{
  0, NULL,
  0, NULL,
};
};
 
 
void
void
register_gdbarch_swap (void *data,
register_gdbarch_swap (void *data,
                       unsigned long sizeof_data,
                       unsigned long sizeof_data,
                       gdbarch_swap_ftype *init)
                       gdbarch_swap_ftype *init)
{
{
  struct gdbarch_swap_registration **rego;
  struct gdbarch_swap_registration **rego;
  for (rego = &gdbarch_swap_registrary.registrations;
  for (rego = &gdbarch_swap_registrary.registrations;
       (*rego) != NULL;
       (*rego) != NULL;
       rego = &(*rego)->next);
       rego = &(*rego)->next);
  (*rego) = XMALLOC (struct gdbarch_swap_registration);
  (*rego) = XMALLOC (struct gdbarch_swap_registration);
  (*rego)->next = NULL;
  (*rego)->next = NULL;
  (*rego)->init = init;
  (*rego)->init = init;
  (*rego)->data = data;
  (*rego)->data = data;
  (*rego)->sizeof_data = sizeof_data;
  (*rego)->sizeof_data = sizeof_data;
}
}
 
 
 
 
static void
static void
init_gdbarch_swap (struct gdbarch *gdbarch)
init_gdbarch_swap (struct gdbarch *gdbarch)
{
{
  struct gdbarch_swap_registration *rego;
  struct gdbarch_swap_registration *rego;
  struct gdbarch_swap **curr = &gdbarch->swap;
  struct gdbarch_swap **curr = &gdbarch->swap;
  for (rego = gdbarch_swap_registrary.registrations;
  for (rego = gdbarch_swap_registrary.registrations;
       rego != NULL;
       rego != NULL;
       rego = rego->next)
       rego = rego->next)
    {
    {
      if (rego->data != NULL)
      if (rego->data != NULL)
        {
        {
          (*curr) = XMALLOC (struct gdbarch_swap);
          (*curr) = XMALLOC (struct gdbarch_swap);
          (*curr)->source = rego;
          (*curr)->source = rego;
          (*curr)->swap = xmalloc (rego->sizeof_data);
          (*curr)->swap = xmalloc (rego->sizeof_data);
          (*curr)->next = NULL;
          (*curr)->next = NULL;
          memset (rego->data, 0, rego->sizeof_data);
          memset (rego->data, 0, rego->sizeof_data);
          curr = &(*curr)->next;
          curr = &(*curr)->next;
        }
        }
      if (rego->init != NULL)
      if (rego->init != NULL)
        rego->init ();
        rego->init ();
    }
    }
}
}
 
 
static void
static void
swapout_gdbarch_swap (struct gdbarch *gdbarch)
swapout_gdbarch_swap (struct gdbarch *gdbarch)
{
{
  struct gdbarch_swap *curr;
  struct gdbarch_swap *curr;
  for (curr = gdbarch->swap;
  for (curr = gdbarch->swap;
       curr != NULL;
       curr != NULL;
       curr = curr->next)
       curr = curr->next)
    memcpy (curr->swap, curr->source->data, curr->source->sizeof_data);
    memcpy (curr->swap, curr->source->data, curr->source->sizeof_data);
}
}
 
 
static void
static void
swapin_gdbarch_swap (struct gdbarch *gdbarch)
swapin_gdbarch_swap (struct gdbarch *gdbarch)
{
{
  struct gdbarch_swap *curr;
  struct gdbarch_swap *curr;
  for (curr = gdbarch->swap;
  for (curr = gdbarch->swap;
       curr != NULL;
       curr != NULL;
       curr = curr->next)
       curr = curr->next)
    memcpy (curr->source->data, curr->swap, curr->source->sizeof_data);
    memcpy (curr->source->data, curr->swap, curr->source->sizeof_data);
}
}
 
 
 
 
/* Keep a registrary of the architectures known by GDB. */
/* Keep a registrary of the architectures known by GDB. */
 
 
struct gdbarch_init_registration
struct gdbarch_init_registration
{
{
  enum bfd_architecture bfd_architecture;
  enum bfd_architecture bfd_architecture;
  gdbarch_init_ftype *init;
  gdbarch_init_ftype *init;
  struct gdbarch_list *arches;
  struct gdbarch_list *arches;
  struct gdbarch_init_registration *next;
  struct gdbarch_init_registration *next;
};
};
 
 
static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
 
 
void
void
register_gdbarch_init (enum bfd_architecture bfd_architecture,
register_gdbarch_init (enum bfd_architecture bfd_architecture,
                       gdbarch_init_ftype *init)
                       gdbarch_init_ftype *init)
{
{
  struct gdbarch_init_registration **curr;
  struct gdbarch_init_registration **curr;
  const struct bfd_arch_info *bfd_arch_info;
  const struct bfd_arch_info *bfd_arch_info;
  /* Check that BFD reconizes this architecture */
  /* Check that BFD reconizes this architecture */
  bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
  bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
  if (bfd_arch_info == NULL)
  if (bfd_arch_info == NULL)
    {
    {
      internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
      internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
    }
    }
  /* Check that we haven't seen this architecture before */
  /* Check that we haven't seen this architecture before */
  for (curr = &gdbarch_init_registrary;
  for (curr = &gdbarch_init_registrary;
       (*curr) != NULL;
       (*curr) != NULL;
       curr = &(*curr)->next)
       curr = &(*curr)->next)
    {
    {
      if (bfd_architecture == (*curr)->bfd_architecture)
      if (bfd_architecture == (*curr)->bfd_architecture)
        internal_error ("gdbarch: Duplicate registraration of architecture (%s)",
        internal_error ("gdbarch: Duplicate registraration of architecture (%s)",
               bfd_arch_info->printable_name);
               bfd_arch_info->printable_name);
    }
    }
  /* log it */
  /* log it */
  if (gdbarch_debug)
  if (gdbarch_debug)
    fprintf_unfiltered (gdb_stdlog, "register_gdbarch_init (%s, 0x%08lx)\n",
    fprintf_unfiltered (gdb_stdlog, "register_gdbarch_init (%s, 0x%08lx)\n",
                        bfd_arch_info->printable_name,
                        bfd_arch_info->printable_name,
                        (long) init);
                        (long) init);
  /* Append it */
  /* Append it */
  (*curr) = XMALLOC (struct gdbarch_init_registration);
  (*curr) = XMALLOC (struct gdbarch_init_registration);
  (*curr)->bfd_architecture = bfd_architecture;
  (*curr)->bfd_architecture = bfd_architecture;
  (*curr)->init = init;
  (*curr)->init = init;
  (*curr)->arches = NULL;
  (*curr)->arches = NULL;
  (*curr)->next = NULL;
  (*curr)->next = NULL;
}
}
 
 
 
 
 
 
/* Look for an architecture using gdbarch_info.  Base search on only
/* Look for an architecture using gdbarch_info.  Base search on only
   BFD_ARCH_INFO and BYTE_ORDER. */
   BFD_ARCH_INFO and BYTE_ORDER. */
 
 
struct gdbarch_list *
struct gdbarch_list *
gdbarch_list_lookup_by_info (struct gdbarch_list *arches,
gdbarch_list_lookup_by_info (struct gdbarch_list *arches,
                             const struct gdbarch_info *info)
                             const struct gdbarch_info *info)
{
{
  for (; arches != NULL; arches = arches->next)
  for (; arches != NULL; arches = arches->next)
    {
    {
      if (info->bfd_arch_info != arches->gdbarch->bfd_arch_info)
      if (info->bfd_arch_info != arches->gdbarch->bfd_arch_info)
        continue;
        continue;
      if (info->byte_order != arches->gdbarch->byte_order)
      if (info->byte_order != arches->gdbarch->byte_order)
        continue;
        continue;
      return arches;
      return arches;
    }
    }
  return NULL;
  return NULL;
}
}
 
 
 
 
/* Update the current architecture. Return ZERO if the update request
/* Update the current architecture. Return ZERO if the update request
   failed. */
   failed. */
 
 
int
int
gdbarch_update (struct gdbarch_info info)
gdbarch_update (struct gdbarch_info info)
{
{
  struct gdbarch *new_gdbarch;
  struct gdbarch *new_gdbarch;
  struct gdbarch_list **list;
  struct gdbarch_list **list;
  struct gdbarch_init_registration *rego;
  struct gdbarch_init_registration *rego;
 
 
  /* Fill in any missing bits. Most important is the bfd_architecture
  /* Fill in any missing bits. Most important is the bfd_architecture
     which is used to select the target architecture. */
     which is used to select the target architecture. */
  if (info.bfd_architecture == bfd_arch_unknown)
  if (info.bfd_architecture == bfd_arch_unknown)
    {
    {
      if (info.bfd_arch_info != NULL)
      if (info.bfd_arch_info != NULL)
        info.bfd_architecture = info.bfd_arch_info->arch;
        info.bfd_architecture = info.bfd_arch_info->arch;
      else if (info.abfd != NULL)
      else if (info.abfd != NULL)
        info.bfd_architecture = bfd_get_arch (info.abfd);
        info.bfd_architecture = bfd_get_arch (info.abfd);
      /* FIXME - should query BFD for its default architecture. */
      /* FIXME - should query BFD for its default architecture. */
      else
      else
        info.bfd_architecture = current_gdbarch->bfd_arch_info->arch;
        info.bfd_architecture = current_gdbarch->bfd_arch_info->arch;
    }
    }
  if (info.bfd_arch_info == NULL)
  if (info.bfd_arch_info == NULL)
    {
    {
      if (target_architecture_auto && info.abfd != NULL)
      if (target_architecture_auto && info.abfd != NULL)
        info.bfd_arch_info = bfd_get_arch_info (info.abfd);
        info.bfd_arch_info = bfd_get_arch_info (info.abfd);
      else
      else
        info.bfd_arch_info = current_gdbarch->bfd_arch_info;
        info.bfd_arch_info = current_gdbarch->bfd_arch_info;
    }
    }
  if (info.byte_order == 0)
  if (info.byte_order == 0)
    {
    {
      if (target_byte_order_auto && info.abfd != NULL)
      if (target_byte_order_auto && info.abfd != NULL)
        info.byte_order = (bfd_big_endian (info.abfd) ? BIG_ENDIAN
        info.byte_order = (bfd_big_endian (info.abfd) ? BIG_ENDIAN
                           : bfd_little_endian (info.abfd) ? LITTLE_ENDIAN
                           : bfd_little_endian (info.abfd) ? LITTLE_ENDIAN
                           : 0);
                           : 0);
      else
      else
        info.byte_order = current_gdbarch->byte_order;
        info.byte_order = current_gdbarch->byte_order;
      /* FIXME - should query BFD for its default byte-order. */
      /* FIXME - should query BFD for its default byte-order. */
    }
    }
  /* A default for abfd? */
  /* A default for abfd? */
 
 
  /* Find the target that knows about this architecture. */
  /* Find the target that knows about this architecture. */
  for (rego = gdbarch_init_registrary;
  for (rego = gdbarch_init_registrary;
       rego != NULL && rego->bfd_architecture != info.bfd_architecture;
       rego != NULL && rego->bfd_architecture != info.bfd_architecture;
       rego = rego->next);
       rego = rego->next);
  if (rego == NULL)
  if (rego == NULL)
    {
    {
      if (gdbarch_debug)
      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;
      return 0;
    }
    }
 
 
  if (gdbarch_debug)
  if (gdbarch_debug)
    {
    {
      fprintf_unfiltered (gdb_stdlog,
      fprintf_unfiltered (gdb_stdlog,
                          "gdbarch_update: info.bfd_architecture %d (%s)\n",
                          "gdbarch_update: info.bfd_architecture %d (%s)\n",
                          info.bfd_architecture,
                          info.bfd_architecture,
                          bfd_lookup_arch (info.bfd_architecture, 0)->printable_name);
                          bfd_lookup_arch (info.bfd_architecture, 0)->printable_name);
      fprintf_unfiltered (gdb_stdlog,
      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 != NULL
                           ? info.bfd_arch_info->printable_name
                           ? info.bfd_arch_info->printable_name
                           : "(null)"));
                           : "(null)"));
      fprintf_unfiltered (gdb_stdlog,
      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,
                          (info.byte_order == BIG_ENDIAN ? "big"
                          (info.byte_order == BIG_ENDIAN ? "big"
                           : info.byte_order == LITTLE_ENDIAN ? "little"
                           : info.byte_order == LITTLE_ENDIAN ? "little"
                           : "default"));
                           : "default"));
      fprintf_unfiltered (gdb_stdlog,
      fprintf_unfiltered (gdb_stdlog,
                          "gdbarch_update: info.abfd 0x%lx\n",
                          "gdbarch_update: info.abfd 0x%lx\n",
                          (long) info.abfd);
                          (long) info.abfd);
      fprintf_unfiltered (gdb_stdlog,
      fprintf_unfiltered (gdb_stdlog,
                          "gdbarch_update: info.tdep_info 0x%lx\n",
                          "gdbarch_update: info.tdep_info 0x%lx\n",
                          (long) info.tdep_info);
                          (long) info.tdep_info);
    }
    }
 
 
  /* Ask the target for a replacement architecture. */
  /* Ask the target for a replacement architecture. */
  new_gdbarch = rego->init (info, rego->arches);
  new_gdbarch = rego->init (info, rego->arches);
 
 
  /* Did the target like it?  No. Reject the change. */
  /* Did the target like it?  No. Reject the change. */
  if (new_gdbarch == NULL)
  if (new_gdbarch == NULL)
    {
    {
      if (gdbarch_debug)
      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;
      return 0;
    }
    }
 
 
  /* Did the architecture change?  No. Do nothing. */
  /* Did the architecture change?  No. Do nothing. */
  if (current_gdbarch == new_gdbarch)
  if (current_gdbarch == new_gdbarch)
    {
    {
      if (gdbarch_debug)
      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,
                            (long) new_gdbarch,
                            new_gdbarch->bfd_arch_info->printable_name);
                            new_gdbarch->bfd_arch_info->printable_name);
      return 1;
      return 1;
    }
    }
 
 
  /* Swap all data belonging to the old target out */
  /* Swap all data belonging to the old target out */
  swapout_gdbarch_swap (current_gdbarch);
  swapout_gdbarch_swap (current_gdbarch);
 
 
  /* Is this a pre-existing architecture?  Yes. Swap it in.  */
  /* Is this a pre-existing architecture?  Yes. Swap it in.  */
  for (list = &rego->arches;
  for (list = &rego->arches;
       (*list) != NULL;
       (*list) != NULL;
       list = &(*list)->next)
       list = &(*list)->next)
    {
    {
      if ((*list)->gdbarch == new_gdbarch)
      if ((*list)->gdbarch == new_gdbarch)
        {
        {
          if (gdbarch_debug)
          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,
                                (long) new_gdbarch,
                                new_gdbarch->bfd_arch_info->printable_name);
                                new_gdbarch->bfd_arch_info->printable_name);
          current_gdbarch = new_gdbarch;
          current_gdbarch = new_gdbarch;
          swapin_gdbarch_swap (new_gdbarch);
          swapin_gdbarch_swap (new_gdbarch);
          return 1;
          return 1;
        }
        }
    }
    }
 
 
  /* Append this new architecture to this targets list. */
  /* Append this new architecture to this targets list. */
  (*list) = XMALLOC (struct gdbarch_list);
  (*list) = XMALLOC (struct gdbarch_list);
  (*list)->next = NULL;
  (*list)->next = NULL;
  (*list)->gdbarch = new_gdbarch;
  (*list)->gdbarch = new_gdbarch;
 
 
  /* Switch to this new architecture.  Dump it out. */
  /* Switch to this new architecture.  Dump it out. */
  current_gdbarch = new_gdbarch;
  current_gdbarch = new_gdbarch;
  if (gdbarch_debug)
  if (gdbarch_debug)
    {
    {
      fprintf_unfiltered (gdb_stdlog,
      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,
                          (long) new_gdbarch,
                          new_gdbarch->bfd_arch_info->printable_name);
                          new_gdbarch->bfd_arch_info->printable_name);
      gdbarch_dump ();
      gdbarch_dump ();
    }
    }
 
 
  /* Check that the newly installed architecture is valid.  */
  /* Check that the newly installed architecture is valid.  */
  verify_gdbarch (new_gdbarch);
  verify_gdbarch (new_gdbarch);
 
 
  /* Initialize the per-architecture memory (swap) areas.
  /* Initialize the per-architecture memory (swap) areas.
     CURRENT_GDBARCH must be update before these modules are
     CURRENT_GDBARCH must be update before these modules are
     called. */
     called. */
  init_gdbarch_swap (new_gdbarch);
  init_gdbarch_swap (new_gdbarch);
 
 
  /* Initialize the per-architecture data-pointer of all parties that
  /* Initialize the per-architecture data-pointer of all parties that
     registered an interest in this architecture.  CURRENT_GDBARCH
     registered an interest in this architecture.  CURRENT_GDBARCH
     must be updated before these modules are called. */
     must be updated before these modules are called. */
  init_gdbarch_data (new_gdbarch);
  init_gdbarch_data (new_gdbarch);
 
 
  return 1;
  return 1;
}
}
 
 
 
 
 
 
/* Functions to manipulate the endianness of the target.  */
/* Functions to manipulate the endianness of the target.  */
 
 
#ifdef TARGET_BYTE_ORDER_SELECTABLE
#ifdef TARGET_BYTE_ORDER_SELECTABLE
/* compat - Catch old targets that expect a selectable byte-order to
/* compat - Catch old targets that expect a selectable byte-order to
   default to BIG_ENDIAN */
   default to BIG_ENDIAN */
#ifndef TARGET_BYTE_ORDER_DEFAULT
#ifndef TARGET_BYTE_ORDER_DEFAULT
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
#endif
#endif
#endif
#endif
#if !TARGET_BYTE_ORDER_SELECTABLE_P
#if !TARGET_BYTE_ORDER_SELECTABLE_P
#ifndef TARGET_BYTE_ORDER_DEFAULT
#ifndef TARGET_BYTE_ORDER_DEFAULT
/* compat - Catch old non byte-order selectable targets that do not
/* compat - Catch old non byte-order selectable targets that do not
   define TARGET_BYTE_ORDER_DEFAULT and instead expect
   define TARGET_BYTE_ORDER_DEFAULT and instead expect
   TARGET_BYTE_ORDER to be used as the default.  For targets that
   TARGET_BYTE_ORDER to be used as the default.  For targets that
   defined neither TARGET_BYTE_ORDER nor TARGET_BYTE_ORDER_DEFAULT the
   defined neither TARGET_BYTE_ORDER nor TARGET_BYTE_ORDER_DEFAULT the
   below will get a strange compiler warning. */
   below will get a strange compiler warning. */
#define TARGET_BYTE_ORDER_DEFAULT TARGET_BYTE_ORDER
#define TARGET_BYTE_ORDER_DEFAULT TARGET_BYTE_ORDER
#endif
#endif
#endif
#endif
#ifndef TARGET_BYTE_ORDER_DEFAULT
#ifndef TARGET_BYTE_ORDER_DEFAULT
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN /* arbitrary */
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN /* arbitrary */
#endif
#endif
int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
int target_byte_order_auto = 1;
int target_byte_order_auto = 1;
 
 
/* Chain containing the \"set endian\" commands.  */
/* Chain containing the \"set endian\" commands.  */
static struct cmd_list_element *endianlist = NULL;
static struct cmd_list_element *endianlist = NULL;
 
 
/* Called by \`\`show endian''.  */
/* Called by \`\`show endian''.  */
static void
static void
show_endian (char *args, int from_tty)
show_endian (char *args, int from_tty)
{
{
  char *msg =
  char *msg =
    (TARGET_BYTE_ORDER_AUTO
    (TARGET_BYTE_ORDER_AUTO
     ? "The target endianness is set automatically (currently %s endian)\n"
     ? "The target endianness is set automatically (currently %s endian)\n"
     : "The target is assumed to be %s endian\n");
     : "The target is assumed to be %s endian\n");
  printf_unfiltered (msg, (TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
  printf_unfiltered (msg, (TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
}
}
 
 
/* Called if the user enters \`\`set endian'' without an argument.  */
/* Called if the user enters \`\`set endian'' without an argument.  */
static void
static void
set_endian (char *args, int from_tty)
set_endian (char *args, int from_tty)
{
{
  printf_unfiltered ("\"set endian\" must be followed by \"auto\", \"big\" or \"little\".\n");
  printf_unfiltered ("\"set endian\" must be followed by \"auto\", \"big\" or \"little\".\n");
  show_endian (args, from_tty);
  show_endian (args, from_tty);
}
}
 
 
/* Called by \`\`set endian big''.  */
/* Called by \`\`set endian big''.  */
static void
static void
set_endian_big (char *args, int from_tty)
set_endian_big (char *args, int from_tty)
{
{
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
    {
    {
      target_byte_order = BIG_ENDIAN;
      target_byte_order = BIG_ENDIAN;
      target_byte_order_auto = 0;
      target_byte_order_auto = 0;
      if (GDB_MULTI_ARCH)
      if (GDB_MULTI_ARCH)
        {
        {
          struct gdbarch_info info;
          struct gdbarch_info info;
          memset (&info, 0, sizeof info);
          memset (&info, 0, sizeof info);
          info.byte_order = BIG_ENDIAN;
          info.byte_order = BIG_ENDIAN;
          gdbarch_update (info);
          gdbarch_update (info);
        }
        }
    }
    }
  else
  else
    {
    {
      printf_unfiltered ("Byte order is not selectable.");
      printf_unfiltered ("Byte order is not selectable.");
      show_endian (args, from_tty);
      show_endian (args, from_tty);
    }
    }
}
}
 
 
/* Called by \`\`set endian little''.  */
/* Called by \`\`set endian little''.  */
static void
static void
set_endian_little (char *args, int from_tty)
set_endian_little (char *args, int from_tty)
{
{
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
    {
    {
      target_byte_order = LITTLE_ENDIAN;
      target_byte_order = LITTLE_ENDIAN;
      target_byte_order_auto = 0;
      target_byte_order_auto = 0;
      if (GDB_MULTI_ARCH)
      if (GDB_MULTI_ARCH)
        {
        {
          struct gdbarch_info info;
          struct gdbarch_info info;
          memset (&info, 0, sizeof info);
          memset (&info, 0, sizeof info);
          info.byte_order = LITTLE_ENDIAN;
          info.byte_order = LITTLE_ENDIAN;
          gdbarch_update (info);
          gdbarch_update (info);
        }
        }
    }
    }
  else
  else
    {
    {
      printf_unfiltered ("Byte order is not selectable.");
      printf_unfiltered ("Byte order is not selectable.");
      show_endian (args, from_tty);
      show_endian (args, from_tty);
    }
    }
}
}
 
 
/* Called by \`\`set endian auto''.  */
/* Called by \`\`set endian auto''.  */
static void
static void
set_endian_auto (char *args, int from_tty)
set_endian_auto (char *args, int from_tty)
{
{
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
    {
    {
      target_byte_order_auto = 1;
      target_byte_order_auto = 1;
    }
    }
  else
  else
    {
    {
      printf_unfiltered ("Byte order is not selectable.");
      printf_unfiltered ("Byte order is not selectable.");
      show_endian (args, from_tty);
      show_endian (args, from_tty);
    }
    }
}
}
 
 
/* Set the endianness from a BFD.  */
/* Set the endianness from a BFD.  */
static void
static void
set_endian_from_file (bfd *abfd)
set_endian_from_file (bfd *abfd)
{
{
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
  if (TARGET_BYTE_ORDER_SELECTABLE_P)
    {
    {
      int want;
      int want;
 
 
      if (bfd_big_endian (abfd))
      if (bfd_big_endian (abfd))
        want = BIG_ENDIAN;
        want = BIG_ENDIAN;
      else
      else
        want = LITTLE_ENDIAN;
        want = LITTLE_ENDIAN;
      if (TARGET_BYTE_ORDER_AUTO)
      if (TARGET_BYTE_ORDER_AUTO)
        target_byte_order = want;
        target_byte_order = want;
      else if (TARGET_BYTE_ORDER != want)
      else if (TARGET_BYTE_ORDER != want)
        warning ("%s endian file does not match %s endian target.",
        warning ("%s endian file does not match %s endian target.",
                 want == BIG_ENDIAN ? "big" : "little",
                 want == BIG_ENDIAN ? "big" : "little",
                 TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
                 TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
    }
    }
  else
  else
    {
    {
      if (bfd_big_endian (abfd)
      if (bfd_big_endian (abfd)
          ? TARGET_BYTE_ORDER != BIG_ENDIAN
          ? TARGET_BYTE_ORDER != BIG_ENDIAN
          : TARGET_BYTE_ORDER == BIG_ENDIAN)
          : TARGET_BYTE_ORDER == BIG_ENDIAN)
        warning ("%s endian file does not match %s endian target.",
        warning ("%s endian file does not match %s endian target.",
                 bfd_big_endian (abfd) ? "big" : "little",
                 bfd_big_endian (abfd) ? "big" : "little",
                 TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
                 TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
    }
    }
}
}
 
 
 
 
 
 
/* Functions to manipulate the architecture of the target */
/* Functions to manipulate the architecture of the target */
 
 
enum set_arch { set_arch_auto, set_arch_manual };
enum set_arch { set_arch_auto, set_arch_manual };
 
 
int target_architecture_auto = 1;
int target_architecture_auto = 1;
extern const struct bfd_arch_info bfd_default_arch_struct;
extern const struct bfd_arch_info bfd_default_arch_struct;
const struct bfd_arch_info *target_architecture = &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);
int (*target_architecture_hook) (const struct bfd_arch_info *ap);
 
 
static void show_endian (char *, int);
static void show_endian (char *, int);
static void set_endian (char *, int);
static void set_endian (char *, int);
static void set_endian_big (char *, int);
static void set_endian_big (char *, int);
static void set_endian_little (char *, int);
static void set_endian_little (char *, int);
static void set_endian_auto (char *, int);
static void set_endian_auto (char *, int);
static void set_endian_from_file (bfd *);
static void set_endian_from_file (bfd *);
static int arch_ok (const struct bfd_arch_info *arch);
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 set_arch (const struct bfd_arch_info *arch, enum set_arch type);
static void show_architecture (char *, int);
static void show_architecture (char *, int);
static void set_architecture (char *, int);
static void set_architecture (char *, int);
static void info_architecture (char *, int);
static void info_architecture (char *, int);
static void set_architecture_from_file (bfd *);
static void set_architecture_from_file (bfd *);
 
 
/* Do the real work of changing the current architecture */
/* Do the real work of changing the current architecture */
 
 
static int
static int
arch_ok (const struct bfd_arch_info *arch)
arch_ok (const struct bfd_arch_info *arch)
{
{
  /* Should be performing the more basic check that the binary is
  /* Should be performing the more basic check that the binary is
     compatible with GDB. */
     compatible with GDB. */
  /* Check with the target that the architecture is valid. */
  /* Check with the target that the architecture is valid. */
  return (target_architecture_hook == NULL
  return (target_architecture_hook == NULL
          || target_architecture_hook (arch));
          || target_architecture_hook (arch));
}
}
 
 
static void
static void
set_arch (const struct bfd_arch_info *arch,
set_arch (const struct bfd_arch_info *arch,
          enum set_arch type)
          enum set_arch type)
{
{
  switch (type)
  switch (type)
    {
    {
    case set_arch_auto:
    case set_arch_auto:
      if (!arch_ok (arch))
      if (!arch_ok (arch))
        warning ("Target may not support %s architecture",
        warning ("Target may not support %s architecture",
                 arch->printable_name);
                 arch->printable_name);
      target_architecture = arch;
      target_architecture = arch;
      break;
      break;
    case set_arch_manual:
    case set_arch_manual:
      if (!arch_ok (arch))
      if (!arch_ok (arch))
        {
        {
          printf_unfiltered ("Target does not support \`%s' architecture.\n",
          printf_unfiltered ("Target does not support \`%s' architecture.\n",
                             arch->printable_name);
                             arch->printable_name);
        }
        }
      else
      else
        {
        {
          target_architecture_auto = 0;
          target_architecture_auto = 0;
          target_architecture = arch;
          target_architecture = arch;
        }
        }
      break;
      break;
    }
    }
  if (gdbarch_debug)
  if (gdbarch_debug)
    gdbarch_dump ();
    gdbarch_dump ();
}
}
 
 
/* Called if the user enters \`\`show architecture'' without an argument. */
/* Called if the user enters \`\`show architecture'' without an argument. */
static void
static void
show_architecture (char *args, int from_tty)
show_architecture (char *args, int from_tty)
{
{
  const char *arch;
  const char *arch;
  arch = TARGET_ARCHITECTURE->printable_name;
  arch = TARGET_ARCHITECTURE->printable_name;
  if (target_architecture_auto)
  if (target_architecture_auto)
    printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
    printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
  else
  else
    printf_filtered ("The target architecture is assumed to be %s\n", arch);
    printf_filtered ("The target architecture is assumed to be %s\n", arch);
}
}
 
 
/* Called if the user enters \`\`set architecture'' with or without an
/* Called if the user enters \`\`set architecture'' with or without an
   argument. */
   argument. */
static void
static void
set_architecture (char *args, int from_tty)
set_architecture (char *args, int from_tty)
{
{
  if (args == NULL)
  if (args == NULL)
    {
    {
      printf_unfiltered ("\"set architecture\" must be followed by \"auto\" or an architecture name.\n");
      printf_unfiltered ("\"set architecture\" must be followed by \"auto\" or an architecture name.\n");
    }
    }
  else if (strcmp (args, "auto") == 0)
  else if (strcmp (args, "auto") == 0)
    {
    {
      target_architecture_auto = 1;
      target_architecture_auto = 1;
    }
    }
  else if (GDB_MULTI_ARCH)
  else if (GDB_MULTI_ARCH)
    {
    {
      const struct bfd_arch_info *arch = bfd_scan_arch (args);
      const struct bfd_arch_info *arch = bfd_scan_arch (args);
      if (arch == NULL)
      if (arch == NULL)
        printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
        printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
      else
      else
        {
        {
          struct gdbarch_info info;
          struct gdbarch_info info;
          memset (&info, 0, sizeof info);
          memset (&info, 0, sizeof info);
          info.bfd_arch_info = arch;
          info.bfd_arch_info = arch;
          if (gdbarch_update (info))
          if (gdbarch_update (info))
            target_architecture_auto = 0;
            target_architecture_auto = 0;
          else
          else
            printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
            printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
        }
        }
    }
    }
  else
  else
    {
    {
      const struct bfd_arch_info *arch = bfd_scan_arch (args);
      const struct bfd_arch_info *arch = bfd_scan_arch (args);
      if (arch != NULL)
      if (arch != NULL)
        set_arch (arch, set_arch_manual);
        set_arch (arch, set_arch_manual);
      else
      else
        printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
        printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
    }
    }
}
}
 
 
/* Called if the user enters \`\`info architecture'' without an argument. */
/* Called if the user enters \`\`info architecture'' without an argument. */
static void
static void
info_architecture (char *args, int from_tty)
info_architecture (char *args, int from_tty)
{
{
  enum bfd_architecture a;
  enum bfd_architecture a;
  if (GDB_MULTI_ARCH)
  if (GDB_MULTI_ARCH)
    {
    {
      if (gdbarch_init_registrary != NULL)
      if (gdbarch_init_registrary != NULL)
        {
        {
          struct gdbarch_init_registration *rego;
          struct gdbarch_init_registration *rego;
          printf_filtered ("Available architectures are:\n");
          printf_filtered ("Available architectures are:\n");
          for (rego = gdbarch_init_registrary;
          for (rego = gdbarch_init_registrary;
               rego != NULL;
               rego != NULL;
               rego = rego->next)
               rego = rego->next)
            {
            {
              const struct bfd_arch_info *ap;
              const struct bfd_arch_info *ap;
              ap = bfd_lookup_arch (rego->bfd_architecture, 0);
              ap = bfd_lookup_arch (rego->bfd_architecture, 0);
              if (ap != NULL)
              if (ap != NULL)
                {
                {
                  do
                  do
                    {
                    {
                      printf_filtered (" %s", ap->printable_name);
                      printf_filtered (" %s", ap->printable_name);
                      ap = ap->next;
                      ap = ap->next;
                    }
                    }
                  while (ap != NULL);
                  while (ap != NULL);
                  printf_filtered ("\n");
                  printf_filtered ("\n");
                }
                }
            }
            }
        }
        }
      else
      else
        {
        {
          printf_filtered ("There are no available architectures.\n");
          printf_filtered ("There are no available architectures.\n");
        }
        }
      return;
      return;
    }
    }
  printf_filtered ("Available architectures are:\n");
  printf_filtered ("Available architectures are:\n");
  for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
  for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
    {
    {
      const struct bfd_arch_info *ap = bfd_lookup_arch (a, 0);
      const struct bfd_arch_info *ap = bfd_lookup_arch (a, 0);
      if (ap != NULL)
      if (ap != NULL)
        {
        {
          do
          do
            {
            {
              printf_filtered (" %s", ap->printable_name);
              printf_filtered (" %s", ap->printable_name);
              ap = ap->next;
              ap = ap->next;
            }
            }
          while (ap != NULL);
          while (ap != NULL);
          printf_filtered ("\n");
          printf_filtered ("\n");
        }
        }
    }
    }
}
}
 
 
/* Set the architecture from arch/machine */
/* Set the architecture from arch/machine */
void
void
set_architecture_from_arch_mach (arch, mach)
set_architecture_from_arch_mach (arch, mach)
     enum bfd_architecture arch;
     enum bfd_architecture arch;
     unsigned long mach;
     unsigned long mach;
{
{
  const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
  const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
  if (wanted != NULL)
  if (wanted != NULL)
    set_arch (wanted, set_arch_manual);
    set_arch (wanted, set_arch_manual);
  else
  else
    internal_error ("gdbarch: hardwired architecture/machine not reconized");
    internal_error ("gdbarch: hardwired architecture/machine not reconized");
}
}
 
 
/* Set the architecture from a BFD */
/* Set the architecture from a BFD */
static void
static void
set_architecture_from_file (bfd *abfd)
set_architecture_from_file (bfd *abfd)
{
{
  const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
  const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
  if (target_architecture_auto)
  if (target_architecture_auto)
    {
    {
      set_arch (wanted, set_arch_auto);
      set_arch (wanted, set_arch_auto);
    }
    }
  else if (wanted != target_architecture)
  else if (wanted != target_architecture)
    {
    {
      warning ("%s architecture file may be incompatible with %s target.",
      warning ("%s architecture file may be incompatible with %s target.",
               wanted->printable_name,
               wanted->printable_name,
               target_architecture->printable_name);
               target_architecture->printable_name);
    }
    }
}
}
 
 
 
 
/* Misc helper functions for targets. */
/* Misc helper functions for targets. */
 
 
int
int
frame_num_args_unknown (fi)
frame_num_args_unknown (fi)
     struct frame_info *fi;
     struct frame_info *fi;
{
{
  return -1;
  return -1;
}
}
 
 
 
 
int
int
generic_register_convertible_not (num)
generic_register_convertible_not (num)
     int num;
     int num;
{
{
  return 0;
  return 0;
}
}
 
 
/* Disassembler */
/* Disassembler */
 
 
/* Pointer to the target-dependent disassembly function.  */
/* Pointer to the target-dependent disassembly function.  */
int (*tm_print_insn) (bfd_vma, disassemble_info *);
int (*tm_print_insn) (bfd_vma, disassemble_info *);
disassemble_info tm_print_insn_info;
disassemble_info tm_print_insn_info;
 
 
 
 
 
 
/* Set the dynamic target-system-dependant parameters (architecture,
/* Set the dynamic target-system-dependant parameters (architecture,
   byte-order) using information found in the BFD */
   byte-order) using information found in the BFD */
 
 
void
void
set_gdbarch_from_file (abfd)
set_gdbarch_from_file (abfd)
     bfd *abfd;
     bfd *abfd;
{
{
  if (GDB_MULTI_ARCH)
  if (GDB_MULTI_ARCH)
    {
    {
      struct gdbarch_info info;
      struct gdbarch_info info;
      memset (&info, 0, sizeof info);
      memset (&info, 0, sizeof info);
      info.abfd = abfd;
      info.abfd = abfd;
      gdbarch_update (info);
      gdbarch_update (info);
      return;
      return;
    }
    }
  set_architecture_from_file (abfd);
  set_architecture_from_file (abfd);
  set_endian_from_file (abfd);
  set_endian_from_file (abfd);
}
}
 
 
 
 
#if defined (CALL_DUMMY)
#if defined (CALL_DUMMY)
/* FIXME - this should go away */
/* FIXME - this should go away */
LONGEST call_dummy_words[] = CALL_DUMMY;
LONGEST call_dummy_words[] = CALL_DUMMY;
int sizeof_call_dummy_words = sizeof (call_dummy_words);
int sizeof_call_dummy_words = sizeof (call_dummy_words);
#endif
#endif
 
 
 
 
/* Initialize the current architecture.  */
/* Initialize the current architecture.  */
void
void
initialize_current_architecture ()
initialize_current_architecture ()
{
{
  if (GDB_MULTI_ARCH)
  if (GDB_MULTI_ARCH)
    {
    {
      struct gdbarch_init_registration *rego;
      struct gdbarch_init_registration *rego;
      const struct bfd_arch_info *chosen = NULL;
      const struct bfd_arch_info *chosen = NULL;
      for (rego = gdbarch_init_registrary; rego != NULL; rego = rego->next)
      for (rego = gdbarch_init_registrary; rego != NULL; rego = rego->next)
        {
        {
          const struct bfd_arch_info *ap
          const struct bfd_arch_info *ap
            = bfd_lookup_arch (rego->bfd_architecture, 0);
            = bfd_lookup_arch (rego->bfd_architecture, 0);
 
 
          /* Choose the first architecture alphabetically.  */
          /* Choose the first architecture alphabetically.  */
          if (chosen == NULL
          if (chosen == NULL
              || strcmp (ap->printable_name, chosen->printable_name) < 0)
              || strcmp (ap->printable_name, chosen->printable_name) < 0)
            chosen = ap;
            chosen = ap;
        }
        }
 
 
      if (chosen != NULL)
      if (chosen != NULL)
        {
        {
          struct gdbarch_info info;
          struct gdbarch_info info;
          memset (&info, 0, sizeof info);
          memset (&info, 0, sizeof info);
          info.bfd_arch_info = chosen;
          info.bfd_arch_info = chosen;
          gdbarch_update (info);
          gdbarch_update (info);
        }
        }
    }
    }
}
}
 
 
extern void _initialize_gdbarch (void);
extern void _initialize_gdbarch (void);
void
void
_initialize_gdbarch ()
_initialize_gdbarch ()
{
{
  struct cmd_list_element *c;
  struct cmd_list_element *c;
 
 
  add_prefix_cmd ("endian", class_support, set_endian,
  add_prefix_cmd ("endian", class_support, set_endian,
                  "Set endianness of target.",
                  "Set endianness of target.",
                  &endianlist, "set endian ", 0, &setlist);
                  &endianlist, "set endian ", 0, &setlist);
  add_cmd ("big", class_support, set_endian_big,
  add_cmd ("big", class_support, set_endian_big,
           "Set target as being big endian.", &endianlist);
           "Set target as being big endian.", &endianlist);
  add_cmd ("little", class_support, set_endian_little,
  add_cmd ("little", class_support, set_endian_little,
           "Set target as being little endian.", &endianlist);
           "Set target as being little endian.", &endianlist);
  add_cmd ("auto", class_support, set_endian_auto,
  add_cmd ("auto", class_support, set_endian_auto,
           "Select target endianness automatically.", &endianlist);
           "Select target endianness automatically.", &endianlist);
  add_cmd ("endian", class_support, show_endian,
  add_cmd ("endian", class_support, show_endian,
           "Show endianness of target.", &showlist);
           "Show endianness of target.", &showlist);
 
 
  add_cmd ("architecture", class_support, set_architecture,
  add_cmd ("architecture", class_support, set_architecture,
           "Set architecture of target.", &setlist);
           "Set architecture of target.", &setlist);
  add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
  add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
  add_cmd ("architecture", class_support, show_architecture,
  add_cmd ("architecture", class_support, show_architecture,
           "Show architecture of target.", &showlist);
           "Show architecture of target.", &showlist);
  add_cmd ("architecture", class_support, info_architecture,
  add_cmd ("architecture", class_support, info_architecture,
           "List supported target architectures", &infolist);
           "List supported target architectures", &infolist);
 
 
  INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
  INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
  tm_print_insn_info.flavour = bfd_target_unknown_flavour;
  tm_print_insn_info.flavour = bfd_target_unknown_flavour;
  tm_print_insn_info.read_memory_func = dis_asm_read_memory;
  tm_print_insn_info.read_memory_func = dis_asm_read_memory;
  tm_print_insn_info.memory_error_func = dis_asm_memory_error;
  tm_print_insn_info.memory_error_func = dis_asm_memory_error;
  tm_print_insn_info.print_address_func = dis_asm_print_address;
  tm_print_insn_info.print_address_func = dis_asm_print_address;
 
 
  add_show_from_set (add_set_cmd ("arch",
  add_show_from_set (add_set_cmd ("arch",
                                  class_maintenance,
                                  class_maintenance,
                                  var_zinteger,
                                  var_zinteger,
                                  (char *)&gdbarch_debug,
                                  (char *)&gdbarch_debug,
                                  "Set architecture debugging.\n\\
                                  "Set architecture debugging.\n\\
When non-zero, architecture debugging is enabled.", &setdebuglist),
When non-zero, architecture debugging is enabled.", &setdebuglist),
                     &showdebuglist);
                     &showdebuglist);
  c = add_set_cmd ("archdebug",
  c = add_set_cmd ("archdebug",
                   class_maintenance,
                   class_maintenance,
                   var_zinteger,
                   var_zinteger,
                   (char *)&gdbarch_debug,
                   (char *)&gdbarch_debug,
                   "Set architecture debugging.\n\\
                   "Set architecture debugging.\n\\
When non-zero, architecture debugging is enabled.", &setlist);
When non-zero, architecture debugging is enabled.", &setlist);
 
 
  deprecate_cmd (c, "set debug arch");
  deprecate_cmd (c, "set debug arch");
  deprecate_cmd (add_show_from_set (c, &showlist), "show debug arch");
  deprecate_cmd (add_show_from_set (c, &showlist), "show debug arch");
}
}
EOF
EOF
 
 
# close things off
# close things off
exec 1>&2
exec 1>&2
#../move-if-change new-gdbarch.c gdbarch.c
#../move-if-change new-gdbarch.c gdbarch.c
compare_new gdbarch.c
compare_new gdbarch.c
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.