2002-06-09 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Sun, 9 Jun 2002 19:36:15 +0000 (19:36 +0000)
committerDaniel Jacobowitz <drow@false.org>
Sun, 9 Jun 2002 19:36:15 +0000 (19:36 +0000)
        * mips-tdep.c (mips_find_abi_section): New function.
        (mips_gdbarch_init): Call it.

gdb/ChangeLog
gdb/mips-tdep.c

index bbe728e5a0bc3bbe5ad72af12839eeede7c7ae3a..f4c00166fabcc4115b0150a15e597a50f9c26853 100644 (file)
@@ -1,3 +1,8 @@
+2002-06-09  Daniel Jacobowitz  <drow@mvista.com>
+
+       * mips-tdep.c (mips_find_abi_section): New function.
+       (mips_gdbarch_init): Call it.
+
 2002-06-09  Mark Kettenis  <kettenis@gnu.org>
 
        * solib-svr4.c (init_fetch_link_map_offsets): Simply return
index 67409f6d18aedb246def41b5e30fffb4405ff98c..c62886ce48f6433765b8862de11e48bf81f64517 100644 (file)
@@ -4126,6 +4126,32 @@ mips_integer_to_address (struct type *type, void *buf)
                                 TYPE_LENGTH (builtin_type_void_data_ptr));
 }
 
+static void
+mips_find_abi_section (bfd *abfd, asection *sect, void *obj)
+{
+  enum mips_abi *abip = (enum mips_abi *) obj;
+  const char *name = bfd_get_section_name (abfd, sect);
+
+  if (*abip != MIPS_ABI_UNKNOWN)
+    return;
+
+  if (strncmp (name, ".mdebug.", 8) != 0)
+    return;
+
+  if (strcmp (name, ".mdebug.abi32") == 0)
+    *abip = MIPS_ABI_O32;
+  else if (strcmp (name, ".mdebug.abiN32") == 0)
+    *abip = MIPS_ABI_N32;
+  else if (strcmp (name, ".mdebug.abiO64") == 0)
+    *abip = MIPS_ABI_O64;
+  else if (strcmp (name, ".mdebug.eabi32") == 0)
+    *abip = MIPS_ABI_EABI32;
+  else if (strcmp (name, ".mdebug.eabi64") == 0)
+    *abip = MIPS_ABI_EABI64;
+  else
+    warning ("unsupported ABI %s.", name + 8);
+}
+
 static struct gdbarch *
 mips_gdbarch_init (struct gdbarch_info info,
                   struct gdbarch_list *arches)
@@ -4180,6 +4206,10 @@ mips_gdbarch_init (struct gdbarch_info info,
       break;
     }
 
+  /* GCC creates a pseudo-section whose name describes the ABI.  */
+  if (mips_abi == MIPS_ABI_UNKNOWN && info.abfd != NULL)
+    bfd_map_over_sections (info.abfd, mips_find_abi_section, &mips_abi);
+
   /* Try the architecture for any hint of the corect ABI */
   if (mips_abi == MIPS_ABI_UNKNOWN
       && info.bfd_arch_info != NULL