Add support for 32-bit and 64-bit PowerPC AIX core files.
authorSangamesh Mallayya <nickc@redhat.com>
Tue, 27 Oct 2015 10:30:29 +0000 (10:30 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 27 Oct 2015 10:30:29 +0000 (10:30 +0000)
* configure.ac (powerpc64-*-aix[5-9].*): Match powerpc64 running
aix for core file support.
* configure: Regenerate.
* rs6000-core.c: Check for __ld_info64 if compiling 64-bit gdb.
Added BFD64 check if we are using old core file format for 32-bit gdb.
Set sizeof CORE_COMMONSZ appropriately in case of either new or
old core file format.
(read_hdr): Added BFD64 check for 64-bit support.
(rs6000coff_core_p): Likewise.
(rs6000coff_core_file_matches_executable_p): Likewise.
(rs6000coff_core_file_failing_command): Likewise.
(rs6000coff_core_file_failing_signal): Likewise.
Add support for debugging core files generated by binaries in
Large Memory model.
(rs6000coff_core_p): If Large Memory Model is used, then the .data
segment should start from BDATAORG which has been defined in the
system header files.

bfd/ChangeLog
bfd/configure
bfd/configure.ac
bfd/rs6000-core.c

index 29c974d6322447fb4b897516ac0b861c965c0562..d8a1f7097a5e8c82ccabefe973b43250375f71a8 100644 (file)
@@ -1,3 +1,23 @@
+2015-10-27  Sangamesh Mallayya  <nickc@redhat.com>sangamesh.swamy@in.ibm.com>
+
+       * configure.ac (powerpc64-*-aix[5-9].*): Match powerpc64 running
+       aix for core file support.
+       * configure: Regenerate.
+       * rs6000-core.c: Check for __ld_info64 if compiling 64-bit gdb.
+       Added BFD64 check if we are using old core file format for 32-bit gdb.
+       Set sizeof CORE_COMMONSZ appropriately in case of either new or
+       old core file format.
+       (read_hdr): Added BFD64 check for 64-bit support.
+       (rs6000coff_core_p): Likewise.
+       (rs6000coff_core_file_matches_executable_p): Likewise.
+       (rs6000coff_core_file_failing_command): Likewise.
+       (rs6000coff_core_file_failing_signal): Likewise.
+       Add support for debugging core files generated by binaries in
+       Large Memory model.
+       (rs6000coff_core_p): If Large Memory Model is used, then the .data
+       segment should start from BDATAORG which has been defined in the
+       system header files.
+
 2015-10-26  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/19175
index a17e936c43c2c8c9b424003c5cb18c30fc7492a4..0308aa5bdad74e23712102df7c897714d0696d03 100755 (executable)
@@ -14056,7 +14056,7 @@ if test "${target}" = "${host}"; then
   rs6000-*-lynx*)
        COREFILE=lynx-core.lo
        ;;
-  rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].*)
+  rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].* | powerpc64-*-aix[5-9].*)
         COREFILE=rs6000-core.lo
        COREFLAG="$COREFLAG -DAIX_5_CORE -DAIX_CORE_DUMPX_CORE"
        ;;
@@ -14092,6 +14092,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        ;;
   rs6000-*-aix4*)      COREFILE=rs6000-core.lo ;;
   rs6000-*-*)          COREFILE=rs6000-core.lo ;;
+  powerpc64-*-aix*)    COREFILE=rs6000-core.lo ;;
   powerpc-*-aix4*)     COREFILE=rs6000-core.lo ;;
   powerpc-*-aix*)      COREFILE=rs6000-core.lo ;;
   powerpc-*-beos*)     ;;
index 24971310ec29f4b392b2e10d09b9b0d247ae0c5e..cc446e1bb8f199ca327f21a80b5647cffcf97489 100644 (file)
@@ -428,7 +428,7 @@ changequote([,])dnl
        COREFILE=lynx-core.lo
        ;;
 changequote(,)dnl
-  rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].*)
+  rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].* | powerpc64-*-aix[5-9].*)
 changequote([,])dnl
         COREFILE=rs6000-core.lo
        COREFLAG="$COREFLAG -DAIX_5_CORE -DAIX_CORE_DUMPX_CORE"
@@ -447,6 +447,7 @@ changequote([,])dnl
        ;;
   rs6000-*-aix4*)      COREFILE=rs6000-core.lo ;;
   rs6000-*-*)          COREFILE=rs6000-core.lo ;;
+  powerpc64-*-aix*)    COREFILE=rs6000-core.lo ;;
   powerpc-*-aix4*)     COREFILE=rs6000-core.lo ;;
   powerpc-*-aix*)      COREFILE=rs6000-core.lo ;;
   powerpc-*-beos*)     ;;
index 6711498e0d4538bdd9187970f0f4ffeace5e45bb..0f469c4c706f47df81809245032af60fa06ff656 100644 (file)
@@ -55,9 +55,7 @@
 
 #undef SCNHDR
 
-/* ------------------------------------------------------------------------ */
-/*     Support for core file stuff..                                       */
-/* ------------------------------------------------------------------------ */
+/* Support for core file stuff.  */
 
 #include <sys/user.h>
 #define __LDINFO_PTRACE32__    /* for __ld_info32 */
@@ -91,8 +89,9 @@ typedef unsigned long ptr_to_uint;
 
 /* Union of 32-bit and 64-bit versions of ld_info.  */
 
-typedef union {
-#ifdef __ld_info32
+typedef union
+{
+#if defined (__ld_info32) || defined (__ld_info64)
   struct __ld_info32 l32;
   struct __ld_info64 l64;
 #else
@@ -103,33 +102,43 @@ typedef union {
 
 /* Union of old and new core dump structures.  */
 
-typedef union {
+typedef union
+{
 #ifdef AIX_CORE_DUMPX_CORE
-  struct core_dumpx new_dump;  /* new AIX 4.3+ core dump */
+  struct core_dumpx new_dump;  /* New AIX 4.3+ core dump.  */
 #else
-  struct core_dump new_dump;           /* for simpler coding */
+  struct core_dump new_dump;   /* For simpler coding.  */
+#endif
+#ifndef BFD64                   /* Use old only if gdb is 32-bit.  */
+  struct core_dump old;                /* Old AIX 4.2- core dump, still used on
+                                  4.3+ with appropriate SMIT config.  */
 #endif
-  struct core_dump old;                /* old AIX 4.2- core dump, still used on
-                                  4.3+ with appropriate SMIT config */
 } CoreHdr;
 
 /* Union of old and new vm_info structures.  */
 
 #ifdef CORE_VERSION_1
-typedef union {
+typedef union
+{
 #ifdef AIX_CORE_DUMPX_CORE
   struct vm_infox new_dump;
 #else
   struct vm_info new_dump;
 #endif
+#ifndef BFD64
   struct vm_info old;
+#endif
 } VmInfo;
 #endif
 
 /* Return whether CoreHdr C is in new or old format.  */
 
 #ifdef AIX_CORE_DUMPX_CORE
-# define CORE_NEW(c)   (!(c).old.c_entries)
+# ifndef BFD64
+#  define CORE_NEW(c)        (!(c).old.c_entries)
+# else
+#  define CORE_NEW(c)   (!(c).new_dump.c_entries)
+# endif
 #else
 # define CORE_NEW(c)   0
 #endif
@@ -258,9 +267,13 @@ typedef union {
 
 /* Size of the leading portion that old and new core dump structures have in
    common.  */
-#define CORE_COMMONSZ  ((int) &((struct core_dump *) 0)->c_entries \
-                        + sizeof (((struct core_dump *) 0)->c_entries))
-
+#ifdef AIX_CORE_DUMPX_CORE
+#define CORE_COMMONSZ  ((long) &((struct core_dumpx *) 0)->c_entries \
+                        + sizeof (((struct core_dumpx *) 0)->c_entries))
+#else
+#define CORE_COMMONSZ   ((int) &((struct core_dump *) 0)->c_entries \
+                       + sizeof (((struct core_dump *) 0)->c_entries)
+#endif
 /* Define prototypes for certain functions, to avoid a compiler warning
    saying that they are missing.  */
 
@@ -290,8 +303,10 @@ read_hdr (bfd *abfd, CoreHdr *core)
   /* Read the trailing portion of the structure.  */
   if (CORE_NEW (*core))
     size = sizeof (core->new_dump);
+#ifndef BFD64
   else
     size = sizeof (core->old);
+#endif
   size -= CORE_COMMONSZ;
   return bfd_bread ((char *) core + CORE_COMMONSZ, size, abfd) == size;
 }
@@ -356,6 +371,7 @@ rs6000coff_core_p (bfd *abfd)
       c_stackend = CNEW_STACKORG (core.new_dump) + c_size;
       c_lsize = CNEW_LSIZE (core.new_dump);
       c_loader = CNEW_LOADER (core.new_dump);
+#ifndef BFD64
       proc64 = CNEW_PROC64 (core.new_dump);
     }
   else
@@ -366,6 +382,7 @@ rs6000coff_core_p (bfd *abfd)
       c_stackend = COLD_STACKEND;
       c_lsize = 0x7ffffff;
       c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
+#endif
       proc64 = 0;
     }
 
@@ -379,11 +396,13 @@ rs6000coff_core_p (bfd *abfd)
       c_regsize = sizeof (CNEW_MSTSAVE (core.new_dump));
       c_regptr = &CNEW_MSTSAVE (core.new_dump);
     }
+#ifndef BFD64
   else
     {
       c_regsize = sizeof (COLD_MSTSAVE (core.old));
       c_regptr = &COLD_MSTSAVE (core.old);
     }
+#endif
   c_regoff = (char *) c_regptr - (char *) &core;
 
   if (bfd_stat (abfd, &statbuf) < 0)
@@ -433,9 +452,15 @@ rs6000coff_core_p (bfd *abfd)
     }
 
   /* Sanity check on the c_tab field.  */
-  if (!CORE_NEW (core) && (c_loader < (file_ptr) sizeof core.old ||
-                          c_loader >= statbuf.st_size ||
-                          c_loader >= c_stack))
+  if (!CORE_NEW (core)
+      && (
+#ifndef BFD64
+         c_loader < (file_ptr) sizeof core.old
+#else
+         c_loader < (file_ptr) sizeof core.new_dump
+#endif
+         || c_loader >= statbuf.st_size
+         || c_loader >= c_stack))
     {
       bfd_set_error (bfd_error_wrong_format);
       return NULL;
@@ -447,7 +472,11 @@ rs6000coff_core_p (bfd *abfd)
                           bfd_get_filename (abfd));
 
   /* Allocate core file header.  */
+#ifndef BFD64
   size = CORE_NEW (core) ? sizeof (core.new_dump) : sizeof (core.old);
+#else
+  size =  sizeof (core.new_dump);
+#endif
   tmpptr = (char *) bfd_zalloc (abfd, (bfd_size_type) size);
   if (!tmpptr)
     return NULL;
@@ -528,6 +557,7 @@ rs6000coff_core_p (bfd *abfd)
     file_ptr ldi_core;
     uint ldi_next;
     bfd_vma ldi_dataorg;
+    bfd_vma core_dataorg;
 
     /* Fields from new and old core structures.  */
     bfd_size_type c_datasize, c_vmregions;
@@ -540,6 +570,7 @@ rs6000coff_core_p (bfd *abfd)
        c_vmregions = core.new_dump.c_vmregions;
        c_vmm = (file_ptr) core.new_dump.c_vmm;
       }
+#ifndef BFD64
     else
       {
        c_datasize = core.old.c_datasize;
@@ -547,23 +578,32 @@ rs6000coff_core_p (bfd *abfd)
        c_vmregions = core.old.c_vmregions;
        c_vmm = (file_ptr) (ptr_to_uint) core.old.c_vmm;
       }
+#endif
 
     /* .data section from executable.  */
     if (c_datasize)
       {
+       /* If Large Memory Model is used, then the .data segment should start from
+          BDATAORG which has been defined in the system header files. */
+
+        if (c_flag & CORE_BIGDATA)
+          core_dataorg = BDATAORG;
+        else
+          core_dataorg = CDATA_ADDR (c_datasize);
+
        if (!make_bfd_asection (abfd, ".data",
                                SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS,
                                c_datasize,
-                               (bfd_vma) CDATA_ADDR (c_datasize),
+                               (bfd_vma) core_dataorg,
                                c_data))
          goto fail;
       }
 
     /* .data sections from loaded objects.  */
     if (proc64)
-      size = (int) ((LdInfo *) 0)->l64.ldinfo_filename;
+      size = (unsigned long) ((LdInfo *) 0)->l64.ldinfo_filename;
     else
-      size = (int) ((LdInfo *) 0)->l32.ldinfo_filename;
+      size = (unsigned long) ((LdInfo *) 0)->l32.ldinfo_filename;
 
     while (1)
       {
@@ -613,7 +653,11 @@ rs6000coff_core_p (bfd *abfd)
            file_ptr vminfo_offset;
            bfd_vma vminfo_addr;
 
+#ifndef BFD64
            size = CORE_NEW (core) ? sizeof (vminfo.new_dump) : sizeof (vminfo.old);
+#else
+            size = sizeof (vminfo.new_dump);
+#endif
            if (bfd_bread (&vminfo, size, abfd) != size)
              goto fail;
 
@@ -623,12 +667,14 @@ rs6000coff_core_p (bfd *abfd)
                vminfo_size = vminfo.new_dump.vminfo_size;
                vminfo_offset = vminfo.new_dump.vminfo_offset;
              }
+#ifndef BFD64
            else
              {
                vminfo_addr = (bfd_vma) (ptr_to_uint) vminfo.old.vminfo_addr;
                vminfo_size = vminfo.old.vminfo_size;
                vminfo_offset = vminfo.old.vminfo_offset;
              }
+#endif
 
            if (vminfo_offset)
              if (!make_bfd_asection (abfd, ".vmdata",
@@ -668,8 +714,10 @@ rs6000coff_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
 
   if (CORE_NEW (core))
     c_loader = CNEW_LOADER (core.new_dump);
+#ifndef BFD64
   else
     c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
+#endif
 
   if (CORE_NEW (core) && CNEW_PROC64 (core.new_dump))
     size = (int) ((LdInfo *) 0)->l64.ldinfo_filename;
@@ -732,8 +780,12 @@ char *
 rs6000coff_core_file_failing_command (bfd *abfd)
 {
   CoreHdr *core = core_hdr (abfd);
+#ifndef BFD64
   char *com = CORE_NEW (*core) ?
     CNEW_COMM (core->new_dump) : COLD_COMM (core->old);
+#else
+  char *com = CNEW_COMM (core->new_dump);
+#endif
 
   if (*com)
     return com;
@@ -745,7 +797,11 @@ int
 rs6000coff_core_file_failing_signal (bfd *abfd)
 {
   CoreHdr *core = core_hdr (abfd);
+#ifndef BFD64
   return CORE_NEW (*core) ? core->new_dump.c_signo : core->old.c_signo;
+#else
+  return  core->new_dump.c_signo;
+#endif
 }
 
 #endif /* AIX_CORE */
This page took 0.059555 seconds and 4 git commands to generate.