(root)/
binutils-2.41/
bfd/
ecoffswap.h
       1  /* Generic ECOFF swapping routines, for BFD.
       2     Copyright (C) 1992-2023 Free Software Foundation, Inc.
       3     Written by Cygnus Support.
       4  
       5     This file is part of BFD, the Binary File Descriptor library.
       6  
       7     This program is free software; you can redistribute it and/or modify
       8     it under the terms of the GNU General Public License as published by
       9     the Free Software Foundation; either version 3 of the License, or
      10     (at your option) any later version.
      11  
      12     This program is distributed in the hope that it will be useful,
      13     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15     GNU General Public License for more details.
      16  
      17     You should have received a copy of the GNU General Public License
      18     along with this program; if not, write to the Free Software
      19     Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      20     MA 02110-1301, USA.  */
      21  
      22  
      23  /* NOTE: This is a header file, but it contains executable routines.
      24     This is done this way because these routines are substantially
      25     similar, but are not identical, for all ECOFF targets.
      26  
      27     These are routines to swap the ECOFF symbolic information in and
      28     out.  The routines are defined statically.  You can set breakpoints
      29     on them in gdb by naming the including source file; e.g.,
      30     'coff-mips.c':ecoff_swap_hdr_in.
      31  
      32     Before including this header file, one of ECOFF_32, ECOFF_64,
      33     ECOFF_SIGNED_32 or ECOFF_SIGNED_64 must be defined.  These are
      34     checked when swapping information that depends upon the target
      35     size.  This code works for 32 bit and 64 bit ECOFF, but may need to
      36     be generalized in the future.
      37  
      38     Some header file which defines the external forms of these
      39     structures must also be included before including this header file.
      40     Currently this is either coff/mips.h or coff/alpha.h.
      41  
      42     If the symbol TEST is defined when this file is compiled, a
      43     comparison is made to ensure that, in fact, the output is
      44     bit-for-bit the same as the input.  Of course, this symbol should
      45     only be defined when deliberately testing the code on a machine
      46     with the proper byte sex and such.  */
      47  
      48  #ifdef ECOFF_32
      49  #define ECOFF_GET_OFF H_GET_32
      50  #define ECOFF_PUT_OFF H_PUT_32
      51  #endif
      52  #ifdef ECOFF_64
      53  #define ECOFF_GET_OFF H_GET_64
      54  #define ECOFF_PUT_OFF H_PUT_64
      55  #endif
      56  #ifdef ECOFF_SIGNED_32
      57  #define ECOFF_GET_OFF H_GET_S32
      58  #define ECOFF_PUT_OFF H_PUT_S32
      59  #endif
      60  #ifdef ECOFF_SIGNED_64
      61  #define ECOFF_GET_OFF H_GET_S64
      62  #define ECOFF_PUT_OFF H_PUT_S64
      63  #endif
      64  
      65  /* ECOFF auxiliary information swapping routines.  These are the same
      66     for all ECOFF targets, so they are defined in ecofflink.c.  */
      67  
      68  extern void _bfd_ecoff_swap_tir_in
      69    (int, const struct tir_ext *, TIR *);
      70  extern void _bfd_ecoff_swap_tir_out
      71    (int, const TIR *, struct tir_ext *);
      72  extern void _bfd_ecoff_swap_rndx_in
      73    (int, const struct rndx_ext *, RNDXR *);
      74  extern void _bfd_ecoff_swap_rndx_out
      75    (int, const RNDXR *, struct rndx_ext *);
      76  
      77  /* Prototypes for functions defined in this file.  */
      78  
      79  static void ecoff_swap_hdr_in (bfd *, void *, HDRR *);
      80  static void ecoff_swap_hdr_out (bfd *, const HDRR *, void *);
      81  static void ecoff_swap_fdr_in (bfd *, void *, FDR *);
      82  static void ecoff_swap_fdr_out (bfd *, const FDR *, void *);
      83  static void ecoff_swap_pdr_in (bfd *, void *, PDR *);
      84  static void ecoff_swap_pdr_out (bfd *, const PDR *, void *);
      85  static void ecoff_swap_sym_in (bfd *, void *, SYMR *);
      86  static void ecoff_swap_sym_out (bfd *, const SYMR *, void *);
      87  static void ecoff_swap_ext_in (bfd *, void *, EXTR *);
      88  static void ecoff_swap_ext_out (bfd *, const EXTR *, void *);
      89  static void ecoff_swap_rfd_in (bfd *, void *, RFDT *);
      90  static void ecoff_swap_rfd_out (bfd *, const RFDT *, void *);
      91  static void ecoff_swap_opt_in (bfd *, void *, OPTR *);
      92  static void ecoff_swap_opt_out (bfd *, const OPTR *, void *);
      93  static void ecoff_swap_dnr_in (bfd *, void *, DNR *);
      94  static void ecoff_swap_dnr_out (bfd *, const DNR *, void *);
      95  
      96  /* Swap in the symbolic header.  */
      97  
      98  static void
      99  ecoff_swap_hdr_in (bfd *abfd, void * ext_copy, HDRR *intern)
     100  {
     101    struct hdr_ext ext[1];
     102  
     103    *ext = *(struct hdr_ext *) ext_copy;
     104  
     105    intern->magic		= H_GET_S16	(abfd, ext->h_magic);
     106    intern->vstamp	= H_GET_S16	(abfd, ext->h_vstamp);
     107    intern->ilineMax	= H_GET_32	(abfd, ext->h_ilineMax);
     108    intern->cbLine	= ECOFF_GET_OFF (abfd, ext->h_cbLine);
     109    intern->cbLineOffset	= ECOFF_GET_OFF (abfd, ext->h_cbLineOffset);
     110    intern->idnMax	= H_GET_32	(abfd, ext->h_idnMax);
     111    intern->cbDnOffset	= ECOFF_GET_OFF (abfd, ext->h_cbDnOffset);
     112    intern->ipdMax	= H_GET_32	(abfd, ext->h_ipdMax);
     113    intern->cbPdOffset	= ECOFF_GET_OFF (abfd, ext->h_cbPdOffset);
     114    intern->isymMax	= H_GET_32	(abfd, ext->h_isymMax);
     115    intern->cbSymOffset	= ECOFF_GET_OFF (abfd, ext->h_cbSymOffset);
     116    intern->ioptMax	= H_GET_32	(abfd, ext->h_ioptMax);
     117    intern->cbOptOffset	= ECOFF_GET_OFF (abfd, ext->h_cbOptOffset);
     118    intern->iauxMax	= H_GET_32	(abfd, ext->h_iauxMax);
     119    intern->cbAuxOffset	= ECOFF_GET_OFF (abfd, ext->h_cbAuxOffset);
     120    intern->issMax	= H_GET_32	(abfd, ext->h_issMax);
     121    intern->cbSsOffset	= ECOFF_GET_OFF (abfd, ext->h_cbSsOffset);
     122    intern->issExtMax	= H_GET_32	(abfd, ext->h_issExtMax);
     123    intern->cbSsExtOffset = ECOFF_GET_OFF (abfd, ext->h_cbSsExtOffset);
     124    intern->ifdMax	= H_GET_32	(abfd, ext->h_ifdMax);
     125    intern->cbFdOffset	= ECOFF_GET_OFF (abfd, ext->h_cbFdOffset);
     126    intern->crfd		= H_GET_32	(abfd, ext->h_crfd);
     127    intern->cbRfdOffset	= ECOFF_GET_OFF (abfd, ext->h_cbRfdOffset);
     128    intern->iextMax	= H_GET_32	(abfd, ext->h_iextMax);
     129    intern->cbExtOffset	= ECOFF_GET_OFF (abfd, ext->h_cbExtOffset);
     130  
     131  #ifdef TEST
     132    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     133      abort ();
     134  #endif
     135  }
     136  
     137  /* Swap out the symbolic header.  */
     138  
     139  static void
     140  ecoff_swap_hdr_out (bfd *abfd, const HDRR *intern_copy, void * ext_ptr)
     141  {
     142    struct hdr_ext *ext = (struct hdr_ext *) ext_ptr;
     143    HDRR intern[1];
     144  
     145    *intern = *intern_copy;
     146  
     147    H_PUT_S16	(abfd, intern->magic,	      ext->h_magic);
     148    H_PUT_S16	(abfd, intern->vstamp,	      ext->h_vstamp);
     149    H_PUT_32	(abfd, intern->ilineMax,      ext->h_ilineMax);
     150    ECOFF_PUT_OFF (abfd, intern->cbLine,	      ext->h_cbLine);
     151    ECOFF_PUT_OFF (abfd, intern->cbLineOffset,  ext->h_cbLineOffset);
     152    H_PUT_32	(abfd, intern->idnMax,	      ext->h_idnMax);
     153    ECOFF_PUT_OFF (abfd, intern->cbDnOffset,    ext->h_cbDnOffset);
     154    H_PUT_32	(abfd, intern->ipdMax,	      ext->h_ipdMax);
     155    ECOFF_PUT_OFF (abfd, intern->cbPdOffset,    ext->h_cbPdOffset);
     156    H_PUT_32	(abfd, intern->isymMax,	      ext->h_isymMax);
     157    ECOFF_PUT_OFF (abfd, intern->cbSymOffset,   ext->h_cbSymOffset);
     158    H_PUT_32	(abfd, intern->ioptMax,	      ext->h_ioptMax);
     159    ECOFF_PUT_OFF (abfd, intern->cbOptOffset,   ext->h_cbOptOffset);
     160    H_PUT_32	(abfd, intern->iauxMax,	      ext->h_iauxMax);
     161    ECOFF_PUT_OFF (abfd, intern->cbAuxOffset,   ext->h_cbAuxOffset);
     162    H_PUT_32	(abfd, intern->issMax,	      ext->h_issMax);
     163    ECOFF_PUT_OFF (abfd, intern->cbSsOffset,    ext->h_cbSsOffset);
     164    H_PUT_32	(abfd, intern->issExtMax,     ext->h_issExtMax);
     165    ECOFF_PUT_OFF (abfd, intern->cbSsExtOffset, ext->h_cbSsExtOffset);
     166    H_PUT_32	(abfd, intern->ifdMax,	      ext->h_ifdMax);
     167    ECOFF_PUT_OFF (abfd, intern->cbFdOffset,    ext->h_cbFdOffset);
     168    H_PUT_32	(abfd, intern->crfd,	      ext->h_crfd);
     169    ECOFF_PUT_OFF (abfd, intern->cbRfdOffset,   ext->h_cbRfdOffset);
     170    H_PUT_32	(abfd, intern->iextMax,	      ext->h_iextMax);
     171    ECOFF_PUT_OFF (abfd, intern->cbExtOffset,   ext->h_cbExtOffset);
     172  
     173  #ifdef TEST
     174    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     175      abort ();
     176  #endif
     177  }
     178  
     179  /* Swap in the file descriptor record.  */
     180  
     181  static void
     182  ecoff_swap_fdr_in (bfd *abfd, void * ext_copy, FDR *intern)
     183  {
     184    struct fdr_ext ext[1];
     185  
     186    *ext = *(struct fdr_ext *) ext_copy;
     187  
     188    intern->adr		= ECOFF_GET_OFF (abfd, ext->f_adr);
     189    intern->rss		= H_GET_32 (abfd, ext->f_rss);
     190  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     191    if (intern->rss == (signed long) 0xffffffff)
     192      intern->rss = -1;
     193  #endif
     194    intern->issBase	= H_GET_32 (abfd, ext->f_issBase);
     195    intern->cbSs		= ECOFF_GET_OFF (abfd, ext->f_cbSs);
     196    intern->isymBase	= H_GET_32 (abfd, ext->f_isymBase);
     197    intern->csym		= H_GET_32 (abfd, ext->f_csym);
     198    intern->ilineBase	= H_GET_32 (abfd, ext->f_ilineBase);
     199    intern->cline		= H_GET_32 (abfd, ext->f_cline);
     200    intern->ioptBase	= H_GET_32 (abfd, ext->f_ioptBase);
     201    intern->copt		= H_GET_32 (abfd, ext->f_copt);
     202  #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
     203    intern->ipdFirst	= H_GET_16 (abfd, ext->f_ipdFirst);
     204    intern->cpd		= H_GET_16 (abfd, ext->f_cpd);
     205  #endif
     206  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     207    intern->ipdFirst	= H_GET_32 (abfd, ext->f_ipdFirst);
     208    intern->cpd		= H_GET_32 (abfd, ext->f_cpd);
     209  #endif
     210    intern->iauxBase	= H_GET_32 (abfd, ext->f_iauxBase);
     211    intern->caux		= H_GET_32 (abfd, ext->f_caux);
     212    intern->rfdBase	= H_GET_32 (abfd, ext->f_rfdBase);
     213    intern->crfd		= H_GET_32 (abfd, ext->f_crfd);
     214  
     215    /* Now the fun stuff...  */
     216    if (bfd_header_big_endian (abfd))
     217      {
     218        intern->lang       = ((ext->f_bits1[0] & FDR_BITS1_LANG_BIG)
     219  			    >> FDR_BITS1_LANG_SH_BIG);
     220        intern->fMerge     = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_BIG);
     221        intern->fReadin    = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_BIG);
     222        intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_BIG);
     223        intern->glevel     = ((ext->f_bits2[0] & FDR_BITS2_GLEVEL_BIG)
     224  			    >> FDR_BITS2_GLEVEL_SH_BIG);
     225      }
     226    else
     227      {
     228        intern->lang       = ((ext->f_bits1[0] & FDR_BITS1_LANG_LITTLE)
     229  			    >> FDR_BITS1_LANG_SH_LITTLE);
     230        intern->fMerge     = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_LITTLE);
     231        intern->fReadin    = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_LITTLE);
     232        intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_LITTLE);
     233        intern->glevel     = ((ext->f_bits2[0] & FDR_BITS2_GLEVEL_LITTLE)
     234  			    >> FDR_BITS2_GLEVEL_SH_LITTLE);
     235      }
     236    intern->reserved = 0;
     237  
     238    intern->cbLineOffset	= ECOFF_GET_OFF (abfd, ext->f_cbLineOffset);
     239    intern->cbLine	= ECOFF_GET_OFF (abfd, ext->f_cbLine);
     240  
     241  #ifdef TEST
     242    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     243      abort ();
     244  #endif
     245  }
     246  
     247  /* Swap out the file descriptor record.  */
     248  
     249  static void
     250  ecoff_swap_fdr_out (bfd *abfd, const FDR *intern_copy, void * ext_ptr)
     251  {
     252    struct fdr_ext *ext = (struct fdr_ext *) ext_ptr;
     253    FDR intern[1];
     254  
     255    /* Make it reasonable to do in-place.  */
     256    *intern = *intern_copy;
     257  
     258    ECOFF_PUT_OFF (abfd, intern->adr,       ext->f_adr);
     259    H_PUT_32      (abfd, intern->rss,       ext->f_rss);
     260    H_PUT_32      (abfd, intern->issBase,   ext->f_issBase);
     261    ECOFF_PUT_OFF (abfd, intern->cbSs,      ext->f_cbSs);
     262    H_PUT_32      (abfd, intern->isymBase,  ext->f_isymBase);
     263    H_PUT_32      (abfd, intern->csym,      ext->f_csym);
     264    H_PUT_32      (abfd, intern->ilineBase, ext->f_ilineBase);
     265    H_PUT_32      (abfd, intern->cline,     ext->f_cline);
     266    H_PUT_32      (abfd, intern->ioptBase,  ext->f_ioptBase);
     267    H_PUT_32      (abfd, intern->copt,      ext->f_copt);
     268  #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
     269    H_PUT_16      (abfd, intern->ipdFirst,  ext->f_ipdFirst);
     270    H_PUT_16      (abfd, intern->cpd,       ext->f_cpd);
     271  #endif
     272  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     273    H_PUT_32      (abfd, intern->ipdFirst,  ext->f_ipdFirst);
     274    H_PUT_32      (abfd, intern->cpd,       ext->f_cpd);
     275  #endif
     276    H_PUT_32      (abfd, intern->iauxBase,  ext->f_iauxBase);
     277    H_PUT_32      (abfd, intern->caux,      ext->f_caux);
     278    H_PUT_32      (abfd, intern->rfdBase,   ext->f_rfdBase);
     279    H_PUT_32      (abfd, intern->crfd,      ext->f_crfd);
     280  
     281    /* Now the fun stuff...  */
     282    if (bfd_header_big_endian (abfd))
     283      {
     284        ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_BIG)
     285  			  & FDR_BITS1_LANG_BIG)
     286  			 | (intern->fMerge ? FDR_BITS1_FMERGE_BIG : 0)
     287  			 | (intern->fReadin ? FDR_BITS1_FREADIN_BIG : 0)
     288  			 | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_BIG : 0));
     289        ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_BIG)
     290  			 & FDR_BITS2_GLEVEL_BIG);
     291        ext->f_bits2[1] = 0;
     292        ext->f_bits2[2] = 0;
     293      }
     294    else
     295      {
     296        ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_LITTLE)
     297  			  & FDR_BITS1_LANG_LITTLE)
     298  			 | (intern->fMerge ? FDR_BITS1_FMERGE_LITTLE : 0)
     299  			 | (intern->fReadin ? FDR_BITS1_FREADIN_LITTLE : 0)
     300  			 | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_LITTLE : 0));
     301        ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_LITTLE)
     302  			 & FDR_BITS2_GLEVEL_LITTLE);
     303        ext->f_bits2[1] = 0;
     304        ext->f_bits2[2] = 0;
     305      }
     306  
     307    ECOFF_PUT_OFF (abfd, intern->cbLineOffset, ext->f_cbLineOffset);
     308    ECOFF_PUT_OFF (abfd, intern->cbLine, ext->f_cbLine);
     309  
     310  #ifdef TEST
     311    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     312      abort ();
     313  #endif
     314  }
     315  
     316  /* Swap in the procedure descriptor record.  */
     317  
     318  static void
     319  ecoff_swap_pdr_in (bfd *abfd, void * ext_copy, PDR *intern)
     320  {
     321    struct pdr_ext ext[1];
     322  
     323    *ext = *(struct pdr_ext *) ext_copy;
     324  
     325    memset ((void *) intern, 0, sizeof (*intern));
     326  
     327    intern->adr		= ECOFF_GET_OFF (abfd, ext->p_adr);
     328    intern->isym		= H_GET_32 (abfd, ext->p_isym);
     329    intern->iline		= H_GET_32 (abfd, ext->p_iline);
     330    intern->regmask	= H_GET_32 (abfd, ext->p_regmask);
     331    intern->regoffset	= H_GET_S32 (abfd, ext->p_regoffset);
     332    intern->iopt		= H_GET_S32 (abfd, ext->p_iopt);
     333    intern->fregmask	= H_GET_32 (abfd, ext->p_fregmask);
     334    intern->fregoffset	= H_GET_S32 (abfd, ext->p_fregoffset);
     335    intern->frameoffset	= H_GET_S32 (abfd, ext->p_frameoffset);
     336    intern->framereg	= H_GET_16 (abfd, ext->p_framereg);
     337    intern->pcreg		= H_GET_16 (abfd, ext->p_pcreg);
     338    intern->lnLow		= H_GET_32 (abfd, ext->p_lnLow);
     339    intern->lnHigh	= H_GET_32 (abfd, ext->p_lnHigh);
     340    intern->cbLineOffset	= ECOFF_GET_OFF (abfd, ext->p_cbLineOffset);
     341  
     342  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     343    if (intern->isym == (signed long) 0xffffffff)
     344      intern->isym = -1;
     345    if (intern->iline == (signed long) 0xffffffff)
     346      intern->iline = -1;
     347  
     348    intern->gp_prologue = H_GET_8 (abfd, ext->p_gp_prologue);
     349    if (bfd_header_big_endian (abfd))
     350      {
     351        intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_BIG);
     352        intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_BIG);
     353        intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_BIG);
     354        intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_BIG)
     355  			   << PDR_BITS1_RESERVED_SH_LEFT_BIG)
     356  			  | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_BIG)
     357  			     >> PDR_BITS2_RESERVED_SH_BIG));
     358      }
     359    else
     360      {
     361        intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_LITTLE);
     362        intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_LITTLE);
     363        intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_LITTLE);
     364        intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_LITTLE)
     365  			   >> PDR_BITS1_RESERVED_SH_LITTLE)
     366  			  | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_LITTLE)
     367  			     << PDR_BITS2_RESERVED_SH_LEFT_LITTLE));
     368      }
     369    intern->localoff = H_GET_8 (abfd, ext->p_localoff);
     370  #endif
     371  
     372  #ifdef TEST
     373    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     374      abort ();
     375  #endif
     376  }
     377  
     378  /* Swap out the procedure descriptor record.  */
     379  
     380  static void
     381  ecoff_swap_pdr_out (bfd *abfd, const PDR *intern_copy, void * ext_ptr)
     382  {
     383    struct pdr_ext *ext = (struct pdr_ext *) ext_ptr;
     384    PDR intern[1];
     385  
     386    /* Make it reasonable to do in-place.  */
     387    *intern = *intern_copy;
     388  
     389    ECOFF_PUT_OFF (abfd, intern->adr,	     ext->p_adr);
     390    H_PUT_32	(abfd, intern->isym,	     ext->p_isym);
     391    H_PUT_32	(abfd, intern->iline,	     ext->p_iline);
     392    H_PUT_32	(abfd, intern->regmask,	     ext->p_regmask);
     393    H_PUT_32	(abfd, intern->regoffset,    ext->p_regoffset);
     394    H_PUT_32	(abfd, intern->iopt,	     ext->p_iopt);
     395    H_PUT_32	(abfd, intern->fregmask,     ext->p_fregmask);
     396    H_PUT_32	(abfd, intern->fregoffset,   ext->p_fregoffset);
     397    H_PUT_32	(abfd, intern->frameoffset,  ext->p_frameoffset);
     398    H_PUT_16	(abfd, intern->framereg,     ext->p_framereg);
     399    H_PUT_16	(abfd, intern->pcreg,	     ext->p_pcreg);
     400    H_PUT_32	(abfd, intern->lnLow,	     ext->p_lnLow);
     401    H_PUT_32	(abfd, intern->lnHigh,	     ext->p_lnHigh);
     402    ECOFF_PUT_OFF (abfd, intern->cbLineOffset, ext->p_cbLineOffset);
     403  
     404  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     405    H_PUT_8       (abfd, intern->gp_prologue,  ext->p_gp_prologue);
     406  
     407    if (bfd_header_big_endian (abfd))
     408      {
     409        ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_BIG : 0)
     410  			 | (intern->reg_frame ? PDR_BITS1_REG_FRAME_BIG : 0)
     411  			 | (intern->prof ? PDR_BITS1_PROF_BIG : 0)
     412  			 | ((intern->reserved
     413  			     >> PDR_BITS1_RESERVED_SH_LEFT_BIG)
     414  			    & PDR_BITS1_RESERVED_BIG));
     415        ext->p_bits2[0] = ((intern->reserved << PDR_BITS2_RESERVED_SH_BIG)
     416  			 & PDR_BITS2_RESERVED_BIG);
     417      }
     418    else
     419      {
     420        ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_LITTLE : 0)
     421  			 | (intern->reg_frame ? PDR_BITS1_REG_FRAME_LITTLE : 0)
     422  			 | (intern->prof ? PDR_BITS1_PROF_LITTLE : 0)
     423  			 | ((intern->reserved << PDR_BITS1_RESERVED_SH_LITTLE)
     424  			    & PDR_BITS1_RESERVED_LITTLE));
     425        ext->p_bits2[0] = ((intern->reserved >>
     426  			  PDR_BITS2_RESERVED_SH_LEFT_LITTLE)
     427  			 & PDR_BITS2_RESERVED_LITTLE);
     428      }
     429    H_PUT_8 (abfd, intern->localoff, ext->p_localoff);
     430  #endif
     431  
     432  #ifdef TEST
     433    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     434      abort ();
     435  #endif
     436  }
     437  
     438  /* Swap in a symbol record.  */
     439  
     440  static void
     441  ecoff_swap_sym_in (bfd *abfd, void * ext_copy, SYMR *intern)
     442  {
     443    struct sym_ext ext[1];
     444  
     445    *ext = *(struct sym_ext *) ext_copy;
     446  
     447    intern->iss		= H_GET_32 (abfd, ext->s_iss);
     448    intern->value		= ECOFF_GET_OFF (abfd, ext->s_value);
     449  
     450  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     451    if (intern->iss == (signed long) 0xffffffff)
     452      intern->iss = -1;
     453  #endif
     454  
     455    /* Now the fun stuff...  */
     456    if (bfd_header_big_endian (abfd))
     457      {
     458        intern->st	  =  (ext->s_bits1[0] & SYM_BITS1_ST_BIG)
     459  					     >> SYM_BITS1_ST_SH_BIG;
     460        intern->sc	  = ((ext->s_bits1[0] & SYM_BITS1_SC_BIG)
     461  					     << SYM_BITS1_SC_SH_LEFT_BIG)
     462  			  | ((ext->s_bits2[0] & SYM_BITS2_SC_BIG)
     463  					     >> SYM_BITS2_SC_SH_BIG);
     464        intern->reserved	  = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_BIG);
     465        intern->index	  = ((ext->s_bits2[0] & SYM_BITS2_INDEX_BIG)
     466  					     << SYM_BITS2_INDEX_SH_LEFT_BIG)
     467  			  | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_BIG)
     468  			  | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_BIG);
     469      }
     470    else
     471      {
     472        intern->st	  =  (ext->s_bits1[0] & SYM_BITS1_ST_LITTLE)
     473  					     >> SYM_BITS1_ST_SH_LITTLE;
     474        intern->sc	  = ((ext->s_bits1[0] & SYM_BITS1_SC_LITTLE)
     475  					     >> SYM_BITS1_SC_SH_LITTLE)
     476  			  | ((ext->s_bits2[0] & SYM_BITS2_SC_LITTLE)
     477  					     << SYM_BITS2_SC_SH_LEFT_LITTLE);
     478        intern->reserved	  = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_LITTLE);
     479        intern->index	  = ((ext->s_bits2[0] & SYM_BITS2_INDEX_LITTLE)
     480  					     >> SYM_BITS2_INDEX_SH_LITTLE)
     481  			  | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_LITTLE)
     482  			  | ((unsigned int) ext->s_bits4[0]
     483  			     << SYM_BITS4_INDEX_SH_LEFT_LITTLE);
     484      }
     485  
     486  #ifdef TEST
     487    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     488      abort ();
     489  #endif
     490  }
     491  
     492  /* Swap out a symbol record.  */
     493  
     494  static void
     495  ecoff_swap_sym_out (bfd *abfd, const SYMR *intern_copy, void * ext_ptr)
     496  {
     497    struct sym_ext *ext = (struct sym_ext *) ext_ptr;
     498    SYMR intern[1];
     499  
     500    /* Make it reasonable to do in-place.  */
     501    *intern = *intern_copy;
     502  
     503    H_PUT_32 (abfd, intern->iss, ext->s_iss);
     504    ECOFF_PUT_OFF (abfd, intern->value, ext->s_value);
     505  
     506    /* Now the fun stuff...  */
     507    if (bfd_header_big_endian (abfd))
     508      {
     509        ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_BIG)
     510  			  & SYM_BITS1_ST_BIG)
     511  			 | ((intern->sc >> SYM_BITS1_SC_SH_LEFT_BIG)
     512  			    & SYM_BITS1_SC_BIG));
     513        ext->s_bits2[0] = (((intern->sc << SYM_BITS2_SC_SH_BIG)
     514  			  & SYM_BITS2_SC_BIG)
     515  			 | (intern->reserved ? SYM_BITS2_RESERVED_BIG : 0)
     516  			 | ((intern->index >> SYM_BITS2_INDEX_SH_LEFT_BIG)
     517  			    & SYM_BITS2_INDEX_BIG));
     518        ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_BIG) & 0xff;
     519        ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_BIG) & 0xff;
     520      }
     521    else
     522      {
     523        ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_LITTLE)
     524  			  & SYM_BITS1_ST_LITTLE)
     525  			 | ((intern->sc << SYM_BITS1_SC_SH_LITTLE)
     526  			    & SYM_BITS1_SC_LITTLE));
     527        ext->s_bits2[0] = (((intern->sc >> SYM_BITS2_SC_SH_LEFT_LITTLE)
     528  			  & SYM_BITS2_SC_LITTLE)
     529  			 | (intern->reserved ? SYM_BITS2_RESERVED_LITTLE : 0)
     530  			 | ((intern->index << SYM_BITS2_INDEX_SH_LITTLE)
     531  			    & SYM_BITS2_INDEX_LITTLE));
     532        ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_LITTLE) & 0xff;
     533        ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_LITTLE) & 0xff;
     534      }
     535  
     536  #ifdef TEST
     537    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     538      abort ();
     539  #endif
     540  }
     541  
     542  /* Swap in an external symbol record.  */
     543  
     544  static void
     545  ecoff_swap_ext_in (bfd *abfd, void * ext_copy, EXTR *intern)
     546  {
     547    struct ext_ext ext[1];
     548  
     549    *ext = *(struct ext_ext *) ext_copy;
     550  
     551    /* Now the fun stuff...  */
     552    if (bfd_header_big_endian (abfd))
     553      {
     554        intern->jmptbl      = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_BIG);
     555        intern->cobol_main  = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_BIG);
     556        intern->weakext     = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_BIG);
     557      }
     558    else
     559      {
     560        intern->jmptbl      = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_LITTLE);
     561        intern->cobol_main  = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_LITTLE);
     562        intern->weakext     = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_LITTLE);
     563      }
     564    intern->reserved = 0;
     565  
     566  #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
     567    intern->ifd = H_GET_S16 (abfd, ext->es_ifd);
     568  #endif
     569  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     570    intern->ifd = H_GET_S32 (abfd, ext->es_ifd);
     571  #endif
     572  
     573    ecoff_swap_sym_in (abfd, &ext->es_asym, &intern->asym);
     574  
     575  #ifdef TEST
     576    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     577      abort ();
     578  #endif
     579  }
     580  
     581  /* Swap out an external symbol record.  */
     582  
     583  static void
     584  ecoff_swap_ext_out (bfd *abfd, const EXTR *intern_copy, void * ext_ptr)
     585  {
     586    struct ext_ext *ext = (struct ext_ext *) ext_ptr;
     587    EXTR intern[1];
     588  
     589    /* Make it reasonable to do in-place.  */
     590    *intern = *intern_copy;
     591  
     592    /* Now the fun stuff...  */
     593    if (bfd_header_big_endian (abfd))
     594      {
     595        ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_BIG : 0)
     596  			  | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_BIG : 0)
     597  			  | (intern->weakext ? EXT_BITS1_WEAKEXT_BIG : 0));
     598        ext->es_bits2[0] = 0;
     599  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     600        ext->es_bits2[1] = 0;
     601        ext->es_bits2[2] = 0;
     602  #endif
     603      }
     604    else
     605      {
     606        ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_LITTLE : 0)
     607  			  | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_LITTLE : 0)
     608  			  | (intern->weakext ? EXT_BITS1_WEAKEXT_LITTLE : 0));
     609        ext->es_bits2[0] = 0;
     610  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     611        ext->es_bits2[1] = 0;
     612        ext->es_bits2[2] = 0;
     613  #endif
     614      }
     615  
     616  #if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
     617    H_PUT_S16 (abfd, intern->ifd, ext->es_ifd);
     618  #endif
     619  #if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
     620    H_PUT_S32 (abfd, intern->ifd, ext->es_ifd);
     621  #endif
     622  
     623    ecoff_swap_sym_out (abfd, &intern->asym, &ext->es_asym);
     624  
     625  #ifdef TEST
     626    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     627      abort ();
     628  #endif
     629  }
     630  
     631  /* Swap in a relative file descriptor.  */
     632  
     633  static void
     634  ecoff_swap_rfd_in (bfd *abfd, void * ext_ptr, RFDT *intern)
     635  {
     636    struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
     637  
     638    *intern = H_GET_32 (abfd, ext->rfd);
     639  
     640  #ifdef TEST
     641    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     642      abort ();
     643  #endif
     644  }
     645  
     646  /* Swap out a relative file descriptor.  */
     647  
     648  static void
     649  ecoff_swap_rfd_out (bfd *abfd, const RFDT *intern, void * ext_ptr)
     650  {
     651    struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
     652  
     653    H_PUT_32 (abfd, *intern, ext->rfd);
     654  
     655  #ifdef TEST
     656    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     657      abort ();
     658  #endif
     659  }
     660  
     661  /* Swap in an optimization symbol.  */
     662  
     663  static void
     664  ecoff_swap_opt_in (bfd *abfd, void * ext_copy, OPTR * intern)
     665  {
     666    struct opt_ext ext[1];
     667  
     668    *ext = *(struct opt_ext *) ext_copy;
     669  
     670    if (bfd_header_big_endian (abfd))
     671      {
     672        intern->ot = ext->o_bits1[0];
     673        intern->value = (((unsigned int) ext->o_bits2[0]
     674  			<< OPT_BITS2_VALUE_SH_LEFT_BIG)
     675  		       | ((unsigned int) ext->o_bits3[0]
     676  			  << OPT_BITS2_VALUE_SH_LEFT_BIG)
     677  		       | ((unsigned int) ext->o_bits4[0]
     678  			  << OPT_BITS2_VALUE_SH_LEFT_BIG));
     679      }
     680    else
     681      {
     682        intern->ot = ext->o_bits1[0];
     683        intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
     684  		       | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
     685  		       | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE));
     686      }
     687  
     688    _bfd_ecoff_swap_rndx_in (bfd_header_big_endian (abfd),
     689  			   &ext->o_rndx, &intern->rndx);
     690  
     691    intern->offset = H_GET_32 (abfd, ext->o_offset);
     692  
     693  #ifdef TEST
     694    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     695      abort ();
     696  #endif
     697  }
     698  
     699  /* Swap out an optimization symbol.  */
     700  
     701  static void
     702  ecoff_swap_opt_out (bfd *abfd, const OPTR *intern_copy, void * ext_ptr)
     703  {
     704    struct opt_ext *ext = (struct opt_ext *) ext_ptr;
     705    OPTR intern[1];
     706  
     707    /* Make it reasonable to do in-place.  */
     708    *intern = *intern_copy;
     709  
     710    if (bfd_header_big_endian (abfd))
     711      {
     712        ext->o_bits1[0] = intern->ot;
     713        ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_BIG;
     714        ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_BIG;
     715        ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_BIG;
     716      }
     717    else
     718      {
     719        ext->o_bits1[0] = intern->ot;
     720        ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_LITTLE;
     721        ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_LITTLE;
     722        ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_LITTLE;
     723      }
     724  
     725    _bfd_ecoff_swap_rndx_out (bfd_header_big_endian (abfd),
     726  			    &intern->rndx, &ext->o_rndx);
     727  
     728    H_PUT_32 (abfd, intern->value, ext->o_offset);
     729  
     730  #ifdef TEST
     731    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     732      abort ();
     733  #endif
     734  }
     735  
     736  /* Swap in a dense number.  */
     737  
     738  static void
     739  ecoff_swap_dnr_in (bfd *abfd, void * ext_copy, DNR *intern)
     740  {
     741    struct dnr_ext ext[1];
     742  
     743    *ext = *(struct dnr_ext *) ext_copy;
     744  
     745    intern->rfd = H_GET_32 (abfd, ext->d_rfd);
     746    intern->index = H_GET_32 (abfd, ext->d_index);
     747  
     748  #ifdef TEST
     749    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     750      abort ();
     751  #endif
     752  }
     753  
     754  /* Swap out a dense number.  */
     755  
     756  static void
     757  ecoff_swap_dnr_out (bfd *abfd, const DNR *intern_copy, void * ext_ptr)
     758  {
     759    struct dnr_ext *ext = (struct dnr_ext *) ext_ptr;
     760    DNR intern[1];
     761  
     762    /* Make it reasonable to do in-place.  */
     763    *intern = *intern_copy;
     764  
     765    H_PUT_32 (abfd, intern->rfd, ext->d_rfd);
     766    H_PUT_32 (abfd, intern->index, ext->d_index);
     767  
     768  #ifdef TEST
     769    if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
     770      abort ();
     771  #endif
     772  }