daily update
[deliverable/binutils-gdb.git] / bfd / rs6000-core.c
index 19ff4a4a77f1cf5638da4e59ebbfc29ed24ac112..ad7bef9e10a10afb55ccf3d002638288e41d83be 100644 (file)
@@ -1,31 +1,28 @@
 /* IBM RS/6000 "XCOFF" back-end for BFD.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
-   2001, 2002
+   2001, 2002, 2004, 2006, 2007, 2008
    Free Software Foundation, Inc.
-   FIXME: Can someone provide a transliteration of this name into ASCII?
-   Using the following chars caused a compiler warning on HIUX (so I replaced
-   them with octal escapes), and isn't useful without an understanding of what
-   character set it is.
-   Written by Metin G. Ozisik, Mimi Ph\373\364ng-Th\345o V\365,
-     and John Gilmore.
+   Written by Metin G. Ozisik, Mimi Phuong-Thao Vo, and John Gilmore.
    Archive support from Damon A. Permezel.
    Contributed by IBM Corporation and Cygnus Support.
 
-This file is part of BFD, the Binary File Descriptor library.
+   This file is part of BFD, the Binary File Descriptor library.
 
-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 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 3 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.
+   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.  */
 
-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.  */
 
 /* This port currently only handles reading object files, except when
    compiled on an RS/6000 host.  -- no archive support, no core files.
@@ -44,8 +41,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #define _LONG_LONG
 #endif
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 
 #ifdef AIX_CORE
@@ -71,6 +68,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include <sys/core.h>
 #include <sys/systemcfg.h>
 
+/* Borrowed from <sys/inttypes.h> on recent AIX versions.  */
+typedef unsigned long ptr_to_uint;
+
 #define        core_hdr(bfd)           ((CoreHdr *) bfd->tdata.any)
 
 /* AIX 4.1 changed the names and locations of a few items in the core file.
@@ -136,6 +136,19 @@ typedef union {
 # define CORE_NEW(c)   0
 #endif
 
+/* Return whether CoreHdr C usese core_dumpxx structure.
+
+   FIXME: the core file format version number used here definitely indicates
+   that struct core_dumpxx should be used to represent the core file header,
+   but that may not be the only such format version number.  */
+
+#ifdef AIX_5_CORE
+# define CORE_DUMPXX_VERSION   267312562
+# define CNEW_IS_CORE_DUMPXX(c) ((c).new.c_version == CORE_DUMPXX_VERSION)
+#else
+# define CNEW_IS_CORE_DUMPXX(c) 0
+#endif
+
 /* Return the c_stackorg field from struct core_dumpx C.  */
 
 #ifdef AIX_CORE_DUMPX_CORE
@@ -182,7 +195,7 @@ typedef union {
 
 /* Return the c_impl field from struct core_dumpx C.  */
 
-#ifdef AIX_CORE_DUMPX_CORE
+#if defined (HAVE_ST_C_IMPL) || defined (AIX_5_CORE)
 # define CNEW_IMPL(c)  (c).c_impl
 #else
 # define CNEW_IMPL(c)  0
@@ -250,22 +263,31 @@ typedef union {
 #define CORE_COMMONSZ  ((int) &((struct core_dump *) 0)->c_entries \
                         + sizeof (((struct core_dump *) 0)->c_entries))
 
+/* Define prototypes for certain functions, to avoid a compiler warning
+   saying that they are missing.  */
+
+const bfd_target * rs6000coff_core_p (bfd *abfd);
+bfd_boolean rs6000coff_core_file_matches_executable_p (bfd *core_bfd,
+                                                       bfd *exec_bfd);
+char * rs6000coff_core_file_failing_command (bfd *abfd);
+int rs6000coff_core_file_failing_signal (bfd *abfd);
+
 /* Try to read into CORE the header from the core file associated with ABFD.
    Return success.  */
 
-static boolean
+static bfd_boolean
 read_hdr (bfd *abfd, CoreHdr *core)
 {
   bfd_size_type size;
 
   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
-    return false;
+    return FALSE;
 
   /* Read the leading portion that old and new core dump structures have in
      common.  */
   size = CORE_COMMONSZ;
   if (bfd_bread (core, size, abfd) != size)
-    return false;
+    return FALSE;
 
   /* Read the trailing portion of the structure.  */
   if (CORE_NEW (*core))
@@ -277,22 +299,16 @@ read_hdr (bfd *abfd, CoreHdr *core)
 }
 
 static asection *
-make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
-     bfd *abfd;
-     const char *name;
-     flagword flags;
-     bfd_size_type _raw_size;
-     bfd_vma vma;
-     file_ptr filepos;
+make_bfd_asection (bfd *abfd, const char *name, flagword flags,
+                  bfd_size_type size, bfd_vma vma, file_ptr filepos)
 {
   asection *asect;
 
-  asect = bfd_make_section_anyway (abfd, name);
+  asect = bfd_make_section_anyway_with_flags (abfd, name, flags);
   if (!asect)
     return NULL;
 
-  asect->flags = flags;
-  asect->_raw_size = _raw_size;
+  asect->size = size;
   asect->vma = vma;
   asect->filepos = filepos;
   asect->alignment_power = 8;
@@ -304,8 +320,7 @@ make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos)
    magic number or anything like, in rs6000coff.  */
 
 const bfd_target *
-rs6000coff_core_p (abfd)
-     bfd *abfd;
+rs6000coff_core_p (bfd *abfd)
 {
   CoreHdr core;
   struct stat statbuf;
@@ -327,6 +342,13 @@ rs6000coff_core_p (abfd)
       return NULL;
     }
 
+  /* This isn't the right handler for 64-bit core files on AIX 5.x.  */
+  if (CORE_NEW (core) && CNEW_IS_CORE_DUMPXX (core))
+    {
+      bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+
   /* Copy fields from new or old core structure.  */
   if (CORE_NEW (core))
     {
@@ -341,11 +363,11 @@ rs6000coff_core_p (abfd)
   else
     {
       c_flag = core.old.c_flag;
-      c_stack = (file_ptr) core.old.c_stack;
+      c_stack = (file_ptr) (ptr_to_uint) core.old.c_stack;
       c_size = core.old.c_size;
       c_stackend = COLD_STACKEND;
       c_lsize = 0x7ffffff;
-      c_loader = (file_ptr) COLD_LOADER (core.old);
+      c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
       proc64 = 0;
     }
 
@@ -523,9 +545,9 @@ rs6000coff_core_p (abfd)
     else
       {
        c_datasize = core.old.c_datasize;
-       c_data = (file_ptr) core.old.c_data;
+       c_data = (file_ptr) (ptr_to_uint) core.old.c_data;
        c_vmregions = core.old.c_vmregions;
-       c_vmm = (file_ptr) core.old.c_vmm;
+       c_vmm = (file_ptr) (ptr_to_uint) core.old.c_vmm;
       }
 
     /* .data section from executable.  */
@@ -630,28 +652,26 @@ rs6000coff_core_p (abfd)
   return NULL;
 }
 
-/* Return `true' if given core is from the given executable.  */
+/* Return `TRUE' if given core is from the given executable.  */
 
-boolean
-rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
-     bfd *core_bfd;
-     bfd *exec_bfd;
+bfd_boolean
+rs6000coff_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
 {
   CoreHdr core;
   bfd_size_type size;
   char *path, *s;
   size_t alloc;
   const char *str1, *str2;
-  boolean ret;
+  bfd_boolean ret;
   file_ptr c_loader;
 
   if (!read_hdr (core_bfd, &core))
-    return false;
+    return FALSE;
 
   if (CORE_NEW (core))
     c_loader = CNEW_LOADER (core.new);
   else
-    c_loader = (file_ptr) COLD_LOADER (core.old);
+    c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
 
   if (CORE_NEW (core) && CNEW_PROC64 (core.new))
     size = (int) ((LdInfo *) 0)->l64.ldinfo_filename;
@@ -659,12 +679,12 @@ rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
     size = (int) ((LdInfo *) 0)->l32.ldinfo_filename;
 
   if (bfd_seek (core_bfd, c_loader + size, SEEK_SET) != 0)
-    return false;
+    return FALSE;
 
   alloc = 100;
   path = bfd_malloc ((bfd_size_type) alloc);
   if (path == NULL)
-    return false;
+    return FALSE;
   s = path;
 
   while (1)
@@ -672,7 +692,7 @@ rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
       if (bfd_bread (s, (bfd_size_type) 1, core_bfd) != 1)
        {
          free (path);
-         return false;
+         return FALSE;
        }
       if (*s == '\0')
        break;
@@ -686,7 +706,7 @@ rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
          if (n == NULL)
            {
              free (path);
-             return false;
+             return FALSE;
            }
          s = n + (path - s);
          path = n;
@@ -701,9 +721,9 @@ rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
   str2 = str2 != NULL ? str2 + 1 : exec_bfd->filename;
 
   if (strcmp (str1, str2) == 0)
-    ret = true;
+    ret = TRUE;
   else
-    ret = false;
+    ret = FALSE;
 
   free (path);
 
@@ -711,8 +731,7 @@ rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd)
 }
 
 char *
-rs6000coff_core_file_failing_command (abfd)
-     bfd *abfd;
+rs6000coff_core_file_failing_command (bfd *abfd)
 {
   CoreHdr *core = core_hdr (abfd);
   char *com = CORE_NEW (*core) ?
@@ -725,8 +744,7 @@ rs6000coff_core_file_failing_command (abfd)
 }
 
 int
-rs6000coff_core_file_failing_signal (abfd)
-     bfd *abfd;
+rs6000coff_core_file_failing_signal (bfd *abfd)
 {
   CoreHdr *core = core_hdr (abfd);
   return CORE_NEW (*core) ? core->new.c_signo : core->old.c_signo;
This page took 0.032753 seconds and 4 git commands to generate.