This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH/RFA] Generic OS ABI handling



Actually, Jason, I was thinking you can separate out the sh-tdep.h
creation patch, and just commit that bit by itself. It is not really
tied to the osabi thing.

The rest can go in when it is all approved.

Elena


Jason R Thorpe writes:
 > On Thu, May 16, 2002 at 04:11:30PM -0700, Jason R Thorpe wrote:
 > 
 >  > Right, I'll submit another patch shortly with the include tidying.
 > 
 > Okay, here we go.. This has the includes cleaned up as suggested.  This
 > patch also includes the changes for SH (already approved by Elena),
 > ARM (Richard?  Does this patch look okay to you?), Alpha (maintainerless,
 > but it looks okay to me :-), and MIPS (HI ANDREW :-)
 > 
 >         * Makefile.in (SFILES): Add osabi.c.
 >         (COMMON_OBS): Add osabi.o.
 >         (osabi.o): New dependency list.
 >         * osabi.c: New file.
 >         * osabi.h: New file.
 >         * doc/gdbint.texinfo: Document new generic OS ABI framework.
 > 
 >         * Makefile.in (alpha_tdep_h): Define and use instead of
 >         alpha-tdep.h.
 >         * alpha-tdep.c (alpha_abi_names, process_note_abi_tag_sections,
 >         get_elfosabi, alpha_abi_handler_list, alpha_gdbarch_register_os_abi):
 >         Remove.
 >         (alpha_gdbarch_init, alpha_dump_tdep): Use generic OS ABI framework.
 >         * alpha-tdep.h: Include osabi.h.
 >         (alpha_abi): Remove.
 >         (gdbarch_tdep): Use generic OS ABI framework.
 >         * alpha-linux-tdep.c (_initialize_alpha_linux_tdep): Use
 >         gdbarch_register_osabi.
 >         * alpha-osf1-tdep.c (_initialize_alpha_osf1_tdep): Likewise.
 >         * alphafbsd-tdep.c (_initialize_alphafbsd_tdep): Likewise.
 >         * alphanbsd-tdep.c (_initialize_alphanbsd_tdep): Likewise.
 > 
 >         * Makefile.in (sh_tdep_h): Define and use.
 >         * config/sh/tm-sh.h (sh_osabi): Remove.
 >         (sh_abi, gdbarch_tdep, register enum): Move to...
 >         * sh-tdep.h: ...here.
 >         (gdbarch_tdep): Use generic OS ABI framework.
 >         * sh-tdep.c: Include sh-tdep.h.
 >         (sh_osabi_names, process_note_abi_tag_sections,
 >         sh_osabi_handler_list, sh_gdbarch_register_os_abi): Remove.
 >         (sh_gdbarch_init, sh_dump_tdep): Use generic OS ABI framework.
 >         * sh3-rom.c: Include sh-tdep.h.
 >         * shnbsd-tdep.c: Include sh-tdep.h.
 >         (_initialize_shnbsd_tdep): Use gdbarch_register_osabi.
 > 
 >         * Makefile.in (arm_tdep_h): Define and use instead of arm-tdep.h.
 >         * arm-linux-tdep.c (_initialize_arm_linux_tdep): Use
 >         gdbarch_register_osabi.
 >         * arm-tdep.c (arm_abi_names, process_note_abi_tag_sections,
 >         get_elfosabi, arm_abi_handler_list, arm_gdbarch_register_os_abi):
 >         Remove.
 >         (arm_gdbarch_init): Use generic OS ABI framework.
 >         (arm_dump_tdep): Likewise.
 >         (_initialize_arm_tdep): Likewise.
 >         * arm-tdep.h: Include osabi.h.
 >         (arm_abi): Remove.
 >         (gdbarch_tdep): Remove arm_abi and abi_name members.  Add
 >         osabi member.
 >         (arm_gdbarch_register_os_abi): Remove prototype.
 >         * armnbsd-tdep.c (arm_netbsd_aout_osabi_sniffer): New function.
 >         (_initialize_arm_netbsd_tdep): Use gdbarch_register_osabi.
 > 
 >         * Makefile.in (mips-tdep.o): Add osabi.h to dependency list.
 >         * mips-tdep.c: Include osabi.h.
 >         (gdbarch_tdep, mips_gdbarch_init, mips_dump_tdep): Use generic
 >         OS ABI framework.
 > 
 > -- 
 >         -- Jason R. Thorpe <thorpej@wasabisystems.com>
 > Index: Makefile.in
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/Makefile.in,v
 > retrieving revision 1.184
 > diff -u -r1.184 Makefile.in
 > --- Makefile.in	11 May 2002 22:14:19 -0000	1.184
 > +++ Makefile.in	17 May 2002 02:32:57 -0000
 > @@ -530,7 +530,7 @@
 >  	demangle.c dwarfread.c dwarf2read.c elfread.c environ.c eval.c \
 >  	event-loop.c event-top.c \
 >  	expprint.c f-exp.y f-lang.c f-typeprint.c f-valprint.c \
 > -	findvar.c regcache.c gdbarch.c arch-utils.c gdbtypes.c \
 > +	findvar.c regcache.c gdbarch.c arch-utils.c gdbtypes.c osabi.c \
 >  	inf-loop.c infcmd.c inflow.c infrun.c language.c \
 >  	kod.c kod-cisco.c \
 >  	ui-out.c cli-out.c \
 > @@ -590,8 +590,10 @@
 >  tm_h =		@tm_h@
 >  nm_h =		@nm_h@
 >  
 > +alpha_tdep_h =	alpha-tdep.h osabi.h
 >  annotate_h =	annotate.h $(symtab_h) $(gdbtypes_h)
 >  arch_utils_h =	arch-utils.h
 > +arm_tdep_h =	arm-tdep.h osabi.h
 >  ax_h = 		ax.h $(doublest_h)
 >  bcache_h =	bcache.h
 >  builtin_regs_h = builtin-regs.h
 > @@ -640,6 +642,7 @@
 >  remote_utils_h =  remote-utils.h $(target_h)
 >  ser_unix_h =	ser-unix.h
 >  serial_h =	serial.h
 > +sh_tdep_h =	sh-tdep.h osabi.h
 >  solist_h =	solist.h
 >  source_h =	source.h
 >  stabsread_h =	stabsread.h
 > @@ -712,7 +715,7 @@
 >  	symtab.o symfile.o symmisc.o linespec.o infcmd.o infrun.o \
 >  	expprint.o environ.o stack.o thread.o \
 >  	event-loop.o event-top.o inf-loop.o completer.o \
 > -	gdbarch.o arch-utils.o gdbtypes.o copying.o $(DEPFILES) \
 > +	gdbarch.o arch-utils.o gdbtypes.o osabi.o copying.o $(DEPFILES) \
 >  	memattr.o mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \
 >  	builtin-regs.o std-regs.o \
 >  	signals.o \
 > @@ -1244,44 +1247,44 @@
 >  	$(regcache_h)
 >  
 >  alpha-nat.o: alpha-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) $(target_h) \
 > -	$(regcache_h) alpha-tdep.h
 > +	$(regcache_h) $(alpha_tdep_h)
 >  
 >  alphabsd-nat.o: alphabsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
 > -	alpha-tdep.h alphabsd-tdep.h
 > +	$(alpha_tdep_h) alphabsd-tdep.h
 >  
 >  alpha-tdep.o: alpha-tdep.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
 >  	$(inferior_h) $(symtab_h) $(dis_asm_h) $(gdb_string_h) $(linespec_h) \
 > -	$(regcache_h) $(doublest_h) $(BFD_SRC)/elf-bfd.h alpha-tdep.h
 > +	$(regcache_h) $(doublest_h) $(BFD_SRC)/elf-bfd.h $(alpha_tdep_h)
 >  
 > -alpha-linux-tdep.o: alpha-linux-tdep.c $(defs_h) $(value_h) alpha-tdep.h
 > +alpha-linux-tdep.o: alpha-linux-tdep.c $(defs_h) $(value_h) $(alpha_tdep_h)
 >  
 > -alpha-osf1-tdep.o: alpha-osf1-tdep.c $(defs_h) $(value_h) alpha-tdep.h
 > +alpha-osf1-tdep.o: alpha-osf1-tdep.c $(defs_h) $(value_h) $(alpha_tdep_h)
 >  
 >  alphabsd-tdep.o: alphabsd-tdep.c $(defs_h) $(regcache_h) alphabsd-tdep.h
 >  
 > -alphafbsd-tdep.o: alphafbsd-tdep.c $(defs_h) $(value_h) alpha-tdep.h
 > +alphafbsd-tdep.o: alphafbsd-tdep.c $(defs_h) $(value_h) $(alpha_tdep_h)
 >  
 >  alphanbsd-tdep.o: alphanbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \
 > -	$(value_h) alpha-tdep.h alphabsd-tdep.h nbsd-tdep.h
 > +	$(value_h) $(alpha_tdep_h) alphabsd-tdep.h nbsd-tdep.h
 >  
 >  annotate.o: annotate.c $(defs_h) $(annotate_h) $(value_h) $(target_h) $(gdbtypes_h)
 >  
 >  arm-linux-nat.o: arm-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
 > -	$(gdb_string_h) $(regcache_h) arm-tdep.h
 > +	$(gdb_string_h) $(regcache_h) $(arm_tdep_h)
 >  
 >  arm-linux-tdep.o: arm-linux-tdep.c $(defs_h) $(target_h) $(value_h) \
 > -	$(gdbtypes_h) $(floatformat_h) $(regcache_h) $(doublest_h) arm-tdep.h
 > +	$(gdbtypes_h) $(floatformat_h) $(regcache_h) $(doublest_h) $(arm_tdep_h)
 >  
 >  arm-tdep.o: arm-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(gdbcmd_h) \
 >  	$(gdbcore_h) $(gdb_string_h) $(dis_asm_h) $(regcache_h) $(doublest_h) \
 > -	$(value_h) $(arch_utils_h) $(solib_svr4_h) arm-tdep.h \
 > +	$(value_h) $(arch_utils_h) $(solib_svr4_h) $(arm_tdep_h) \
 >  	$(BFD_SRC)/elf-bfd.h $(INCLUDE_DIR)/coff/internal.h \
 >  	$(INCLUDE_DIR)/elf/arm.h 
 >  
 > -armnbsd-nat.o: armnbsd-nat.c $(defs_h) arm-tdep.h $(inferior_h) $(regcache_h) \
 > -	$(gdbcore_h)
 > +armnbsd-nat.o: armnbsd-nat.c $(defs_h) $(arm_tdep_h) $(inferior_h) \
 > +	$(regcache_h) $(gdbcore_h)
 >  
 > -armnbsd-tdep.o: armnbsd-tdep.c $(defs_h) arm-tdep.h
 > +armnbsd-tdep.o: armnbsd-tdep.c $(defs_h) $(arm_tdep_h)
 >  
 >  avr-tdep.o: avr-tdep.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) $(inferior_h) \
 >  	$(symfile_h) $(regcache_h) $(arch_utils_h)
 > @@ -1557,6 +1560,8 @@
 >  	$(gdbtypes_h) $(language_h) $(objfiles_h) $(symfile_h) $(symtab_h) \
 >  	$(target_h) $(value_h) $(gdb_string_h) $(wrapper_h) $(cp_abi_h)
 >  
 > +osabi.o: osabi.c $(defs_h) $(BFD_SRC)/elf-bfd.h
 > +
 >  go32-nat.o: go32-nat.c $(defs_h) $(inferior_h) gdb_wait.h $(gdbcore_h) \
 >  	$(command_h) $(floatformat_h) $(target_h) i387-tdep.h $(regcache_h)
 >  
 > @@ -1782,7 +1787,8 @@
 >  
 >  mips-tdep.o: mips-tdep.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \
 >  	$(arch_utils_h) $(regcache_h) \
 > -	$(inferior_h) $(language_h) $(objfiles_h) $(symfile_h) $(gdb_string_h)
 > +	$(inferior_h) $(language_h) $(objfiles_h) $(symfile_h) \
 > +	$(gdb_string_h) osabi.h
 >  
 >  mipsread.o: mipsread.c $(buildsym_h) $(complaints_h) $(bfd_h) $(defs_h) \
 >  	$(expression_h) $(gdb_stabs_h) $(gdbcore_h) $(gdbtypes_h) \
 > @@ -1904,7 +1910,7 @@
 >  	$(version_h) $(regcache_h)
 >  
 >  remote-rdi.o: remote-rdi.c $(defs_h) $(gdbcore_h) \
 > -	$(inferior_h) $(gdb_string_h) $(completer_h) arm-tdep.h
 > +	$(inferior_h) $(gdb_string_h) $(completer_h) $(arm_tdep_h)
 >  
 >  rdi-share/libangsd.a:	force
 >  	@dir=rdi-share; \
 > @@ -1917,7 +1923,7 @@
 >  	fi
 >  
 >  remote-rdp.o: remote-rdp.c $(defs_h) $(gdbcore_h) \
 > -	$(inferior_h) $(gdb_string_h) arm-tdep.h
 > +	$(inferior_h) $(gdb_string_h) $(arm_tdep_h)
 >  
 >  remote-bug.o: remote-bug.c $(defs_h) $(gdbcore_h) $(serial_h) \
 >  	$(inferior_h) $(target_h) $(terminal_h) $(remote_utils_h) \
 > @@ -2025,11 +2031,11 @@
 >  sh-tdep.o: sh-tdep.c $(bfd_h) $(dis_asm_h) \
 >  	$(srcdir)/../opcodes/sh-opc.h $(defs_h) $(expression_h) $(frame_h) \
 >  	$(gdbcmd_h) $(gdbtypes_h) $(symtab_h) $(value_h) $(arch_utils_h) \
 > -	$(regcache_h) $(doublest_h)
 > +	$(regcache_h) $(doublest_h) $(sh_tdep_h)
 >  
 >  sh3-rom.o: sh3-rom.c $(monitor_h) $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \
 >  	$(inferior_h) $(target_h) $(serial_h) $(terminal_h) $(arch_utils_h) \
 > -	$(regcache_h)
 > +	$(regcache_h) $(sh_tdep_h)
 >  
 >  signals.o: signals/signals.c $(defs_h) $(target_h)
 >  	$(CC) -c $(INTERNAL_CFLAGS) $<
 > Index: alpha-linux-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/alpha-linux-tdep.c,v
 > retrieving revision 1.5
 > diff -u -r1.5 alpha-linux-tdep.c
 > --- alpha-linux-tdep.c	26 Apr 2002 07:05:34 -0000	1.5
 > +++ alpha-linux-tdep.c	17 May 2002 02:32:57 -0000
 > @@ -116,5 +116,6 @@
 >  void
 >  _initialize_alpha_linux_tdep (void)
 >  {
 > -  alpha_gdbarch_register_os_abi (ALPHA_ABI_LINUX, alpha_linux_init_abi);
 > +  gdbarch_register_osabi (bfd_arch_alpha, GDB_OSABI_LINUX,
 > +                          alpha_linux_init_abi);
 >  }
 > Index: alpha-osf1-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/alpha-osf1-tdep.c,v
 > retrieving revision 1.4
 > diff -u -r1.4 alpha-osf1-tdep.c
 > --- alpha-osf1-tdep.c	26 Apr 2002 07:05:34 -0000	1.4
 > +++ alpha-osf1-tdep.c	17 May 2002 02:32:57 -0000
 > @@ -69,5 +69,5 @@
 >  void
 >  _initialize_alpha_osf1_tdep (void)
 >  {
 > -  alpha_gdbarch_register_os_abi (ALPHA_ABI_OSF1, alpha_osf1_init_abi);
 > +  gdbarch_register_osabi (bfd_arch_alpha, GDB_OSABI_OSF1, alpha_osf1_init_abi);
 >  }
 > Index: alpha-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/alpha-tdep.c,v
 > retrieving revision 1.33
 > diff -u -r1.33 alpha-tdep.c
 > --- alpha-tdep.c	5 May 2002 18:49:57 -0000	1.33
 > +++ alpha-tdep.c	17 May 2002 02:32:59 -0000
 > @@ -1766,186 +1766,6 @@
 >  }
 >  
 >  
 > -/* This table matches the indices assigned to enum alpha_abi.  Keep
 > -   them in sync.  */
 > -static const char * const alpha_abi_names[] =
 > -{
 > -  "<unknown>",
 > -  "OSF/1",
 > -  "GNU/Linux",
 > -  "FreeBSD",
 > -  "NetBSD",
 > -  NULL
 > -};
 > -
 > -static void
 > -process_note_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
 > -{
 > -  enum alpha_abi *os_ident_ptr = obj;
 > -  const char *name;
 > -  unsigned int sectsize;
 > -
 > -  name = bfd_get_section_name (abfd, sect);
 > -  sectsize = bfd_section_size (abfd, sect);
 > -
 > -  if (strcmp (name, ".note.ABI-tag") == 0 && sectsize > 0)
 > -    {
 > -      unsigned int name_length, data_length, note_type;
 > -      char *note;
 > -
 > -      /* If the section is larger than this, it's probably not what we are
 > -	 looking for.  */
 > -      if (sectsize > 128)
 > -	sectsize = 128;
 > -
 > -      note = alloca (sectsize);
 > -
 > -      bfd_get_section_contents (abfd, sect, note,
 > -				(file_ptr) 0, (bfd_size_type) sectsize);
 > -
 > -      name_length = bfd_h_get_32 (abfd, note);
 > -      data_length = bfd_h_get_32 (abfd, note + 4);
 > -      note_type   = bfd_h_get_32 (abfd, note + 8);
 > -
 > -      if (name_length == 4 && data_length == 16 && note_type == 1
 > -	  && strcmp (note + 12, "GNU") == 0)
 > -	{
 > -	  int os_number = bfd_h_get_32 (abfd, note + 16);
 > -
 > -	  /* The case numbers are from abi-tags in glibc.  */
 > -	  switch (os_number)
 > -	    {
 > -	    case 0 :
 > -	      *os_ident_ptr = ALPHA_ABI_LINUX;
 > -	      break;
 > -
 > -	    case 1 :
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: Hurd objects not supported");
 > -	      break;
 > -
 > -	    case 2 :
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: Solaris objects not supported");
 > -	      break;
 > -
 > -	    default :
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: unknown OS number %d",
 > -		 os_number);
 > -	      break;
 > -	    }
 > -	}
 > -    }
 > -  /* NetBSD uses a similar trick.  */
 > -  else if (strcmp (name, ".note.netbsd.ident") == 0 && sectsize > 0)
 > -    {
 > -      unsigned int name_length, desc_length, note_type;
 > -      char *note;
 > -
 > -      /* If the section is larger than this, it's probably not what we are
 > -         looking for.  */
 > -      if (sectsize > 128)
 > -	sectsize = 128;
 > -
 > -      note = alloca (sectsize);
 > -
 > -      bfd_get_section_contents (abfd, sect, note,
 > -				 (file_ptr) 0, (bfd_size_type) sectsize);
 > -      
 > -      name_length = bfd_h_get_32 (abfd, note);
 > -      desc_length = bfd_h_get_32 (abfd, note + 4);
 > -      note_type   = bfd_h_get_32 (abfd, note + 8);
 > -
 > -      if (name_length == 7 && desc_length == 4 && note_type == 1
 > -	  && strcmp (note + 12, "NetBSD") == 0)
 > -	/* XXX Should we check the version here?
 > -	   Probably not necessary yet.  */
 > -	*os_ident_ptr = ALPHA_ABI_NETBSD;
 > -    }
 > -}
 > -
 > -static int
 > -get_elfosabi (bfd *abfd)
 > -{
 > -  int elfosabi;
 > -  enum alpha_abi alpha_abi = ALPHA_ABI_UNKNOWN;
 > -
 > -  elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
 > -
 > -  /* When elfosabi is 0 (ELFOSABI_NONE), this is supposed to indicate
 > -     what we're on a SYSV system.  However, GNU/Linux uses a note section
 > -     to record OS/ABI info, but leaves e_ident[EI_OSABI] zero.  So we
 > -     have to check the note sections too.  */
 > -  if (elfosabi == 0)
 > -    {
 > -      bfd_map_over_sections (abfd,
 > -			     process_note_abi_tag_sections,
 > -			     &alpha_abi);
 > -    }
 > -
 > -  if (alpha_abi != ALPHA_ABI_UNKNOWN)
 > -    return alpha_abi;
 > -
 > -  switch (elfosabi)
 > -    {
 > -    case ELFOSABI_NONE:
 > -      /* Leave it as unknown.  */
 > -      break;
 > -
 > -    case ELFOSABI_NETBSD:
 > -      return ALPHA_ABI_NETBSD;
 > -
 > -    case ELFOSABI_FREEBSD:
 > -      return ALPHA_ABI_FREEBSD;
 > -
 > -    case ELFOSABI_LINUX:
 > -      return ALPHA_ABI_LINUX;
 > -    }
 > -
 > -  return ALPHA_ABI_UNKNOWN;
 > -}
 > -
 > -struct alpha_abi_handler
 > -{
 > -  struct alpha_abi_handler *next;
 > -  enum alpha_abi abi;
 > -  void (*init_abi)(struct gdbarch_info, struct gdbarch *);
 > -};
 > -
 > -struct alpha_abi_handler *alpha_abi_handler_list = NULL;
 > -
 > -void
 > -alpha_gdbarch_register_os_abi (enum alpha_abi abi,
 > -                               void (*init_abi)(struct gdbarch_info,
 > -						struct gdbarch *))
 > -{
 > -  struct alpha_abi_handler **handler_p;
 > -
 > -  for (handler_p = &alpha_abi_handler_list; *handler_p != NULL;
 > -       handler_p = &(*handler_p)->next)
 > -    {
 > -      if ((*handler_p)->abi == abi)
 > -	{
 > -	  internal_error
 > -	    (__FILE__, __LINE__,
 > -	     "alpha_gdbarch_register_os_abi: A handler for this ABI variant "
 > -	     "(%d) has already been registered", (int) abi);
 > -	  /* If user wants to continue, override previous definition.  */
 > -	  (*handler_p)->init_abi = init_abi;
 > -	  return;
 > -	}
 > -    }
 > -
 > -  (*handler_p)
 > -    = (struct alpha_abi_handler *) xmalloc (sizeof (struct alpha_abi_handler));
 > -  (*handler_p)->next = NULL;
 > -  (*handler_p)->abi = abi;
 > -  (*handler_p)->init_abi = init_abi;
 > -}
 >  
 >  /* Initialize the current architecture based on INFO.  If possible, re-use an
 >     architecture from ARCHES, which is a list of architectures already created
 > @@ -1959,27 +1779,18 @@
 >  {
 >    struct gdbarch_tdep *tdep;
 >    struct gdbarch *gdbarch;
 > -  enum alpha_abi alpha_abi = ALPHA_ABI_UNKNOWN;
 > -  struct alpha_abi_handler *abi_handler;
 > +  enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
 >  
 >    /* Try to determine the ABI of the object we are loading.  */
 >  
 >    if (info.abfd != NULL)
 >      {
 > -      switch (bfd_get_flavour (info.abfd))
 > +      osabi = gdbarch_lookup_osabi (info.abfd);
 > +      if (osabi == GDB_OSABI_UNKNOWN)
 >  	{
 > -	case bfd_target_elf_flavour:
 > -	  alpha_abi = get_elfosabi (info.abfd);
 > -	  break;
 > -
 > -	case bfd_target_ecoff_flavour:
 > -	  /* Assume it's OSF/1.  */
 > -	  alpha_abi = ALPHA_ABI_OSF1;
 > -          break;
 > -
 > -	default:
 > -	  /* Not sure what to do here, leave the ABI as unknown.  */
 > -	  break;
 > +	  /* If it's an ECOFF file, assume it's OSF/1.  */
 > +	  if (bfd_get_flavour (info.abfd) == bfd_target_ecoff_flavour)
 > +	    osabi = GDB_OSABI_OSF1;
 >  	}
 >      }
 >  
 > @@ -1990,22 +1801,14 @@
 >      {
 >        /* Make sure the ABI selection matches.  */
 >        tdep = gdbarch_tdep (arches->gdbarch);
 > -      if (tdep && tdep->alpha_abi == alpha_abi)
 > +      if (tdep && tdep->osabi == osabi)
 >  	return arches->gdbarch;
 >      }
 >  
 >    tdep = xmalloc (sizeof (struct gdbarch_tdep));
 >    gdbarch = gdbarch_alloc (&info, tdep);
 >  
 > -  tdep->alpha_abi = alpha_abi;
 > -  if (alpha_abi < ALPHA_ABI_INVALID)
 > -    tdep->abi_name = alpha_abi_names[alpha_abi];
 > -  else
 > -    {
 > -      internal_error (__FILE__, __LINE__, "Invalid setting of alpha_abi %d",
 > -		      (int) alpha_abi);
 > -      tdep->abi_name = "<invalid>";
 > -    }
 > +  tdep->osabi = osabi;
 >  
 >    /* Lowest text address.  This is used by heuristic_proc_start() to
 >       decide when to stop looking.  */
 > @@ -2122,38 +1925,7 @@
 >    set_gdbarch_frame_args_skip (gdbarch, 0);
 >  
 >    /* Hook in ABI-specific overrides, if they have been registered.  */
 > -  if (alpha_abi == ALPHA_ABI_UNKNOWN)
 > -    {
 > -      /* Don't complain about not knowing the ABI variant if we don't
 > -	 have an inferior.  */
 > -      if (info.abfd)
 > -	fprintf_filtered
 > -	  (gdb_stderr, "GDB doesn't recognize the ABI of the inferior.  "
 > -	   "Attempting to continue with the default Alpha settings");
 > -    }
 > -  else
 > -    {
 > -      for (abi_handler = alpha_abi_handler_list; abi_handler != NULL;
 > -	   abi_handler = abi_handler->next)
 > -	if (abi_handler->abi == alpha_abi)
 > -	  break;
 > -
 > -      if (abi_handler)
 > -	abi_handler->init_abi (info, gdbarch);
 > -      else
 > -	{
 > -	  /* We assume that if GDB_MULTI_ARCH is less than
 > -	     GDB_MULTI_ARCH_TM that an ABI variant can be supported by
 > -	     overriding definitions in this file.  */
 > -	  if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
 > -	    fprintf_filtered
 > -	      (gdb_stderr,
 > -	       "A handler for the ABI variant \"%s\" is not built into this "
 > -	       "configuration of GDB.  "
 > -	       "Attempting to continue with the default Alpha settings",
 > -	       alpha_abi_names[alpha_abi]);
 > -	}
 > -    }
 > +  gdbarch_init_osabi (info, gdbarch, osabi);
 >  
 >    /* Now that we have tuned the configuration, set a few final things
 >       based on what the OS ABI has told us.  */
 > @@ -2172,12 +1944,8 @@
 >    if (tdep == NULL)
 >      return;
 >  
 > -  if (tdep->abi_name != NULL)
 > -    fprintf_unfiltered (file, "alpha_dump_tdep: ABI = %s\n", tdep->abi_name);
 > -  else
 > -    internal_error (__FILE__, __LINE__,
 > -		    "alpha_dump_tdep: illegal setting of tdep->alpha_abi (%d)",
 > -		    (int) tdep->alpha_abi);
 > +  fprintf_unfiltered (file, "alpha_dump_tdep: OS ABI = %s\n",
 > +		      gdbarch_osabi_name (tdep->osabi));
 >  
 >    fprintf_unfiltered (file,
 >                        "alpha_dump_tdep: vm_min_address = 0x%lx\n",
 > Index: alpha-tdep.h
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/alpha-tdep.h,v
 > retrieving revision 1.7
 > diff -u -r1.7 alpha-tdep.h
 > --- alpha-tdep.h	26 Apr 2002 07:05:34 -0000	1.7
 > +++ alpha-tdep.h	17 May 2002 02:32:59 -0000
 > @@ -22,6 +22,8 @@
 >  #ifndef ALPHA_TDEP_H
 >  #define ALPHA_TDEP_H
 >  
 > +#include "osabi.h"
 > +
 >  /* Say how long (ordinary) registers are.  This is a piece of bogosity
 >     used in push_word and a few other places;  REGISTER_RAW_SIZE is the
 >     real way to know how big a register is.  */
 > @@ -76,24 +78,10 @@
 >     pointer, the value of localoff is obtained from the PDR.  */
 >  #define ALPHA_NUM_ARG_REGS   6
 >  
 > -/* ABI variants that we know about.  If you add to this enum, please
 > -   update the table of names in alpha-tdep.c.  */
 > -enum alpha_abi
 > -{
 > -  ALPHA_ABI_UNKNOWN = 0,
 > -  ALPHA_ABI_OSF1,
 > -  ALPHA_ABI_LINUX,
 > -  ALPHA_ABI_FREEBSD,
 > -  ALPHA_ABI_NETBSD,
 > -
 > -  ALPHA_ABI_INVALID	/* Keep this last. */
 > -};
 > -
 >  /* Target-dependent structure in gdbarch.  */
 >  struct gdbarch_tdep
 >  {
 > -  enum alpha_abi alpha_abi;	/* OS/ABI of inferior.  */
 > -  const char *abi_name;		/* Name of the above.  */
 > +  enum gdb_osabi osabi;		/* OS/ABI of inferior.  */
 >  
 >    CORE_ADDR vm_min_address;	/* used by heuristic_proc_start */
 >  
 > @@ -117,9 +105,5 @@
 >  };
 >  
 >  void alpha_software_single_step (enum target_signal, int);
 > -
 > -void alpha_gdbarch_register_os_abi (enum alpha_abi,
 > -                                    void (*init_abi)(struct gdbarch_info,
 > -						     struct gdbarch *));
 >  
 >  #endif /* ALPHA_TDEP_H */
 > Index: alphafbsd-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/alphafbsd-tdep.c,v
 > retrieving revision 1.4
 > diff -u -r1.4 alphafbsd-tdep.c
 > --- alphafbsd-tdep.c	26 Apr 2002 01:08:19 -0000	1.4
 > +++ alphafbsd-tdep.c	17 May 2002 02:32:59 -0000
 > @@ -78,5 +78,6 @@
 >  void
 >  _initialize_alphafbsd_tdep (void)
 >  {
 > -  alpha_gdbarch_register_os_abi (ALPHA_ABI_FREEBSD, alphafbsd_init_abi);
 > +  gdbarch_register_osabi (bfd_arch_alpha, GDB_OSABI_FREEBSD_ELF,
 > +                          alphafbsd_init_abi);
 >  }
 > Index: alphanbsd-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/alphanbsd-tdep.c,v
 > retrieving revision 1.5
 > diff -u -r1.5 alphanbsd-tdep.c
 > --- alphanbsd-tdep.c	11 May 2002 22:14:19 -0000	1.5
 > +++ alphanbsd-tdep.c	17 May 2002 02:32:59 -0000
 > @@ -203,7 +203,8 @@
 >  void
 >  _initialize_alphanbsd_tdep (void)
 >  {
 > -  alpha_gdbarch_register_os_abi (ALPHA_ABI_NETBSD, alphanbsd_init_abi);
 > +  gdbarch_register_osabi (bfd_arch_alpha, GDB_OSABI_NETBSD_ELF,
 > +                          alphanbsd_init_abi);
 >  
 >    add_core_fns (&alphanbsd_core_fns);
 >    add_core_fns (&alphanbsd_elfcore_fns);
 > Index: arm-linux-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/arm-linux-tdep.c,v
 > retrieving revision 1.20
 > diff -u -r1.20 arm-linux-tdep.c
 > --- arm-linux-tdep.c	23 Feb 2002 22:17:11 -0000	1.20
 > +++ arm-linux-tdep.c	17 May 2002 02:33:00 -0000
 > @@ -543,5 +543,5 @@
 >  void
 >  _initialize_arm_linux_tdep (void)
 >  {
 > -  arm_gdbarch_register_os_abi (ARM_ABI_LINUX, arm_linux_init_abi);
 > +  gdbarch_register_osabi (bfd_arch_arm, GDB_OSABI_LINUX, arm_linux_init_abi);
 >  }
 > Index: arm-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/arm-tdep.c,v
 > retrieving revision 1.60
 > diff -u -r1.60 arm-tdep.c
 > --- arm-tdep.c	9 May 2002 18:07:00 -0000	1.60
 > +++ arm-tdep.c	17 May 2002 02:33:03 -0000
 > @@ -93,23 +93,6 @@
 >  #define MSYMBOL_SIZE(msym)				\
 >  	((long) MSYMBOL_INFO (msym) & 0x7fffffff)
 >  
 > -/* This table matches the indicees assigned to enum arm_abi. 
 > -   Keep them in sync.  */
 > -
 > -static const char * const arm_abi_names[] =
 > -{
 > -  "<unknown>",
 > -  "ARM EABI (version 1)",
 > -  "ARM EABI (version 2)",
 > -  "GNU/Linux",
 > -  "NetBSD (a.out)",
 > -  "NetBSD (ELF)",
 > -  "APCS",
 > -  "FreeBSD",
 > -  "Windows CE",
 > -  NULL
 > -};
 > -
 >  /* Number of different reg name sets (options).  */
 >  static int num_flavor_options;
 >  
 > @@ -2608,208 +2591,6 @@
 >  }
 >  
 >  
 > -static void
 > -process_note_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
 > -{
 > -  enum arm_abi *os_ident_ptr = obj;
 > -  const char *name;
 > -  unsigned int sectsize;
 > -
 > -  name = bfd_get_section_name (abfd, sect);
 > -  sectsize = bfd_section_size (abfd, sect);
 > -
 > -  if (strcmp (name, ".note.ABI-tag") == 0 && sectsize > 0)
 > -    {
 > -      unsigned int name_length, data_length, note_type;
 > -      char *note;
 > -
 > -      /* If the section is larger than this, it's probably not what we are
 > -	 looking for.  */
 > -      if (sectsize > 128)
 > -	sectsize = 128;
 > -
 > -      note = alloca (sectsize);
 > -
 > -      bfd_get_section_contents (abfd, sect, note,
 > -                                (file_ptr) 0, (bfd_size_type) sectsize);
 > -
 > -      name_length = bfd_h_get_32 (abfd, note);
 > -      data_length = bfd_h_get_32 (abfd, note + 4);
 > -      note_type   = bfd_h_get_32 (abfd, note + 8);
 > -
 > -      if (name_length == 4 && data_length == 16 && note_type == 1
 > -          && strcmp (note + 12, "GNU") == 0)
 > -	{
 > -	  int os_number = bfd_h_get_32 (abfd, note + 16);
 > -
 > -	  /* The case numbers are from abi-tags in glibc.  */
 > -	  switch (os_number)
 > -	    {
 > -	    case 0 :
 > -	      *os_ident_ptr = ARM_ABI_LINUX;
 > -	      break;
 > -
 > -	    case 1 :
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: Hurd objects not supported");
 > -	      break;
 > -
 > -	    case 2 :
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: Solaris objects not supported");
 > -	      break;
 > -
 > -	    default :
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: unknown OS number %d",
 > -		 os_number);
 > -	      break;
 > -	    }
 > -	}
 > -    }
 > -  /* NetBSD uses a similar trick.  */
 > -  else if (strcmp (name, ".note.netbsd.ident") == 0 && sectsize > 0)
 > -    {
 > -      unsigned int name_length, desc_length, note_type;
 > -      char *note;
 > -
 > -      /* If the section is larger than this, it's probably not what we are
 > -	 looking for.  */
 > -      if (sectsize > 128)
 > -	sectsize = 128;
 > -
 > -      note = alloca (sectsize);
 > -
 > -      bfd_get_section_contents (abfd, sect, note,
 > -                                (file_ptr) 0, (bfd_size_type) sectsize);
 > -
 > -      name_length = bfd_h_get_32 (abfd, note);
 > -      desc_length = bfd_h_get_32 (abfd, note + 4);
 > -      note_type   = bfd_h_get_32 (abfd, note + 8);
 > -
 > -      if (name_length == 7 && desc_length == 4 && note_type == 1
 > -          && strcmp (note + 12, "NetBSD") == 0)
 > -	/* XXX Should we check the version here?
 > -	   Probably not necessary yet.  */
 > -	*os_ident_ptr = ARM_ABI_NETBSD_ELF;
 > -    }
 > -}
 > -
 > -/* Return one of the ELFOSABI_ constants for BFDs representing ELF
 > -   executables.  If it's not an ELF executable or if the OS/ABI couldn't
 > -   be determined, simply return -1.  */
 > -
 > -static int
 > -get_elfosabi (bfd *abfd)
 > -{
 > -  int elfosabi;
 > -  enum arm_abi arm_abi = ARM_ABI_UNKNOWN;
 > -
 > -  elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
 > -
 > -  /* When elfosabi is 0 (ELFOSABI_NONE), this is supposed to indicate
 > -     that we're on a SYSV system.  However, GNU/Linux uses a note section
 > -     to record OS/ABI info, but leaves e_ident[EI_OSABI] zero.  So we
 > -     have to check the note sections too.
 > -
 > -     GNU/ARM tools set the EI_OSABI field to ELFOSABI_ARM, so handle that
 > -     as well.  */
 > -  if (elfosabi == 0 || elfosabi == ELFOSABI_ARM)
 > -    {
 > -      bfd_map_over_sections (abfd,
 > -			     process_note_abi_tag_sections,
 > -			     &arm_abi);
 > -    }
 > -
 > -  if (arm_abi != ARM_ABI_UNKNOWN)
 > -    return arm_abi;
 > -
 > -  switch (elfosabi)
 > -    {
 > -    case ELFOSABI_NONE:
 > -      /* Existing ARM Tools don't set this field, so look at the EI_FLAGS
 > -	 field for more information.  */
 > -
 > -      switch (EF_ARM_EABI_VERSION(elf_elfheader(abfd)->e_flags))
 > -	{
 > -	case EF_ARM_EABI_VER1:
 > -	  return ARM_ABI_EABI_V1;
 > -
 > -	case EF_ARM_EABI_VER2:
 > -	  return ARM_ABI_EABI_V2;
 > -
 > -	case EF_ARM_EABI_UNKNOWN:
 > -	  /* Assume GNU tools.  */
 > -	  return ARM_ABI_APCS;
 > -
 > -	default:
 > -	  internal_error (__FILE__, __LINE__,
 > -			  "get_elfosabi: Unknown ARM EABI version 0x%lx",
 > -			  EF_ARM_EABI_VERSION(elf_elfheader(abfd)->e_flags));
 > -
 > -	}
 > -      break;
 > -
 > -    case ELFOSABI_NETBSD:
 > -      return ARM_ABI_NETBSD_ELF;
 > -
 > -    case ELFOSABI_FREEBSD:
 > -      return ARM_ABI_FREEBSD;
 > -
 > -    case ELFOSABI_LINUX:
 > -      return ARM_ABI_LINUX;
 > -
 > -    case ELFOSABI_ARM:
 > -      /* Assume GNU tools with the old APCS abi.  */
 > -      return ARM_ABI_APCS;
 > -
 > -    default:
 > -    }
 > -
 > -  return ARM_ABI_UNKNOWN;
 > -}
 > -
 > -struct arm_abi_handler
 > -{
 > -  struct arm_abi_handler *next;
 > -  enum arm_abi abi;
 > -  void (*init_abi)(struct gdbarch_info, struct gdbarch *);
 > -};
 > -
 > -struct arm_abi_handler *arm_abi_handler_list = NULL;
 > -
 > -void
 > -arm_gdbarch_register_os_abi (enum arm_abi abi,
 > -			     void (*init_abi)(struct gdbarch_info,
 > -					      struct gdbarch *))
 > -{
 > -  struct arm_abi_handler **handler_p;
 > -
 > -  for (handler_p = &arm_abi_handler_list; *handler_p != NULL;
 > -       handler_p = &(*handler_p)->next)
 > -    {
 > -      if ((*handler_p)->abi == abi)
 > -	{
 > -	  internal_error
 > -	    (__FILE__, __LINE__,
 > -	     "arm_gdbarch_register_os_abi: A handler for this ABI variant (%d)"
 > -	     " has already been registered", (int)abi);
 > -	  /* If user wants to continue, override previous definition.  */
 > -	  (*handler_p)->init_abi = init_abi;
 > -	  return;
 > -	}
 > -    }
 > -
 > -  (*handler_p)
 > -    = (struct arm_abi_handler *) xmalloc (sizeof (struct arm_abi_handler));
 > -  (*handler_p)->next = NULL;
 > -  (*handler_p)->abi = abi;
 > -  (*handler_p)->init_abi = init_abi;
 > -}
 > -
 >  /* Initialize the current architecture based on INFO.  If possible,
 >     re-use an architecture from ARCHES, which is a list of
 >     architectures already created during this debugging session.
 > @@ -2822,36 +2603,31 @@
 >  {
 >    struct gdbarch_tdep *tdep;
 >    struct gdbarch *gdbarch;
 > -  enum arm_abi arm_abi = ARM_ABI_UNKNOWN;
 > -  struct arm_abi_handler *abi_handler;
 > +  enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
 >  
 >    /* Try to deterimine the ABI of the object we are loading.  */
 >  
 >    if (info.abfd != NULL)
 >      {
 > -      switch (bfd_get_flavour (info.abfd))
 > +      osabi = gdbarch_lookup_osabi (info.abfd);
 > +      if (osabi == GDB_OSABI_UNKNOWN)
 >  	{
 > -	case bfd_target_elf_flavour:
 > -	  arm_abi = get_elfosabi (info.abfd);
 > -	  break;
 > -
 > -	case bfd_target_aout_flavour:
 > -	  if (strcmp (bfd_get_target(info.abfd), "a.out-arm-netbsd") == 0)
 > -	    arm_abi = ARM_ABI_NETBSD_AOUT;
 > -	  else
 > -	    /* Assume it's an old APCS-style ABI.  */
 > -	    arm_abi = ARM_ABI_APCS;
 > -	  break;
 > +	  switch (bfd_get_flavour (info.abfd))
 > +	    {
 > +	    case bfd_target_aout_flavour:
 > +	      /* Assume it's an old APCS-style ABI.  */
 > +	      osabi = GDB_OSABI_ARM_APCS;
 > +	      break;
 >  
 > -	case bfd_target_coff_flavour:
 > -	  /* Assume it's an old APCS-style ABI.  */
 > -	  /* XXX WinCE?  */
 > -	  arm_abi = ARM_ABI_APCS;
 > -	  break;
 > +	    case bfd_target_coff_flavour:
 > +	      /* Assume it's an old APCS-style ABI.  */
 > +	      /* XXX WinCE?  */
 > +	      osabi = GDB_OSABI_ARM_APCS;
 > +	      break;
 >  
 > -	default:
 > -	  /* Not sure what to do here, leave the ABI as unknown.  */
 > -	  break;
 > +	    default:
 > +	      /* Leave it as "unknown".  */
 > +	    }
 >  	}
 >      }
 >  
 > @@ -2862,22 +2638,14 @@
 >      {
 >        /* Make sure the ABI selection matches.  */
 >        tdep = gdbarch_tdep (arches->gdbarch);
 > -      if (tdep && tdep->arm_abi == arm_abi)
 > +      if (tdep && tdep->osabi == osabi)
 >  	return arches->gdbarch;
 >      }
 >  
 >    tdep = xmalloc (sizeof (struct gdbarch_tdep));
 >    gdbarch = gdbarch_alloc (&info, tdep);
 >  
 > -  tdep->arm_abi = arm_abi;
 > -  if (arm_abi < ARM_ABI_INVALID)
 > -    tdep->abi_name = arm_abi_names[arm_abi];
 > -  else
 > -    {
 > -      internal_error (__FILE__, __LINE__, "Invalid setting of arm_abi %d",
 > -		      (int) arm_abi);
 > -      tdep->abi_name = "<invalid>";
 > -    }
 > +  tdep->osabi = osabi;
 >  
 >    /* This is the way it has always defaulted.  */
 >    tdep->fp_model = ARM_FLOAT_FPA;
 > @@ -3047,38 +2815,7 @@
 >  					 arm_coff_make_msymbol_special);
 >  
 >    /* Hook in the ABI-specific overrides, if they have been registered.  */
 > -  if (arm_abi == ARM_ABI_UNKNOWN)
 > -    {
 > -      /* Don't complain about not knowing the ABI variant if we don't 
 > -	 have an inferior.  */
 > -      if (info.abfd)
 > -	fprintf_filtered
 > -	  (gdb_stderr, "GDB doesn't recognize the ABI of the inferior.  "
 > -	   "Attempting to continue with the default ARM settings");
 > -    }
 > -  else
 > -    {
 > -      for (abi_handler = arm_abi_handler_list; abi_handler != NULL;
 > -	   abi_handler = abi_handler->next)
 > -	if (abi_handler->abi == arm_abi)
 > -	  break;
 > -
 > -      if (abi_handler)
 > -	abi_handler->init_abi (info, gdbarch);
 > -      else
 > -	{
 > -	  /* We assume that if GDB_MULTI_ARCH is less than 
 > -	     GDB_MULTI_ARCH_TM that an ABI variant can be supported by
 > -	     overriding definitions in this file.  */
 > -	  if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
 > -	    fprintf_filtered
 > -	      (gdb_stderr,
 > -	       "A handler for the ABI variant \"%s\" is not built into this "
 > -	       "configuration of GDB.  "
 > -	       "Attempting to continue with the default ARM settings",
 > -	       arm_abi_names[arm_abi]);
 > -	}
 > -    }
 > +  gdbarch_init_osabi (info, gdbarch, osabi);
 >  
 >    /* Now we have tuned the configuration, set a few final things,
 >       based on what the OS ABI has told us.  */
 > @@ -3144,12 +2881,8 @@
 >    if (tdep == NULL)
 >      return;
 >  
 > -  if (tdep->abi_name != NULL)
 > -    fprintf_unfiltered (file, "arm_dump_tdep: ABI = %s\n", tdep->abi_name);
 > -  else
 > -    internal_error (__FILE__, __LINE__,
 > -		    "arm_dump_tdep: illegal setting of tdep->arm_abi (%d)",
 > -		    (int) tdep->arm_abi);
 > +  fprintf_unfiltered (file, "arm_dump_tdep: OS ABI = %s\n",
 > +		      gdbarch_osabi_name (tdep->osabi));
 >  
 >    fprintf_unfiltered (file, "arm_dump_tdep: Lowest pc = 0x%lx",
 >  		      (unsigned long) tdep->lowest_pc);
 > @@ -3192,9 +2925,12 @@
 >      gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
 >  
 >    /* Register some ABI variants for embedded systems.  */
 > -  arm_gdbarch_register_os_abi (ARM_ABI_EABI_V1, arm_init_abi_eabi_v1);
 > -  arm_gdbarch_register_os_abi (ARM_ABI_EABI_V2, arm_init_abi_eabi_v2);
 > -  arm_gdbarch_register_os_abi (ARM_ABI_APCS, arm_init_abi_apcs);
 > +  gdbarch_register_osabi (bfd_arch_arm, GDB_OSABI_ARM_EABI_V1,
 > +                          arm_init_abi_eabi_v1);
 > +  gdbarch_register_osabi (bfd_arch_arm, GDB_OSABI_ARM_EABI_V2,
 > +                          arm_init_abi_eabi_v2);
 > +  gdbarch_register_osabi (bfd_arch_arm, GDB_OSABI_ARM_APCS,
 > +                          arm_init_abi_apcs);
 >  
 >    tm_print_insn = gdb_print_insn_arm;
 >  
 > Index: arm-tdep.h
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/arm-tdep.h,v
 > retrieving revision 1.8
 > diff -u -r1.8 arm-tdep.h
 > --- arm-tdep.h	7 May 2002 12:58:51 -0000	1.8
 > +++ arm-tdep.h	17 May 2002 02:33:03 -0000
 > @@ -18,6 +18,8 @@
 >     Foundation, Inc., 59 Temple Place - Suite 330,
 >     Boston, MA 02111-1307, USA.  */
 >  
 > +#include "osabi.h"
 > +
 >  /* Register numbers of various important registers.  Note that some of
 >     these values are "real" register numbers, and correspond to the
 >     general registers of the machine, and some are "phony" register
 > @@ -104,23 +106,6 @@
 >  #define FLAG_C		0x20000000
 >  #define FLAG_V		0x10000000
 >  
 > -/* ABI variants that we know about.  If you add to this enum, please 
 > -   update the table of names in tm-arm.c.  */
 > -enum arm_abi
 > -{
 > -  ARM_ABI_UNKNOWN = 0,
 > -  ARM_ABI_EABI_V1,
 > -  ARM_ABI_EABI_V2,
 > -  ARM_ABI_LINUX,
 > -  ARM_ABI_NETBSD_AOUT,
 > -  ARM_ABI_NETBSD_ELF,
 > -  ARM_ABI_APCS,
 > -  ARM_ABI_FREEBSD,
 > -  ARM_ABI_WINCE,
 > -
 > -  ARM_ABI_INVALID	/* Keep this last.  */
 > -};
 > -
 >  /* Type of floating-point code in use by inferior.  There are really 3 models
 >     that are traditionally supported (plus the endianness issue), but gcc can
 >     only generate 2 of those.  The third is APCS_FLOAT, where arguments to
 > @@ -139,8 +124,7 @@
 >  /* Target-dependent structure in gdbarch.  */
 >  struct gdbarch_tdep
 >  {
 > -  enum arm_abi arm_abi;		/* OS/ABI of inferior.  */
 > -  const char *abi_name;		/* Name of the above.  */
 > +  enum gdb_osabi osabi;		/* OS/ABI of inferior.  */
 >  
 >    enum arm_float_model fp_model; /* Floating point calling conventions.  */
 >  
 > @@ -170,10 +154,3 @@
 >  CORE_ADDR thumb_get_next_pc (CORE_ADDR);
 >  
 >  CORE_ADDR arm_get_next_pc (CORE_ADDR);
 > -
 > -/* How a OS variant tells the ARM generic code that it can handle an ABI
 > -   type. */
 > -void
 > -arm_gdbarch_register_os_abi (enum arm_abi abi,
 > -			     void (*init_abi)(struct gdbarch_info,
 > -					      struct gdbarch *));
 > Index: armnbsd-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/armnbsd-tdep.c,v
 > retrieving revision 1.4
 > diff -u -r1.4 armnbsd-tdep.c
 > --- armnbsd-tdep.c	19 Feb 2002 19:20:31 -0000	1.4
 > +++ armnbsd-tdep.c	17 May 2002 02:33:03 -0000
 > @@ -77,9 +77,23 @@
 >    tdep->fp_model = ARM_FLOAT_SOFT_VFP;
 >  }
 >  
 > +static enum gdb_osabi
 > +arm_netbsd_aout_osabi_sniffer (bfd *abfd)
 > +{
 > +  if (strcmp (bfd_get_target (abfd), "a.out-arm-netbsd") == 0)
 > +    return GDB_OSABI_NETBSD_AOUT;
 > +
 > +  return GDB_OSABI_UNKNOWN;
 > +}
 > +
 >  void
 >  _initialize_arm_netbsd_tdep (void)
 >  {
 > -  arm_gdbarch_register_os_abi (ARM_ABI_NETBSD_AOUT, arm_netbsd_aout_init_abi);
 > -  arm_gdbarch_register_os_abi (ARM_ABI_NETBSD_ELF, arm_netbsd_elf_init_abi);
 > +  gdbarch_register_osabi_sniffer (bfd_arch_arm, bfd_target_aout_flavour,
 > +				  arm_netbsd_aout_osabi_sniffer);
 > +
 > +  gdbarch_register_osabi (bfd_arch_arm, GDB_OSABI_NETBSD_AOUT,
 > +                          arm_netbsd_aout_init_abi);
 > +  gdbarch_register_osabi (bfd_arch_arm, GDB_OSABI_NETBSD_ELF,
 > +                          arm_netbsd_elf_init_abi);
 >  }
 > Index: mips-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/mips-tdep.c,v
 > retrieving revision 1.73
 > diff -u -r1.73 mips-tdep.c
 > --- mips-tdep.c	11 May 2002 14:18:15 -0000	1.73
 > +++ mips-tdep.c	17 May 2002 02:33:13 -0000
 > @@ -38,6 +38,7 @@
 >  #include "target.h"
 >  #include "arch-utils.h"
 >  #include "regcache.h"
 > +#include "osabi.h"
 >  
 >  #include "opcode/mips.h"
 >  #include "elf/mips.h"
 > @@ -119,6 +120,7 @@
 >    {
 >      /* from the elf header */
 >      int elf_flags;
 > +
 >      /* mips options */
 >      enum mips_abi mips_abi;
 >      const char *mips_abi_string;
 > @@ -131,6 +133,8 @@
 >      int mips_default_stack_argsize;
 >      int gdb_target_is_mips64;
 >      int default_mask_address_p;
 > +
 > +    enum gdb_osabi osabi;
 >    };
 >  
 >  #if GDB_MULTI_ARCH
 > @@ -4132,6 +4136,7 @@
 >    struct gdbarch_tdep *tdep;
 >    int elf_flags;
 >    enum mips_abi mips_abi;
 > +  enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
 >  
 >    /* Reset the disassembly info, in case it was set to something
 >       non-default.  */
 > @@ -4139,12 +4144,18 @@
 >    tm_print_insn_info.arch = bfd_arch_unknown;
 >    tm_print_insn_info.mach = 0;
 >  
 > -  /* Extract the elf_flags if available */
 > -  if (info.abfd != NULL
 > -      && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
 > -    elf_flags = elf_elfheader (info.abfd)->e_flags;
 > -  else
 > -    elf_flags = 0;
 > +  elf_flags = 0;
 > +
 > +  if (info.abfd)
 > +    {
 > +      /* First of all, extract the elf_flags, if available.  */
 > +      if (bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
 > +	elf_flags = elf_elfheader (info.abfd)->e_flags;
 > +
 > +      /* Try to determine the OS ABI of the object we are loading.  If
 > +	 we end up with `unknown', just leave it that way.  */
 > +      osabi = gdbarch_lookup_osabi (info.abfd);
 > +    }
 >  
 >    /* Check ELF_FLAGS to see if it specifies the ABI being used. */
 >    switch ((elf_flags & EF_MIPS_ABI))
 > @@ -4215,13 +4226,15 @@
 >  	continue;
 >        if (gdbarch_tdep (arches->gdbarch)->mips_abi != mips_abi)
 >  	continue;
 > -      return arches->gdbarch;
 > +      if (gdbarch_tdep (arches->gdbarch)->osabi == osabi)
 > +        return arches->gdbarch;
 >      }
 >  
 >    /* Need a new architecture. Fill in a target specific vector. */
 >    tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
 >    gdbarch = gdbarch_alloc (&info, tdep);
 >    tdep->elf_flags = elf_flags;
 > +  tdep->osabi = osabi;
 >  
 >    /* Initially set everything according to the default ABI/ISA. */
 >    set_gdbarch_short_bit (gdbarch, 16);
 > @@ -4433,6 +4446,10 @@
 >    set_gdbarch_pointer_to_address (gdbarch, signed_pointer_to_address);
 >    set_gdbarch_address_to_pointer (gdbarch, address_to_signed_pointer);
 >    set_gdbarch_integer_to_address (gdbarch, mips_integer_to_address);
 > +
 > +  /* Hook in OS ABI-specific overrides, if they have been registered.  */
 > +  gdbarch_init_osabi (info, gdbarch, osabi);
 > +
 >    return gdbarch;
 >  }
 >  
 > @@ -4841,6 +4858,10 @@
 >    fprintf_unfiltered (file,
 >  		      "mips_dump_tdep: _PROC_MAGIC_ = %d\n",
 >  		      _PROC_MAGIC_);
 > +
 > +  fprintf_unfiltered (file,
 > +		      "mips_dump_tdep: OS ABI = %s\n",
 > +		      gdbarch_osabi_name (tdep->osabi));
 >  }
 >  
 >  void
 > Index: osabi.c
 > ===================================================================
 > RCS file: osabi.c
 > diff -N osabi.c
 > --- /dev/null	1 Jan 1970 00:00:00 -0000
 > +++ osabi.c	17 May 2002 02:33:14 -0000
 > @@ -0,0 +1,404 @@
 > +/* OS ABI variant handling for GDB.
 > +   Copyright 2001, 2002 Free Software Foundation, Inc.
 > +
 > +   This file is part of GDB.
 > +
 > +   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
 > +   the Free Software Foundation; either version 2 of the License, or
 > +   (at your option) any later version.
 > +
 > +   This program is distributed in the hope that it will be useful,  
 > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 > +   GNU General Public License for more details.
 > +  
 > +   You should have received a copy of the GNU General Public License
 > +   along with this program; if not, write to the Free Software
 > +   Foundation, Inc., 59 Temple Place - Suite 330,
 > +   Boston, MA 02111-1307, USA.  */
 > +
 > +#include "defs.h"
 > +#include "osabi.h"
 > +
 > +#include "elf-bfd.h"
 > +
 > +
 > +/* This table matches the indices assigned to enum gdb_osabi.  Keep
 > +   them in sync.  */
 > +static const char * const gdb_osabi_names[] =
 > +{
 > +  "<unknown>",
 > +
 > +  "SVR4",
 > +  "GNU Hurd",
 > +  "Solaris",
 > +  "OSF/1",
 > +  "GNU/Linux",
 > +  "FreeBSD a.out",
 > +  "FreeBSD ELF",
 > +  "NetBSD a.out",
 > +  "NetBSD ELF",
 > +  "Windows CE",
 > +
 > +  "ARM EABI v1",
 > +  "ARM EABI v2",
 > +  "ARM APCS",
 > +
 > +  "<invalid>"
 > +};
 > +
 > +const char *
 > +gdbarch_osabi_name (enum gdb_osabi osabi)
 > +{
 > +  if (osabi >= GDB_OSABI_UNKNOWN && osabi < GDB_OSABI_INVALID)
 > +    return gdb_osabi_names[osabi];
 > +
 > +  return gdb_osabi_names[GDB_OSABI_INVALID];
 > +}
 > +
 > +/* Handler for a given architecture/OS ABI pair.  There should be only
 > +   one handler for a given OS ABI each architecture family.  */
 > +struct gdb_osabi_handler  
 > +{
 > +  struct gdb_osabi_handler *next;
 > +  enum bfd_architecture arch;
 > +  enum gdb_osabi osabi;
 > +  void (*init_osabi)(struct gdbarch_info, struct gdbarch *);
 > +};
 > +
 > +static struct gdb_osabi_handler *gdb_osabi_handler_list;
 > +
 > +void
 > +gdbarch_register_osabi (enum bfd_architecture arch, enum gdb_osabi osabi,
 > +                        void (*init_osabi)(struct gdbarch_info,
 > +					   struct gdbarch *))
 > +{
 > +  struct gdb_osabi_handler **handler_p;
 > +
 > +  /* Registering an OS ABI handler for "unknown" is not allowed.  */
 > +  if (osabi == GDB_OSABI_UNKNOWN)
 > +    {
 > +      internal_error
 > +	(__FILE__, __LINE__,
 > +	 "gdbarch_register_osabi: An attempt to register a handler for "
 > +         "OS ABI \"%s\" for architecture %s was made.  The handler will "
 > +	 "not be registered",
 > +	 gdbarch_osabi_name (osabi),
 > +	 bfd_printable_arch_mach (arch, 0));
 > +      return;
 > +    }
 > +
 > +  for (handler_p = &gdb_osabi_handler_list; *handler_p != NULL;
 > +       handler_p = &(*handler_p)->next)
 > +    {
 > +      if ((*handler_p)->arch == arch
 > +	  && (*handler_p)->osabi == osabi)
 > +	{
 > +	  internal_error
 > +	    (__FILE__, __LINE__,
 > +	     "gdbarch_register_osabi: A handler for OS ABI \"%s\" "
 > +	     "has already been registered for architecture %s",
 > +	     gdbarch_osabi_name (osabi),
 > +	     bfd_printable_arch_mach (arch, 0));
 > +	  /* If user wants to continue, override previous definition.  */
 > +	  (*handler_p)->init_osabi = init_osabi;
 > +	  return;
 > +	}
 > +    }
 > +
 > +  (*handler_p)
 > +    = (struct gdb_osabi_handler *) xmalloc (sizeof (struct gdb_osabi_handler));
 > +  (*handler_p)->next = NULL;
 > +  (*handler_p)->arch = arch;
 > +  (*handler_p)->osabi = osabi;
 > +  (*handler_p)->init_osabi = init_osabi;
 > +}
 > +
 > +
 > +/* Sniffer to find the OS ABI for a given file's architecture and flavour. 
 > +   It is legal to have multiple sniffers for each arch/flavour pair, to
 > +   disambiguate one OS's a.out from another, for example.  The first sniffer
 > +   to return something other than GDB_OSABI_UNKNOWN wins, so a sniffer should
 > +   be careful to claim a file only if it knows for sure what it is.  */
 > +struct gdb_osabi_sniffer
 > +{
 > +  struct gdb_osabi_sniffer *next;
 > +  enum bfd_architecture arch;   /* bfd_arch_unknown == wildcard */
 > +  enum bfd_flavour flavour;
 > +  enum gdb_osabi (*sniffer)(bfd *);
 > +};
 > +
 > +static struct gdb_osabi_sniffer *gdb_osabi_sniffer_list;
 > +
 > +void
 > +gdbarch_register_osabi_sniffer (enum bfd_architecture arch,
 > +                                enum bfd_flavour flavour,
 > +				enum gdb_osabi (*sniffer_fn)(bfd *))
 > +{
 > +  struct gdb_osabi_sniffer *sniffer;
 > +
 > +  sniffer =
 > +    (struct gdb_osabi_sniffer *) xmalloc (sizeof (struct gdb_osabi_sniffer));
 > +  sniffer->arch = arch;
 > +  sniffer->flavour = flavour;
 > +  sniffer->sniffer = sniffer_fn;
 > +
 > +  sniffer->next = gdb_osabi_sniffer_list;
 > +  gdb_osabi_sniffer_list = sniffer;
 > +}
 > +
 > +
 > +enum gdb_osabi
 > +gdbarch_lookup_osabi (bfd *abfd)
 > +{
 > +  struct gdb_osabi_sniffer *sniffer;
 > +  enum gdb_osabi osabi, match;
 > +
 > +  match = GDB_OSABI_UNKNOWN;
 > +
 > +  for (sniffer = gdb_osabi_sniffer_list; sniffer != NULL;
 > +       sniffer = sniffer->next)
 > +    {
 > +      if ((sniffer->arch == bfd_arch_unknown /* wildcard */
 > +	   || sniffer->arch == bfd_get_arch (abfd))
 > +	  && sniffer->flavour == bfd_get_flavour (abfd))
 > +	{
 > +	  osabi = (*sniffer->sniffer) (abfd);
 > +	  if (osabi < GDB_OSABI_UNKNOWN || osabi >= GDB_OSABI_INVALID)
 > +	    {
 > +	      internal_error
 > +		(__FILE__, __LINE__,
 > +		 "gdbarch_lookup_osabi: invalid OS ABI (%d) from sniffer "
 > +		 "for architecture %s flavour %d",
 > +		 (int) osabi,
 > +		 bfd_printable_arch_mach (bfd_get_arch (abfd), 0),
 > +		 (int) bfd_get_flavour (abfd));
 > +	    }
 > +	  else if (osabi != GDB_OSABI_UNKNOWN)
 > +	    {
 > +	      /* Croak on multiple match.  If the user wishes to
 > +		 continue, we'll use the first match.  */
 > +	      if (match != GDB_OSABI_UNKNOWN)
 > +		internal_error
 > +		  (__FILE__, __LINE__,
 > +		   "gdbarch_lookup_osabi: multiple OS ABI match for "
 > +		   "architecture %s flavour %d: first match \"%s\", second "
 > +		   "match \"%s\"",
 > +		   bfd_printable_arch_mach (bfd_get_arch (abfd), 0),
 > +		   (int) bfd_get_flavour (abfd),
 > +		   gdbarch_osabi_name (match),
 > +		   gdbarch_osabi_name (osabi));
 > +	      else
 > +		match = osabi;
 > +	    }
 > +	}
 > +    }
 > +
 > +  return match;
 > +}
 > +
 > +void
 > +gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch,
 > +                    enum gdb_osabi osabi)
 > +{
 > +  struct gdb_osabi_handler *handler;
 > +  bfd *abfd = info.abfd;
 > +  const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch);
 > +
 > +  if (osabi == GDB_OSABI_UNKNOWN)
 > +    {
 > +      /* Don't complain about not knowing the OS ABI if we don't
 > +	 have an inferior.  */
 > +      if (info.abfd)
 > +	fprintf_filtered
 > +	  (gdb_stderr, "GDB doesn't recognize the OS ABI of the inferior.  "
 > +	   "Attempting to continue with the default %s settings",
 > +	   bfd_printable_arch_mach (arch_info->arch, arch_info->mach));
 > +      return;
 > +    }
 > +
 > +  for (handler = gdb_osabi_handler_list; handler != NULL;
 > +       handler = handler->next)
 > +    {
 > +      if (handler->arch == bfd_get_arch (abfd)
 > +	  && handler->osabi == osabi)
 > +	{
 > +	  (*handler->init_osabi) (info, gdbarch);
 > +	  return;
 > +	}
 > +    }
 > +
 > +  /* We assume that if GDB_MULTI_ARCH is less than GDB_MULTI_ARCH_TM
 > +     that an ABI variant can be supported by overriding definitions in
 > +     the tm-file.  */
 > +  if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
 > +    fprintf_filtered
 > +      (gdb_stderr,
 > +       "A handler for the OS ABI \"%s\" is not built into this "
 > +       "configuration of GDB.  "
 > +       "Attempting to continue with the default %s settings",
 > +       gdbarch_osabi_name (osabi),
 > +       bfd_printable_arch_mach (arch_info->arch, arch_info->mach));
 > +}
 > +
 > +
 > +/* Generic sniffer for ELF flavoured files.  */
 > +
 > +static void
 > +process_note_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
 > +{
 > +  enum gdb_osabi *os_ident_ptr = obj;
 > +  const char *name;
 > +  unsigned int sectsize;
 > +
 > +  name = bfd_get_section_name (abfd, sect);
 > +  sectsize = bfd_section_size (abfd, sect);
 > +
 > +  /* .note.ABI-tag notes, used by GNU/Linux and FreeBSD.  */
 > +  if (strcmp (name, ".note.ABI-tag") == 0 && sectsize > 0)
 > +    {
 > +      unsigned int name_length, data_length, note_type;
 > +      char *note;
 > +
 > +      /* If the section is larger than this, it's probably not what we are
 > +	 looking for.  */
 > +      if (sectsize > 128)
 > +	sectsize = 128;
 > +
 > +      note = alloca (sectsize);
 > +
 > +      bfd_get_section_contents (abfd, sect, note,
 > +				(file_ptr) 0, (bfd_size_type) sectsize);
 > +
 > +      name_length = bfd_h_get_32 (abfd, note);
 > +      data_length = bfd_h_get_32 (abfd, note + 4);
 > +      note_type   = bfd_h_get_32 (abfd, note + 8);
 > +
 > +      if (name_length == 4 && data_length == 16 && note_type == NT_GNU_ABI_TAG
 > +	  && strcmp (note + 12, "GNU") == 0)
 > +	{
 > +	  int os_number = bfd_h_get_32 (abfd, note + 16);
 > +
 > +	  switch (os_number)
 > +	    {
 > +	    case GNU_ABI_TAG_LINUX:
 > +	      *os_ident_ptr = GDB_OSABI_LINUX;
 > +	      break;
 > +
 > +	    case GNU_ABI_TAG_HURD:
 > +	      *os_ident_ptr = GDB_OSABI_HURD;
 > +	      break;
 > +
 > +	    case GNU_ABI_TAG_SOLARIS:
 > +	      *os_ident_ptr = GDB_OSABI_SOLARIS;
 > +	      break;
 > +
 > +	    default:
 > +	      internal_error
 > +		(__FILE__, __LINE__,
 > +		 "process_note_abi_sections: unknown OS number %d",
 > +		 os_number);
 > +	    }
 > +	  return;
 > +	}
 > +      else if (name_length == 8 && data_length == 4
 > +	       && note_type == NT_FREEBSD_ABI_TAG
 > +	       && strcmp (note + 12, "FreeBSD") == 0)
 > +	{
 > +	  /* XXX Should we check the version here?  Probably not
 > +	     necessary yet.  */
 > +	  *os_ident_ptr = GDB_OSABI_FREEBSD_ELF;
 > +	}
 > +      return;
 > +    }
 > +
 > +  /* .note.netbsd.ident notes, used by NetBSD.  */
 > +  if (strcmp (name, ".note.netbsd.ident") == 0 && sectsize > 0)
 > +    {
 > +      unsigned int name_length, data_length, note_type;
 > +      char *note;
 > +
 > +      /* If the section is larger than this, it's probably not what we are
 > +	 looking for.  */
 > +      if (sectsize > 128) 
 > +	sectsize = 128;
 > +
 > +      note = alloca (sectsize);
 > +
 > +      bfd_get_section_contents (abfd, sect, note,
 > +				(file_ptr) 0, (bfd_size_type) sectsize);
 > +      
 > +      name_length = bfd_h_get_32 (abfd, note);
 > +      data_length = bfd_h_get_32 (abfd, note + 4);
 > +      note_type   = bfd_h_get_32 (abfd, note + 8);
 > +
 > +      if (name_length == 7 && data_length == 4 && note_type == NT_NETBSD_IDENT
 > +	  && strcmp (note + 12, "NetBSD") == 0)
 > +	{
 > +	  /* XXX Should we check the version here?  Probably not
 > +	     necessary yet.  */
 > +	  *os_ident_ptr = GDB_OSABI_NETBSD_ELF;
 > +	}
 > +      return;
 > +    }
 > +}
 > +
 > +static enum gdb_osabi
 > +generic_elf_osabi_sniffer (bfd *abfd)
 > +{
 > +  int elfosabi;
 > +  enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
 > +
 > +  elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
 > +
 > +  switch (elfosabi)
 > +    {
 > +    case ELFOSABI_NONE:
 > +      /* When elfosabi is ELFOSABI_NONE (0), this is supposed to indicate
 > +	 that we're on a SVR4 system.  However, some systems use note sections
 > +	 to record OS/ABI info, but leave e_ident[EI_OSABI] zero.  So we
 > +	 have to check the note sections, too.  */
 > +      bfd_map_over_sections (abfd,
 > +			     process_note_abi_tag_sections,
 > +			     &osabi);
 > +      break;
 > +
 > +    case ELFOSABI_FREEBSD:
 > +      osabi = GDB_OSABI_FREEBSD_ELF;
 > +      break;
 > +
 > +    case ELFOSABI_NETBSD:
 > +      osabi = GDB_OSABI_NETBSD_ELF;
 > +      break;
 > +
 > +    case ELFOSABI_LINUX:
 > +      osabi = GDB_OSABI_LINUX;
 > +      break;
 > +
 > +    case ELFOSABI_HURD:
 > +      osabi = GDB_OSABI_HURD;
 > +      break;
 > +
 > +    case ELFOSABI_SOLARIS:
 > +      osabi = GDB_OSABI_SOLARIS;
 > +      break;
 > +    }
 > +
 > +  return osabi;
 > +}
 > +
 > +
 > +void
 > +_initialize_gdb_osabi (void)
 > +{
 > +  if (strcmp (gdb_osabi_names[GDB_OSABI_INVALID], "<invalid>") != 0)
 > +    internal_error
 > +      (__FILE__, __LINE__,
 > +       "_initialize_gdb_osabi: gdb_osabi_names[] is inconsistent");
 > +
 > +  /* Register a generic sniffer for ELF flavoured files.  */
 > +  gdbarch_register_osabi_sniffer (bfd_arch_unknown,
 > +				  bfd_target_elf_flavour,
 > +				  generic_elf_osabi_sniffer);
 > +}
 > Index: osabi.h
 > ===================================================================
 > RCS file: osabi.h
 > diff -N osabi.h
 > --- /dev/null	1 Jan 1970 00:00:00 -0000
 > +++ osabi.h	17 May 2002 02:33:14 -0000
 > @@ -0,0 +1,73 @@
 > +/* OS ABI variant handling for GDB.
 > +   Copyright 2001, 2002 Free Software Foundation, Inc.
 > +   
 > +   This file is part of GDB.
 > +
 > +   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
 > +   the Free Software Foundation; either version 2 of the License, or
 > +   (at your option) any later version.
 > +
 > +   This program is distributed in the hope that it will be useful,
 > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 > +   GNU General Public License for more details.
 > +
 > +   You should have received a copy of the GNU General Public License
 > +   along with this program; if not, write to the Free Software
 > +   Foundation, Inc., 59 Temple Place - Suite 330,
 > +   Boston, MA 02111-1307, USA.  */
 > +
 > +#ifndef OSABI_H
 > +#define OSABI_H
 > +
 > +/* List of known OS ABIs.  If you change this, make sure to update the
 > +   table in osabi.c.  */
 > +enum gdb_osabi
 > +{
 > +  GDB_OSABI_UNKNOWN = 0,	/* keep this first */
 > +
 > +  GDB_OSABI_SVR4,
 > +  GDB_OSABI_HURD,
 > +  GDB_OSABI_SOLARIS,
 > +  GDB_OSABI_OSF1,
 > +  GDB_OSABI_LINUX,
 > +  GDB_OSABI_FREEBSD_AOUT,
 > +  GDB_OSABI_FREEBSD_ELF,
 > +  GDB_OSABI_NETBSD_AOUT,
 > +  GDB_OSABI_NETBSD_ELF,
 > +  GDB_OSABI_WINCE,
 > +
 > +  GDB_OSABI_ARM_EABI_V1,
 > +  GDB_OSABI_ARM_EABI_V2,
 > +  GDB_OSABI_ARM_APCS,
 > +
 > +  GDB_OSABI_INVALID		/* keep this last */
 > +};
 > +
 > +/* Register an OS ABI sniffer.  Each arch/flavour may have more than
 > +   one sniffer.  This is used to e.g. differentiate one OS's a.out from
 > +   another.  The first sniffer to return something other than
 > +   GDB_OSABI_UNKNOWN wins, so a sniffer should be careful to claim a file
 > +   only if it knows for sure what it is.  */
 > +void gdbarch_register_osabi_sniffer (enum bfd_architecture,
 > +				     enum bfd_flavour,
 > +				     enum gdb_osabi (*)(bfd *));
 > +
 > +/* Register a handler for an OS ABI variant for a given architecture.  There
 > +   should be only one handler for a given OS ABI each architecture family.  */
 > +void gdbarch_register_osabi (enum bfd_architecture, enum gdb_osabi,
 > +                             void (*)(struct gdbarch_info,
 > +				      struct gdbarch *));
 > +
 > +/* Lookup the OS ABI corresponding to the specified BFD.  */
 > +enum gdb_osabi gdbarch_lookup_osabi (bfd *);
 > +
 > +/* Initialize the gdbarch for the specified OS ABI variant.  */
 > +void gdbarch_init_osabi (struct gdbarch_info, struct gdbarch *,
 > +                         enum gdb_osabi);
 > +
 > +/* Return the name of the specified OS ABI.  */
 > +const char *gdbarch_osabi_name (enum gdb_osabi);
 > +
 > +#endif /* OSABI_H */
 > Index: sh-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/sh-tdep.c,v
 > retrieving revision 1.58
 > diff -u -r1.58 sh-tdep.c
 > --- sh-tdep.c	10 May 2002 23:59:09 -0000	1.58
 > +++ sh-tdep.c	17 May 2002 02:33:21 -0000
 > @@ -41,6 +41,8 @@
 >  #include "regcache.h"
 >  #include "doublest.h"
 >  
 > +#include "sh-tdep.h"
 > +
 >  #include "elf-bfd.h"
 >  #include "solib-svr4.h"
 >  
 > @@ -4198,175 +4200,6 @@
 >  #endif /* SVR4_SHARED_LIBS */
 >  
 >  
 > -/* This table matches the indices assigned to enum sh_osabi.  Keep
 > -   them in sync.  */
 > -static const char * const sh_osabi_names[] =
 > -{
 > -  "<unknown>",
 > -  "GNU/Linux",
 > -  "NetBSD ELF",
 > -  NULL
 > -};
 > -
 > -static void
 > -process_note_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
 > -{
 > -  enum sh_osabi *os_ident_ptr = obj;
 > -  const char *name;
 > -  unsigned int sectsize;
 > -
 > -  name = bfd_get_section_name (abfd, sect);
 > -  sectsize = bfd_section_size (abfd, sect);
 > -
 > -  if (strcmp (name, ".note.ABI-tag") == 0 && sectsize > 0)
 > -    {
 > -      unsigned int name_length, data_length, note_type;
 > -      char *note;
 > -
 > -      /* If the section is larger than this, it's probably not what we are
 > -	 looking for.  */
 > -      if (sectsize > 128)
 > -	sectsize = 128;
 > -
 > -      note = alloca (sectsize);
 > -
 > -      bfd_get_section_contents (abfd, sect, note,
 > -				(file_ptr) 0, (bfd_size_type) sectsize);
 > -
 > -      name_length = bfd_h_get_32 (abfd, note);
 > -      data_length = bfd_h_get_32 (abfd, note + 4);
 > -      note_type   = bfd_h_get_32 (abfd, note + 8);
 > -
 > -      if (name_length == 4 && data_length == 16 && note_type == NT_GNU_ABI_TAG
 > -	  && strcmp (note + 12, "GNU") == 0)
 > -	{
 > -	  int os_number = bfd_h_get_32 (abfd, note + 16);
 > -
 > -	  /* The case numbers are from abi-tags in glibc.  */
 > -	  switch (os_number)
 > -	    {
 > -	    case GNU_ABI_TAG_LINUX:
 > -	      *os_ident_ptr = SH_OSABI_LINUX;
 > -	      break;
 > -
 > -	    case GNU_ABI_TAG_HURD:
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: Hurd objects not supported");
 > -	      break;
 > -
 > -	    case GNU_ABI_TAG_SOLARIS:
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: Solaris objects not supported");
 > -	      break;
 > -
 > -	    default:
 > -	      internal_error
 > -		(__FILE__, __LINE__,
 > -		 "process_note_abi_sections: unknown OS number %d",
 > -		 os_number);
 > -	    }
 > -	}
 > -    }
 > -  /* NetBSD uses a similar trick.  */
 > -  else if (strcmp (name, ".note.netbsd.ident") == 0 && sectsize > 0)
 > -    {
 > -      unsigned int name_length, desc_length, note_type;
 > -      char *note;
 > -
 > -      /* If the section is larger than this, it's probably not what we are
 > -	 looking for.  */
 > -      if (sectsize > 128)
 > -	sectsize = 128;
 > -
 > -      note = alloca (sectsize);
 > -
 > -      bfd_get_section_contents (abfd, sect, note,
 > -				(file_ptr) 0, (bfd_size_type) sectsize);
 > -
 > -      name_length = bfd_h_get_32 (abfd, note);
 > -      desc_length = bfd_h_get_32 (abfd, note + 4);
 > -      note_type   = bfd_h_get_32 (abfd, note + 8);
 > -
 > -      if (name_length == 7 && desc_length == 4 && note_type == NT_NETBSD_IDENT
 > -	  && strcmp (note + 12, "NetBSD") == 0)
 > -	/* XXX Should we check the version here?
 > -	   Probably not necessary yet.  */
 > -	*os_ident_ptr = SH_OSABI_NETBSD_ELF;
 > -    }
 > -}
 > -
 > -static int
 > -get_elfosabi (bfd *abfd)
 > -{
 > -  int elfosabi;
 > -  enum sh_osabi sh_osabi = SH_OSABI_UNKNOWN;
 > -
 > -  elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
 > -
 > -  switch (elfosabi)
 > -    {
 > -    case ELFOSABI_NONE:
 > -      /* When elfosabi is 0 (ELFOSABI_NONE), this is supposed to indicate
 > -	 that we're on a SYSV system.  However, some systems use note sections
 > -	 to record OS/ABI info, but leave e_ident[EI_OSABI] zero.  So we
 > -	 have to check the note sections too.  */
 > -      bfd_map_over_sections (abfd,
 > -			     process_note_abi_tag_sections,
 > -			     &sh_osabi);
 > -      break;
 > -
 > -    case ELFOSABI_NETBSD:
 > -      sh_osabi = SH_OSABI_NETBSD_ELF;
 > -      break;
 > -
 > -    case ELFOSABI_LINUX:
 > -      sh_osabi = SH_OSABI_LINUX;
 > -      break;
 > -    }
 > -
 > -  return (sh_osabi);
 > -}
 > -
 > -struct sh_osabi_handler
 > -{
 > -  struct sh_osabi_handler *next;
 > -  enum sh_osabi abi;
 > -  void (*init_osabi)(struct gdbarch_info, struct gdbarch *);
 > -};
 > -
 > -struct sh_osabi_handler *sh_osabi_handler_list = NULL;
 > -
 > -void
 > -sh_gdbarch_register_os_abi (enum sh_osabi abi,
 > -                            void (*init_osabi)(struct gdbarch_info,
 > -					       struct gdbarch *))
 > -{
 > -  struct sh_osabi_handler **handler_p;
 > -
 > -  for (handler_p = &sh_osabi_handler_list; *handler_p != NULL;
 > -       handler_p = &(*handler_p)->next)
 > -    {
 > -      if ((*handler_p)->abi == abi)
 > -	{
 > -	  internal_error
 > -	    (__FILE__, __LINE__,
 > -	     "sh_gdbarch_register_os_abi: A handler for this ABI variant "
 > -	     "(%d) has already been registered", (int) abi);
 > -	  /* If user wants to continue, override previous definition.  */
 > -	  (*handler_p)->init_osabi = init_osabi;
 > -	  return;
 > -	}
 > -    }
 > -
 > -  (*handler_p)
 > -    = (struct sh_osabi_handler *) xmalloc (sizeof (struct sh_osabi_handler));
 > -  (*handler_p)->next = NULL;
 > -  (*handler_p)->abi = abi;
 > -  (*handler_p)->init_osabi = init_osabi;
 > -}
 > -
 >  static gdbarch_init_ftype sh_gdbarch_init;
 >  
 >  static struct gdbarch *
 > @@ -4378,23 +4211,14 @@
 >    gdbarch_register_name_ftype *sh_register_name;
 >    gdbarch_store_return_value_ftype *sh_store_return_value;
 >    gdbarch_register_virtual_type_ftype *sh_register_virtual_type;
 > -  enum sh_osabi sh_osabi = SH_OSABI_UNKNOWN;
 > -  struct sh_osabi_handler *osabi_handler;
 > +  enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
 >  
 >    /* Try to determine the ABI of the object we are loading.  */
 >  
 >    if (info.abfd != NULL)
 >      {
 > -      switch (bfd_get_flavour (info.abfd))
 > -	{
 > -	case bfd_target_elf_flavour:
 > -	  sh_osabi = get_elfosabi (info.abfd);
 > -	  break;
 > -
 > -	default:
 > -	  /* Just leave it as "unkown".  */
 > -	  break;
 > -	}
 > +      osabi = gdbarch_lookup_osabi (info.abfd);
 > +      /* If we get "unknown" back, just leave it that way.  */
 >      }
 >  
 >    /* Find a candidate among the list of pre-declared architectures. */
 > @@ -4404,7 +4228,7 @@
 >      {
 >        /* Make sure the ABI selection matches.  */
 >        tdep = gdbarch_tdep (arches->gdbarch);
 > -      if (tdep && tdep->sh_osabi == sh_osabi)
 > +      if (tdep && tdep->osabi == osabi)
 >  	return arches->gdbarch;
 >      }
 >  
 > @@ -4413,15 +4237,7 @@
 >    tdep = XMALLOC (struct gdbarch_tdep);
 >    gdbarch = gdbarch_alloc (&info, tdep);
 >  
 > -  tdep->sh_osabi = sh_osabi;
 > -  if (sh_osabi < SH_OSABI_INVALID)
 > -    tdep->osabi_name = sh_osabi_names[sh_osabi];
 > -  else
 > -    {
 > -      internal_error (__FILE__, __LINE__, "Invalid setting of sh_osabi %d",
 > -		      (int) sh_osabi);
 > -      tdep->osabi_name = "<invalid>";
 > -    }
 > +  tdep->osabi = osabi;
 >  
 >    /* Initialize the register numbers that are not common to all the
 >       variants to -1, if necessary thse will be overwritten in the case
 > @@ -4774,32 +4590,11 @@
 >    set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
 >    set_gdbarch_believe_pcc_promotion (gdbarch, 1);
 >  
 > -  /* Hook in ABI-specific overrides, if they have been registered.  If
 > -     the ABI is unknown, this is probably an embedded target, so we
 > -     should not warn about this situation.  */
 > -  if (sh_osabi != SH_OSABI_UNKNOWN)
 > -    {
 > -      for (osabi_handler = sh_osabi_handler_list; osabi_handler != NULL;
 > -	   osabi_handler = osabi_handler->next)
 > -	if (osabi_handler->abi == sh_osabi)
 > -	  break;
 > +  /* Hook in ABI-specific overrides, if they have been registered.
 >  
 > -      if (osabi_handler)
 > -        osabi_handler->init_osabi (info, gdbarch);
 > -      else
 > -        {
 > -	  /* We assume that if GDB_MULTI_ARCH is less than
 > -	     GDB_MULTI_ARCH_TM that an ABI variant can be supported by 
 > -	     overriding definitions in this file.  */
 > -	  if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) 
 > -	    fprintf_filtered
 > -	      (gdb_stderr,
 > -	       "A handler for the ABI variant \"%s\" is not built into this "
 > -	       "configuration of GDB.  "
 > -	       "Attempting to continue with the default SuperH settings",
 > -	       sh_osabi_names[sh_osabi]);
 > -        }
 > -    }
 > +     FIXME: if the ABI is unknown, this is probably an embedded target,
 > +     so we should not warn about this situation.  */
 > +  gdbarch_init_osabi (info, gdbarch, osabi);
 >  
 >    return gdbarch;
 >  }
 > @@ -4812,12 +4607,8 @@
 >    if (tdep == NULL)
 >      return;
 >  
 > -  if (tdep->osabi_name != NULL)
 > -    fprintf_unfiltered (file, "sh_dump_tdep: OS ABI = %s\n", tdep->osabi_name);
 > -  else
 > -    internal_error (__FILE__, __LINE__,
 > -		    "sh_dump_tdep: illegal setting of tdep->sh_osabi (%d)",
 > -		    (int) tdep->sh_osabi);
 > +  fprintf_unfiltered (file, "sh_dump_tdep: OS ABI = %s\n",
 > +                      gdbarch_osabi_name (tdep->osabi));
 >  }
 >  
 >  void
 > Index: sh-tdep.h
 > ===================================================================
 > RCS file: sh-tdep.h
 > diff -N sh-tdep.h
 > --- /dev/null	1 Jan 1970 00:00:00 -0000
 > +++ sh-tdep.h	17 May 2002 02:33:21 -0000
 > @@ -0,0 +1,111 @@
 > +/* Target-specific definition for a Hitachi Super-H.
 > +   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 > +   Free Software Foundation, Inc.
 > +
 > +   This file is part of GDB.
 > +
 > +   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
 > +   the Free Software Foundation; either version 2 of the License, or
 > +   (at your option) any later version.
 > +
 > +   This program is distributed in the hope that it will be useful,
 > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 > +   GNU General Public License for more details.
 > +
 > +   You should have received a copy of the GNU General Public License
 > +   along with this program; if not, write to the Free Software
 > +   Foundation, Inc., 59 Temple Place - Suite 330,
 > +   Boston, MA 02111-1307, USA.  */
 > +
 > +#ifndef SH_TDEP_H
 > +#define SH_TDEP_H
 > +
 > +#include "osabi.h"
 > +
 > +/* Contributed by Steve Chamberlain sac@cygnus.com */
 > +
 > +/* Information that is dependent on the processor variant. */
 > +
 > +enum sh_abi
 > +  {
 > +    SH_ABI_UNKNOWN,
 > +    SH_ABI_32,
 > +    SH_ABI_64
 > +  };
 > +
 > +struct gdbarch_tdep
 > +  {
 > +    int PR_REGNUM;
 > +    int FPUL_REGNUM;  /*                       sh3e, sh4 */
 > +    int FPSCR_REGNUM; /*                       sh3e, sh4 */
 > +    int SR_REGNUM;    /* sh-dsp, sh3, sh3-dsp, sh3e, sh4 */
 > +    int DSR_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > +    int FP_LAST_REGNUM; /*                     sh3e, sh4 */
 > +    int A0G_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > +    int A0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int A1G_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > +    int A1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int M0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int M1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int X0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int X1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int Y0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int Y1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int MOD_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > +    int SSR_REGNUM;   /*         sh3, sh3-dsp, sh3e, sh4 */
 > +    int SPC_REGNUM;   /*         sh3, sh3-dsp, sh3e, sh4 */
 > +    int RS_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int RE_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > +    int DR0_REGNUM;   /*                             sh4 */
 > +    int DR_LAST_REGNUM; /*                           sh4 */
 > +    int FV0_REGNUM;   /*                             sh4 */
 > +    int FV_LAST_REGNUM; /*                           sh4 */
 > +    /* FPP stands for Floating Point Pair, to avoid confusion with
 > +       GDB's FP0_REGNUM, which is the number of the first Floating
 > +       point register. Unfortunately on the sh5, the floating point
 > +       registers are called FR, and the floating point pairs are called FP. */
 > +    int TR7_REGNUM;       /*                            sh5-media*/
 > +    int FPP0_REGNUM;      /*                            sh5-media*/
 > +    int FPP_LAST_REGNUM;  /*                            sh5-media*/
 > +    int R0_C_REGNUM;      /*                            sh5-compact*/
 > +    int R_LAST_C_REGNUM;  /*                            sh5-compact*/
 > +    int PC_C_REGNUM;      /*                            sh5-compact*/
 > +    int GBR_C_REGNUM;     /*                            sh5-compact*/
 > +    int MACH_C_REGNUM;    /*                            sh5-compact*/
 > +    int MACL_C_REGNUM;    /*                            sh5-compact*/
 > +    int PR_C_REGNUM;      /*                            sh5-compact*/
 > +    int T_C_REGNUM;       /*                            sh5-compact*/
 > +    int FPSCR_C_REGNUM;   /*                            sh5-compact*/
 > +    int FPUL_C_REGNUM;    /*                            sh5-compact*/
 > +    int FP0_C_REGNUM;     /*                            sh5-compact*/
 > +    int FP_LAST_C_REGNUM; /*                            sh5-compact*/
 > +    int DR0_C_REGNUM;     /*                            sh5-compact*/
 > +    int DR_LAST_C_REGNUM; /*                            sh5-compact*/
 > +    int FV0_C_REGNUM;     /*                            sh5-compact*/
 > +    int FV_LAST_C_REGNUM; /*                            sh5-compact*/
 > +    int ARG0_REGNUM;
 > +    int ARGLAST_REGNUM;
 > +    int FLOAT_ARGLAST_REGNUM;
 > +    int RETURN_REGNUM;
 > +    enum gdb_osabi osabi;      /* OS/ABI of the inferior */
 > +    enum sh_abi sh_abi;
 > +  };
 > +
 > +/* Registers common to all the SH variants. */
 > +enum
 > +  {
 > +    R0_REGNUM = 0,
 > +    STRUCT_RETURN_REGNUM = 2,
 > +    ARG0_REGNUM = 4, /* Used in h8300-tdep.c */
 > +    ARGLAST_REGNUM = 7, /* Used in h8300-tdep.c */
 > +    PR_REGNUM = 17, /* used in sh3-rom.c */
 > +    GBR_REGNUM = 18,
 > +    VBR_REGNUM = 19,
 > +    MACH_REGNUM = 20,
 > +    MACL_REGNUM = 21,
 > +    SR_REGNUM = 22
 > +  };
 > +
 > +#endif /* SH_TDEP_H */
 > Index: sh3-rom.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/sh3-rom.c,v
 > retrieving revision 1.11
 > diff -u -r1.11 sh3-rom.c
 > --- sh3-rom.c	15 Jul 2001 20:34:14 -0000	1.11
 > +++ sh3-rom.c	17 May 2002 02:33:21 -0000
 > @@ -28,6 +28,8 @@
 >  #include "arch-utils.h"
 >  #include "regcache.h"
 >  
 > +#include "sh-tdep.h"
 > +
 >  static struct serial *parallel;
 >  static int parallel_in_use;
 >  
 > Index: shnbsd-tdep.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/shnbsd-tdep.c,v
 > retrieving revision 1.3
 > diff -u -r1.3 shnbsd-tdep.c
 > --- shnbsd-tdep.c	11 May 2002 22:14:19 -0000	1.3
 > +++ shnbsd-tdep.c	17 May 2002 02:33:21 -0000
 > @@ -25,6 +25,7 @@
 >  #include "value.h"
 >  
 >  #include "nbsd-tdep.h"
 > +#include "sh-tdep.h"
 >  #include "shnbsd-tdep.h"
 >  
 >  /* Convert an r0-r15 register number into an offset into a ptrace
 > @@ -176,5 +177,5 @@
 >    add_core_fns (&shnbsd_core_fns);
 >    add_core_fns (&shnbsd_elfcore_fns);
 >  
 > -  sh_gdbarch_register_os_abi (SH_OSABI_NETBSD_ELF, shnbsd_init_abi);
 > +  gdbarch_register_osabi (bfd_arch_sh, GDB_OSABI_NETBSD_ELF, shnbsd_init_abi);
 >  }
 > Index: config/sh/tm-sh.h
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/config/sh/tm-sh.h,v
 > retrieving revision 1.18
 > diff -u -r1.18 tm-sh.h
 > --- config/sh/tm-sh.h	10 May 2002 23:00:23 -0000	1.18
 > +++ config/sh/tm-sh.h	17 May 2002 02:33:22 -0000
 > @@ -23,100 +23,6 @@
 >  
 >  #define GDB_MULTI_ARCH 1
 >  
 > -/* Information that is dependent on the processor variant. */
 > -
 > -/* ABI variants that we know about.  If you add to this enum, please
 > -   update the table of names in sh-tdep.c.  */
 > -enum sh_osabi
 > -{
 > -  SH_OSABI_UNKNOWN = 0,
 > -  SH_OSABI_LINUX,
 > -  SH_OSABI_NETBSD_ELF,
 > -
 > -  SH_OSABI_INVALID     /* Keep this last.  */
 > -};
 > -
 > -enum sh_abi
 > -  {
 > -    SH_ABI_UNKNOWN,
 > -    SH_ABI_32,
 > -    SH_ABI_64
 > -  };
 > -
 > -struct gdbarch_tdep
 > -  {
 > -    int PR_REGNUM;
 > -    int FPUL_REGNUM;  /*                       sh3e, sh4 */
 > -    int FPSCR_REGNUM; /*                       sh3e, sh4 */
 > -    int SR_REGNUM;    /* sh-dsp, sh3, sh3-dsp, sh3e, sh4 */
 > -    int DSR_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > -    int FP_LAST_REGNUM; /*                     sh3e, sh4 */
 > -    int A0G_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > -    int A0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int A1G_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > -    int A1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int M0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int M1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int X0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int X1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int Y0_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int Y1_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int MOD_REGNUM;   /* sh-dsp,      sh3-dsp            */
 > -    int SSR_REGNUM;   /*         sh3, sh3-dsp, sh3e, sh4 */
 > -    int SPC_REGNUM;   /*         sh3, sh3-dsp, sh3e, sh4 */
 > -    int RS_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int RE_REGNUM;    /* sh-dsp,      sh3-dsp            */
 > -    int DR0_REGNUM;   /*                             sh4 */
 > -    int DR_LAST_REGNUM; /*                           sh4 */
 > -    int FV0_REGNUM;   /*                             sh4 */
 > -    int FV_LAST_REGNUM; /*                           sh4 */
 > -    /* FPP stands for Floating Point Pair, to avoid confusion with
 > -       GDB's FP0_REGNUM, which is the number of the first Floating
 > -       point register. Unfortunately on the sh5, the floating point
 > -       registers are called FR, and the floating point pairs are called FP. */
 > -    int TR7_REGNUM;       /*                            sh5-media*/
 > -    int FPP0_REGNUM;      /*                            sh5-media*/
 > -    int FPP_LAST_REGNUM;  /*                            sh5-media*/
 > -    int R0_C_REGNUM;      /*                            sh5-compact*/
 > -    int R_LAST_C_REGNUM;  /*                            sh5-compact*/
 > -    int PC_C_REGNUM;      /*                            sh5-compact*/
 > -    int GBR_C_REGNUM;     /*                            sh5-compact*/
 > -    int MACH_C_REGNUM;    /*                            sh5-compact*/
 > -    int MACL_C_REGNUM;    /*                            sh5-compact*/
 > -    int PR_C_REGNUM;      /*                            sh5-compact*/
 > -    int T_C_REGNUM;       /*                            sh5-compact*/
 > -    int FPSCR_C_REGNUM;   /*                            sh5-compact*/
 > -    int FPUL_C_REGNUM;    /*                            sh5-compact*/
 > -    int FP0_C_REGNUM;     /*                            sh5-compact*/
 > -    int FP_LAST_C_REGNUM; /*                            sh5-compact*/
 > -    int DR0_C_REGNUM;     /*                            sh5-compact*/
 > -    int DR_LAST_C_REGNUM; /*                            sh5-compact*/
 > -    int FV0_C_REGNUM;     /*                            sh5-compact*/
 > -    int FV_LAST_C_REGNUM; /*                            sh5-compact*/
 > -    int ARG0_REGNUM;
 > -    int ARGLAST_REGNUM;
 > -    int FLOAT_ARGLAST_REGNUM;
 > -    int RETURN_REGNUM;
 > -    enum sh_osabi sh_osabi;    /* OS/ABI of the inferior */
 > -    const char *osabi_name;    /* Name of the above */
 > -    enum sh_abi sh_abi;
 > -  };
 > -
 > -/* Registers common to all the SH variants. */
 > -enum
 > -  {
 > -    R0_REGNUM = 0,
 > -    STRUCT_RETURN_REGNUM = 2,
 > -    ARG0_REGNUM = 4, /* Used in h8300-tdep.c */
 > -    ARGLAST_REGNUM = 7, /* Used in h8300-tdep.c */
 > -    PR_REGNUM = 17, /* used in sh3-rom.c */
 > -    GBR_REGNUM = 18,
 > -    VBR_REGNUM = 19,
 > -    MACH_REGNUM = 20,
 > -    MACL_REGNUM = 21,
 > -    SR_REGNUM = 22
 > -  };
 > -
 >  #define NUM_REALREGS 59 /* used in remote-e7000.c which is not multiarched. */
 >  
 >  #define REGISTER_TYPE  long /* used in standalone.c */
 > Index: doc/gdbint.texinfo
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/doc/gdbint.texinfo,v
 > retrieving revision 1.81
 > diff -u -r1.81 gdbint.texinfo
 > --- doc/gdbint.texinfo	4 May 2002 19:57:22 -0000	1.81
 > +++ doc/gdbint.texinfo	17 May 2002 02:33:28 -0000
 > @@ -2312,6 +2312,58 @@
 >  @code{struct gdbarch *}.  The structure, and its methods, are generated
 >  using the Bourne shell script @file{gdbarch.sh}.
 >  
 > +@section Operating System ABI Variant Handling
 > +
 > +@value{GDBN} provides a mechanism for handling variations in OS
 > +ABIs.  An OS ABI variant may have influence over any number of
 > +variables in the target architecture definition.  There are two major
 > +components in the OS ABI mechanism: sniffers and handlers.
 > +
 > +A sniffer examines a file matching a BFD architecture/flavour pair
 > +(the architecture may be wildcarded) in an attempt to determine the
 > +OS ABI of that file.  Multiple sniffers for an architecture/flavour
 > +may exist, in order to differentiate between two different operating
 > +systems which use the same basic file format.  The OS ABI framework
 > +provides a generic sniffer for ELF-format files which examines the
 > +@code{EI_OSABI} field of the ELF header, as well as note sections known
 > +to be used by several operating systems.
 > +
 > +A handler is used to fine-tune the @code{gdbarch} structure for the
 > +selected OS ABI.  There may be only one handler for a given OS ABI
 > +for each BFD architecture.
 > +
 > +Here are the functions that make up the OS ABI framework:
 > +
 > +@deftypefun const char *gdbarch_osabi_name (enum gdb_osabi @var{osabi})
 > +Return the name of the OS ABI corresponding to @var{osabi}.
 > +@end deftypefun
 > +
 > +@deftypefun void gdbarch_register_osabi (enum bfd_architecture @var{arch}, enum gdb_osabi @var{osabi}, void (*@var{init_osabi})(struct gdbarch_info @var{info}, struct gdbarch *@var{gdbarch}))
 > +Register the OS ABI handler specified by @var{init_osabi} for the
 > +architecture/OS ABI pair specified by @var{arch} and @var{osabi}.
 > +@end deftypefun
 > +
 > +@deftypefun void gdbarch_register_osabi_sniffer (enum bfd_architecture @var{arch}, enum bfd_flavour @var{flavour}, enum gdb_osabi (*@var{sniffer})(bfd *@var{abfd}))
 > +Register the OS ABI file sniffer specified by @var{sniffer} for the
 > +BFD architecture/flavour pair specified by @var{arch} and @var{flavour}.
 > +If @var{arch} is @code{bfd_arch_unknown}, the sniffer is allowed to examine
 > +@var{flavour}-flavoured files for any architecture.
 > +@end deftypefun
 > +
 > +@deftypefun enum gdb_osabi gdbarch_lookup_osabi (bfd *@var{abfd})
 > +Examine the file described by @var{abfd} to determine its OS ABI.
 > +The value @code{GDB_OSABI_UNKNOWN} is returned if the OS ABI cannot
 > +be determined.
 > +@end deftypefun
 > +
 > +@deftypefun void gdbarch_init_osabi (struct gdbarch info @var{info}, struct gdbarch *@var{gdbarch}, enum gdb_osabi @var{osabi})
 > +Invoke the OS ABI handler corresponding to @var{osabi} to fine-tune the
 > +@code{gdbarch} structure specified by @var{gdbarch}.  If a handler
 > +corresponding to @var{osabi} has not been registered or @var{gdbarch}'s
 > +architecture, a warning will be issued and the debugging session will continue
 > +with the defaults already established for @var{gdbarch}.
 > +@end deftypefun
 > +
 >  @section Registers and Memory
 >  
 >  @value{GDBN}'s model of the target machine is rather simple.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]