X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbarch.sh;h=eb015b38d74ac91ba3a917a2e71e4761c0482017;hb=039cf96dc4850dfd1de813faa9200bdc4fadb021;hp=aee39b45823c157f975e9e5976fcf148f3086580;hpb=b8de82830d3ac0a9ecf9575722b517e1070a092d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index aee39b4582..eb015b38d7 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -94,9 +94,6 @@ EOF M ) staticdefault="0" ;; * ) test "${staticdefault}" || staticdefault=0 ;; esac - # NOT YET: Breaks BELIEVE_PCC_PROMOTION and confuses non- - # multi-arch defaults. - # test "${predefault}" || predefault=0 # come up with a format, use a few guesses for variables case ":${class}:${fmt}:${print}:" in @@ -119,13 +116,16 @@ EOF F | V | M ) case "${invalid_p}" in "" ) - if test -n "${predefault}" -a "${predefault}" != "0" + if test -n "${predefault}" then #invalid_p="gdbarch->${function} == ${predefault}" predicate="gdbarch->${function} != ${predefault}" - else - # filled in later - predicate="" + elif class_is_variable_p + then + predicate="gdbarch->${function} != 0" + elif class_is_function_p + then + predicate="gdbarch->${function} != NULL" fi ;; * ) @@ -323,8 +323,9 @@ do # You cannot specify both a zero INVALID_P and a POSTDEFAULT. - # Variable declarations can refer to ``gdbarch'' which will - # contain the current architecture. Care should be taken. + # Variable declarations can refer to ``current_gdbarch'' which + # will contain the current architecture. Care should be + # taken. invalid_p ) : ;; @@ -435,8 +436,8 @@ F:2:TARGET_READ_SP:CORE_ADDR:read_sp:void # serious shakedown. f:2:TARGET_VIRTUAL_FRAME_POINTER:void:virtual_frame_pointer:CORE_ADDR pc, int *frame_regnum, LONGEST *frame_offset:pc, frame_regnum, frame_offset::0:legacy_virtual_frame_pointer::0 # -M:::void:pseudo_register_read:struct regcache *regcache, int cookednum, void *buf:regcache, cookednum, buf: -M:::void:pseudo_register_write:struct regcache *regcache, int cookednum, const void *buf:regcache, cookednum, buf: +M:::void:pseudo_register_read:struct regcache *regcache, int cookednum, void *buf:regcache, cookednum, buf +M:::void:pseudo_register_write:struct regcache *regcache, int cookednum, const void *buf:regcache, cookednum, buf # v:2:NUM_REGS:int:num_regs::::0:-1 # This macro gives the number of pseudo-registers that live in the @@ -453,7 +454,9 @@ v:2:SP_REGNUM:int:sp_regnum::::-1:-1::0 v:2:PC_REGNUM:int:pc_regnum::::-1:-1::0 v:2:PS_REGNUM:int:ps_regnum::::-1:-1::0 v:2:FP0_REGNUM:int:fp0_regnum::::0:-1::0 -v:2:NPC_REGNUM:int:npc_regnum::::0:-1::0 +# Replace DEPRECATED_NPC_REGNUM with an implementation of WRITE_PC +# that updates PC, NPC and even NNPC. +v:2:DEPRECATED_NPC_REGNUM:int:deprecated_npc_regnum::::0:-1::0 # Convert stab register number (from \`r\' declaration) to a gdb REGNUM. f:2:STAB_REG_TO_REGNUM:int:stab_reg_to_regnum:int stab_regnr:stab_regnr:::no_op_reg_to_regnum::0 # Provide a default mapping from a ecoff register number to a gdb REGNUM. @@ -461,16 +464,14 @@ f:2:ECOFF_REG_TO_REGNUM:int:ecoff_reg_to_regnum:int ecoff_regnr:ecoff_regnr:::no # Provide a default mapping from a DWARF register number to a gdb REGNUM. f:2:DWARF_REG_TO_REGNUM:int:dwarf_reg_to_regnum:int dwarf_regnr:dwarf_regnr:::no_op_reg_to_regnum::0 # Convert from an sdb register number to an internal gdb register number. -# This should be defined in tm.h, if REGISTER_NAMES is not set up -# to map one to one onto the sdb register numbers. f:2:SDB_REG_TO_REGNUM:int:sdb_reg_to_regnum:int sdb_regnr:sdb_regnr:::no_op_reg_to_regnum::0 f:2:DWARF2_REG_TO_REGNUM:int:dwarf2_reg_to_regnum:int dwarf2_regnr:dwarf2_regnr:::no_op_reg_to_regnum::0 -f:2:REGISTER_NAME:const char *:register_name:int regnr:regnr:::legacy_register_name::0 +f::REGISTER_NAME:const char *:register_name:int regnr:regnr -# REGISTER_TYPE is a direct replacement for REGISTER_VIRTUAL_TYPE. -M:2:REGISTER_TYPE:struct type *:register_type:int reg_nr:reg_nr::0: -# REGISTER_TYPE is a direct replacement for REGISTER_VIRTUAL_TYPE. -F:2:REGISTER_VIRTUAL_TYPE:struct type *:deprecated_register_virtual_type:int reg_nr:reg_nr::0:0 +# REGISTER_TYPE is a direct replacement for DEPRECATED_REGISTER_VIRTUAL_TYPE. +M:2:REGISTER_TYPE:struct type *:register_type:int reg_nr:reg_nr +# REGISTER_TYPE is a direct replacement for DEPRECATED_REGISTER_VIRTUAL_TYPE. +F:2:DEPRECATED_REGISTER_VIRTUAL_TYPE:struct type *:deprecated_register_virtual_type:int reg_nr:reg_nr # DEPRECATED_REGISTER_BYTES can be deleted. The value is computed # from REGISTER_TYPE. v::DEPRECATED_REGISTER_BYTES:int:deprecated_register_bytes @@ -481,17 +482,17 @@ v::DEPRECATED_REGISTER_BYTES:int:deprecated_register_bytes # consequence, even when the predicate is false, the corresponding # function works. This simplifies the migration process - old code, # calling DEPRECATED_REGISTER_BYTE, doesn't need to be modified. -F::REGISTER_BYTE:int:deprecated_register_byte:int reg_nr:reg_nr::generic_register_byte:generic_register_byte +F::DEPRECATED_REGISTER_BYTE:int:deprecated_register_byte:int reg_nr:reg_nr::generic_register_byte:generic_register_byte # If all registers have identical raw and virtual sizes and those # sizes agree with the value computed from REGISTER_TYPE, # DEPRECATED_REGISTER_RAW_SIZE can be deleted. See: maint print # registers. -f:2:REGISTER_RAW_SIZE:int:deprecated_register_raw_size:int reg_nr:reg_nr::generic_register_size:generic_register_size::0 +F:2:DEPRECATED_REGISTER_RAW_SIZE:int:deprecated_register_raw_size:int reg_nr:reg_nr::generic_register_size:generic_register_size # If all registers have identical raw and virtual sizes and those # sizes agree with the value computed from REGISTER_TYPE, # DEPRECATED_REGISTER_VIRTUAL_SIZE can be deleted. See: maint print # registers. -f:2:REGISTER_VIRTUAL_SIZE:int:deprecated_register_virtual_size:int reg_nr:reg_nr::generic_register_size:generic_register_size::0 +F:2:DEPRECATED_REGISTER_VIRTUAL_SIZE:int:deprecated_register_virtual_size:int reg_nr:reg_nr::generic_register_size:generic_register_size # DEPRECATED_MAX_REGISTER_RAW_SIZE can be deleted. It has been # replaced by the constant MAX_REGISTER_SIZE. V:2:DEPRECATED_MAX_REGISTER_RAW_SIZE:int:deprecated_max_register_raw_size @@ -500,10 +501,10 @@ V:2:DEPRECATED_MAX_REGISTER_RAW_SIZE:int:deprecated_max_register_raw_size V:2:DEPRECATED_MAX_REGISTER_VIRTUAL_SIZE:int:deprecated_max_register_virtual_size # See gdbint.texinfo, and PUSH_DUMMY_CALL. -M::UNWIND_DUMMY_ID:struct frame_id:unwind_dummy_id:struct frame_info *info:info::0:0 +M::UNWIND_DUMMY_ID:struct frame_id:unwind_dummy_id:struct frame_info *info:info # Implement UNWIND_DUMMY_ID and PUSH_DUMMY_CALL, then delete # SAVE_DUMMY_FRAME_TOS. -F:2:SAVE_DUMMY_FRAME_TOS:void:save_dummy_frame_tos:CORE_ADDR sp:sp::0:0 +F:2:DEPRECATED_SAVE_DUMMY_FRAME_TOS:void:deprecated_save_dummy_frame_tos:CORE_ADDR sp:sp # Implement UNWIND_DUMMY_ID and PUSH_DUMMY_CALL, then delete # DEPRECATED_FP_REGNUM. v:2:DEPRECATED_FP_REGNUM:int:deprecated_fp_regnum::::-1:-1::0 @@ -520,13 +521,13 @@ F:2:DEPRECATED_PUSH_ARGUMENTS:CORE_ADDR:deprecated_push_arguments:int nargs, str v::DEPRECATED_USE_GENERIC_DUMMY_FRAMES:int:deprecated_use_generic_dummy_frames:::::1::0 # Implement PUSH_RETURN_ADDRESS, and then merge in # DEPRECATED_PUSH_RETURN_ADDRESS. -F:2:DEPRECATED_PUSH_RETURN_ADDRESS:CORE_ADDR:deprecated_push_return_address:CORE_ADDR pc, CORE_ADDR sp:pc, sp:::0 +F:2:DEPRECATED_PUSH_RETURN_ADDRESS:CORE_ADDR:deprecated_push_return_address:CORE_ADDR pc, CORE_ADDR sp:pc, sp # Implement PUSH_DUMMY_CALL, then merge in DEPRECATED_DUMMY_WRITE_SP. F:2:DEPRECATED_DUMMY_WRITE_SP:void:deprecated_dummy_write_sp:CORE_ADDR val:val # DEPRECATED_REGISTER_SIZE can be deleted. v::DEPRECATED_REGISTER_SIZE:int:deprecated_register_size v::CALL_DUMMY_LOCATION:int:call_dummy_location:::::AT_ENTRY_POINT::0 -f::CALL_DUMMY_ADDRESS:CORE_ADDR:call_dummy_address:void::::entry_point_address::0 +F::DEPRECATED_CALL_DUMMY_ADDRESS:CORE_ADDR:deprecated_call_dummy_address:void # DEPRECATED_CALL_DUMMY_START_OFFSET can be deleted. v::DEPRECATED_CALL_DUMMY_START_OFFSET:CORE_ADDR:deprecated_call_dummy_start_offset # DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET can be deleted. @@ -538,14 +539,14 @@ v::DEPRECATED_CALL_DUMMY_WORDS:LONGEST *:deprecated_call_dummy_words::::0:legacy # Implement PUSH_DUMMY_CALL, then delete DEPRECATED_SIZEOF_CALL_DUMMY_WORDS. v::DEPRECATED_SIZEOF_CALL_DUMMY_WORDS:int:deprecated_sizeof_call_dummy_words::::0:legacy_sizeof_call_dummy_words::0 # Implement PUSH_DUMMY_CALL, then delete DEPRECATED_CALL_DUMMY_STACK_ADJUST. -V:2:DEPRECATED_CALL_DUMMY_STACK_ADJUST:int:deprecated_call_dummy_stack_adjust::::0 +V:2:DEPRECATED_CALL_DUMMY_STACK_ADJUST:int:deprecated_call_dummy_stack_adjust # DEPRECATED_FIX_CALL_DUMMY can be deleted. For the SPARC, implement # PUSH_DUMMY_CODE and set CALL_DUMMY_LOCATION to ON_STACK. F::DEPRECATED_FIX_CALL_DUMMY:void:deprecated_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 # This is a replacement for DEPRECATED_FIX_CALL_DUMMY et.al. -M::PUSH_DUMMY_CODE:CORE_ADDR:push_dummy_code:CORE_ADDR sp, CORE_ADDR funaddr, int using_gcc, struct value **args, int nargs, struct type *value_type, CORE_ADDR *real_pc, CORE_ADDR *bp_addr:sp, funaddr, using_gcc, args, nargs, value_type, real_pc, bp_addr: +M::PUSH_DUMMY_CODE:CORE_ADDR:push_dummy_code:CORE_ADDR sp, CORE_ADDR funaddr, int using_gcc, struct value **args, int nargs, struct type *value_type, CORE_ADDR *real_pc, CORE_ADDR *bp_addr:sp, funaddr, using_gcc, args, nargs, value_type, real_pc, bp_addr # Implement PUSH_DUMMY_CALL, then delete DEPRECATED_PUSH_DUMMY_FRAME. -F:2:DEPRECATED_PUSH_DUMMY_FRAME:void:deprecated_push_dummy_frame:void:-:::0 +F:2:DEPRECATED_PUSH_DUMMY_FRAME:void:deprecated_push_dummy_frame:void:- # Implement PUSH_DUMMY_CALL, then delete # DEPRECATED_EXTRA_STACK_ALIGNMENT_NEEDED. v:2:DEPRECATED_EXTRA_STACK_ALIGNMENT_NEEDED:int:deprecated_extra_stack_alignment_needed::::0:0::0::: @@ -557,11 +558,11 @@ M:2:PRINT_VECTOR_INFO:void:print_vector_info:struct ui_file *file, struct frame_ # MAP a GDB RAW register number onto a simulator register number. See # also include/...-sim.h. f:2:REGISTER_SIM_REGNO:int:register_sim_regno:int reg_nr:reg_nr:::legacy_register_sim_regno::0 -F:2:REGISTER_BYTES_OK:int:register_bytes_ok:long nr_bytes:nr_bytes::0:0 +F:2:REGISTER_BYTES_OK:int:register_bytes_ok:long nr_bytes:nr_bytes f:2:CANNOT_FETCH_REGISTER:int:cannot_fetch_register:int regnum:regnum:::cannot_register_not::0 f:2:CANNOT_STORE_REGISTER:int:cannot_store_register:int regnum:regnum:::cannot_register_not::0 # setjmp/longjmp support. -F:2:GET_LONGJMP_TARGET:int:get_longjmp_target:CORE_ADDR *pc:pc::0:0 +F:2:GET_LONGJMP_TARGET:int:get_longjmp_target:CORE_ADDR *pc:pc # NOTE: cagney/2002-11-24: This function with predicate has a valid # (callable) initial value. As a consequence, even when the predicate # is false, the corresponding function works. This simplifies the @@ -585,67 +586,93 @@ f:2:DEPRECATED_REGISTER_CONVERT_TO_VIRTUAL:void:deprecated_register_convert_to_v # For raw <-> cooked register conversions, replaced by pseudo registers. f:2:DEPRECATED_REGISTER_CONVERT_TO_RAW:void:deprecated_register_convert_to_raw:struct type *type, int regnum, const char *from, char *to:type, regnum, from, to:::0::0 # -f:1:CONVERT_REGISTER_P:int:convert_register_p:int regnum:regnum::0:legacy_convert_register_p::0 -f:1:REGISTER_TO_VALUE:void:register_to_value:int regnum, struct type *type, char *from, char *to:regnum, type, from, to::0:legacy_register_to_value::0 -f:1:VALUE_TO_REGISTER:void:value_to_register:struct type *type, int regnum, char *from, char *to:type, regnum, from, to::0:legacy_value_to_register::0 +f:1:CONVERT_REGISTER_P:int:convert_register_p:int regnum, struct type *type:regnum, type::0:legacy_convert_register_p::0 +f:1:REGISTER_TO_VALUE:void:register_to_value:struct frame_info *frame, int regnum, struct type *type, void *buf:frame, regnum, type, buf::0:legacy_register_to_value::0 +f:1:VALUE_TO_REGISTER:void:value_to_register:struct frame_info *frame, int regnum, struct type *type, const void *buf:frame, regnum, type, buf::0:legacy_value_to_register::0 # f:2:POINTER_TO_ADDRESS:CORE_ADDR:pointer_to_address:struct type *type, const void *buf:type, buf:::unsigned_pointer_to_address::0 f:2:ADDRESS_TO_POINTER:void:address_to_pointer:struct type *type, void *buf, CORE_ADDR addr:type, buf, addr:::unsigned_address_to_pointer::0 F:2:INTEGER_TO_ADDRESS:CORE_ADDR:integer_to_address:struct type *type, void *buf:type, buf # -f:2:RETURN_VALUE_ON_STACK:int:return_value_on_stack:struct type *type:type:::generic_return_value_on_stack_not::0 -F:2:DEPRECATED_POP_FRAME:void:deprecated_pop_frame:void:-:::0 +F:2:DEPRECATED_POP_FRAME:void:deprecated_pop_frame:void:- # NOTE: cagney/2003-03-24: Replaced by PUSH_ARGUMENTS. -F:2:DEPRECATED_STORE_STRUCT_RETURN:void:deprecated_store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp:::0 -# +F:2:DEPRECATED_STORE_STRUCT_RETURN:void:deprecated_store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp + +# It has been suggested that this, well actually its predecessor, +# should take the type/value of the function to be called and not the +# return type. This is left as an exercise for the reader. + +M:::enum return_value_convention:return_value:struct type *valtype, struct regcache *regcache, void *readbuf, const void *writebuf:valtype, regcache, readbuf, writebuf + +# The deprecated methods RETURN_VALUE_ON_STACK, EXTRACT_RETURN_VALUE, +# STORE_RETURN_VALUE and USE_STRUCT_CONVENTION have all been folded +# into RETURN_VALUE. For the moment do not try to fold in +# EXTRACT_STRUCT_VALUE_ADDRESS as, dependant on the ABI, the debug +# info, and the level of effort, it may well be possible to find the +# address of a structure being return on the stack. Someone else can +# make that change. + +f:2:RETURN_VALUE_ON_STACK:int:return_value_on_stack:struct type *type:type:::generic_return_value_on_stack_not::0 f:2:EXTRACT_RETURN_VALUE:void:extract_return_value:struct type *type, struct regcache *regcache, void *valbuf:type, regcache, valbuf:::legacy_extract_return_value::0 f:2:STORE_RETURN_VALUE:void:store_return_value:struct type *type, struct regcache *regcache, const void *valbuf:type, regcache, valbuf:::legacy_store_return_value::0 f:2:DEPRECATED_EXTRACT_RETURN_VALUE:void:deprecated_extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf f:2:DEPRECATED_STORE_RETURN_VALUE:void:deprecated_store_return_value:struct type *type, char *valbuf:type, valbuf -# -F:2:EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:extract_struct_value_address:struct regcache *regcache:regcache:::0 -F:2:DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:deprecated_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:::generic_use_struct_convention::0 + +F:2:EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:extract_struct_value_address:struct regcache *regcache:regcache +F:2:DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:deprecated_extract_struct_value_address:char *regbuf:regbuf # -F:2:DEPRECATED_FRAME_INIT_SAVED_REGS:void:deprecated_frame_init_saved_regs:struct frame_info *frame:frame:::0 -F:2:DEPRECATED_INIT_EXTRA_FRAME_INFO:void:deprecated_init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame:::0 +F:2:DEPRECATED_FRAME_INIT_SAVED_REGS:void:deprecated_frame_init_saved_regs:struct frame_info *frame:frame +F:2:DEPRECATED_INIT_EXTRA_FRAME_INFO:void:deprecated_init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame # f:2:SKIP_PROLOGUE:CORE_ADDR:skip_prologue:CORE_ADDR ip:ip::0:0 f:2:PROLOGUE_FRAMELESS_P:int:prologue_frameless_p:CORE_ADDR ip:ip::0:generic_prologue_frameless_p::0 f:2:INNER_THAN:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs::0:0 f::BREAKPOINT_FROM_PC:const unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr:::0: +M:2:ADJUST_BREAKPOINT_ADDRESS:CORE_ADDR:adjust_breakpoint_address:CORE_ADDR bpaddr:bpaddr f:2:MEMORY_INSERT_BREAKPOINT:int:memory_insert_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_insert_breakpoint::0 f:2:MEMORY_REMOVE_BREAKPOINT:int:memory_remove_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_remove_breakpoint::0 v:2:DECR_PC_AFTER_BREAK:CORE_ADDR:decr_pc_after_break::::0:-1 -f:2:PREPARE_TO_PROCEED:int:prepare_to_proceed:int select_it:select_it::0:default_prepare_to_proceed::0 v:2:FUNCTION_START_OFFSET:CORE_ADDR:function_start_offset::::0:-1 # m::REMOTE_TRANSLATE_XFER_ADDRESS:void:remote_translate_xfer_address:struct regcache *regcache, CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:regcache, gdb_addr, gdb_len, rem_addr, rem_len:::generic_remote_translate_xfer_address::0 # v:2:FRAME_ARGS_SKIP:CORE_ADDR:frame_args_skip::::0:-1 f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi:::generic_frameless_function_invocation_not::0 -F:2:DEPRECATED_FRAME_CHAIN:CORE_ADDR:deprecated_frame_chain:struct frame_info *frame:frame::0:0 -F:2:DEPRECATED_FRAME_CHAIN_VALID:int:deprecated_frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe::0:0 +F:2:DEPRECATED_FRAME_CHAIN:CORE_ADDR:deprecated_frame_chain:struct frame_info *frame:frame +F:2:DEPRECATED_FRAME_CHAIN_VALID:int:deprecated_frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe # DEPRECATED_FRAME_SAVED_PC has been replaced by UNWIND_PC. Please # note, per UNWIND_PC's doco, that while the two have similar # interfaces they have very different underlying implementations. -F:2:DEPRECATED_FRAME_SAVED_PC:CORE_ADDR:deprecated_frame_saved_pc:struct frame_info *fi:fi::0:0 -M::UNWIND_PC:CORE_ADDR:unwind_pc:struct frame_info *next_frame:next_frame: -M::UNWIND_SP:CORE_ADDR:unwind_sp:struct frame_info *next_frame:next_frame: -f:2:FRAME_ARGS_ADDRESS:CORE_ADDR:frame_args_address:struct frame_info *fi:fi::0:get_frame_base::0 -f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi::0:get_frame_base::0 +F:2:DEPRECATED_FRAME_SAVED_PC:CORE_ADDR:deprecated_frame_saved_pc:struct frame_info *fi:fi +M::UNWIND_PC:CORE_ADDR:unwind_pc:struct frame_info *next_frame:next_frame +M::UNWIND_SP:CORE_ADDR:unwind_sp:struct frame_info *next_frame:next_frame +# DEPRECATED_FRAME_ARGS_ADDRESS as been replaced by the per-frame +# frame-base. Enable frame-base before frame-unwind. +F::DEPRECATED_FRAME_ARGS_ADDRESS:CORE_ADDR:deprecated_frame_args_address:struct frame_info *fi:fi::get_frame_base:get_frame_base +# DEPRECATED_FRAME_LOCALS_ADDRESS as been replaced by the per-frame +# frame-base. Enable frame-base before frame-unwind. +F::DEPRECATED_FRAME_LOCALS_ADDRESS:CORE_ADDR:deprecated_frame_locals_address:struct frame_info *fi:fi::get_frame_base:get_frame_base F::DEPRECATED_SAVED_PC_AFTER_CALL:CORE_ADDR:deprecated_saved_pc_after_call:struct frame_info *frame:frame F:2:FRAME_NUM_ARGS:int:frame_num_args:struct frame_info *frame:frame # -F:2:STACK_ALIGN:CORE_ADDR:stack_align:CORE_ADDR sp:sp::0:0 +# DEPRECATED_STACK_ALIGN has been replaced by an initial aligning call +# to frame_align and the requirement that methods such as +# push_dummy_call and frame_red_zone_size maintain correct stack/frame +# alignment. +F:2:DEPRECATED_STACK_ALIGN:CORE_ADDR:deprecated_stack_align:CORE_ADDR sp:sp M:::CORE_ADDR:frame_align:CORE_ADDR address:address -F:2:REG_STRUCT_HAS_ADDR:int:reg_struct_has_addr:int gcc_p, struct type *type:gcc_p, type::0:0 +# DEPRECATED_REG_STRUCT_HAS_ADDR has been replaced by +# stabs_argument_has_addr. +F:2:DEPRECATED_REG_STRUCT_HAS_ADDR:int:deprecated_reg_struct_has_addr:int gcc_p, struct type *type:gcc_p, type +m:::int:stabs_argument_has_addr:struct type *type:type:::default_stabs_argument_has_addr::0 +v::FRAME_RED_ZONE_SIZE:int:frame_red_zone_size v:2:PARM_BOUNDARY:int:parm_boundary # -v:2:TARGET_FLOAT_FORMAT:const struct floatformat *:float_format::::::default_float_format (gdbarch)::%s:(TARGET_FLOAT_FORMAT)->name -v:2:TARGET_DOUBLE_FORMAT:const struct floatformat *:double_format::::::default_double_format (gdbarch)::%s:(TARGET_DOUBLE_FORMAT)->name -v:2:TARGET_LONG_DOUBLE_FORMAT:const struct floatformat *:long_double_format::::::default_double_format (gdbarch)::%s:(TARGET_LONG_DOUBLE_FORMAT)->name -f:2:CONVERT_FROM_FUNC_PTR_ADDR:CORE_ADDR:convert_from_func_ptr_addr:CORE_ADDR addr:addr:::core_addr_identity::0 +v:2:TARGET_FLOAT_FORMAT:const struct floatformat *:float_format::::::default_float_format (current_gdbarch)::%s:(TARGET_FLOAT_FORMAT)->name +v:2:TARGET_DOUBLE_FORMAT:const struct floatformat *:double_format::::::default_double_format (current_gdbarch)::%s:(TARGET_DOUBLE_FORMAT)->name +v:2:TARGET_LONG_DOUBLE_FORMAT:const struct floatformat *:long_double_format::::::default_double_format (current_gdbarch)::%s:(TARGET_LONG_DOUBLE_FORMAT)->name +m:::CORE_ADDR:convert_from_func_ptr_addr:CORE_ADDR addr, struct target_ops *targ:addr, targ:::convert_from_func_ptr_addr_identity::0 # On some machines there are bits in addresses which are not really # part of the address, but are used by the kernel, the hardware, etc. # for special purposes. ADDR_BITS_REMOVE takes out any such bits so @@ -656,7 +683,7 @@ f:2:CONVERT_FROM_FUNC_PTR_ADDR:CORE_ADDR:convert_from_func_ptr_addr:CORE_ADDR ad # sort of generic thing to handle alignment or segmentation (it's # possible it should be in TARGET_READ_PC instead). f:2:ADDR_BITS_REMOVE:CORE_ADDR:addr_bits_remove:CORE_ADDR addr:addr:::core_addr_identity::0 -# It is not at all clear why SMASH_TEXT_ADDRESS is not folded into +# It is not at all clear why SMASH_TEXT_ADDRESS is not folded into # ADDR_BITS_REMOVE. f:2:SMASH_TEXT_ADDRESS:CORE_ADDR:smash_text_address:CORE_ADDR addr:addr:::core_addr_identity::0 # FIXME/cagney/2001-01-18: This should be split in two. A target method that indicates if @@ -667,11 +694,17 @@ f:2:SMASH_TEXT_ADDRESS:CORE_ADDR:smash_text_address:CORE_ADDR addr:addr:::core_a # # FIXME/cagney/2001-01-18: The logic is backwards. It should be asking if the target can # single step. If not, then implement single step using breakpoints. -F:2:SOFTWARE_SINGLE_STEP:void:software_single_step:enum target_signal sig, int insert_breakpoints_p:sig, insert_breakpoints_p::0:0 -f:2:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, disassemble_info *info:vma, info:::legacy_print_insn::0 +F:2:SOFTWARE_SINGLE_STEP:void:software_single_step:enum target_signal sig, int insert_breakpoints_p:sig, insert_breakpoints_p +# FIXME: cagney/2003-08-28: Need to find a better way of selecting the +# disassembler. Perhaphs objdump can handle it? +f::TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, struct disassemble_info *info:vma, info:::0: f:2:SKIP_TRAMPOLINE_CODE:CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc:::generic_skip_trampoline_code::0 +# If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER +# evaluates non-zero, this is the address where the debugger will place +# a step-resume breakpoint to get us past the dynamic linker. +m:2:SKIP_SOLIB_RESOLVER:CORE_ADDR:skip_solib_resolver:CORE_ADDR pc:pc:::generic_skip_solib_resolver::0 # For SVR4 shared libraries, each call goes through a small piece of # trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE evaluates # to nonzero if we are currently stopped in one of these. @@ -722,19 +755,22 @@ m:::int:in_function_epilogue_p:CORE_ADDR addr:addr::0:generic_in_function_epilog # ARGC is the number of elements in the vector. # ARGV is an array of strings, one per argument. m::CONSTRUCT_INFERIOR_ARGUMENTS:char *:construct_inferior_arguments:int argc, char **argv:argc, argv:::construct_inferior_arguments::0 -F:2:DWARF2_BUILD_FRAME_INFO:void:dwarf2_build_frame_info:struct objfile *objfile:objfile:::0 f:2:ELF_MAKE_MSYMBOL_SPECIAL:void:elf_make_msymbol_special:asymbol *sym, struct minimal_symbol *msym:sym, msym:::default_elf_make_msymbol_special::0 f:2:COFF_MAKE_MSYMBOL_SPECIAL:void:coff_make_msymbol_special:int val, struct minimal_symbol *msym:val, msym:::default_coff_make_msymbol_special::0 v:2:NAME_OF_MALLOC:const char *:name_of_malloc::::"malloc":"malloc"::0:%s:NAME_OF_MALLOC v:2:CANNOT_STEP_BREAKPOINT:int:cannot_step_breakpoint::::0:0::0 v:2:HAVE_NONSTEPPABLE_WATCHPOINT:int:have_nonsteppable_watchpoint::::0:0::0 F:2:ADDRESS_CLASS_TYPE_FLAGS:int:address_class_type_flags:int byte_size, int dwarf2_addr_class:byte_size, dwarf2_addr_class -M:2:ADDRESS_CLASS_TYPE_FLAGS_TO_NAME:const char *:address_class_type_flags_to_name:int type_flags:type_flags: +M:2:ADDRESS_CLASS_TYPE_FLAGS_TO_NAME:const char *:address_class_type_flags_to_name:int type_flags:type_flags M:2:ADDRESS_CLASS_NAME_TO_TYPE_FLAGS:int:address_class_name_to_type_flags:const char *name, int *type_flags_ptr:name, type_flags_ptr # Is a register in a group m:::int:register_reggroup_p:int regnum, struct reggroup *reggroup:regnum, reggroup:::default_register_reggroup_p::0 -# Fetch the pointer to the ith function argument. -F::FETCH_POINTER_ARGUMENT:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct type *type:frame, argi, type::::::::: +# Fetch the pointer to the ith function argument. +F::FETCH_POINTER_ARGUMENT:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct type *type:frame, argi, type + +# Return the appropriate register set for a core file section with +# name SECT_NAME and size SECT_SIZE. +M:::const struct regset *:regset_from_core_section:const char *sect_name, size_t sect_size:sect_name, sect_size EOF } @@ -831,13 +867,6 @@ cat < -#include "symtab.h" -#include "frame.h" -#include "inferior.h" -#include "breakpoint.h" -#include "gdb_wait.h" -#include "gdbcore.h" -#include "gdbcmd.h" -#include "target.h" -#include "gdbthread.h" -#include "annotate.h" -#include "symfile.h" /* for overlay functions */ -#include "value.h" /* For old tm.h/nm.h macros. */ -#endif #include "symcat.h" #include "floatformat.h" @@ -1312,16 +1280,11 @@ cat <obstack = obstack; alloc_gdbarch_data (current_gdbarch); @@ -1511,6 +1473,17 @@ EOF printf "\n" printf "\n" cat <obstack, size); + memset (data, 0, size); + return data; +} + + /* Free a gdbarch struct. This should never happen in normal operation --- once you've created a gdbarch, you keep it around. However, if an architecture's init function encounters an error @@ -1520,34 +1493,40 @@ cat <initialized_p); + obstack = arch->obstack; + obstack_free (obstack, 0); /* Includes the ARCH. */ + xfree (obstack); } EOF # verify a new architecture -printf "\n" -printf "\n" -printf "/* Ensure that all values in a GDBARCH are reasonable. */\n" -printf "\n" cat <byte_order == BFD_ENDIAN_UNKNOWN) + if (current_gdbarch->byte_order == BFD_ENDIAN_UNKNOWN) fprintf_unfiltered (log, "\n\tbyte-order"); - if (gdbarch->bfd_arch_info == NULL) + if (current_gdbarch->bfd_arch_info == NULL) fprintf_unfiltered (log, "\n\tbfd_arch_info"); /* Check those that need to be defined for the given multi-arch level. */ EOF @@ -1565,15 +1544,15 @@ do elif [ -n "${invalid_p}" -a -n "${postdefault}" ] then printf " if (${invalid_p})\n" - printf " gdbarch->${function} = ${postdefault};\n" + printf " current_gdbarch->${function} = ${postdefault};\n" elif [ -n "${predefault}" -a -n "${postdefault}" ] then - printf " if (gdbarch->${function} == ${predefault})\n" - printf " gdbarch->${function} = ${postdefault};\n" + printf " if (current_gdbarch->${function} == ${predefault})\n" + printf " current_gdbarch->${function} = ${postdefault};\n" elif [ -n "${postdefault}" ] then - printf " if (gdbarch->${function} == 0)\n" - printf " gdbarch->${function} = ${postdefault};\n" + printf " if (current_gdbarch->${function} == 0)\n" + printf " current_gdbarch->${function} = ${postdefault};\n" elif [ -n "${invalid_p}" ] then printf " if ((GDB_MULTI_ARCH ${gt_level})\n" @@ -1582,7 +1561,7 @@ do elif [ -n "${predefault}" ] then printf " if ((GDB_MULTI_ARCH ${gt_level})\n" - printf " && (gdbarch->${function} == ${predefault}))\n" + printf " && (current_gdbarch->${function} == ${predefault}))\n" printf " fprintf_unfiltered (log, \"\\\\n\\\\t${function}\");\n" fi fi @@ -1611,7 +1590,7 @@ cat <${function});\n" + printf " fprintf_unfiltered (file,\n" + printf " \"gdbarch_dump: ${function} = 0x%%08lx\\\\n\",\n" + printf " (long) current_gdbarch->${function});\n" continue fi # Print the macro definition. printf "#ifdef ${macro}\n" - if [ "x${returntype}" = "xvoid" ] - then - printf "#if GDB_MULTI_ARCH\n" - printf " /* Macro might contain \`[{}]' when not multi-arch */\n" - fi if class_is_function_p then printf " fprintf_unfiltered (file,\n" @@ -1667,11 +1639,6 @@ do printf " \"gdbarch_dump: ${macro} # %%s\\\\n\",\n" printf " XSTRING (${macro}));\n" fi - # Print the architecture vector value - if [ "x${returntype}" = "xvoid" ] - then - printf "#endif\n" - fi if [ "x${print_p}" = "x()" ] then printf " gdbarch_dump_${function} (current_gdbarch);\n" @@ -1686,11 +1653,10 @@ do printf " ${print});\n" elif class_is_function_p then - printf " if (GDB_MULTI_ARCH)\n" - printf " fprintf_unfiltered (file,\n" - printf " \"gdbarch_dump: ${macro} = <0x%%08lx>\\\\n\",\n" - printf " (long) current_gdbarch->${function}\n" - printf " /*${macro} ()*/);\n" + printf " fprintf_unfiltered (file,\n" + printf " \"gdbarch_dump: ${macro} = <0x%%08lx>\\\\n\",\n" + printf " (long) current_gdbarch->${function}\n" + printf " /*${macro} ()*/);\n" else printf " fprintf_unfiltered (file,\n" printf " \"gdbarch_dump: ${macro} = %s\\\\n\",\n" "${fmt}" @@ -1726,12 +1692,7 @@ do printf "gdbarch_${function}_p (struct gdbarch *gdbarch)\n" printf "{\n" printf " gdb_assert (gdbarch != NULL);\n" - if [ -n "${predicate}" ] - then - printf " return ${predicate};\n" - else - printf " return gdbarch->${function} != 0;\n" - fi + printf " return ${predicate};\n" printf "}\n" fi if class_is_function_p @@ -1746,13 +1707,11 @@ do fi printf "{\n" printf " gdb_assert (gdbarch != NULL);\n" - printf " if (gdbarch->${function} == 0)\n" - printf " internal_error (__FILE__, __LINE__,\n" - printf " \"gdbarch: gdbarch_${function} invalid\");\n" - if class_is_predicate_p && test -n "${predicate}" + printf " gdb_assert (gdbarch->${function} != NULL);\n" + if class_is_predicate_p && test -n "${predefault}" then # Allow a call to a function with a predicate. - printf " /* Ignore predicate (${predicate}). */\n" + printf " /* Do not check predicate: ${predicate}, allow call. */\n" fi printf " if (gdbarch_debug >= 2)\n" printf " fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n" @@ -1798,14 +1757,12 @@ do printf " /* Skip verify of ${function}, invalid_p == 0 */\n" elif [ -n "${invalid_p}" ] then - printf " if (${invalid_p})\n" - printf " internal_error (__FILE__, __LINE__,\n" - printf " \"gdbarch: gdbarch_${function} invalid\");\n" + printf " /* Check variable is valid. */\n" + printf " gdb_assert (!(${invalid_p}));\n" elif [ -n "${predefault}" ] then - printf " if (gdbarch->${function} == ${predefault})\n" - printf " internal_error (__FILE__, __LINE__,\n" - printf " \"gdbarch: gdbarch_${function} invalid\");\n" + printf " /* Check variable changed from pre-default. */\n" + printf " gdb_assert (gdbarch->${function} != ${predefault});\n" fi printf " if (gdbarch_debug >= 2)\n" printf " fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n" @@ -1844,7 +1801,6 @@ struct gdbarch_data unsigned index; int init_p; gdbarch_data_init_ftype *init; - gdbarch_data_free_ftype *free; }; struct gdbarch_data_registration @@ -1865,8 +1821,7 @@ struct gdbarch_data_registry gdbarch_data_registry = }; struct gdbarch_data * -register_gdbarch_data (gdbarch_data_init_ftype *init, - gdbarch_data_free_ftype *free) +register_gdbarch_data (gdbarch_data_init_ftype *init) { struct gdbarch_data_registration **curr; /* Append the new registraration. */ @@ -1879,7 +1834,6 @@ register_gdbarch_data (gdbarch_data_init_ftype *init, (*curr)->data->index = gdbarch_data_registry.nr++; (*curr)->data->init = init; (*curr)->data->init_p = 1; - (*curr)->data->free = free; return (*curr)->data; } @@ -1891,31 +1845,9 @@ alloc_gdbarch_data (struct gdbarch *gdbarch) { gdb_assert (gdbarch->data == NULL); gdbarch->nr_data = gdbarch_data_registry.nr; - gdbarch->data = xcalloc (gdbarch->nr_data, sizeof (void*)); + gdbarch->data = GDBARCH_OBSTACK_CALLOC (gdbarch, gdbarch->nr_data, void *); } -static void -free_gdbarch_data (struct gdbarch *gdbarch) -{ - struct gdbarch_data_registration *rego; - gdb_assert (gdbarch->data != NULL); - for (rego = gdbarch_data_registry.registrations; - rego != NULL; - rego = rego->next) - { - struct gdbarch_data *data = rego->data; - gdb_assert (data->index < gdbarch->nr_data); - if (data->free != NULL && gdbarch->data[data->index] != NULL) - { - data->free (gdbarch, gdbarch->data[data->index]); - gdbarch->data[data->index] = NULL; - } - } - xfree (gdbarch->data); - gdbarch->data = NULL; -} - - /* Initialize the current value of the specified per-architecture data-pointer. */ @@ -1925,11 +1857,7 @@ set_gdbarch_data (struct gdbarch *gdbarch, void *pointer) { gdb_assert (data->index < gdbarch->nr_data); - if (gdbarch->data[data->index] != NULL) - { - gdb_assert (data->free != NULL); - data->free (gdbarch, gdbarch->data[data->index]); - } + gdb_assert (gdbarch->data[data->index] == NULL); gdbarch->data[data->index] = pointer; } @@ -2004,31 +1932,21 @@ register_gdbarch_swap (void *data, } static void -clear_gdbarch_swap (struct gdbarch *gdbarch) -{ - struct gdbarch_swap *curr; - for (curr = gdbarch->swap; - curr != NULL; - curr = curr->next) - { - memset (curr->source->data, 0, curr->source->sizeof_data); - } -} - -static void -init_gdbarch_swap (struct gdbarch *gdbarch) +current_gdbarch_swap_init_hack (void) { struct gdbarch_swap_registration *rego; - struct gdbarch_swap **curr = &gdbarch->swap; + struct gdbarch_swap **curr = ¤t_gdbarch->swap; for (rego = gdbarch_swap_registry.registrations; rego != NULL; rego = rego->next) { if (rego->data != NULL) { - (*curr) = XMALLOC (struct gdbarch_swap); + (*curr) = GDBARCH_OBSTACK_ZALLOC (current_gdbarch, + struct gdbarch_swap); (*curr)->source = rego; - (*curr)->swap = xmalloc (rego->sizeof_data); + (*curr)->swap = gdbarch_obstack_zalloc (current_gdbarch, + rego->sizeof_data); (*curr)->next = NULL; curr = &(*curr)->next; } @@ -2037,24 +1955,35 @@ init_gdbarch_swap (struct gdbarch *gdbarch) } } -static void -swapout_gdbarch_swap (struct gdbarch *gdbarch) +static struct gdbarch * +current_gdbarch_swap_out_hack (void) { + struct gdbarch *old_gdbarch = current_gdbarch; struct gdbarch_swap *curr; - for (curr = gdbarch->swap; + + gdb_assert (old_gdbarch != NULL); + for (curr = old_gdbarch->swap; curr != NULL; curr = curr->next) - memcpy (curr->swap, curr->source->data, curr->source->sizeof_data); + { + memcpy (curr->swap, curr->source->data, curr->source->sizeof_data); + memset (curr->source->data, 0, curr->source->sizeof_data); + } + current_gdbarch = NULL; + return old_gdbarch; } static void -swapin_gdbarch_swap (struct gdbarch *gdbarch) +current_gdbarch_swap_in_hack (struct gdbarch *new_gdbarch) { struct gdbarch_swap *curr; - for (curr = gdbarch->swap; + + gdb_assert (current_gdbarch == NULL); + for (curr = new_gdbarch->swap; curr != NULL; curr = curr->next) memcpy (curr->source->data, curr->swap, curr->source->sizeof_data); + current_gdbarch = new_gdbarch; } @@ -2082,37 +2011,30 @@ append_name (const char ***buf, int *nr, const char *name) const char ** gdbarch_printable_names (void) { - if (GDB_MULTI_ARCH) + /* Accumulate a list of names based on the registed list of + architectures. */ + enum bfd_architecture a; + int nr_arches = 0; + const char **arches = NULL; + struct gdbarch_registration *rego; + for (rego = gdbarch_registry; + rego != NULL; + rego = rego->next) { - /* Accumulate a list of names based on the registed list of - architectures. */ - enum bfd_architecture a; - int nr_arches = 0; - const char **arches = NULL; - struct gdbarch_registration *rego; - for (rego = gdbarch_registry; - rego != NULL; - rego = rego->next) - { - const struct bfd_arch_info *ap; - ap = bfd_lookup_arch (rego->bfd_architecture, 0); - if (ap == NULL) - internal_error (__FILE__, __LINE__, - "gdbarch_architecture_names: multi-arch unknown"); - do - { - append_name (&arches, &nr_arches, ap->printable_name); - ap = ap->next; - } - while (ap != NULL); - } - append_name (&arches, &nr_arches, NULL); - return arches; + const struct bfd_arch_info *ap; + ap = bfd_lookup_arch (rego->bfd_architecture, 0); + if (ap == NULL) + internal_error (__FILE__, __LINE__, + "gdbarch_architecture_names: multi-arch unknown"); + do + { + append_name (&arches, &nr_arches, ap->printable_name); + ap = ap->next; + } + while (ap != NULL); } - else - /* Just return all the architectures that BFD knows. Assume that - the legacy architecture framework supports them. */ - return bfd_arch_list (); + append_name (&arches, &nr_arches, NULL); + return arches; } @@ -2153,12 +2075,6 @@ gdbarch_register (enum bfd_architecture bfd_architecture, (*curr)->dump_tdep = dump_tdep; (*curr)->arches = NULL; (*curr)->next = NULL; - /* When non- multi-arch, install whatever target dump routine we've - been provided - hopefully that routine has been written correctly - and works regardless of multi-arch. */ - if (!GDB_MULTI_ARCH && dump_tdep != NULL - && startup_gdbarch.dump_tdep == NULL) - startup_gdbarch.dump_tdep = dump_tdep; } void @@ -2190,50 +2106,24 @@ gdbarch_list_lookup_by_info (struct gdbarch_list *arches, } -/* Update the current architecture. Return ZERO if the update request - failed. */ +/* Find an architecture that matches the specified INFO. Create a new + architecture if needed. Return that new architecture. Assumes + that there is no current architecture. */ -int -gdbarch_update_p (struct gdbarch_info info) +static struct gdbarch * +find_arch_by_info (struct gdbarch *old_gdbarch, struct gdbarch_info info) { struct gdbarch *new_gdbarch; - struct gdbarch *old_gdbarch; struct gdbarch_registration *rego; + /* The existing architecture has been swapped out - all this code + works from a clean slate. */ + gdb_assert (current_gdbarch == NULL); + /* Fill in missing parts of the INFO struct using a number of - sources: \`\`set ...''; INFOabfd supplied; existing target. */ - - /* \`\`(gdb) set architecture ...'' */ - if (info.bfd_arch_info == NULL - && !TARGET_ARCHITECTURE_AUTO) - info.bfd_arch_info = TARGET_ARCHITECTURE; - if (info.bfd_arch_info == NULL - && info.abfd != NULL - && bfd_get_arch (info.abfd) != bfd_arch_unknown - && bfd_get_arch (info.abfd) != bfd_arch_obscure) - info.bfd_arch_info = bfd_get_arch_info (info.abfd); - if (info.bfd_arch_info == NULL) - info.bfd_arch_info = TARGET_ARCHITECTURE; - - /* \`\`(gdb) set byte-order ...'' */ - if (info.byte_order == BFD_ENDIAN_UNKNOWN - && !TARGET_BYTE_ORDER_AUTO) - info.byte_order = TARGET_BYTE_ORDER; - /* From the INFO struct. */ - if (info.byte_order == BFD_ENDIAN_UNKNOWN - && info.abfd != NULL) - info.byte_order = (bfd_big_endian (info.abfd) ? BFD_ENDIAN_BIG - : bfd_little_endian (info.abfd) ? BFD_ENDIAN_LITTLE - : BFD_ENDIAN_UNKNOWN); - /* From the current target. */ - if (info.byte_order == BFD_ENDIAN_UNKNOWN) - info.byte_order = TARGET_BYTE_ORDER; - - /* \`\`(gdb) set osabi ...'' is handled by gdbarch_lookup_osabi. */ - if (info.osabi == GDB_OSABI_UNINITIALIZED) - info.osabi = gdbarch_lookup_osabi (info.abfd); - if (info.osabi == GDB_OSABI_UNINITIALIZED) - info.osabi = current_gdbarch->osabi; + sources: "set ..."; INFOabfd supplied; and the existing + architecture. */ + gdbarch_info_fill (old_gdbarch, &info); /* Must have found some sort of architecture. */ gdb_assert (info.bfd_arch_info != NULL); @@ -2241,28 +2131,28 @@ gdbarch_update_p (struct gdbarch_info info) if (gdbarch_debug) { fprintf_unfiltered (gdb_stdlog, - "gdbarch_update: info.bfd_arch_info %s\n", + "find_arch_by_info: info.bfd_arch_info %s\n", (info.bfd_arch_info != NULL ? info.bfd_arch_info->printable_name : "(null)")); fprintf_unfiltered (gdb_stdlog, - "gdbarch_update: info.byte_order %d (%s)\n", + "find_arch_by_info: info.byte_order %d (%s)\n", info.byte_order, (info.byte_order == BFD_ENDIAN_BIG ? "big" : info.byte_order == BFD_ENDIAN_LITTLE ? "little" : "default")); fprintf_unfiltered (gdb_stdlog, - "gdbarch_update: info.osabi %d (%s)\n", + "find_arch_by_info: info.osabi %d (%s)\n", info.osabi, gdbarch_osabi_name (info.osabi)); fprintf_unfiltered (gdb_stdlog, - "gdbarch_update: info.abfd 0x%lx\n", + "find_arch_by_info: info.abfd 0x%lx\n", (long) info.abfd); fprintf_unfiltered (gdb_stdlog, - "gdbarch_update: info.tdep_info 0x%lx\n", + "find_arch_by_info: info.tdep_info 0x%lx\n", (long) info.tdep_info); } - /* Find the target that knows about this architecture. */ + /* Find the tdep code that knows about this architecture. */ for (rego = gdbarch_registry; rego != NULL; rego = rego->next) @@ -2271,86 +2161,61 @@ gdbarch_update_p (struct gdbarch_info info) if (rego == NULL) { if (gdbarch_debug) - fprintf_unfiltered (gdb_stdlog, "gdbarch_update: No matching architecture\\n"); + fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: " + "No matching architecture\n"); return 0; } - /* Swap the data belonging to the old target out setting the - installed data to zero. This stops the ->init() function trying - to refer to the previous architecture's global data structures. */ - swapout_gdbarch_swap (current_gdbarch); - clear_gdbarch_swap (current_gdbarch); - - /* Save the previously selected architecture, setting the global to - NULL. This stops ->init() trying to use the previous - architecture's configuration. The previous architecture may not - even be of the same architecture family. The most recent - architecture of the same family is found at the head of the - rego->arches list. */ - old_gdbarch = current_gdbarch; - current_gdbarch = NULL; - - /* Ask the target for a replacement architecture. */ + /* Ask the tdep code for an architecture that matches "info". */ new_gdbarch = rego->init (info, rego->arches); - /* Did the target like it? No. Reject the change and revert to the - old architecture. */ + /* Did the tdep code like it? No. Reject the change and revert to + the old architecture. */ if (new_gdbarch == NULL) { if (gdbarch_debug) - fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Target rejected architecture\\n"); - swapin_gdbarch_swap (old_gdbarch); - current_gdbarch = old_gdbarch; - return 0; + fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: " + "Target rejected architecture\n"); + return NULL; } - /* Did the architecture change? No. Oops, put the old architecture - back. */ - if (old_gdbarch == new_gdbarch) + /* Is this a pre-existing architecture (as determined by already + being initialized)? Move it to the front of the architecture + list (keeping the list sorted Most Recently Used). */ + if (new_gdbarch->initialized_p) { + struct gdbarch_list **list; + struct gdbarch_list *this; if (gdbarch_debug) - fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Architecture 0x%08lx (%s) unchanged\\n", + fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: " + "Previous architecture 0x%08lx (%s) selected\n", (long) new_gdbarch, new_gdbarch->bfd_arch_info->printable_name); - swapin_gdbarch_swap (old_gdbarch); - current_gdbarch = old_gdbarch; - return 1; + /* Find the existing arch in the list. */ + for (list = ®o->arches; + (*list) != NULL && (*list)->gdbarch != new_gdbarch; + list = &(*list)->next); + /* It had better be in the list of architectures. */ + gdb_assert ((*list) != NULL && (*list)->gdbarch == new_gdbarch); + /* Unlink THIS. */ + this = (*list); + (*list) = this->next; + /* Insert THIS at the front. */ + this->next = rego->arches; + rego->arches = this; + /* Return it. */ + return new_gdbarch; } - /* Is this a pre-existing architecture? Yes. Move it to the front - of the list of architectures (keeping the list sorted Most - Recently Used) and then copy it in. */ - { - struct gdbarch_list **list; - for (list = ®o->arches; - (*list) != NULL; - list = &(*list)->next) - { - if ((*list)->gdbarch == new_gdbarch) - { - struct gdbarch_list *this; - if (gdbarch_debug) - fprintf_unfiltered (gdb_stdlog, - "gdbarch_update: Previous architecture 0x%08lx (%s) selected\n", - (long) new_gdbarch, - new_gdbarch->bfd_arch_info->printable_name); - /* Unlink this. */ - this = (*list); - (*list) = this->next; - /* Insert in the front. */ - this->next = rego->arches; - rego->arches = this; - /* Copy the new architecture in. */ - current_gdbarch = new_gdbarch; - swapin_gdbarch_swap (new_gdbarch); - architecture_changed_event (); - return 1; - } - } - } - - /* Prepend this new architecture to the architecture list (keep the - list sorted Most Recently Used). */ + /* It's a new architecture. */ + if (gdbarch_debug) + fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: " + "New architecture 0x%08lx (%s) selected\n", + (long) new_gdbarch, + new_gdbarch->bfd_arch_info->printable_name); + + /* Insert the new architecture into the front of the architecture + list (keep the list sorted Most Recently Used). */ { struct gdbarch_list *this = XMALLOC (struct gdbarch_list); this->next = rego->arches; @@ -2358,42 +2223,59 @@ gdbarch_update_p (struct gdbarch_info info) rego->arches = this; } - /* Switch to this new architecture marking it initialized. */ - current_gdbarch = new_gdbarch; - current_gdbarch->initialized_p = 1; - if (gdbarch_debug) - { - fprintf_unfiltered (gdb_stdlog, - "gdbarch_update: New architecture 0x%08lx (%s) selected\\n", - (long) new_gdbarch, - new_gdbarch->bfd_arch_info->printable_name); - } - /* Check that the newly installed architecture is valid. Plug in any post init values. */ new_gdbarch->dump_tdep = rego->dump_tdep; verify_gdbarch (new_gdbarch); + new_gdbarch->initialized_p = 1; - /* Initialize the per-architecture memory (swap) areas. - CURRENT_GDBARCH must be update before these modules are - called. */ - init_gdbarch_swap (new_gdbarch); - - /* Initialize the per-architecture data. CURRENT_GDBARCH - must be updated before these modules are called. */ - architecture_changed_event (); + /* Initialize any per-architecture swap areas. This phase requires + a valid global CURRENT_GDBARCH. Set it momentarially, and then + swap the entire architecture out. */ + current_gdbarch = new_gdbarch; + current_gdbarch_swap_init_hack (); + current_gdbarch_swap_out_hack (); if (gdbarch_debug) - gdbarch_dump (current_gdbarch, gdb_stdlog); + gdbarch_dump (new_gdbarch, gdb_stdlog); - return 1; + return new_gdbarch; } +struct gdbarch * +gdbarch_find_by_info (struct gdbarch_info info) +{ + /* Save the previously selected architecture, setting the global to + NULL. This stops things like gdbarch->init() trying to use the + previous architecture's configuration. The previous architecture + may not even be of the same architecture family. The most recent + architecture of the same family is found at the head of the + rego->arches list. */ + struct gdbarch *old_gdbarch = current_gdbarch_swap_out_hack (); + + /* Find the specified architecture. */ + struct gdbarch *new_gdbarch = find_arch_by_info (old_gdbarch, info); + + /* Restore the existing architecture. */ + gdb_assert (current_gdbarch == NULL); + current_gdbarch_swap_in_hack (old_gdbarch); -/* Disassembler */ + return new_gdbarch; +} -/* Pointer to the target-dependent disassembly function. */ -int (*deprecated_tm_print_insn) (bfd_vma, disassemble_info *); +/* Make the specified architecture current, swapping the existing one + out. */ + +void +deprecated_current_gdbarch_select_hack (struct gdbarch *new_gdbarch) +{ + gdb_assert (new_gdbarch != NULL); + gdb_assert (current_gdbarch != NULL); + gdb_assert (new_gdbarch->initialized_p); + current_gdbarch_swap_out_hack (); + current_gdbarch_swap_in_hack (new_gdbarch); + architecture_changed_event (); +} extern void _initialize_gdbarch (void);