Properly read i386 coredump.
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 21 Apr 2010 20:22:20 +0000 (20:22 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 21 Apr 2010 20:22:20 +0000 (20:22 +0000)
2010-04-21  H.J. Lu  <hongjiu.lu@intel.com>

PR corefiles/11523
* amd64-linux-tdep.c (amd64_linux_core_read_description): Check
XCR0 first.

* i386-linux-tdep.c (i386_linux_core_read_xcr0): Return 0 if
there is no .reg-xstate section.
(i386_linux_core_read_description): Check XCR0 first.

gdb/ChangeLog
gdb/amd64-linux-tdep.c
gdb/i386-linux-tdep.c

index 2ba55a2..07b0efc 100644 (file)
@@ -1,3 +1,13 @@
+2010-04-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR corefiles/11523
+       * amd64-linux-tdep.c (amd64_linux_core_read_description): Check
+       XCR0 first.
+
+       * i386-linux-tdep.c (i386_linux_core_read_xcr0): Return 0 if
+       there is no .reg-xstate section.
+       (i386_linux_core_read_description): Check XCR0 first.
+
 2010-04-21  Mike Frysinger  <vapier@gentoo.org>
 
        * gdb/sparc-tdep.c (sparc32_store_return_value): Add gdb_assert ()
index f249d5d..7376ba7 100644 (file)
@@ -1269,18 +1269,15 @@ amd64_linux_core_read_description (struct gdbarch *gdbarch,
                                  struct target_ops *target,
                                  bfd *abfd)
 {
-  asection *section = bfd_get_section_by_name (abfd, ".reg2");
-  uint64_t xcr0;
-
-  if (section == NULL)
-    return NULL;
-
   /* Linux/x86-64.  */
-  xcr0 = i386_linux_core_read_xcr0 (gdbarch, target, abfd);
-  if ((xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
-    return tdesc_amd64_avx_linux;
-  else
-    return tdesc_amd64_linux;
+  uint64_t xcr0 = i386_linux_core_read_xcr0 (gdbarch, target, abfd);
+  switch ((xcr0 & I386_XSTATE_AVX_MASK))
+    {
+    case I386_XSTATE_AVX_MASK:
+      return tdesc_amd64_avx_linux;
+    default:
+      return tdesc_amd64_linux;
+    }
 }
 
 static void
index 4e3408c..272cc99 100644 (file)
@@ -611,7 +611,7 @@ i386_linux_core_read_xcr0 (struct gdbarch *gdbarch,
        }
     }
   else
-    xcr0 = I386_XSTATE_SSE_MASK;
+    xcr0 = 0;
 
   return xcr0;
 }
@@ -623,22 +623,24 @@ i386_linux_core_read_description (struct gdbarch *gdbarch,
                                  struct target_ops *target,
                                  bfd *abfd)
 {
-  asection *section = bfd_get_section_by_name (abfd, ".reg2");
-  uint64_t xcr0;
-
-  if (section == NULL)
-    return NULL;
-
-  section = bfd_get_section_by_name (abfd, ".reg-xfp");
-  if (section == NULL)
-    return tdesc_i386_mmx_linux;
-
   /* Linux/i386.  */
-  xcr0 = i386_linux_core_read_xcr0 (gdbarch, target, abfd);
-  if ((xcr0 & I386_XSTATE_AVX_MASK) == I386_XSTATE_AVX_MASK)
-    return tdesc_i386_avx_linux;
-  else
+  uint64_t xcr0 = i386_linux_core_read_xcr0 (gdbarch, target, abfd);
+  switch ((xcr0 & I386_XSTATE_AVX_MASK))
+    {
+    case I386_XSTATE_AVX_MASK:
+      return tdesc_i386_avx_linux;
+    case I386_XSTATE_SSE_MASK:
+      return tdesc_i386_linux;
+    case I386_XSTATE_X87_MASK:
+      return tdesc_i386_mmx_linux;
+    default:
+      break;
+    }
+
+  if (bfd_get_section_by_name (abfd, ".reg-xfp") != NULL)
     return tdesc_i386_linux;
+  else
+    return tdesc_i386_mmx_linux;
 }
 
 static void