+/* Return the c_datasize field from struct core_dumpx C. */
+
+#ifdef AIX_CORE_DUMPX_CORE
+# define CNEW_DATASIZE(c) (c).c_datasize
+#else
+# define CNEW_DATASIZE(c) 0
+#endif
+
+/* Return the c_impl field from struct core_dumpx C. */
+
+#if defined (HAVE_ST_C_IMPL) || defined (AIX_5_CORE)
+# define CNEW_IMPL(c) (c).c_impl
+#else
+# define CNEW_IMPL(c) 0
+#endif
+
+/* Return the command string from struct core_dumpx C. */
+
+#ifdef AIX_CORE_DUMPX_CORE
+# define CNEW_COMM(c) (c).c_u.U_proc.pi_comm
+#else
+# define CNEW_COMM(c) 0
+#endif
+
+/* Return the command string from struct core_dump C. */
+
+#ifdef CORE_VERSION_1
+# define COLD_COMM(c) (c).c_u.U_comm
+#else
+# define COLD_COMM(c) (c).c_u.u_comm
+#endif
+
+/* Return the struct __context64 pointer from struct core_dumpx C. */
+
+#ifdef AIX_CORE_DUMPX_CORE
+# define CNEW_CONTEXT64(c) (c).c_flt.hctx.r64
+#else
+# define CNEW_CONTEXT64(c) c
+#endif
+
+/* Return the struct mstsave pointer from struct core_dumpx C. */
+
+#ifdef AIX_CORE_DUMPX_CORE
+# define CNEW_MSTSAVE(c) (c).c_flt.hctx.r32
+#else
+# define CNEW_MSTSAVE(c) c
+#endif
+
+/* Return the struct mstsave pointer from struct core_dump C. */
+
+#ifdef CORE_VERSION_1
+# define COLD_MSTSAVE(c) (c).c_mst
+#else
+# define COLD_MSTSAVE(c) (c).c_u.u_save
+#endif
+
+/* Return whether struct core_dumpx is from a 64-bit process. */
+
+#ifdef AIX_CORE_DUMPX_CORE
+# define CNEW_PROC64(c) IS_PROC64(&(c).c_u.U_proc)
+#else
+# define CNEW_PROC64(c) 0
+#endif
+
+/* Magic end-of-stack addresses for old core dumps. This is _very_ fragile,
+ but I don't see any easy way to get that info right now. */
+
+#ifdef CORE_VERSION_1
+# define COLD_STACKEND 0x2ff23000
+#else
+# define COLD_STACKEND 0x2ff80000
+#endif
+
+/* Size of the leading portion that old and new core dump structures have in
+ common. */
+#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. */
+
+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 bfd_boolean
+read_hdr (bfd *abfd, CoreHdr *core)
+{
+ bfd_size_type size;
+
+ if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
+ 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;
+
+ /* 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;
+}
+
+static asection *
+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_with_flags (abfd, name, flags);
+ if (!asect)
+ return NULL;