X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbarch.c;h=825ce1c124e297009cc6414bb721e55e9069afaa;hb=ea5bf0a1f9f5ebc127b1982c31a7abb27b36c563;hp=df7676684721f84c2b5194e43ccae220da5ac8fd;hpb=0b1b3e423ad28731135cdd275522bdf3d2d17570;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index df76766847..825ce1c124 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -144,7 +144,6 @@ struct gdbarch const struct floatformat ** long_double_format; int ptr_bit; int addr_bit; - int bfd_vma_bit; int char_signed; gdbarch_read_pc_ftype *read_pc; gdbarch_write_pc_ftype *write_pc; @@ -167,7 +166,6 @@ struct gdbarch gdbarch_unwind_dummy_id_ftype *unwind_dummy_id; int deprecated_fp_regnum; gdbarch_push_dummy_call_ftype *push_dummy_call; - int deprecated_register_size; int call_dummy_location; gdbarch_push_dummy_code_ftype *push_dummy_code; gdbarch_print_registers_info_ftype *print_registers_info; @@ -189,7 +187,6 @@ struct gdbarch gdbarch_extract_return_value_ftype *extract_return_value; gdbarch_store_return_value_ftype *store_return_value; gdbarch_deprecated_use_struct_convention_ftype *deprecated_use_struct_convention; - gdbarch_deprecated_extract_struct_value_address_ftype *deprecated_extract_struct_value_address; gdbarch_skip_prologue_ftype *skip_prologue; gdbarch_inner_than_ftype *inner_than; gdbarch_breakpoint_from_pc_ftype *breakpoint_from_pc; @@ -268,7 +265,6 @@ struct gdbarch startup_gdbarch = 0, /* long_double_format */ 8 * sizeof (void*), /* ptr_bit */ 8 * sizeof (void*), /* addr_bit */ - 8 * sizeof (void*), /* bfd_vma_bit */ 1, /* char_signed */ 0, /* read_pc */ 0, /* write_pc */ @@ -291,7 +287,6 @@ struct gdbarch startup_gdbarch = 0, /* unwind_dummy_id */ -1, /* deprecated_fp_regnum */ 0, /* push_dummy_call */ - 0, /* deprecated_register_size */ 0, /* call_dummy_location */ 0, /* push_dummy_code */ default_print_registers_info, /* print_registers_info */ @@ -313,7 +308,6 @@ struct gdbarch startup_gdbarch = 0, /* extract_return_value */ 0, /* store_return_value */ 0, /* deprecated_use_struct_convention */ - 0, /* deprecated_extract_struct_value_address */ 0, /* skip_prologue */ 0, /* inner_than */ 0, /* breakpoint_from_pc */ @@ -404,9 +398,7 @@ gdbarch_alloc (const struct gdbarch_info *info, current_gdbarch->double_bit = 8*TARGET_CHAR_BIT; current_gdbarch->long_double_bit = 8*TARGET_CHAR_BIT; current_gdbarch->ptr_bit = current_gdbarch->int_bit; - current_gdbarch->bfd_vma_bit = gdbarch_bfd_arch_info (current_gdbarch)->bits_per_address; current_gdbarch->char_signed = -1; - current_gdbarch->write_pc = generic_target_write_pc; current_gdbarch->virtual_frame_pointer = legacy_virtual_frame_pointer; current_gdbarch->num_regs = -1; current_gdbarch->sp_regnum = -1; @@ -520,11 +512,10 @@ verify_gdbarch (struct gdbarch *current_gdbarch) /* Skip verify of ptr_bit, invalid_p == 0 */ if (current_gdbarch->addr_bit == 0) current_gdbarch->addr_bit = gdbarch_ptr_bit (current_gdbarch); - /* Skip verify of bfd_vma_bit, invalid_p == 0 */ if (current_gdbarch->char_signed == -1) current_gdbarch->char_signed = 1; /* Skip verify of read_pc, has predicate */ - /* Skip verify of write_pc, invalid_p == 0 */ + /* Skip verify of write_pc, has predicate */ /* Skip verify of virtual_frame_pointer, invalid_p == 0 */ /* Skip verify of pseudo_register_read, has predicate */ /* Skip verify of pseudo_register_write, has predicate */ @@ -560,7 +551,6 @@ verify_gdbarch (struct gdbarch *current_gdbarch) /* Skip verify of integer_to_address, has predicate */ /* Skip verify of return_value, has predicate */ /* Skip verify of deprecated_use_struct_convention, invalid_p == 0 */ - /* Skip verify of deprecated_extract_struct_value_address, has predicate */ if (current_gdbarch->skip_prologue == 0) fprintf_unfiltered (log, "\n\tskip_prologue"); if (current_gdbarch->inner_than == 0) @@ -683,20 +673,12 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: adjust_breakpoint_address = <0x%lx>\n", (long) current_gdbarch->adjust_breakpoint_address); -#ifdef BELIEVE_PCC_PROMOTION - fprintf_unfiltered (file, - "gdbarch_dump: BELIEVE_PCC_PROMOTION # %s\n", - XSTRING (BELIEVE_PCC_PROMOTION)); -#endif fprintf_unfiltered (file, "gdbarch_dump: believe_pcc_promotion = %s\n", paddr_d (current_gdbarch->believe_pcc_promotion)); fprintf_unfiltered (file, "gdbarch_dump: bfd_arch_info = %s\n", gdbarch_bfd_arch_info (current_gdbarch)->printable_name); - fprintf_unfiltered (file, - "gdbarch_dump: bfd_vma_bit = %s\n", - paddr_d (current_gdbarch->bfd_vma_bit)); fprintf_unfiltered (file, "gdbarch_dump: breakpoint_from_pc = <0x%lx>\n", (long) current_gdbarch->breakpoint_from_pc); @@ -733,72 +715,18 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: decr_pc_after_break = 0x%s\n", paddr_nz (current_gdbarch->decr_pc_after_break)); -#ifdef DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS_P - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS_P()", - XSTRING (DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS_P ())); -#endif - fprintf_unfiltered (file, - "gdbarch_dump: gdbarch_deprecated_extract_struct_value_address_p() = %d\n", - gdbarch_deprecated_extract_struct_value_address_p (current_gdbarch)); -#ifdef DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(regcache)", - XSTRING (DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS (regcache))); -#endif - fprintf_unfiltered (file, - "gdbarch_dump: deprecated_extract_struct_value_address = <0x%lx>\n", - (long) current_gdbarch->deprecated_extract_struct_value_address); -#ifdef DEPRECATED_FP_REGNUM - fprintf_unfiltered (file, - "gdbarch_dump: DEPRECATED_FP_REGNUM # %s\n", - XSTRING (DEPRECATED_FP_REGNUM)); -#endif fprintf_unfiltered (file, "gdbarch_dump: deprecated_fp_regnum = %s\n", paddr_d (current_gdbarch->deprecated_fp_regnum)); -#ifdef DEPRECATED_FUNCTION_START_OFFSET - fprintf_unfiltered (file, - "gdbarch_dump: DEPRECATED_FUNCTION_START_OFFSET # %s\n", - XSTRING (DEPRECATED_FUNCTION_START_OFFSET)); -#endif fprintf_unfiltered (file, "gdbarch_dump: deprecated_function_start_offset = 0x%s\n", paddr_nz (current_gdbarch->deprecated_function_start_offset)); -#ifdef DEPRECATED_REG_STRUCT_HAS_ADDR_P - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "DEPRECATED_REG_STRUCT_HAS_ADDR_P()", - XSTRING (DEPRECATED_REG_STRUCT_HAS_ADDR_P ())); -#endif fprintf_unfiltered (file, "gdbarch_dump: gdbarch_deprecated_reg_struct_has_addr_p() = %d\n", gdbarch_deprecated_reg_struct_has_addr_p (current_gdbarch)); -#ifdef DEPRECATED_REG_STRUCT_HAS_ADDR - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "DEPRECATED_REG_STRUCT_HAS_ADDR(gcc_p, type)", - XSTRING (DEPRECATED_REG_STRUCT_HAS_ADDR (gcc_p, type))); -#endif fprintf_unfiltered (file, "gdbarch_dump: deprecated_reg_struct_has_addr = <0x%lx>\n", (long) current_gdbarch->deprecated_reg_struct_has_addr); -#ifdef DEPRECATED_REGISTER_SIZE - fprintf_unfiltered (file, - "gdbarch_dump: DEPRECATED_REGISTER_SIZE # %s\n", - XSTRING (DEPRECATED_REGISTER_SIZE)); -#endif - fprintf_unfiltered (file, - "gdbarch_dump: deprecated_register_size = %s\n", - paddr_d (current_gdbarch->deprecated_register_size)); -#ifdef DEPRECATED_USE_STRUCT_CONVENTION - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "DEPRECATED_USE_STRUCT_CONVENTION(gcc_p, value_type)", - XSTRING (DEPRECATED_USE_STRUCT_CONVENTION (gcc_p, value_type))); -#endif fprintf_unfiltered (file, "gdbarch_dump: deprecated_use_struct_convention = <0x%lx>\n", (long) current_gdbarch->deprecated_use_struct_convention); @@ -820,12 +748,6 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: elf_make_msymbol_special = <0x%lx>\n", (long) current_gdbarch->elf_make_msymbol_special); -#ifdef EXTRACT_RETURN_VALUE - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "EXTRACT_RETURN_VALUE(type, regcache, valbuf)", - XSTRING (EXTRACT_RETURN_VALUE (type, regcache, valbuf))); -#endif fprintf_unfiltered (file, "gdbarch_dump: extract_return_value = <0x%lx>\n", (long) current_gdbarch->extract_return_value); @@ -847,11 +769,6 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: float_format = %s\n", pformat (current_gdbarch->float_format)); -#ifdef FP0_REGNUM - fprintf_unfiltered (file, - "gdbarch_dump: FP0_REGNUM # %s\n", - XSTRING (FP0_REGNUM)); -#endif fprintf_unfiltered (file, "gdbarch_dump: fp0_regnum = %s\n", paddr_d (current_gdbarch->fp0_regnum)); @@ -936,11 +853,6 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: overlay_update = <0x%lx>\n", (long) current_gdbarch->overlay_update); -#ifdef PC_REGNUM - fprintf_unfiltered (file, - "gdbarch_dump: PC_REGNUM # %s\n", - XSTRING (PC_REGNUM)); -#endif fprintf_unfiltered (file, "gdbarch_dump: pc_regnum = %s\n", paddr_d (current_gdbarch->pc_regnum)); @@ -953,12 +865,6 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: print_float_info = <0x%lx>\n", (long) current_gdbarch->print_float_info); -#ifdef TARGET_PRINT_INSN - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "TARGET_PRINT_INSN(vma, info)", - XSTRING (TARGET_PRINT_INSN (vma, info))); -#endif fprintf_unfiltered (file, "gdbarch_dump: print_insn = <0x%lx>\n", (long) current_gdbarch->print_insn); @@ -971,11 +877,6 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: print_vector_info = <0x%lx>\n", (long) current_gdbarch->print_vector_info); -#ifdef PS_REGNUM - fprintf_unfiltered (file, - "gdbarch_dump: PS_REGNUM # %s\n", - XSTRING (PS_REGNUM)); -#endif fprintf_unfiltered (file, "gdbarch_dump: ps_regnum = %s\n", paddr_d (current_gdbarch->ps_regnum)); @@ -1006,21 +907,9 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: push_dummy_code = <0x%lx>\n", (long) current_gdbarch->push_dummy_code); -#ifdef TARGET_READ_PC_P - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "TARGET_READ_PC_P()", - XSTRING (TARGET_READ_PC_P ())); -#endif fprintf_unfiltered (file, "gdbarch_dump: gdbarch_read_pc_p() = %d\n", gdbarch_read_pc_p (current_gdbarch)); -#ifdef TARGET_READ_PC - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "TARGET_READ_PC(ptid)", - XSTRING (TARGET_READ_PC (ptid))); -#endif fprintf_unfiltered (file, "gdbarch_dump: read_pc = <0x%lx>\n", (long) current_gdbarch->read_pc); @@ -1087,29 +976,12 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: smash_text_address = <0x%lx>\n", (long) current_gdbarch->smash_text_address); -#ifdef SOFTWARE_SINGLE_STEP_P - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "SOFTWARE_SINGLE_STEP_P()", - XSTRING (SOFTWARE_SINGLE_STEP_P ())); -#endif fprintf_unfiltered (file, "gdbarch_dump: gdbarch_software_single_step_p() = %d\n", gdbarch_software_single_step_p (current_gdbarch)); -#ifdef SOFTWARE_SINGLE_STEP - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "SOFTWARE_SINGLE_STEP(frame)", - XSTRING (SOFTWARE_SINGLE_STEP (frame))); -#endif fprintf_unfiltered (file, "gdbarch_dump: software_single_step = <0x%lx>\n", (long) current_gdbarch->software_single_step); -#ifdef SP_REGNUM - fprintf_unfiltered (file, - "gdbarch_dump: SP_REGNUM # %s\n", - XSTRING (SP_REGNUM)); -#endif fprintf_unfiltered (file, "gdbarch_dump: sp_regnum = %s\n", paddr_d (current_gdbarch->sp_regnum)); @@ -1119,12 +991,6 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: stabs_argument_has_addr = <0x%lx>\n", (long) current_gdbarch->stabs_argument_has_addr); -#ifdef STORE_RETURN_VALUE - fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "STORE_RETURN_VALUE(type, regcache, valbuf)", - XSTRING (STORE_RETURN_VALUE (type, regcache, valbuf))); -#endif fprintf_unfiltered (file, "gdbarch_dump: store_return_value = <0x%lx>\n", (long) current_gdbarch->store_return_value); @@ -1164,12 +1030,9 @@ gdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: vtable_function_descriptors = %s\n", paddr_d (current_gdbarch->vtable_function_descriptors)); -#ifdef TARGET_WRITE_PC fprintf_unfiltered (file, - "gdbarch_dump: %s # %s\n", - "TARGET_WRITE_PC(val, ptid)", - XSTRING (TARGET_WRITE_PC (val, ptid))); -#endif + "gdbarch_dump: gdbarch_write_pc_p() = %d\n", + gdbarch_write_pc_p (current_gdbarch)); fprintf_unfiltered (file, "gdbarch_dump: write_pc = <0x%lx>\n", (long) current_gdbarch->write_pc); @@ -1424,23 +1287,6 @@ set_gdbarch_addr_bit (struct gdbarch *gdbarch, gdbarch->addr_bit = addr_bit; } -int -gdbarch_bfd_vma_bit (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - /* Skip verify of bfd_vma_bit, invalid_p == 0 */ - if (gdbarch_debug >= 2) - fprintf_unfiltered (gdb_stdlog, "gdbarch_bfd_vma_bit called\n"); - return gdbarch->bfd_vma_bit; -} - -void -set_gdbarch_bfd_vma_bit (struct gdbarch *gdbarch, - int bfd_vma_bit) -{ - gdbarch->bfd_vma_bit = bfd_vma_bit; -} - int gdbarch_char_signed (struct gdbarch *gdbarch) { @@ -1467,13 +1313,13 @@ gdbarch_read_pc_p (struct gdbarch *gdbarch) } CORE_ADDR -gdbarch_read_pc (struct gdbarch *gdbarch, ptid_t ptid) +gdbarch_read_pc (struct gdbarch *gdbarch, struct regcache *regcache) { gdb_assert (gdbarch != NULL); gdb_assert (gdbarch->read_pc != NULL); if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_read_pc called\n"); - return gdbarch->read_pc (ptid); + return gdbarch->read_pc (regcache); } void @@ -1483,14 +1329,21 @@ set_gdbarch_read_pc (struct gdbarch *gdbarch, gdbarch->read_pc = read_pc; } +int +gdbarch_write_pc_p (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + return gdbarch->write_pc != NULL; +} + void -gdbarch_write_pc (struct gdbarch *gdbarch, CORE_ADDR val, ptid_t ptid) +gdbarch_write_pc (struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR val) { gdb_assert (gdbarch != NULL); gdb_assert (gdbarch->write_pc != NULL); if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_write_pc called\n"); - gdbarch->write_pc (val, ptid); + gdbarch->write_pc (regcache, val); } void @@ -1859,22 +1712,6 @@ set_gdbarch_push_dummy_call (struct gdbarch *gdbarch, gdbarch->push_dummy_call = push_dummy_call; } -int -gdbarch_deprecated_register_size (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - if (gdbarch_debug >= 2) - fprintf_unfiltered (gdb_stdlog, "gdbarch_deprecated_register_size called\n"); - return gdbarch->deprecated_register_size; -} - -void -set_gdbarch_deprecated_register_size (struct gdbarch *gdbarch, - int deprecated_register_size) -{ - gdbarch->deprecated_register_size = deprecated_register_size; -} - int gdbarch_call_dummy_location (struct gdbarch *gdbarch) { @@ -1900,13 +1737,13 @@ gdbarch_push_dummy_code_p (struct gdbarch *gdbarch) } CORE_ADDR -gdbarch_push_dummy_code (struct gdbarch *gdbarch, 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) +gdbarch_push_dummy_code (struct gdbarch *gdbarch, 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, struct regcache *regcache) { gdb_assert (gdbarch != NULL); gdb_assert (gdbarch->push_dummy_code != NULL); if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_push_dummy_code called\n"); - return gdbarch->push_dummy_code (gdbarch, sp, funaddr, using_gcc, args, nargs, value_type, real_pc, bp_addr); + return gdbarch->push_dummy_code (gdbarch, sp, funaddr, using_gcc, args, nargs, value_type, real_pc, bp_addr, regcache); } void @@ -2040,13 +1877,13 @@ gdbarch_get_longjmp_target_p (struct gdbarch *gdbarch) } int -gdbarch_get_longjmp_target (struct gdbarch *gdbarch, CORE_ADDR *pc) +gdbarch_get_longjmp_target (struct gdbarch *gdbarch, struct frame_info *frame, CORE_ADDR *pc) { gdb_assert (gdbarch != NULL); gdb_assert (gdbarch->get_longjmp_target != NULL); if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_get_longjmp_target called\n"); - return gdbarch->get_longjmp_target (pc); + return gdbarch->get_longjmp_target (frame, pc); } void @@ -2274,30 +2111,6 @@ set_gdbarch_deprecated_use_struct_convention (struct gdbarch *gdbarch, gdbarch->deprecated_use_struct_convention = deprecated_use_struct_convention; } -int -gdbarch_deprecated_extract_struct_value_address_p (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - return gdbarch->deprecated_extract_struct_value_address != NULL; -} - -CORE_ADDR -gdbarch_deprecated_extract_struct_value_address (struct gdbarch *gdbarch, struct regcache *regcache) -{ - gdb_assert (gdbarch != NULL); - gdb_assert (gdbarch->deprecated_extract_struct_value_address != NULL); - if (gdbarch_debug >= 2) - fprintf_unfiltered (gdb_stdlog, "gdbarch_deprecated_extract_struct_value_address called\n"); - return gdbarch->deprecated_extract_struct_value_address (regcache); -} - -void -set_gdbarch_deprecated_extract_struct_value_address (struct gdbarch *gdbarch, - gdbarch_deprecated_extract_struct_value_address_ftype deprecated_extract_struct_value_address) -{ - gdbarch->deprecated_extract_struct_value_address = deprecated_extract_struct_value_address; -} - CORE_ADDR gdbarch_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR ip) { @@ -2769,13 +2582,13 @@ set_gdbarch_print_insn (struct gdbarch *gdbarch, } CORE_ADDR -gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, CORE_ADDR pc) +gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, struct frame_info *frame, CORE_ADDR pc) { gdb_assert (gdbarch != NULL); gdb_assert (gdbarch->skip_trampoline_code != NULL); if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_skip_trampoline_code called\n"); - return gdbarch->skip_trampoline_code (pc); + return gdbarch->skip_trampoline_code (frame, pc); } void @@ -3281,107 +3094,6 @@ gdbarch_data (struct gdbarch *gdbarch, struct gdbarch_data *data) } - -/* Keep a registry of swapped data required by GDB modules. */ - -struct gdbarch_swap -{ - void *swap; - struct gdbarch_swap_registration *source; - struct gdbarch_swap *next; -}; - -struct gdbarch_swap_registration -{ - void *data; - unsigned long sizeof_data; - gdbarch_swap_ftype *init; - struct gdbarch_swap_registration *next; -}; - -struct gdbarch_swap_registry -{ - int nr; - struct gdbarch_swap_registration *registrations; -}; - -struct gdbarch_swap_registry gdbarch_swap_registry = -{ - 0, NULL, -}; - -void -deprecated_register_gdbarch_swap (void *data, - unsigned long sizeof_data, - gdbarch_swap_ftype *init) -{ - struct gdbarch_swap_registration **rego; - for (rego = &gdbarch_swap_registry.registrations; - (*rego) != NULL; - rego = &(*rego)->next); - (*rego) = XMALLOC (struct gdbarch_swap_registration); - (*rego)->next = NULL; - (*rego)->init = init; - (*rego)->data = data; - (*rego)->sizeof_data = sizeof_data; -} - -static void -current_gdbarch_swap_init_hack (void) -{ - struct gdbarch_swap_registration *rego; - struct gdbarch_swap **curr = ¤t_gdbarch->swap; - for (rego = gdbarch_swap_registry.registrations; - rego != NULL; - rego = rego->next) - { - if (rego->data != NULL) - { - (*curr) = GDBARCH_OBSTACK_ZALLOC (current_gdbarch, - struct gdbarch_swap); - (*curr)->source = rego; - (*curr)->swap = gdbarch_obstack_zalloc (current_gdbarch, - rego->sizeof_data); - (*curr)->next = NULL; - curr = &(*curr)->next; - } - if (rego->init != NULL) - rego->init (); - } -} - -static struct gdbarch * -current_gdbarch_swap_out_hack (void) -{ - struct gdbarch *old_gdbarch = current_gdbarch; - struct gdbarch_swap *curr; - - 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); - memset (curr->source->data, 0, curr->source->sizeof_data); - } - current_gdbarch = NULL; - return old_gdbarch; -} - -static void -current_gdbarch_swap_in_hack (struct gdbarch *new_gdbarch) -{ - struct gdbarch_swap *curr; - - 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; -} - - /* Keep a registry of the architectures known by GDB. */ struct gdbarch_registration @@ -3625,13 +3337,6 @@ find_arch_by_info (struct gdbarch_info info) verify_gdbarch (new_gdbarch); new_gdbarch->initialized_p = 1; - /* 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 (new_gdbarch, gdb_stdlog); @@ -3641,26 +3346,28 @@ find_arch_by_info (struct gdbarch_info info) struct gdbarch * gdbarch_find_by_info (struct gdbarch_info info) { + struct gdbarch *new_gdbarch; + /* 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 (); + struct gdbarch *old_gdbarch = current_gdbarch; + current_gdbarch = NULL; /* Find the specified architecture. */ - struct gdbarch *new_gdbarch = find_arch_by_info (info); + new_gdbarch = find_arch_by_info (info); /* Restore the existing architecture. */ gdb_assert (current_gdbarch == NULL); - current_gdbarch_swap_in_hack (old_gdbarch); + current_gdbarch = old_gdbarch; return new_gdbarch; } -/* Make the specified architecture current, swapping the existing one - out. */ +/* Make the specified architecture current. */ void deprecated_current_gdbarch_select_hack (struct gdbarch *new_gdbarch) @@ -3668,8 +3375,7 @@ 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); + current_gdbarch = new_gdbarch; architecture_changed_event (); reinit_frame_cache (); }