2010-05-06 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / osabi.c
index 5d3962ae7522b71dee8127aa46e0320c51a02ba5..57af407f5024f4ba486f9e5970c5395f93de7670 100644 (file)
@@ -1,23 +1,22 @@
 /* OS ABI variant handling for GDB.
 
-   Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010
+   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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful,  
+   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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 
@@ -64,16 +63,16 @@ static const char * const gdb_osabi_names[] =
   "OpenBSD ELF",
   "Windows CE",
   "DJGPP",
-  "NetWare",
   "Irix",
-  "LynxOS",
   "Interix",
   "HP/UX ELF",
   "HP/UX SOM",
-
   "QNX Neutrino",
-
   "Cygwin",
+  "AIX",
+  "DICOS",
+  "Darwin",
+  "Symbian",
 
   "<invalid>"
 };
@@ -87,6 +86,30 @@ gdbarch_osabi_name (enum gdb_osabi osabi)
   return gdb_osabi_names[GDB_OSABI_INVALID];
 }
 
+/* Lookup the OS ABI corresponding to the specified target description
+   string.  */
+
+enum gdb_osabi
+osabi_from_tdesc_string (const char *name)
+{
+  int i;
+
+  for (i = 0; i < ARRAY_SIZE (gdb_osabi_names); i++)
+    if (strcmp (name, gdb_osabi_names[i]) == 0)
+      {
+       /* See note above: the name table matches the indices assigned
+          to enum gdb_osabi.  */
+       enum gdb_osabi osabi = (enum gdb_osabi) i;
+
+       if (osabi == GDB_OSABI_INVALID)
+         return GDB_OSABI_UNKNOWN;
+       else
+         return osabi;
+      }
+
+  return GDB_OSABI_UNKNOWN;
+}
+
 /* 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  
@@ -205,15 +228,11 @@ gdbarch_lookup_osabi (bfd *abfd)
   if (user_osabi_state == osabi_user)
     return user_selected_osabi;
 
-  /* If we don't have a binary, return the default OS ABI (if set) or
-     an inconclusive result (otherwise).  */
+  /* If we don't have a binary, just return unknown.  The caller may
+     have other sources the OSABI can be extracted from, e.g., the
+     target description.  */
   if (abfd == NULL) 
-    {
-      if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN)
-       return GDB_OSABI_DEFAULT;
-      else
-       return GDB_OSABI_UNINITIALIZED;
-    }
+    return GDB_OSABI_UNKNOWN;
 
   match = GDB_OSABI_UNKNOWN;
   match_specific = 0;
@@ -274,12 +293,7 @@ gdbarch_lookup_osabi (bfd *abfd)
        }
     }
 
-  /* If we didn't find a match, but a default was specified at configure
-     time, return the default.  */
-  if (GDB_OSABI_DEFAULT != GDB_OSABI_UNKNOWN && match == GDB_OSABI_UNKNOWN)
-    return GDB_OSABI_DEFAULT;
-  else
-    return match;
+  return match;
 }
 
 
@@ -547,7 +561,7 @@ generic_elf_osabi_sniffer (bfd *abfd)
          "FreeBSD" in the padding of the e_ident field of the ELF
          header to "brand" their ELF binaries in FreeBSD 3.x.  */
       if (memcmp (&elf_elfheader (abfd)->e_ident[8],
-                 "FreeBSD", sizeof ("FreeBSD") == 0)
+                 "FreeBSD", sizeof ("FreeBSD")) == 0)
        osabi = GDB_OSABI_FREEBSD_ELF;
     }
 
@@ -601,7 +615,7 @@ show_osabi (struct ui_file *file, int from_tty, struct cmd_list_element *c,
   if (user_osabi_state == osabi_auto)
     fprintf_filtered (file,
                      _("The current OS ABI is \"auto\" (currently \"%s\").\n"),
-                     gdbarch_osabi_name (gdbarch_osabi (current_gdbarch)));
+                     gdbarch_osabi_name (gdbarch_osabi (get_current_arch ())));
   else
     fprintf_filtered (file, _("The current OS ABI is \"%s\".\n"),
                      gdbarch_osabi_name (user_selected_osabi));
@@ -616,8 +630,6 @@ extern initialize_file_ftype _initialize_gdb_osabi; /* -Wmissing-prototype */
 void
 _initialize_gdb_osabi (void)
 {
-  struct cmd_list_element *c;
-
   if (strcmp (gdb_osabi_names[GDB_OSABI_INVALID], "<invalid>") != 0)
     internal_error
       (__FILE__, __LINE__,
This page took 0.04027 seconds and 4 git commands to generate.