Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.200 diff -u -r1.200 Makefile.in --- Makefile.in 24 May 2002 00:12:16 -0000 1.200 +++ Makefile.in 26 May 2002 05:30:41 -0000 @@ -2109,7 +2109,7 @@ sparc-tdep.o: sparc-tdep.c $(floatformat_h) $(defs_h) $(gdbcore_h) \ $(inferior_h) $(objfiles_h) $(symfile_h) $(target_h) $(gdb_string_h) \ - $(arch_utils_h) $(regcache_h) + $(arch_utils_h) $(regcache_h) osabi.h sparcl-tdep.o: sparcl-tdep.c $(defs_h) $(gdbcore_h) $(target_h) $(regcache_h) Index: sparc-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/sparc-tdep.c,v retrieving revision 1.34 diff -u -r1.34 sparc-tdep.c --- sparc-tdep.c 5 May 2002 01:55:37 -0000 1.34 +++ sparc-tdep.c 26 May 2002 05:30:44 -0000 @@ -33,6 +33,7 @@ #include "bfd.h" #include "gdb_string.h" #include "regcache.h" +#include "osabi.h" #ifdef USE_PROC_FS #include @@ -111,6 +112,8 @@ 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 +2275,13 @@ 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 */ @@ -2930,6 +2934,7 @@ { 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 +2958,29 @@ }; 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 +2990,8 @@ 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); @@ -3281,6 +3307,20 @@ 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)); +}