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