133965Sjdp/* Generic ECOFF swapping routines, for BFD.
2218822Sdim   Copyright 1992, 1993, 1994, 1995, 1996, 2000, 2001, 2002, 2004, 2005
378828Sobrien   Free Software Foundation, Inc.
433965Sjdp   Written by Cygnus Support.
533965Sjdp
6130561Sobrien   This file is part of BFD, the Binary File Descriptor library.
733965Sjdp
8130561Sobrien   This program is free software; you can redistribute it and/or modify
9130561Sobrien   it under the terms of the GNU General Public License as published by
10130561Sobrien   the Free Software Foundation; either version 2 of the License, or
11130561Sobrien   (at your option) any later version.
1233965Sjdp
13130561Sobrien   This program is distributed in the hope that it will be useful,
14130561Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
15130561Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16130561Sobrien   GNU General Public License for more details.
1733965Sjdp
18130561Sobrien   You should have received a copy of the GNU General Public License
19130561Sobrien   along with this program; if not, write to the Free Software
20218822Sdim   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
2133965Sjdp
2233965Sjdp/* NOTE: This is a header file, but it contains executable routines.
2333965Sjdp   This is done this way because these routines are substantially
2433965Sjdp   similar, but are not identical, for all ECOFF targets.
2533965Sjdp
2633965Sjdp   These are routines to swap the ECOFF symbolic information in and
2733965Sjdp   out.  The routines are defined statically.  You can set breakpoints
2833965Sjdp   on them in gdb by naming the including source file; e.g.,
2933965Sjdp   'coff-mips.c':ecoff_swap_hdr_in.
3033965Sjdp
3177298Sobrien   Before including this header file, one of ECOFF_32, ECOFF_64,
3277298Sobrien   ECOFF_SIGNED_32 or ECOFF_SIGNED_64 must be defined.  These are
3377298Sobrien   checked when swapping information that depends upon the target
3477298Sobrien   size.  This code works for 32 bit and 64 bit ECOFF, but may need to
3577298Sobrien   be generalized in the future.
3633965Sjdp
3733965Sjdp   Some header file which defines the external forms of these
3833965Sjdp   structures must also be included before including this header file.
3933965Sjdp   Currently this is either coff/mips.h or coff/alpha.h.
4033965Sjdp
4133965Sjdp   If the symbol TEST is defined when this file is compiled, a
4233965Sjdp   comparison is made to ensure that, in fact, the output is
4333965Sjdp   bit-for-bit the same as the input.  Of course, this symbol should
4433965Sjdp   only be defined when deliberately testing the code on a machine
4533965Sjdp   with the proper byte sex and such.  */
4633965Sjdp
4733965Sjdp#ifdef ECOFF_32
4889857Sobrien#define ECOFF_GET_OFF H_GET_32
4989857Sobrien#define ECOFF_PUT_OFF H_PUT_32
5033965Sjdp#endif
5133965Sjdp#ifdef ECOFF_64
5289857Sobrien#define ECOFF_GET_OFF H_GET_64
5389857Sobrien#define ECOFF_PUT_OFF H_PUT_64
5433965Sjdp#endif
5577298Sobrien#ifdef ECOFF_SIGNED_32
5689857Sobrien#define ECOFF_GET_OFF H_GET_S32
5789857Sobrien#define ECOFF_PUT_OFF H_PUT_S32
5877298Sobrien#endif
5977298Sobrien#ifdef ECOFF_SIGNED_64
6089857Sobrien#define ECOFF_GET_OFF H_GET_S64
6189857Sobrien#define ECOFF_PUT_OFF H_PUT_S64
6277298Sobrien#endif
6333965Sjdp
6433965Sjdp/* ECOFF auxiliary information swapping routines.  These are the same
6533965Sjdp   for all ECOFF targets, so they are defined in ecofflink.c.  */
6633965Sjdp
6733965Sjdpextern void _bfd_ecoff_swap_tir_in
68218822Sdim  (int, const struct tir_ext *, TIR *);
6933965Sjdpextern void _bfd_ecoff_swap_tir_out
70218822Sdim  (int, const TIR *, struct tir_ext *);
7133965Sjdpextern void _bfd_ecoff_swap_rndx_in
72218822Sdim  (int, const struct rndx_ext *, RNDXR *);
7333965Sjdpextern void _bfd_ecoff_swap_rndx_out
74218822Sdim  (int, const RNDXR *, struct rndx_ext *);
7533965Sjdp
7633965Sjdp/* Prototypes for functions defined in this file.  */
7733965Sjdp
78218822Sdimstatic void ecoff_swap_hdr_in (bfd *, void *, HDRR *);
79218822Sdimstatic void ecoff_swap_hdr_out (bfd *, const HDRR *, void *);
80218822Sdimstatic void ecoff_swap_fdr_in (bfd *, void *, FDR *);
81218822Sdimstatic void ecoff_swap_fdr_out (bfd *, const FDR *, void *);
82218822Sdimstatic void ecoff_swap_pdr_in (bfd *, void *, PDR *);
83218822Sdimstatic void ecoff_swap_pdr_out (bfd *, const PDR *, void *);
84218822Sdimstatic void ecoff_swap_sym_in (bfd *, void *, SYMR *);
85218822Sdimstatic void ecoff_swap_sym_out (bfd *, const SYMR *, void *);
86218822Sdimstatic void ecoff_swap_ext_in (bfd *, void *, EXTR *);
87218822Sdimstatic void ecoff_swap_ext_out (bfd *, const EXTR *, void *);
88218822Sdimstatic void ecoff_swap_rfd_in (bfd *, void *, RFDT *);
89218822Sdimstatic void ecoff_swap_rfd_out (bfd *, const RFDT *, void *);
90218822Sdimstatic void ecoff_swap_opt_in (bfd *, void *, OPTR *);
91218822Sdimstatic void ecoff_swap_opt_out (bfd *, const OPTR *, void *);
92218822Sdimstatic void ecoff_swap_dnr_in (bfd *, void *, DNR *);
93218822Sdimstatic void ecoff_swap_dnr_out (bfd *, const DNR *, void *);
9433965Sjdp
9533965Sjdp/* Swap in the symbolic header.  */
9633965Sjdp
9733965Sjdpstatic void
98218822Sdimecoff_swap_hdr_in (bfd *abfd, void * ext_copy, HDRR *intern)
9933965Sjdp{
10033965Sjdp  struct hdr_ext ext[1];
10133965Sjdp
10233965Sjdp  *ext = *(struct hdr_ext *) ext_copy;
10333965Sjdp
10489857Sobrien  intern->magic         = H_GET_S16     (abfd, ext->h_magic);
10589857Sobrien  intern->vstamp        = H_GET_S16     (abfd, ext->h_vstamp);
10689857Sobrien  intern->ilineMax      = H_GET_32      (abfd, ext->h_ilineMax);
10789857Sobrien  intern->cbLine        = ECOFF_GET_OFF (abfd, ext->h_cbLine);
10889857Sobrien  intern->cbLineOffset  = ECOFF_GET_OFF (abfd, ext->h_cbLineOffset);
10989857Sobrien  intern->idnMax        = H_GET_32      (abfd, ext->h_idnMax);
11089857Sobrien  intern->cbDnOffset    = ECOFF_GET_OFF (abfd, ext->h_cbDnOffset);
11189857Sobrien  intern->ipdMax        = H_GET_32      (abfd, ext->h_ipdMax);
11289857Sobrien  intern->cbPdOffset    = ECOFF_GET_OFF (abfd, ext->h_cbPdOffset);
11389857Sobrien  intern->isymMax       = H_GET_32      (abfd, ext->h_isymMax);
11489857Sobrien  intern->cbSymOffset   = ECOFF_GET_OFF (abfd, ext->h_cbSymOffset);
11589857Sobrien  intern->ioptMax       = H_GET_32      (abfd, ext->h_ioptMax);
11689857Sobrien  intern->cbOptOffset   = ECOFF_GET_OFF (abfd, ext->h_cbOptOffset);
11789857Sobrien  intern->iauxMax       = H_GET_32      (abfd, ext->h_iauxMax);
11889857Sobrien  intern->cbAuxOffset   = ECOFF_GET_OFF (abfd, ext->h_cbAuxOffset);
11989857Sobrien  intern->issMax        = H_GET_32      (abfd, ext->h_issMax);
12089857Sobrien  intern->cbSsOffset    = ECOFF_GET_OFF (abfd, ext->h_cbSsOffset);
12189857Sobrien  intern->issExtMax     = H_GET_32      (abfd, ext->h_issExtMax);
12289857Sobrien  intern->cbSsExtOffset = ECOFF_GET_OFF (abfd, ext->h_cbSsExtOffset);
12389857Sobrien  intern->ifdMax        = H_GET_32      (abfd, ext->h_ifdMax);
12489857Sobrien  intern->cbFdOffset    = ECOFF_GET_OFF (abfd, ext->h_cbFdOffset);
12589857Sobrien  intern->crfd          = H_GET_32      (abfd, ext->h_crfd);
12689857Sobrien  intern->cbRfdOffset   = ECOFF_GET_OFF (abfd, ext->h_cbRfdOffset);
12789857Sobrien  intern->iextMax       = H_GET_32      (abfd, ext->h_iextMax);
12889857Sobrien  intern->cbExtOffset   = ECOFF_GET_OFF (abfd, ext->h_cbExtOffset);
12933965Sjdp
13033965Sjdp#ifdef TEST
131218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
13277298Sobrien    abort ();
13333965Sjdp#endif
13433965Sjdp}
13533965Sjdp
13633965Sjdp/* Swap out the symbolic header.  */
13733965Sjdp
13833965Sjdpstatic void
139218822Sdimecoff_swap_hdr_out (bfd *abfd, const HDRR *intern_copy, void * ext_ptr)
14033965Sjdp{
14133965Sjdp  struct hdr_ext *ext = (struct hdr_ext *) ext_ptr;
14233965Sjdp  HDRR intern[1];
14333965Sjdp
14433965Sjdp  *intern = *intern_copy;
14533965Sjdp
14689857Sobrien  H_PUT_S16     (abfd, intern->magic,         ext->h_magic);
14789857Sobrien  H_PUT_S16     (abfd, intern->vstamp,        ext->h_vstamp);
14889857Sobrien  H_PUT_32      (abfd, intern->ilineMax,      ext->h_ilineMax);
14989857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbLine,        ext->h_cbLine);
15089857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbLineOffset,  ext->h_cbLineOffset);
15189857Sobrien  H_PUT_32      (abfd, intern->idnMax,        ext->h_idnMax);
15289857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbDnOffset,    ext->h_cbDnOffset);
15389857Sobrien  H_PUT_32      (abfd, intern->ipdMax,        ext->h_ipdMax);
15489857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbPdOffset,    ext->h_cbPdOffset);
15589857Sobrien  H_PUT_32      (abfd, intern->isymMax,       ext->h_isymMax);
15689857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbSymOffset,   ext->h_cbSymOffset);
15789857Sobrien  H_PUT_32      (abfd, intern->ioptMax,       ext->h_ioptMax);
15889857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbOptOffset,   ext->h_cbOptOffset);
15989857Sobrien  H_PUT_32      (abfd, intern->iauxMax,       ext->h_iauxMax);
16089857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbAuxOffset,   ext->h_cbAuxOffset);
16189857Sobrien  H_PUT_32      (abfd, intern->issMax,        ext->h_issMax);
16289857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbSsOffset,    ext->h_cbSsOffset);
16389857Sobrien  H_PUT_32      (abfd, intern->issExtMax,     ext->h_issExtMax);
16489857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbSsExtOffset, ext->h_cbSsExtOffset);
16589857Sobrien  H_PUT_32      (abfd, intern->ifdMax,        ext->h_ifdMax);
16689857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbFdOffset,    ext->h_cbFdOffset);
16789857Sobrien  H_PUT_32      (abfd, intern->crfd,          ext->h_crfd);
16889857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbRfdOffset,   ext->h_cbRfdOffset);
16989857Sobrien  H_PUT_32      (abfd, intern->iextMax,       ext->h_iextMax);
17089857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbExtOffset,   ext->h_cbExtOffset);
17133965Sjdp
17233965Sjdp#ifdef TEST
17389857Sobrien  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
17477298Sobrien    abort ();
17533965Sjdp#endif
17633965Sjdp}
17733965Sjdp
17833965Sjdp/* Swap in the file descriptor record.  */
17933965Sjdp
18033965Sjdpstatic void
181218822Sdimecoff_swap_fdr_in (bfd *abfd, void * ext_copy, FDR *intern)
18233965Sjdp{
18333965Sjdp  struct fdr_ext ext[1];
18433965Sjdp
18533965Sjdp  *ext = *(struct fdr_ext *) ext_copy;
18677298Sobrien
18789857Sobrien  intern->adr           = ECOFF_GET_OFF (abfd, ext->f_adr);
18889857Sobrien  intern->rss           = H_GET_32 (abfd, ext->f_rss);
18977298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
19078828Sobrien  if (intern->rss == (signed long) 0xffffffff)
19133965Sjdp    intern->rss = -1;
19233965Sjdp#endif
19389857Sobrien  intern->issBase       = H_GET_32 (abfd, ext->f_issBase);
19489857Sobrien  intern->cbSs          = ECOFF_GET_OFF (abfd, ext->f_cbSs);
19589857Sobrien  intern->isymBase      = H_GET_32 (abfd, ext->f_isymBase);
19689857Sobrien  intern->csym          = H_GET_32 (abfd, ext->f_csym);
19789857Sobrien  intern->ilineBase     = H_GET_32 (abfd, ext->f_ilineBase);
19889857Sobrien  intern->cline         = H_GET_32 (abfd, ext->f_cline);
19989857Sobrien  intern->ioptBase      = H_GET_32 (abfd, ext->f_ioptBase);
20089857Sobrien  intern->copt          = H_GET_32 (abfd, ext->f_copt);
20177298Sobrien#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
20289857Sobrien  intern->ipdFirst      = H_GET_16 (abfd, ext->f_ipdFirst);
20389857Sobrien  intern->cpd           = H_GET_16 (abfd, ext->f_cpd);
20433965Sjdp#endif
20577298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
20689857Sobrien  intern->ipdFirst      = H_GET_32 (abfd, ext->f_ipdFirst);
20789857Sobrien  intern->cpd           = H_GET_32 (abfd, ext->f_cpd);
20833965Sjdp#endif
20989857Sobrien  intern->iauxBase      = H_GET_32 (abfd, ext->f_iauxBase);
21089857Sobrien  intern->caux          = H_GET_32 (abfd, ext->f_caux);
21189857Sobrien  intern->rfdBase       = H_GET_32 (abfd, ext->f_rfdBase);
21289857Sobrien  intern->crfd          = H_GET_32 (abfd, ext->f_crfd);
21333965Sjdp
214130561Sobrien  /* Now the fun stuff...  */
21589857Sobrien  if (bfd_header_big_endian (abfd))
21689857Sobrien    {
21789857Sobrien      intern->lang       = ((ext->f_bits1[0] & FDR_BITS1_LANG_BIG)
21889857Sobrien			    >> FDR_BITS1_LANG_SH_BIG);
21989857Sobrien      intern->fMerge     = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_BIG);
22089857Sobrien      intern->fReadin    = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_BIG);
22189857Sobrien      intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_BIG);
22289857Sobrien      intern->glevel     = ((ext->f_bits2[0] & FDR_BITS2_GLEVEL_BIG)
22389857Sobrien			    >> FDR_BITS2_GLEVEL_SH_BIG);
22489857Sobrien    }
22589857Sobrien  else
22689857Sobrien    {
22789857Sobrien      intern->lang       = ((ext->f_bits1[0] & FDR_BITS1_LANG_LITTLE)
22889857Sobrien			    >> FDR_BITS1_LANG_SH_LITTLE);
22989857Sobrien      intern->fMerge     = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_LITTLE);
23089857Sobrien      intern->fReadin    = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_LITTLE);
23189857Sobrien      intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_LITTLE);
23289857Sobrien      intern->glevel     = ((ext->f_bits2[0] & FDR_BITS2_GLEVEL_LITTLE)
23389857Sobrien			    >> FDR_BITS2_GLEVEL_SH_LITTLE);
23489857Sobrien    }
23533965Sjdp  intern->reserved = 0;
23633965Sjdp
23789857Sobrien  intern->cbLineOffset  = ECOFF_GET_OFF (abfd, ext->f_cbLineOffset);
23889857Sobrien  intern->cbLine        = ECOFF_GET_OFF (abfd, ext->f_cbLine);
23933965Sjdp
24033965Sjdp#ifdef TEST
241218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
24277298Sobrien    abort ();
24333965Sjdp#endif
24433965Sjdp}
24533965Sjdp
24633965Sjdp/* Swap out the file descriptor record.  */
24733965Sjdp
24833965Sjdpstatic void
249218822Sdimecoff_swap_fdr_out (bfd *abfd, const FDR *intern_copy, void * ext_ptr)
25033965Sjdp{
25133965Sjdp  struct fdr_ext *ext = (struct fdr_ext *) ext_ptr;
25233965Sjdp  FDR intern[1];
25333965Sjdp
254130561Sobrien  /* Make it reasonable to do in-place.  */
255130561Sobrien  *intern = *intern_copy;
25677298Sobrien
25789857Sobrien  ECOFF_PUT_OFF (abfd, intern->adr,       ext->f_adr);
25889857Sobrien  H_PUT_32      (abfd, intern->rss,       ext->f_rss);
25989857Sobrien  H_PUT_32      (abfd, intern->issBase,   ext->f_issBase);
26089857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbSs,      ext->f_cbSs);
26189857Sobrien  H_PUT_32      (abfd, intern->isymBase,  ext->f_isymBase);
26289857Sobrien  H_PUT_32      (abfd, intern->csym,      ext->f_csym);
26389857Sobrien  H_PUT_32      (abfd, intern->ilineBase, ext->f_ilineBase);
26489857Sobrien  H_PUT_32      (abfd, intern->cline,     ext->f_cline);
26589857Sobrien  H_PUT_32      (abfd, intern->ioptBase,  ext->f_ioptBase);
26689857Sobrien  H_PUT_32      (abfd, intern->copt,      ext->f_copt);
26777298Sobrien#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
26889857Sobrien  H_PUT_16      (abfd, intern->ipdFirst,  ext->f_ipdFirst);
26989857Sobrien  H_PUT_16      (abfd, intern->cpd,       ext->f_cpd);
27033965Sjdp#endif
27177298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
27289857Sobrien  H_PUT_32      (abfd, intern->ipdFirst,  ext->f_ipdFirst);
27389857Sobrien  H_PUT_32      (abfd, intern->cpd,       ext->f_cpd);
27433965Sjdp#endif
27589857Sobrien  H_PUT_32      (abfd, intern->iauxBase,  ext->f_iauxBase);
27689857Sobrien  H_PUT_32      (abfd, intern->caux,      ext->f_caux);
27789857Sobrien  H_PUT_32      (abfd, intern->rfdBase,   ext->f_rfdBase);
27889857Sobrien  H_PUT_32      (abfd, intern->crfd,      ext->f_crfd);
27933965Sjdp
280130561Sobrien  /* Now the fun stuff...  */
28189857Sobrien  if (bfd_header_big_endian (abfd))
28289857Sobrien    {
28389857Sobrien      ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_BIG)
28489857Sobrien			  & FDR_BITS1_LANG_BIG)
28589857Sobrien			 | (intern->fMerge ? FDR_BITS1_FMERGE_BIG : 0)
28689857Sobrien			 | (intern->fReadin ? FDR_BITS1_FREADIN_BIG : 0)
28789857Sobrien			 | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_BIG : 0));
28889857Sobrien      ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_BIG)
28989857Sobrien			 & FDR_BITS2_GLEVEL_BIG);
29089857Sobrien      ext->f_bits2[1] = 0;
29189857Sobrien      ext->f_bits2[2] = 0;
29289857Sobrien    }
29389857Sobrien  else
29489857Sobrien    {
29589857Sobrien      ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_LITTLE)
29689857Sobrien			  & FDR_BITS1_LANG_LITTLE)
29789857Sobrien			 | (intern->fMerge ? FDR_BITS1_FMERGE_LITTLE : 0)
29889857Sobrien			 | (intern->fReadin ? FDR_BITS1_FREADIN_LITTLE : 0)
29989857Sobrien			 | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_LITTLE : 0));
30089857Sobrien      ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_LITTLE)
30189857Sobrien			 & FDR_BITS2_GLEVEL_LITTLE);
30289857Sobrien      ext->f_bits2[1] = 0;
30389857Sobrien      ext->f_bits2[2] = 0;
30489857Sobrien    }
30533965Sjdp
30689857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbLineOffset, ext->f_cbLineOffset);
30789857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbLine, ext->f_cbLine);
30833965Sjdp
30933965Sjdp#ifdef TEST
310218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
31177298Sobrien    abort ();
31233965Sjdp#endif
31333965Sjdp}
31433965Sjdp
31533965Sjdp/* Swap in the procedure descriptor record.  */
31633965Sjdp
31733965Sjdpstatic void
318218822Sdimecoff_swap_pdr_in (bfd *abfd, void * ext_copy, PDR *intern)
31933965Sjdp{
32033965Sjdp  struct pdr_ext ext[1];
32133965Sjdp
32233965Sjdp  *ext = *(struct pdr_ext *) ext_copy;
32333965Sjdp
324218822Sdim  memset ((void *) intern, 0, sizeof (*intern));
32533965Sjdp
32689857Sobrien  intern->adr           = ECOFF_GET_OFF (abfd, ext->p_adr);
32789857Sobrien  intern->isym          = H_GET_32 (abfd, ext->p_isym);
32889857Sobrien  intern->iline         = H_GET_32 (abfd, ext->p_iline);
32989857Sobrien  intern->regmask       = H_GET_32 (abfd, ext->p_regmask);
33089857Sobrien  intern->regoffset     = H_GET_S32 (abfd, ext->p_regoffset);
33189857Sobrien  intern->iopt          = H_GET_S32 (abfd, ext->p_iopt);
33289857Sobrien  intern->fregmask      = H_GET_32 (abfd, ext->p_fregmask);
33389857Sobrien  intern->fregoffset    = H_GET_S32 (abfd, ext->p_fregoffset);
33489857Sobrien  intern->frameoffset   = H_GET_S32 (abfd, ext->p_frameoffset);
33589857Sobrien  intern->framereg      = H_GET_16 (abfd, ext->p_framereg);
33689857Sobrien  intern->pcreg         = H_GET_16 (abfd, ext->p_pcreg);
33789857Sobrien  intern->lnLow         = H_GET_32 (abfd, ext->p_lnLow);
33889857Sobrien  intern->lnHigh        = H_GET_32 (abfd, ext->p_lnHigh);
33989857Sobrien  intern->cbLineOffset  = ECOFF_GET_OFF (abfd, ext->p_cbLineOffset);
34033965Sjdp
34177298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
342130561Sobrien  if (intern->isym == (signed long) 0xffffffff)
343130561Sobrien    intern->isym = -1;
344130561Sobrien  if (intern->iline == (signed long) 0xffffffff)
345130561Sobrien    intern->iline = -1;
346130561Sobrien
34789857Sobrien  intern->gp_prologue = H_GET_8 (abfd, ext->p_gp_prologue);
34833965Sjdp  if (bfd_header_big_endian (abfd))
34933965Sjdp    {
35033965Sjdp      intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_BIG);
35133965Sjdp      intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_BIG);
35233965Sjdp      intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_BIG);
35333965Sjdp      intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_BIG)
35433965Sjdp			   << PDR_BITS1_RESERVED_SH_LEFT_BIG)
35533965Sjdp			  | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_BIG)
35633965Sjdp			     >> PDR_BITS2_RESERVED_SH_BIG));
35733965Sjdp    }
35833965Sjdp  else
35933965Sjdp    {
36033965Sjdp      intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_LITTLE);
36133965Sjdp      intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_LITTLE);
36233965Sjdp      intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_LITTLE);
36333965Sjdp      intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_LITTLE)
36433965Sjdp			   >> PDR_BITS1_RESERVED_SH_LITTLE)
36533965Sjdp			  | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_LITTLE)
36633965Sjdp			     << PDR_BITS2_RESERVED_SH_LEFT_LITTLE));
36733965Sjdp    }
36889857Sobrien  intern->localoff = H_GET_8 (abfd, ext->p_localoff);
36977298Sobrien#endif
37033965Sjdp
37133965Sjdp#ifdef TEST
372218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
37377298Sobrien    abort ();
37433965Sjdp#endif
37533965Sjdp}
37633965Sjdp
37733965Sjdp/* Swap out the procedure descriptor record.  */
37833965Sjdp
37933965Sjdpstatic void
380218822Sdimecoff_swap_pdr_out (bfd *abfd, const PDR *intern_copy, void * ext_ptr)
38133965Sjdp{
38233965Sjdp  struct pdr_ext *ext = (struct pdr_ext *) ext_ptr;
38333965Sjdp  PDR intern[1];
38433965Sjdp
385130561Sobrien  /* Make it reasonable to do in-place.  */
386130561Sobrien  *intern = *intern_copy;
38777298Sobrien
38889857Sobrien  ECOFF_PUT_OFF (abfd, intern->adr,          ext->p_adr);
38989857Sobrien  H_PUT_32      (abfd, intern->isym,         ext->p_isym);
39089857Sobrien  H_PUT_32      (abfd, intern->iline,        ext->p_iline);
39189857Sobrien  H_PUT_32      (abfd, intern->regmask,      ext->p_regmask);
39289857Sobrien  H_PUT_32      (abfd, intern->regoffset,    ext->p_regoffset);
39389857Sobrien  H_PUT_32      (abfd, intern->iopt,         ext->p_iopt);
39489857Sobrien  H_PUT_32      (abfd, intern->fregmask,     ext->p_fregmask);
39589857Sobrien  H_PUT_32      (abfd, intern->fregoffset,   ext->p_fregoffset);
39689857Sobrien  H_PUT_32      (abfd, intern->frameoffset,  ext->p_frameoffset);
39789857Sobrien  H_PUT_16      (abfd, intern->framereg,     ext->p_framereg);
39889857Sobrien  H_PUT_16      (abfd, intern->pcreg,        ext->p_pcreg);
39989857Sobrien  H_PUT_32      (abfd, intern->lnLow,        ext->p_lnLow);
40089857Sobrien  H_PUT_32      (abfd, intern->lnHigh,       ext->p_lnHigh);
40189857Sobrien  ECOFF_PUT_OFF (abfd, intern->cbLineOffset, ext->p_cbLineOffset);
40233965Sjdp
40377298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
40489857Sobrien  H_PUT_8       (abfd, intern->gp_prologue,  ext->p_gp_prologue);
40589857Sobrien
40633965Sjdp  if (bfd_header_big_endian (abfd))
40733965Sjdp    {
40833965Sjdp      ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_BIG : 0)
40933965Sjdp			 | (intern->reg_frame ? PDR_BITS1_REG_FRAME_BIG : 0)
41033965Sjdp			 | (intern->prof ? PDR_BITS1_PROF_BIG : 0)
41133965Sjdp			 | ((intern->reserved
41233965Sjdp			     >> PDR_BITS1_RESERVED_SH_LEFT_BIG)
41333965Sjdp			    & PDR_BITS1_RESERVED_BIG));
41433965Sjdp      ext->p_bits2[0] = ((intern->reserved << PDR_BITS2_RESERVED_SH_BIG)
41533965Sjdp			 & PDR_BITS2_RESERVED_BIG);
41633965Sjdp    }
41733965Sjdp  else
41833965Sjdp    {
41933965Sjdp      ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_LITTLE : 0)
42033965Sjdp			 | (intern->reg_frame ? PDR_BITS1_REG_FRAME_LITTLE : 0)
42133965Sjdp			 | (intern->prof ? PDR_BITS1_PROF_LITTLE : 0)
42233965Sjdp			 | ((intern->reserved << PDR_BITS1_RESERVED_SH_LITTLE)
42333965Sjdp			    & PDR_BITS1_RESERVED_LITTLE));
42433965Sjdp      ext->p_bits2[0] = ((intern->reserved >>
42533965Sjdp			  PDR_BITS2_RESERVED_SH_LEFT_LITTLE)
42633965Sjdp			 & PDR_BITS2_RESERVED_LITTLE);
42733965Sjdp    }
42889857Sobrien  H_PUT_8 (abfd, intern->localoff, ext->p_localoff);
42977298Sobrien#endif
43033965Sjdp
43133965Sjdp#ifdef TEST
432218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
43377298Sobrien    abort ();
43433965Sjdp#endif
43533965Sjdp}
43633965Sjdp
43733965Sjdp/* Swap in a symbol record.  */
43833965Sjdp
43933965Sjdpstatic void
440218822Sdimecoff_swap_sym_in (bfd *abfd, void * ext_copy, SYMR *intern)
44133965Sjdp{
44233965Sjdp  struct sym_ext ext[1];
44333965Sjdp
44433965Sjdp  *ext = *(struct sym_ext *) ext_copy;
44577298Sobrien
44689857Sobrien  intern->iss           = H_GET_32 (abfd, ext->s_iss);
44789857Sobrien  intern->value         = ECOFF_GET_OFF (abfd, ext->s_value);
44833965Sjdp
449130561Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
450130561Sobrien  if (intern->iss == (signed long) 0xffffffff)
451130561Sobrien    intern->iss = -1;
452130561Sobrien#endif
45333965Sjdp
454130561Sobrien  /* Now the fun stuff...  */
455130561Sobrien  if (bfd_header_big_endian (abfd))
456130561Sobrien    {
457130561Sobrien      intern->st          =  (ext->s_bits1[0] & SYM_BITS1_ST_BIG)
458130561Sobrien					     >> SYM_BITS1_ST_SH_BIG;
459130561Sobrien      intern->sc          = ((ext->s_bits1[0] & SYM_BITS1_SC_BIG)
460130561Sobrien					     << SYM_BITS1_SC_SH_LEFT_BIG)
461130561Sobrien			  | ((ext->s_bits2[0] & SYM_BITS2_SC_BIG)
462130561Sobrien					     >> SYM_BITS2_SC_SH_BIG);
463130561Sobrien      intern->reserved    = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_BIG);
464130561Sobrien      intern->index       = ((ext->s_bits2[0] & SYM_BITS2_INDEX_BIG)
465130561Sobrien					     << SYM_BITS2_INDEX_SH_LEFT_BIG)
466130561Sobrien			  | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_BIG)
467130561Sobrien			  | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_BIG);
468130561Sobrien    }
469130561Sobrien  else
470130561Sobrien    {
471130561Sobrien      intern->st          =  (ext->s_bits1[0] & SYM_BITS1_ST_LITTLE)
472130561Sobrien					     >> SYM_BITS1_ST_SH_LITTLE;
473130561Sobrien      intern->sc          = ((ext->s_bits1[0] & SYM_BITS1_SC_LITTLE)
474130561Sobrien					     >> SYM_BITS1_SC_SH_LITTLE)
475130561Sobrien			  | ((ext->s_bits2[0] & SYM_BITS2_SC_LITTLE)
476130561Sobrien					     << SYM_BITS2_SC_SH_LEFT_LITTLE);
477130561Sobrien      intern->reserved    = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_LITTLE);
478130561Sobrien      intern->index       = ((ext->s_bits2[0] & SYM_BITS2_INDEX_LITTLE)
479130561Sobrien					     >> SYM_BITS2_INDEX_SH_LITTLE)
480130561Sobrien			  | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_LITTLE)
481130561Sobrien			  | ((unsigned int) ext->s_bits4[0]
482130561Sobrien			     << SYM_BITS4_INDEX_SH_LEFT_LITTLE);
483130561Sobrien    }
484130561Sobrien
48533965Sjdp#ifdef TEST
486218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
48777298Sobrien    abort ();
48833965Sjdp#endif
48933965Sjdp}
49033965Sjdp
49133965Sjdp/* Swap out a symbol record.  */
49233965Sjdp
49333965Sjdpstatic void
494218822Sdimecoff_swap_sym_out (bfd *abfd, const SYMR *intern_copy, void * ext_ptr)
49533965Sjdp{
49633965Sjdp  struct sym_ext *ext = (struct sym_ext *) ext_ptr;
49733965Sjdp  SYMR intern[1];
49833965Sjdp
499130561Sobrien  /* Make it reasonable to do in-place.  */
500130561Sobrien  *intern = *intern_copy;
50177298Sobrien
50289857Sobrien  H_PUT_32 (abfd, intern->iss, ext->s_iss);
50389857Sobrien  ECOFF_PUT_OFF (abfd, intern->value, ext->s_value);
50433965Sjdp
505130561Sobrien  /* Now the fun stuff...  */
506130561Sobrien  if (bfd_header_big_endian (abfd))
507130561Sobrien    {
508130561Sobrien      ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_BIG)
509130561Sobrien			  & SYM_BITS1_ST_BIG)
510130561Sobrien			 | ((intern->sc >> SYM_BITS1_SC_SH_LEFT_BIG)
511130561Sobrien			    & SYM_BITS1_SC_BIG));
512130561Sobrien      ext->s_bits2[0] = (((intern->sc << SYM_BITS2_SC_SH_BIG)
513130561Sobrien			  & SYM_BITS2_SC_BIG)
514130561Sobrien			 | (intern->reserved ? SYM_BITS2_RESERVED_BIG : 0)
515130561Sobrien			 | ((intern->index >> SYM_BITS2_INDEX_SH_LEFT_BIG)
516130561Sobrien			    & SYM_BITS2_INDEX_BIG));
517130561Sobrien      ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_BIG) & 0xff;
518130561Sobrien      ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_BIG) & 0xff;
519130561Sobrien    }
520130561Sobrien  else
521130561Sobrien    {
522130561Sobrien      ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_LITTLE)
523130561Sobrien			  & SYM_BITS1_ST_LITTLE)
524130561Sobrien			 | ((intern->sc << SYM_BITS1_SC_SH_LITTLE)
525130561Sobrien			    & SYM_BITS1_SC_LITTLE));
526130561Sobrien      ext->s_bits2[0] = (((intern->sc >> SYM_BITS2_SC_SH_LEFT_LITTLE)
527130561Sobrien			  & SYM_BITS2_SC_LITTLE)
528130561Sobrien			 | (intern->reserved ? SYM_BITS2_RESERVED_LITTLE : 0)
529130561Sobrien			 | ((intern->index << SYM_BITS2_INDEX_SH_LITTLE)
530130561Sobrien			    & SYM_BITS2_INDEX_LITTLE));
531130561Sobrien      ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_LITTLE) & 0xff;
532130561Sobrien      ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_LITTLE) & 0xff;
533130561Sobrien    }
53433965Sjdp
53533965Sjdp#ifdef TEST
536218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
53777298Sobrien    abort ();
53833965Sjdp#endif
53933965Sjdp}
54033965Sjdp
54133965Sjdp/* Swap in an external symbol record.  */
54233965Sjdp
54333965Sjdpstatic void
544218822Sdimecoff_swap_ext_in (bfd *abfd, void * ext_copy, EXTR *intern)
54533965Sjdp{
54633965Sjdp  struct ext_ext ext[1];
54733965Sjdp
54833965Sjdp  *ext = *(struct ext_ext *) ext_copy;
54977298Sobrien
550130561Sobrien  /* Now the fun stuff...  */
551130561Sobrien  if (bfd_header_big_endian (abfd))
552130561Sobrien    {
553130561Sobrien      intern->jmptbl      = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_BIG);
554130561Sobrien      intern->cobol_main  = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_BIG);
555130561Sobrien      intern->weakext     = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_BIG);
556130561Sobrien    }
557130561Sobrien  else
558130561Sobrien    {
559130561Sobrien      intern->jmptbl      = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_LITTLE);
560130561Sobrien      intern->cobol_main  = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_LITTLE);
561130561Sobrien      intern->weakext     = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_LITTLE);
562130561Sobrien    }
56333965Sjdp  intern->reserved = 0;
56433965Sjdp
56577298Sobrien#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
566130561Sobrien  intern->ifd = H_GET_S16 (abfd, ext->es_ifd);
56733965Sjdp#endif
56877298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
569130561Sobrien  intern->ifd = H_GET_S32 (abfd, ext->es_ifd);
57033965Sjdp#endif
57133965Sjdp
57233965Sjdp  ecoff_swap_sym_in (abfd, &ext->es_asym, &intern->asym);
57333965Sjdp
57433965Sjdp#ifdef TEST
575218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
57677298Sobrien    abort ();
57733965Sjdp#endif
57833965Sjdp}
57933965Sjdp
58033965Sjdp/* Swap out an external symbol record.  */
58133965Sjdp
58233965Sjdpstatic void
583218822Sdimecoff_swap_ext_out (bfd *abfd, const EXTR *intern_copy, void * ext_ptr)
58433965Sjdp{
58533965Sjdp  struct ext_ext *ext = (struct ext_ext *) ext_ptr;
58633965Sjdp  EXTR intern[1];
58733965Sjdp
588130561Sobrien  /* Make it reasonable to do in-place.  */
589130561Sobrien  *intern = *intern_copy;
59077298Sobrien
591130561Sobrien  /* Now the fun stuff...  */
592130561Sobrien  if (bfd_header_big_endian (abfd))
593130561Sobrien    {
594130561Sobrien      ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_BIG : 0)
595130561Sobrien			  | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_BIG : 0)
596130561Sobrien			  | (intern->weakext ? EXT_BITS1_WEAKEXT_BIG : 0));
597130561Sobrien      ext->es_bits2[0] = 0;
59877298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
599130561Sobrien      ext->es_bits2[1] = 0;
600130561Sobrien      ext->es_bits2[2] = 0;
60133965Sjdp#endif
602130561Sobrien    }
603130561Sobrien  else
604130561Sobrien    {
605130561Sobrien      ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_LITTLE : 0)
606130561Sobrien			  | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_LITTLE : 0)
607130561Sobrien			  | (intern->weakext ? EXT_BITS1_WEAKEXT_LITTLE : 0));
608130561Sobrien      ext->es_bits2[0] = 0;
60977298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
610130561Sobrien      ext->es_bits2[1] = 0;
611130561Sobrien      ext->es_bits2[2] = 0;
61233965Sjdp#endif
613130561Sobrien    }
61433965Sjdp
61577298Sobrien#if defined (ECOFF_32) || defined (ECOFF_SIGNED_32)
61689857Sobrien  H_PUT_S16 (abfd, intern->ifd, ext->es_ifd);
61733965Sjdp#endif
61877298Sobrien#if defined (ECOFF_64) || defined (ECOFF_SIGNED_64)
61989857Sobrien  H_PUT_S32 (abfd, intern->ifd, ext->es_ifd);
62033965Sjdp#endif
62133965Sjdp
62233965Sjdp  ecoff_swap_sym_out (abfd, &intern->asym, &ext->es_asym);
62333965Sjdp
62433965Sjdp#ifdef TEST
625218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
62677298Sobrien    abort ();
62733965Sjdp#endif
62833965Sjdp}
62933965Sjdp
63033965Sjdp/* Swap in a relative file descriptor.  */
63133965Sjdp
63233965Sjdpstatic void
633218822Sdimecoff_swap_rfd_in (bfd *abfd, void * ext_ptr, RFDT *intern)
63433965Sjdp{
63533965Sjdp  struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
63633965Sjdp
63789857Sobrien  *intern = H_GET_32 (abfd, ext->rfd);
63833965Sjdp
63933965Sjdp#ifdef TEST
640218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
64177298Sobrien    abort ();
64233965Sjdp#endif
64333965Sjdp}
64433965Sjdp
64533965Sjdp/* Swap out a relative file descriptor.  */
64633965Sjdp
64733965Sjdpstatic void
648218822Sdimecoff_swap_rfd_out (bfd *abfd, const RFDT *intern, void * ext_ptr)
64933965Sjdp{
65033965Sjdp  struct rfd_ext *ext = (struct rfd_ext *) ext_ptr;
65133965Sjdp
65289857Sobrien  H_PUT_32 (abfd, *intern, ext->rfd);
65333965Sjdp
65433965Sjdp#ifdef TEST
655218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
65677298Sobrien    abort ();
65733965Sjdp#endif
65833965Sjdp}
65933965Sjdp
66033965Sjdp/* Swap in an optimization symbol.  */
66133965Sjdp
66233965Sjdpstatic void
663218822Sdimecoff_swap_opt_in (bfd *abfd, void * ext_copy, OPTR * intern)
66433965Sjdp{
66533965Sjdp  struct opt_ext ext[1];
66633965Sjdp
66733965Sjdp  *ext = *(struct opt_ext *) ext_copy;
66833965Sjdp
66933965Sjdp  if (bfd_header_big_endian (abfd))
67033965Sjdp    {
67133965Sjdp      intern->ot = ext->o_bits1[0];
67233965Sjdp      intern->value = (((unsigned int) ext->o_bits2[0]
67333965Sjdp			<< OPT_BITS2_VALUE_SH_LEFT_BIG)
67433965Sjdp		       | ((unsigned int) ext->o_bits3[0]
67533965Sjdp			  << OPT_BITS2_VALUE_SH_LEFT_BIG)
67633965Sjdp		       | ((unsigned int) ext->o_bits4[0]
67733965Sjdp			  << OPT_BITS2_VALUE_SH_LEFT_BIG));
67833965Sjdp    }
67933965Sjdp  else
68033965Sjdp    {
68133965Sjdp      intern->ot = ext->o_bits1[0];
68233965Sjdp      intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
68333965Sjdp		       | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)
68433965Sjdp		       | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE));
68533965Sjdp    }
68633965Sjdp
68733965Sjdp  _bfd_ecoff_swap_rndx_in (bfd_header_big_endian (abfd),
68833965Sjdp			   &ext->o_rndx, &intern->rndx);
68933965Sjdp
69089857Sobrien  intern->offset = H_GET_32 (abfd, ext->o_offset);
69133965Sjdp
69233965Sjdp#ifdef TEST
693218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
69477298Sobrien    abort ();
69533965Sjdp#endif
69633965Sjdp}
69733965Sjdp
69833965Sjdp/* Swap out an optimization symbol.  */
69933965Sjdp
70033965Sjdpstatic void
701218822Sdimecoff_swap_opt_out (bfd *abfd, const OPTR *intern_copy, void * ext_ptr)
70233965Sjdp{
70333965Sjdp  struct opt_ext *ext = (struct opt_ext *) ext_ptr;
70433965Sjdp  OPTR intern[1];
70533965Sjdp
706130561Sobrien  /* Make it reasonable to do in-place.  */
707130561Sobrien  *intern = *intern_copy;
70833965Sjdp
70933965Sjdp  if (bfd_header_big_endian (abfd))
71033965Sjdp    {
71133965Sjdp      ext->o_bits1[0] = intern->ot;
71233965Sjdp      ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_BIG;
71333965Sjdp      ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_BIG;
71433965Sjdp      ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_BIG;
71533965Sjdp    }
71633965Sjdp  else
71733965Sjdp    {
71833965Sjdp      ext->o_bits1[0] = intern->ot;
71933965Sjdp      ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_LITTLE;
72033965Sjdp      ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_LITTLE;
72133965Sjdp      ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_LITTLE;
72233965Sjdp    }
72333965Sjdp
72433965Sjdp  _bfd_ecoff_swap_rndx_out (bfd_header_big_endian (abfd),
72533965Sjdp			    &intern->rndx, &ext->o_rndx);
72633965Sjdp
72789857Sobrien  H_PUT_32 (abfd, intern->value, ext->o_offset);
72833965Sjdp
72933965Sjdp#ifdef TEST
730218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
73177298Sobrien    abort ();
73233965Sjdp#endif
73333965Sjdp}
73433965Sjdp
73533965Sjdp/* Swap in a dense number.  */
73633965Sjdp
73733965Sjdpstatic void
738218822Sdimecoff_swap_dnr_in (bfd *abfd, void * ext_copy, DNR *intern)
73933965Sjdp{
74033965Sjdp  struct dnr_ext ext[1];
74133965Sjdp
74233965Sjdp  *ext = *(struct dnr_ext *) ext_copy;
74333965Sjdp
74489857Sobrien  intern->rfd = H_GET_32 (abfd, ext->d_rfd);
74589857Sobrien  intern->index = H_GET_32 (abfd, ext->d_index);
74633965Sjdp
74733965Sjdp#ifdef TEST
748218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
74977298Sobrien    abort ();
75033965Sjdp#endif
75133965Sjdp}
75233965Sjdp
75333965Sjdp/* Swap out a dense number.  */
75433965Sjdp
75533965Sjdpstatic void
756218822Sdimecoff_swap_dnr_out (bfd *abfd, const DNR *intern_copy, void * ext_ptr)
75733965Sjdp{
75833965Sjdp  struct dnr_ext *ext = (struct dnr_ext *) ext_ptr;
75933965Sjdp  DNR intern[1];
76033965Sjdp
761130561Sobrien  /* Make it reasonable to do in-place.  */
762130561Sobrien  *intern = *intern_copy;
76333965Sjdp
76489857Sobrien  H_PUT_32 (abfd, intern->rfd, ext->d_rfd);
76589857Sobrien  H_PUT_32 (abfd, intern->index, ext->d_index);
76633965Sjdp
76733965Sjdp#ifdef TEST
768218822Sdim  if (memcmp ((char *) ext, (char *) intern, sizeof (*intern)) != 0)
76977298Sobrien    abort ();
77033965Sjdp#endif
77133965Sjdp}
772