Harmonize and improve auxiliary entries support for XCOFF
authorCl?ment Chigot <clement.chigot@atos.net>
Thu, 22 Apr 2021 11:28:50 +0000 (12:28 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 22 Apr 2021 11:28:50 +0000 (12:28 +0100)
bfd/ChangeLog:
* coff-rs6000.c (_bfd_xcoff_swap_aux_in): Add errors for
unsupported storage class or auxialiry entries.
Improve and adapt to new aux structures.
Add C_DWARF support.
(_bfd_xcoff_swap_aux_out): Likewise.
* coff64-rs6000.c (_bfd_xcoff64_swap_aux_in): Likewise.
(_bfd_xcoff64_swap_aux_out): Likewise.

binutils/ChangeLog:
* od-xcoff.c (dump_xcoff32_symbols): Adapt to new
aux structures.

include/ChangeLog:
* coff/internal.h (union internal_auxent):
 Add x_sect structure.
* coff/rs6000.h (union external_auxent): Rework to
match official documentation.
* coff/rs6k64.h (union external_auxent): Likewise.
(_AUX_SECT): New define.

bfd/ChangeLog
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
binutils/ChangeLog
binutils/od-xcoff.c
include/ChangeLog
include/coff/internal.h
include/coff/rs6000.h
include/coff/rs6k64.h

index db31bdb2669254e632ee2dd8194cd4683c55fc56..abb9d5f34d766f4cfcb926d2ae2d775b9e202ca7 100644 (file)
@@ -1,3 +1,13 @@
+2021-04-22  Clément Chigot  <clement.chigot@atos.net>
+
+       * coff-rs6000.c (_bfd_xcoff_swap_aux_in): Add errors for
+       unsupported storage class or auxialiry entries.
+       Improve and adapt to new aux structures.
+       Add C_DWARF support.
+       (_bfd_xcoff_swap_aux_out): Likewise.
+       * coff64-rs6000.c (_bfd_xcoff64_swap_aux_in): Likewise.
+       (_bfd_xcoff64_swap_aux_out): Likewise.
+
 2021-04-21  Eli Zaretskii  <eliz@gnu.org>
 
        PR 27760
index 7cfe4040fb790d0cea9928958c68b8b12968220b..491efbae80c086dc0eeb8aae32efd9f81127482d 100644 (file)
@@ -470,14 +470,22 @@ _bfd_xcoff_swap_sym_out (bfd *abfd, void * inp, void * extp)
 }
 
 void
-_bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type, int in_class,
-                       int indx, int numaux, void * in1)
+_bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type ATTRIBUTE_UNUSED,
+                       int in_class, int indx, int numaux, void * in1)
 {
   AUXENT * ext = (AUXENT *)ext1;
   union internal_auxent *in = (union internal_auxent *)in1;
 
   switch (in_class)
     {
+    default:
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: unsupported swap_aux_in for storage class %#x"),
+        abfd, (unsigned int) in_class);
+      bfd_set_error (bfd_error_bad_value);
+      break;
+
     case C_FILE:
       if (ext->x_file.x_n.x_fname[0] == 0)
        {
@@ -486,21 +494,13 @@ _bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type, int in_class,
            H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset);
        }
       else
-       {
-         if (numaux > 1)
-           {
-             if (indx == 0)
-               memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname,
-                       numaux * sizeof (AUXENT));
-           }
-         else
-           {
-             memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
-           }
-       }
-      goto end;
+       memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
+      break;
 
-      /* RS/6000 "csect" auxents */
+      /* RS/6000 "csect" auxents.
+         There is always a CSECT auxiliary entry. But functions can
+         have FCN ones too. In this case, CSECT is always the last
+         one. */
     case C_EXT:
     case C_AIX_WEAKEXT:
     case C_HIDEXT:
@@ -516,74 +516,47 @@ _bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type, int in_class,
          in->x_csect.x_smclas   = H_GET_8 (abfd, ext->x_csect.x_smclas);
          in->x_csect.x_stab     = H_GET_32 (abfd, ext->x_csect.x_stab);
          in->x_csect.x_snstab   = H_GET_16 (abfd, ext->x_csect.x_snstab);
-         goto end;
+       }
+      else
+       {
+         /* x_exptr isn't supported.  */
+         in->x_sym.x_misc.x_fsize
+           = H_GET_32 (abfd, ext->x_fcn.x_fsize);
+         in->x_sym.x_fcnary.x_fcn.x_lnnoptr
+           = H_GET_32 (abfd, ext->x_fcn.x_lnnoptr);
+         in->x_sym.x_fcnary.x_fcn.x_endndx.l
+           = H_GET_32 (abfd, ext->x_fcn.x_endndx);
        }
       break;
 
     case C_STAT:
-    case C_LEAFSTAT:
-    case C_HIDDEN:
-      if (type == T_NULL)
-       {
-         in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
-         in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
-         in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
-         /* PE defines some extra fields; we zero them out for
-            safety.  */
-         in->x_scn.x_checksum = 0;
-         in->x_scn.x_associated = 0;
-         in->x_scn.x_comdat = 0;
-
-         goto end;
-       }
+      in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
+      in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
+      in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
+      /* PE defines some extra fields; we zero them out for
+        safety.  */
+      in->x_scn.x_checksum = 0;
+      in->x_scn.x_associated = 0;
+      in->x_scn.x_comdat = 0;
       break;
-    }
 
-  in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
-  in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
+    case C_BLOCK:
+    case C_FCN:
+      in->x_sym.x_misc.x_lnsz.x_lnno
+       = H_GET_32 (abfd, ext->x_sym.x_lnno);
+      break;
 
-  if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
-      || ISTAG (in_class))
-    {
-      in->x_sym.x_fcnary.x_fcn.x_lnnoptr =
-       H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
-      in->x_sym.x_fcnary.x_fcn.x_endndx.l =
-       H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
-    }
-  else
-    {
-      in->x_sym.x_fcnary.x_ary.x_dimen[0] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[1] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[2] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[3] =
-       H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
-    }
+    case C_DWARF:
+      in->x_sect.x_scnlen = H_GET_32 (abfd, ext->x_sect.x_scnlen);
+      in->x_sect.x_nreloc = H_GET_32 (abfd, ext->x_sect.x_nreloc);
+      break;
 
-  if (ISFCN (type))
-    {
-      in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
     }
-  else
-    {
-      in->x_sym.x_misc.x_lnsz.x_lnno =
-       H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno);
-      in->x_sym.x_misc.x_lnsz.x_size =
-       H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size);
-    }
-
- end: ;
-  /* The semicolon is because MSVC doesn't like labels at
-     end of block.  */
 }
 
 unsigned int
-_bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
-                        int indx ATTRIBUTE_UNUSED,
-                        int numaux ATTRIBUTE_UNUSED,
-                        void * extp)
+_bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type ATTRIBUTE_UNUSED,
+                        int in_class, int indx, int numaux, void * extp)
 {
   union internal_auxent *in = (union internal_auxent *)inp;
   AUXENT *ext = (AUXENT *)extp;
@@ -591,6 +564,14 @@ _bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
   memset (ext, 0, bfd_coff_auxesz (abfd));
   switch (in_class)
     {
+    default:
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: unsupported swap_aux_out for storage class %#x"),
+        abfd, (unsigned int) in_class);
+      bfd_set_error (bfd_error_bad_value);
+      break;
+
     case C_FILE:
       if (in->x_file.x_fname[0] == 0)
        {
@@ -599,10 +580,8 @@ _bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
                    ext->x_file.x_n.x_n.x_offset);
        }
       else
-       {
-         memcpy (ext->x_file.x_n.x_fname, in->x_file.x_fname, FILNMLEN);
-       }
-      goto end;
+       memcpy (ext->x_file.x_n.x_fname, in->x_file.x_fname, FILNMLEN);
+      break;
 
       /* RS/6000 "csect" auxents */
     case C_EXT:
@@ -620,57 +599,34 @@ _bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type, int in_class,
          H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
          H_PUT_32 (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
          H_PUT_16 (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
-         goto end;
        }
-      break;
-
-    case C_STAT:
-    case C_LEAFSTAT:
-    case C_HIDDEN:
-      if (type == T_NULL)
+      else
        {
-         H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
-         H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
-         H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
-         goto end;
+         H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_fcn.x_fsize);
+         H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
+                   ext->x_fcn.x_lnnoptr);
+         H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
+                   ext->x_fcn.x_endndx);
        }
       break;
-    }
 
-  H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
-  H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
+    case C_STAT:
+      H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
+      H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
+      H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
+      break;
 
-  if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
-      || ISTAG (in_class))
-    {
-      H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
-               ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
-      H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
-               ext->x_sym.x_fcnary.x_fcn.x_endndx);
-    }
-  else
-    {
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
-      H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
-               ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
-    }
+    case C_BLOCK:
+    case C_FCN:
+      H_PUT_32 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext->x_sym.x_lnno);
+      break;
 
-  if (ISFCN (type))
-    H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
-  else
-    {
-      H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
-               ext->x_sym.x_misc.x_lnsz.x_lnno);
-      H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
-               ext->x_sym.x_misc.x_lnsz.x_size);
+    case C_DWARF:
+      H_PUT_32 (abfd, in->x_sect.x_scnlen, ext->x_sect.x_scnlen);
+      H_PUT_32 (abfd, in->x_sect.x_nreloc, ext->x_sect.x_nreloc);
+      break;
     }
 
- end:
   return bfd_coff_auxesz (abfd);
 }
 \f
index 889534088f0d21d33b41087cfb2c005f7942394e..9e9f9c2992fe3d1ec969e82c0e7e2bb66b3683b0 100644 (file)
@@ -362,15 +362,28 @@ _bfd_xcoff64_swap_sym_out (bfd *abfd, void *inp, void *extp)
 }
 
 static void
-_bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type, int in_class,
-                         int indx, int numaux, void *in1)
+_bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type ATTRIBUTE_UNUSED,
+                         int in_class, int indx, int numaux, void *in1)
 {
   union external_auxent *ext = (union external_auxent *) ext1;
   union internal_auxent *in = (union internal_auxent *) in1;
+  unsigned char auxtype;
 
   switch (in_class)
     {
+    default:
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: unsupported swap_aux_in for storage class %#x"),
+        abfd, (unsigned int) in_class);
+      bfd_set_error (bfd_error_bad_value);
+      break;
+
     case C_FILE:
+      auxtype = H_GET_8 (abfd, ext->x_file.x_auxtype);
+      if (auxtype != _AUX_FILE)
+       goto error;
+
       if (ext->x_file.x_n.x_n.x_zeroes[0] == 0)
        {
          in->x_file.x_n.x_zeroes = 0;
@@ -378,17 +391,25 @@ _bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type, int in_class,
            H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset);
        }
       else
-       {
-         memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
-       }
-      goto end;
+       memcpy (in->x_file.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
+      break;
 
-      /* RS/6000 "csect" auxents */
+      /* RS/6000 "csect" auxents.
+         There is always a CSECT auxiliary entry. But functions can
+         have FCN and EXCEPT ones too. In this case, CSECT is always the last
+         one.
+         For now, we only support FCN types.  */
     case C_EXT:
     case C_AIX_WEAKEXT:
     case C_HIDEXT:
       if (indx + 1 == numaux)
        {
+         /* C_EXT can have several aux enties. But the _AUX_CSECT is always
+            the last one.  */
+         auxtype = H_GET_8 (abfd, ext->x_csect.x_auxtype);
+         if (auxtype != _AUX_CSECT)
+           goto error;
+
          bfd_signed_vma h = 0;
          bfd_vma l = 0;
 
@@ -404,55 +425,67 @@ _bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type, int in_class,
             byte orders.  */
          in->x_csect.x_smtyp = H_GET_8 (abfd, ext->x_csect.x_smtyp);
          in->x_csect.x_smclas = H_GET_8 (abfd, ext->x_csect.x_smclas);
-         goto end;
+       }
+      else
+       {
+         /* It can also be a _AUX_EXCEPT entry. But it's not supported
+            for now. */
+         auxtype = H_GET_8 (abfd, ext->x_fcn.x_auxtype);
+         if (auxtype != _AUX_FCN)
+           goto error;
+
+         in->x_sym.x_fcnary.x_fcn.x_lnnoptr
+           = H_GET_64 (abfd, ext->x_fcn.x_lnnoptr);
+         in->x_sym.x_misc.x_fsize
+           = H_GET_32 (abfd, ext->x_fcn.x_fsize);
+         in->x_sym.x_fcnary.x_fcn.x_endndx.l
+           = H_GET_32 (abfd, ext->x_fcn.x_endndx);
        }
       break;
 
     case C_STAT:
-    case C_LEAFSTAT:
-    case C_HIDDEN:
-      if (type == T_NULL)
-       {
-         /* PE defines some extra fields; we zero them out for
-            safety.  */
-         in->x_scn.x_checksum = 0;
-         in->x_scn.x_associated = 0;
-         in->x_scn.x_comdat = 0;
-
-         goto end;
-       }
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: C_STAT isn't supported by XCOFF64"),
+        abfd);
+      bfd_set_error (bfd_error_bad_value);
       break;
-    }
 
-  if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
-      || ISTAG (in_class))
-    {
-      in->x_sym.x_fcnary.x_fcn.x_lnnoptr
-       = H_GET_64 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
-      in->x_sym.x_fcnary.x_fcn.x_endndx.l
-       = H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx);
-    }
-  if (ISFCN (type))
-    {
-      in->x_sym.x_misc.x_fsize
-       = H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_fsize);
-    }
-  else
-    {
+    case C_BLOCK:
+    case C_FCN:
+      auxtype = H_GET_8 (abfd, ext->x_sym.x_auxtype);
+      if (auxtype != _AUX_SYM)
+       goto error;
+
       in->x_sym.x_misc.x_lnsz.x_lnno
-       = H_GET_32 (abfd, ext->x_sym.x_fcnary.x_lnsz.x_lnno);
-      in->x_sym.x_misc.x_lnsz.x_size
-       = H_GET_16 (abfd, ext->x_sym.x_fcnary.x_lnsz.x_size);
+       = H_GET_32 (abfd, ext->x_sym.x_lnno);
+      break;
+
+    case C_DWARF:
+      auxtype = H_GET_8 (abfd, ext->x_sect.x_auxtype);
+      if (auxtype != _AUX_SECT)
+       goto error;
+
+      in->x_sect.x_scnlen = H_GET_64 (abfd, ext->x_sect.x_scnlen);
+      in->x_sect.x_nreloc = H_GET_64 (abfd, ext->x_sect.x_nreloc);
+      break;
     }
 
- end: ;
+  return;
+
+ error:
+  _bfd_error_handler
+    /* xgettext: c-format */
+    (_("%pB: wrong auxtype %#x for storage class %#x"),
+     abfd, auxtype, (unsigned int) in_class);
+  bfd_set_error (bfd_error_bad_value);
+
+
 }
 
 static unsigned int
-_bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type, int in_class,
-                          int indx ATTRIBUTE_UNUSED,
-                          int numaux ATTRIBUTE_UNUSED,
-                          void *extp)
+_bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type ATTRIBUTE_UNUSED,
+                          int in_class, int indx, int numaux, void *extp)
 {
   union internal_auxent *in = (union internal_auxent *) inp;
   union external_auxent *ext = (union external_auxent *) extp;
@@ -460,6 +493,14 @@ _bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type, int in_class,
   memset (ext, 0, bfd_coff_auxesz (abfd));
   switch (in_class)
     {
+    default:
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: unsupported swap_aux_out for storage class %#x"),
+        abfd, (unsigned int) in_class);
+      bfd_set_error (bfd_error_bad_value);
+      break;
+
     case C_FILE:
       if (in->x_file.x_n.x_zeroes == 0)
        {
@@ -468,13 +509,15 @@ _bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type, int in_class,
                    ext->x_file.x_n.x_n.x_offset);
        }
       else
-       {
-         memcpy (ext->x_file.x_n.x_fname, in->x_file.x_fname, FILNMLEN);
-       }
-      H_PUT_8 (abfd, _AUX_FILE, ext->x_auxtype.x_auxtype);
-      goto end;
+       memcpy (ext->x_file.x_n.x_fname, in->x_file.x_fname, FILNMLEN);
+      H_PUT_8 (abfd, _AUX_FILE, ext->x_file.x_auxtype);
+      break;
 
-      /* RS/6000 "csect" auxents */
+      /* RS/6000 "csect" auxents.
+         There is always a CSECT auxiliary entry. But functions can
+         have FCN and EXCEPT ones too. In this case, CSECT is always the last
+         one.
+         For now, we only support FCN types.  */
     case C_EXT:
     case C_AIX_WEAKEXT:
     case C_HIDEXT:
@@ -493,45 +536,39 @@ _bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type, int in_class,
             byte orders.  */
          H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
          H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
-         H_PUT_8 (abfd, _AUX_CSECT, ext->x_auxtype.x_auxtype);
-         goto end;
+         H_PUT_8 (abfd, _AUX_CSECT, ext->x_csect.x_auxtype);
+       }
+      else
+       {
+         H_PUT_64 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
+                   ext->x_fcn.x_lnnoptr);
+         H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_fcn.x_fsize);
+         H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
+                   ext->x_fcn.x_endndx);
+         H_PUT_8 (abfd, _AUX_FCN, ext->x_csect.x_auxtype);
        }
       break;
 
     case C_STAT:
-    case C_LEAFSTAT:
-    case C_HIDDEN:
-      if (type == T_NULL)
-       {
-         goto end;
-       }
+      _bfd_error_handler
+       /* xgettext: c-format */
+       (_("%pB: C_STAT isn't supported by XCOFF64"),
+        abfd);
+      bfd_set_error (bfd_error_bad_value);
       break;
-    }
 
-  if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
-      || ISTAG (in_class))
-    {
-      H_PUT_64 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
-              ext->x_sym.x_fcnary.x_fcn.x_lnnoptr);
-      H_PUT_8 (abfd, _AUX_FCN,
-              ext->x_auxtype.x_auxtype);
-      H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l,
-              ext->x_sym.x_fcnary.x_fcn.x_endndx);
-    }
-  if (ISFCN (type))
-    {
-      H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize,
-              ext->x_sym.x_fcnary.x_fcn.x_fsize);
-    }
-  else
-    {
-      H_PUT_32 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno,
-              ext->x_sym.x_fcnary.x_lnsz.x_lnno);
-      H_PUT_16 (abfd, in->x_sym.x_misc.x_lnsz.x_size,
-              ext->x_sym.x_fcnary.x_lnsz.x_size);
-    }
+    case C_BLOCK:
+    case C_FCN:
+      H_PUT_32 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext->x_sym.x_lnno);
+      H_PUT_8 (abfd, _AUX_SYM, ext->x_sym.x_auxtype);
+      break;
 
- end:
+    case C_DWARF:
+      H_PUT_64 (abfd, in->x_sect.x_scnlen, ext->x_sect.x_scnlen);
+      H_PUT_64 (abfd, in->x_sect.x_nreloc, ext->x_sect.x_nreloc);
+      H_PUT_8 (abfd, _AUX_SECT, ext->x_sect.x_auxtype);
+      break;
+    }
 
   return bfd_coff_auxesz (abfd);
 }
index e15d036123689123fb23156cccbb83e38c1795bb..9a1fd5dae09696a84d84e294af8757983ec5776a 100644 (file)
@@ -1,3 +1,8 @@
+2021-04-22  Clément Chigot  <clement.chigot@atos.net>
+
+       * od-xcoff.c (dump_xcoff32_symbols): Adapt to new
+       aux structures.
+
 2021-04-21  Nick Lott  <nick.lott@gmail.com>
 
        PR 27672
index f0d566b190213c393af2494b5547d5373661d643..02264503b15b91d41c97ab1af8a413ab4c4d8f3e 100644 (file)
@@ -838,13 +838,13 @@ dump_xcoff32_symbols (bfd *abfd, struct xcoff_dump *data)
                 {
                   /* Function aux entry  (Do not translate).  */
                   printf ("  exptr: %08x fsize: %08x lnnoptr: %08x endndx: %u\n",
-                          (unsigned)bfd_h_get_32 (abfd, aux->x_sym.x_tagndx),
+                          (unsigned)bfd_h_get_32 (abfd, aux->x_fcn.x_exptr),
                           (unsigned)bfd_h_get_32
-                            (abfd, aux->x_sym.x_misc.x_fsize),
+                            (abfd, aux->x_fcn.x_fsize),
                           (unsigned)bfd_h_get_32
-                            (abfd, aux->x_sym.x_fcnary.x_fcn.x_lnnoptr),
+                            (abfd, aux->x_fcn.x_lnnoptr),
                           (unsigned)bfd_h_get_32
-                            (abfd, aux->x_sym.x_fcnary.x_fcn.x_endndx));
+                            (abfd, aux->x_fcn.x_endndx));
                 }
               else if (j == 1 || (j == 0 && s->sym.numaux == 1))
                 {
@@ -899,7 +899,7 @@ dump_xcoff32_symbols (bfd *abfd, struct xcoff_dump *data)
             case C_FCN:
               printf ("  lnno: %u\n",
                       (unsigned)bfd_h_get_16
-                      (abfd, aux->x_sym.x_misc.x_lnsz.x_lnno));
+                      (abfd, aux->x_sym.x_lnno));
               break;
             default:
               /* Do not translate - generic field name.  */
index 20aefde33971e366f622f006d5ae23f9052a102c..0f277f95a61b4f0bbd7fa9911d20e32380dc8bea 100644 (file)
@@ -1,3 +1,12 @@
+2021-04-22  Clément Chigot  <clement.chigot@atos.net>
+
+       * coff/internal.h (union internal_auxent):
+        Add x_sect structure.
+       * coff/rs6000.h (union external_auxent): Rework to
+       match official documentation.
+       * coff/rs6k64.h (union external_auxent): Likewise.
+       (_AUX_SECT): New define.
+
 2021-04-21  Eli Zaretskii  <eliz@gnu.org>
 
        PR 27760
index b09bb0f469dc49f2c598d216e1682f4e5e1e2ddf..e79bf560c6e73606f23ec41395b13e447f59d06c 100644 (file)
@@ -659,6 +659,12 @@ union internal_auxent
 /*             14      ??? */
 #define        XMC_TC0 15              /* Read-write TOC anchor */
 #define XMC_TD 16              /* Read-write data in TOC */
+
+  struct
+  {
+    long x_scnlen;              /* Section length */
+    long x_nreloc;              /* Number of relocation entries */
+  } x_sect;
 };
 
 /********************** RELOCATION DIRECTIVES **********************/
index ff2de530b8ede27efa8d91427bdcdf94567334c9..e60efff23b6d1b633ddfac668cd4bcf93babe307 100644 (file)
@@ -153,59 +153,54 @@ struct external_syment
   
 
 union external_auxent {
-       struct {
-               char x_tagndx[4];       /* str, un, or enum tag indx */
-               union {
-                       struct {
-                           char  x_lnno[2]; /* declaration line number */
-                           char  x_size[2]; /* str/union/array size */
-                       } x_lnsz;
-                       char x_fsize[4];        /* size of function */
-               } x_misc;
-               union {
-                       struct {                /* if ISFCN, tag, or .bb */
-                           char x_lnnoptr[4];  /* ptr to fcn line # */
-                           char x_endndx[4];   /* entry ndx past block end */
-                       } x_fcn;
-                       struct {                /* if ISARY, up to 4 dimen. */
-                           char x_dimen[E_DIMNUM][2];
-                       } x_ary;
-               } x_fcnary;
-               char x_tvndx[2];                /* tv index */
-       } x_sym;
-
-        struct {
-                union {
-                        char x_fname[E_FILNMLEN];
-                        struct {
-                                char x_zeroes[4];
-                                char x_offset[4];
-                        } x_n;
-                } x_n;
-                char x_ftype[1];
-        } x_file;
-
-       struct {
-               char x_scnlen[4];                       /* section length */
-               char x_nreloc[2];       /* # relocation entries */
-               char x_nlinno[2];       /* # line numbers */
-       } x_scn;
-
-        struct {
-               char x_tvfill[4];       /* tv fill value */
-               char x_tvlen[2];        /* length of .tv */
-               char x_tvran[2][2];     /* tv range */
-       } x_tv;         /* info about .tv section (in auxent of symbol .tv)) */
-
-       struct {
-               unsigned char x_scnlen[4];
-               unsigned char x_parmhash[4];
-               unsigned char x_snhash[2];
-               unsigned char x_smtyp[1];
-               unsigned char x_smclas[1];
-               unsigned char x_stab[4];
-               unsigned char x_snstab[2];
-       } x_csect;
+  struct {
+    char x_pad1[2];
+    char x_lnno[4];    /* Source line number */
+    char x_pad[12];
+  } x_sym;
+
+  struct {
+    char x_exptr[4];
+    char x_fsize[4];
+    char x_lnnoptr[4];
+    char x_endndx[4];
+    char x_pad[1];
+  } x_fcn;
+
+  struct {
+    union {
+      char x_fname[E_FILNMLEN];
+      struct {
+       char x_zeroes[4];
+       char x_offset[4];
+      } x_n;
+    } x_n;
+    char x_ftype[1];
+  } x_file;
+
+  struct {
+    char x_scnlen[4];  /* section length */
+    char x_nreloc[2];  /* # relocation entries */
+    char x_nlinno[2];  /* # line numbers */
+    char x_pad[10];
+  } x_scn;
+
+  struct {
+    char x_scnlen[4];
+    char x_parmhash[4];
+    char x_snhash[2];
+    char x_smtyp[1];
+    char x_smclas[1];
+    char x_stab[4];
+    char x_snstab[2];
+  } x_csect;
+
+  struct {
+    char x_scnlen[4];
+    char x_pad1[4];
+    char x_nreloc[4];
+    char x_pad2[6];
+  } x_sect;
 
 };
 
index 53adf4be49ab9e631bee3185a502e15ad8c4050e..58ffd6eb2f4706a1a123667e8d7c4af453ab9f4d 100644 (file)
@@ -144,54 +144,59 @@ struct external_syment
 
 union external_auxent
 {
-    struct {
-       union {
-           struct {
-               char x_lnno[4];         /* declaration line number */
-               char x_size[2];         /* str/union/array size */
-           } x_lnsz;
-           struct {
-               char x_lnnoptr[8];/* ptr to fcn line */
-               char x_fsize[4];         /* size of function */
-               char x_endndx[4];        /* entry ndx past block end */
-           } x_fcn;
-       } x_fcnary;
-    } x_sym;
-         
-    struct {
-        union {
-            char x_fname[E_FILNMLEN];
-            struct {
-               char x_zeroes[4];
-                char x_offset[4];
-               char x_pad[6];
-            } x_n;
-        } x_n;
-        unsigned char x_ftype[1];
-        unsigned char x_resv[2];
-    } x_file;
-
-    struct {
-       char x_exptr[8];
-       char x_fsize[4];
-       char x_endndx[4];
-       char x_pad[1];
-    } x_except;
-
-    struct {
-           unsigned char x_scnlen_lo[4];
-           unsigned char x_parmhash[4];
-           unsigned char x_snhash[2];
-           unsigned char x_smtyp[1];
-           unsigned char x_smclas[1];
-           unsigned char x_scnlen_hi[4];
-           unsigned char x_pad[1];
-    } x_csect; 
-
-    struct {
-       char x_pad[17];
-       char x_auxtype[1];
-    } x_auxtype;
+  struct {
+    char x_lnno[4];    /* declaration line number */
+    char x_pad[13];
+    char x_auxtype[1];
+  } x_sym;
+
+  struct {
+    char x_lnnoptr[8];/* ptr to fcn line */
+    char x_fsize[4];    /* size of function */
+    char x_endndx[4];   /* entry ndx past block end */
+    char x_pad[1];
+    char x_auxtype[1];
+  } x_fcn;
+
+  struct {
+    union {
+      char x_fname[E_FILNMLEN];
+      struct {
+       char x_zeroes[4];
+       char x_offset[4];
+       char x_pad[6];
+      } x_n;
+    } x_n;
+    unsigned char x_ftype[1];
+    unsigned char x_resv[2];
+    char x_auxtype[1];
+  } x_file;
+
+  struct {
+    char x_exptr[8];
+    char x_fsize[4];
+    char x_endndx[4];
+    char x_pad[1];
+    char x_auxtype[1];
+  } x_except;
+
+  struct {
+    char x_scnlen_lo[4];
+    char x_parmhash[4];
+    char x_snhash[2];
+    char x_smtyp[1];
+    char x_smclas[1];
+    char x_scnlen_hi[4];
+    char x_pad[1];
+    char x_auxtype[1];
+  } x_csect;
+
+  struct {
+    char x_scnlen[8];
+    char x_nreloc[8];
+    char x_pad[1];
+    char x_auxtype[1];
+  } x_sect;
 };
 
 #define        SYMENT  struct external_syment
@@ -207,6 +212,7 @@ union external_auxent
 #define _AUX_SYM        253
 #define _AUX_FILE       252
 #define _AUX_CSECT      251
+#define _AUX_SECT       250
 
 /********************** RELOCATION DIRECTIVES **********************/