diff options
Diffstat (limited to 'gdb/sparc-tdep.c')
-rw-r--r-- | gdb/sparc-tdep.c | 93 |
1 files changed, 65 insertions, 28 deletions
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c index 6461ca0..033cc81 100644 --- a/gdb/sparc-tdep.c +++ b/gdb/sparc-tdep.c @@ -27,12 +27,12 @@ #include "arch-utils.h" #include "frame.h" #include "inferior.h" -#include "obstack.h" #include "target.h" #include "value.h" #include "bfd.h" #include "gdb_string.h" #include "regcache.h" +#include "osabi.h" #ifdef USE_PROC_FS #include <sys/procfs.h> @@ -111,6 +111,8 @@ struct gdbarch_tdep int reg_save_offset; int call_dummy_call_offset; int print_insn_mach; + + enum gdb_osabi osabi; }; /* Now make GDB_TARGET_IS_SPARC64 a runtime test. */ @@ -2272,12 +2274,13 @@ sparc_target_architecture_hook (const bfd_arch_info_type *ap) static struct gdbarch * sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches); +static void sparc_dump_tdep (struct gdbarch *, struct ui_file *); void _initialize_sparc_tdep (void) { /* Hook us into the gdbarch mechanism. */ - register_gdbarch_init (bfd_arch_sparc, sparc_gdbarch_init); + gdbarch_register (bfd_arch_sparc, sparc_gdbarch_init, sparc_dump_tdep); tm_print_insn = gdb_print_insn_sparc; tm_print_insn_info.mach = TM_PRINT_INSN_MACH; /* Selects sparc/sparclite */ @@ -2547,7 +2550,7 @@ sparc_print_extra_frame_info (struct frame_info *fi) /* MULTI_ARCH support */ -static char * +static const char * sparc32_register_name (int regno) { static char *register_names[] = @@ -2571,7 +2574,7 @@ sparc32_register_name (int regno) return register_names[regno]; } -static char * +static const char * sparc64_register_name (int regno) { static char *register_names[] = @@ -2603,7 +2606,7 @@ sparc64_register_name (int regno) return register_names[regno]; } -static char * +static const char * sparclite_register_name (int regno) { static char *register_names[] = @@ -2628,7 +2631,7 @@ sparclite_register_name (int regno) return register_names[regno]; } -static char * +static const char * sparclet_register_name (int regno) { static char *register_names[] = @@ -2930,6 +2933,7 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { struct gdbarch *gdbarch; struct gdbarch_tdep *tdep; + enum gdb_osabi osabi = GDB_OSABI_UNKNOWN; static LONGEST call_dummy_32[] = { 0xbc100001, 0x9de38000, 0xbc100002, 0xbe100003, @@ -2953,10 +2957,29 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) }; static LONGEST call_dummy_nil[] = {0}; + /* Try to determine the OS ABI of the object we are loading. */ + + if (info.abfd != NULL) + { + osabi = gdbarch_lookup_osabi (info.abfd); + if (osabi == GDB_OSABI_UNKNOWN) + { + /* If it's an ELF file, assume it's Solaris. */ + if (bfd_get_flavour (info.abfd) == bfd_target_elf_flavour) + osabi = GDB_OSABI_SOLARIS; + } + } + /* First see if there is already a gdbarch that can satisfy the request. */ - arches = gdbarch_list_lookup_by_info (arches, &info); - if (arches != NULL) - return arches->gdbarch; + for (arches = gdbarch_list_lookup_by_info (arches, &info); + arches != NULL; + arches = gdbarch_list_lookup_by_info (arches->next, &info)) + { + /* Make sure the ABI selection matches. */ + tdep = gdbarch_tdep (arches->gdbarch); + if (tdep && tdep->osabi == osabi) + return arches->gdbarch; + } /* None found: is the request for a sparc architecture? */ if (info.bfd_arch_info->arch != bfd_arch_sparc) @@ -2966,6 +2989,8 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep)); gdbarch = gdbarch_alloc (&info, tdep); + tdep->osabi = osabi; + /* First set settings that are common for all sparc architectures. */ set_gdbarch_believe_pcc_promotion (gdbarch, 1); set_gdbarch_breakpoint_from_pc (gdbarch, memory_breakpoint_from_pc); @@ -2976,8 +3001,7 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 1); set_gdbarch_decr_pc_after_break (gdbarch, 0); set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT); - set_gdbarch_extract_struct_value_address (gdbarch, - sparc_extract_struct_value_address); + set_gdbarch_deprecated_extract_struct_value_address (gdbarch, sparc_extract_struct_value_address); set_gdbarch_fix_call_dummy (gdbarch, sparc_gdbarch_fix_call_dummy); set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT); set_gdbarch_fp_regnum (gdbarch, SPARC_FP_REGNUM); @@ -3191,96 +3215,109 @@ sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) switch (info.bfd_arch_info->mach) { case bfd_mach_sparc: - set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 72); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4); set_gdbarch_register_name (gdbarch, sparc32_register_name); - set_gdbarch_store_return_value (gdbarch, sparc_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value); tdep->has_fpu = 1; /* (all but sparclet and sparclite) */ tdep->fp_register_bytes = 32 * 4; tdep->print_insn_mach = bfd_mach_sparc; break; case bfd_mach_sparc_sparclet: - set_gdbarch_extract_return_value (gdbarch, - sparclet_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparclet_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 32 + 32 + 8 + 8 + 8); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4 + 8*4); set_gdbarch_register_name (gdbarch, sparclet_register_name); - set_gdbarch_store_return_value (gdbarch, sparclet_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparclet_store_return_value); tdep->has_fpu = 0; /* (all but sparclet and sparclite) */ tdep->fp_register_bytes = 0; tdep->print_insn_mach = bfd_mach_sparc_sparclet; break; case bfd_mach_sparc_sparclite: - set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 80); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4); set_gdbarch_register_name (gdbarch, sparclite_register_name); - set_gdbarch_store_return_value (gdbarch, sparc_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value); tdep->has_fpu = 0; /* (all but sparclet and sparclite) */ tdep->fp_register_bytes = 0; tdep->print_insn_mach = bfd_mach_sparc_sparclite; break; case bfd_mach_sparc_v8plus: - set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 72); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4); set_gdbarch_register_name (gdbarch, sparc32_register_name); - set_gdbarch_store_return_value (gdbarch, sparc_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value); tdep->print_insn_mach = bfd_mach_sparc; tdep->fp_register_bytes = 32 * 4; tdep->has_fpu = 1; /* (all but sparclet and sparclite) */ break; case bfd_mach_sparc_v8plusa: - set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 72); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4); set_gdbarch_register_name (gdbarch, sparc32_register_name); - set_gdbarch_store_return_value (gdbarch, sparc_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value); tdep->has_fpu = 1; /* (all but sparclet and sparclite) */ tdep->fp_register_bytes = 32 * 4; tdep->print_insn_mach = bfd_mach_sparc; break; case bfd_mach_sparc_sparclite_le: - set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 80); set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4); set_gdbarch_register_name (gdbarch, sparclite_register_name); - set_gdbarch_store_return_value (gdbarch, sparc_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value); tdep->has_fpu = 0; /* (all but sparclet and sparclite) */ tdep->fp_register_bytes = 0; tdep->print_insn_mach = bfd_mach_sparc_sparclite; break; case bfd_mach_sparc_v9: - set_gdbarch_extract_return_value (gdbarch, sparc64_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 125); set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8); set_gdbarch_register_name (gdbarch, sparc64_register_name); - set_gdbarch_store_return_value (gdbarch, sparc_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value); tdep->has_fpu = 1; /* (all but sparclet and sparclite) */ tdep->fp_register_bytes = 64 * 4; tdep->print_insn_mach = bfd_mach_sparc_v9a; break; case bfd_mach_sparc_v9a: - set_gdbarch_extract_return_value (gdbarch, sparc64_extract_return_value); + set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value); set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); set_gdbarch_num_regs (gdbarch, 125); set_gdbarch_register_bytes (gdbarch, 32*8 + 32*8 + 45*8); set_gdbarch_register_name (gdbarch, sparc64_register_name); - set_gdbarch_store_return_value (gdbarch, sparc_store_return_value); + set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value); tdep->has_fpu = 1; /* (all but sparclet and sparclite) */ tdep->fp_register_bytes = 64 * 4; tdep->print_insn_mach = bfd_mach_sparc_v9a; break; } + /* Hook in OS ABI-specific overrides, if they have been registered. */ + gdbarch_init_osabi (info, gdbarch, osabi); + return gdbarch; } +static void +sparc_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + + if (tdep == NULL) + return; + + fprintf_unfiltered (file, "sparc_dump_tdep: OS ABI = %s\n", + gdbarch_osabi_name (tdep->osabi)); +} |