Handle multiple target events before commit resume
[deliverable/binutils-gdb.git] / bfd / coffswap.h
CommitLineData
252b5132 1/* Generic COFF swapping routines, for BFD.
82704155 2 Copyright (C) 1990-2019 Free Software Foundation, Inc.
252b5132
RH
3 Written by Cygnus Support.
4
026df7c5 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
026df7c5
NC
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
026df7c5 10 (at your option) any later version.
252b5132 11
026df7c5
NC
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.
252b5132 16
026df7c5
NC
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
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
252b5132
RH
21
22/* This file contains routines used to swap COFF data. It is a header
23 file because the details of swapping depend on the details of the
24 structures used by each COFF implementation. This is included by
25 coffcode.h, as well as by the ECOFF backend.
26
27 Any file which uses this must first include "coff/internal.h" and
28 "coff/CPU.h". The functions will then be correct for that CPU. */
29
252b5132 30#ifndef GET_FCN_LNNOPTR
dc810e39
AM
31#define GET_FCN_LNNOPTR(abfd, ext) \
32 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
252b5132
RH
33#endif
34
35#ifndef GET_FCN_ENDNDX
dc810e39
AM
36#define GET_FCN_ENDNDX(abfd, ext) \
37 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx)
252b5132
RH
38#endif
39
40#ifndef PUT_FCN_LNNOPTR
dc810e39
AM
41#define PUT_FCN_LNNOPTR(abfd, in, ext) \
42 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
252b5132
RH
43#endif
44#ifndef PUT_FCN_ENDNDX
dc810e39
AM
45#define PUT_FCN_ENDNDX(abfd, in, ext) \
46 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_endndx)
252b5132
RH
47#endif
48#ifndef GET_LNSZ_LNNO
dc810e39
AM
49#define GET_LNSZ_LNNO(abfd, ext) \
50 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno)
252b5132
RH
51#endif
52#ifndef GET_LNSZ_SIZE
dc810e39
AM
53#define GET_LNSZ_SIZE(abfd, ext) \
54 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size)
252b5132
RH
55#endif
56#ifndef PUT_LNSZ_LNNO
dc810e39
AM
57#define PUT_LNSZ_LNNO(abfd, in, ext) \
58 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno)
252b5132
RH
59#endif
60#ifndef PUT_LNSZ_SIZE
dc810e39
AM
61#define PUT_LNSZ_SIZE(abfd, in, ext) \
62 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size)
252b5132
RH
63#endif
64#ifndef GET_SCN_SCNLEN
dc810e39
AM
65#define GET_SCN_SCNLEN(abfd, ext) \
66 H_GET_32 (abfd, ext->x_scn.x_scnlen)
252b5132
RH
67#endif
68#ifndef GET_SCN_NRELOC
dc810e39
AM
69#define GET_SCN_NRELOC(abfd, ext) \
70 H_GET_16 (abfd, ext->x_scn.x_nreloc)
252b5132
RH
71#endif
72#ifndef GET_SCN_NLINNO
dc810e39
AM
73#define GET_SCN_NLINNO(abfd, ext) \
74 H_GET_16 (abfd, ext->x_scn.x_nlinno)
252b5132
RH
75#endif
76#ifndef PUT_SCN_SCNLEN
dc810e39
AM
77#define PUT_SCN_SCNLEN(abfd, in, ext) \
78 H_PUT_32 (abfd, in, ext->x_scn.x_scnlen)
252b5132
RH
79#endif
80#ifndef PUT_SCN_NRELOC
dc810e39
AM
81#define PUT_SCN_NRELOC(abfd, in, ext) \
82 H_PUT_16 (abfd, in, ext->x_scn.x_nreloc)
252b5132
RH
83#endif
84#ifndef PUT_SCN_NLINNO
dc810e39
AM
85#define PUT_SCN_NLINNO(abfd, in, ext) \
86 H_PUT_16 (abfd, in, ext->x_scn.x_nlinno)
252b5132
RH
87#endif
88#ifndef GET_LINENO_LNNO
dc810e39
AM
89#define GET_LINENO_LNNO(abfd, ext) \
90 H_GET_16 (abfd, ext->l_lnno);
252b5132
RH
91#endif
92#ifndef PUT_LINENO_LNNO
dc810e39
AM
93#define PUT_LINENO_LNNO(abfd, val, ext) \
94 H_PUT_16 (abfd, val, ext->l_lnno);
252b5132
RH
95#endif
96
97/* The f_symptr field in the filehdr is sometimes 64 bits. */
98#ifndef GET_FILEHDR_SYMPTR
dc810e39 99#define GET_FILEHDR_SYMPTR H_GET_32
252b5132
RH
100#endif
101#ifndef PUT_FILEHDR_SYMPTR
dc810e39 102#define PUT_FILEHDR_SYMPTR H_PUT_32
252b5132
RH
103#endif
104
105/* Some fields in the aouthdr are sometimes 64 bits. */
106#ifndef GET_AOUTHDR_TSIZE
dc810e39 107#define GET_AOUTHDR_TSIZE H_GET_32
252b5132
RH
108#endif
109#ifndef PUT_AOUTHDR_TSIZE
dc810e39 110#define PUT_AOUTHDR_TSIZE H_PUT_32
252b5132
RH
111#endif
112#ifndef GET_AOUTHDR_DSIZE
dc810e39 113#define GET_AOUTHDR_DSIZE H_GET_32
252b5132
RH
114#endif
115#ifndef PUT_AOUTHDR_DSIZE
dc810e39 116#define PUT_AOUTHDR_DSIZE H_PUT_32
252b5132
RH
117#endif
118#ifndef GET_AOUTHDR_BSIZE
dc810e39 119#define GET_AOUTHDR_BSIZE H_GET_32
252b5132
RH
120#endif
121#ifndef PUT_AOUTHDR_BSIZE
dc810e39 122#define PUT_AOUTHDR_BSIZE H_PUT_32
252b5132
RH
123#endif
124#ifndef GET_AOUTHDR_ENTRY
dc810e39 125#define GET_AOUTHDR_ENTRY H_GET_32
252b5132
RH
126#endif
127#ifndef PUT_AOUTHDR_ENTRY
dc810e39 128#define PUT_AOUTHDR_ENTRY H_PUT_32
252b5132
RH
129#endif
130#ifndef GET_AOUTHDR_TEXT_START
dc810e39 131#define GET_AOUTHDR_TEXT_START H_GET_32
252b5132
RH
132#endif
133#ifndef PUT_AOUTHDR_TEXT_START
dc810e39 134#define PUT_AOUTHDR_TEXT_START H_PUT_32
252b5132
RH
135#endif
136#ifndef GET_AOUTHDR_DATA_START
dc810e39 137#define GET_AOUTHDR_DATA_START H_GET_32
252b5132
RH
138#endif
139#ifndef PUT_AOUTHDR_DATA_START
dc810e39 140#define PUT_AOUTHDR_DATA_START H_PUT_32
252b5132
RH
141#endif
142
143/* Some fields in the scnhdr are sometimes 64 bits. */
144#ifndef GET_SCNHDR_PADDR
dc810e39 145#define GET_SCNHDR_PADDR H_GET_32
252b5132
RH
146#endif
147#ifndef PUT_SCNHDR_PADDR
dc810e39 148#define PUT_SCNHDR_PADDR H_PUT_32
252b5132
RH
149#endif
150#ifndef GET_SCNHDR_VADDR
dc810e39 151#define GET_SCNHDR_VADDR H_GET_32
252b5132
RH
152#endif
153#ifndef PUT_SCNHDR_VADDR
dc810e39 154#define PUT_SCNHDR_VADDR H_PUT_32
252b5132
RH
155#endif
156#ifndef GET_SCNHDR_SIZE
dc810e39 157#define GET_SCNHDR_SIZE H_GET_32
252b5132
RH
158#endif
159#ifndef PUT_SCNHDR_SIZE
dc810e39 160#define PUT_SCNHDR_SIZE H_PUT_32
252b5132
RH
161#endif
162#ifndef GET_SCNHDR_SCNPTR
dc810e39 163#define GET_SCNHDR_SCNPTR H_GET_32
252b5132
RH
164#endif
165#ifndef PUT_SCNHDR_SCNPTR
dc810e39 166#define PUT_SCNHDR_SCNPTR H_PUT_32
252b5132
RH
167#endif
168#ifndef GET_SCNHDR_RELPTR
dc810e39 169#define GET_SCNHDR_RELPTR H_GET_32
252b5132
RH
170#endif
171#ifndef PUT_SCNHDR_RELPTR
dc810e39 172#define PUT_SCNHDR_RELPTR H_PUT_32
252b5132
RH
173#endif
174#ifndef GET_SCNHDR_LNNOPTR
dc810e39 175#define GET_SCNHDR_LNNOPTR H_GET_32
252b5132
RH
176#endif
177#ifndef PUT_SCNHDR_LNNOPTR
dc810e39 178#define PUT_SCNHDR_LNNOPTR H_PUT_32
252b5132
RH
179#endif
180#ifndef GET_SCNHDR_NRELOC
dc810e39 181#define GET_SCNHDR_NRELOC H_GET_16
252b5132 182#endif
7f6d05e8
CP
183#ifndef MAX_SCNHDR_NRELOC
184#define MAX_SCNHDR_NRELOC 0xffff
185#endif
252b5132 186#ifndef PUT_SCNHDR_NRELOC
dc810e39 187#define PUT_SCNHDR_NRELOC H_PUT_16
252b5132
RH
188#endif
189#ifndef GET_SCNHDR_NLNNO
dc810e39 190#define GET_SCNHDR_NLNNO H_GET_16
252b5132 191#endif
7f6d05e8
CP
192#ifndef MAX_SCNHDR_NLNNO
193#define MAX_SCNHDR_NLNNO 0xffff
194#endif
252b5132 195#ifndef PUT_SCNHDR_NLNNO
dc810e39 196#define PUT_SCNHDR_NLNNO H_PUT_16
252b5132
RH
197#endif
198#ifndef GET_SCNHDR_FLAGS
dc810e39 199#define GET_SCNHDR_FLAGS H_GET_32
252b5132
RH
200#endif
201#ifndef PUT_SCNHDR_FLAGS
dc810e39 202#define PUT_SCNHDR_FLAGS H_PUT_32
252b5132
RH
203#endif
204
7f6d05e8 205#ifndef GET_RELOC_VADDR
dc810e39 206#define GET_RELOC_VADDR H_GET_32
7f6d05e8
CP
207#endif
208#ifndef PUT_RELOC_VADDR
dc810e39 209#define PUT_RELOC_VADDR H_PUT_32
7f6d05e8 210#endif
252b5132 211
252b5132
RH
212#ifndef NO_COFF_RELOCS
213
214static void
7920ce38 215coff_swap_reloc_in (bfd * abfd, void * src, void * dst)
252b5132
RH
216{
217 RELOC *reloc_src = (RELOC *) src;
218 struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
219
7920ce38 220 reloc_dst->r_vaddr = GET_RELOC_VADDR (abfd, reloc_src->r_vaddr);
dc810e39 221 reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
7920ce38 222 reloc_dst->r_type = H_GET_16 (abfd, reloc_src->r_type);
252b5132
RH
223
224#ifdef SWAP_IN_RELOC_OFFSET
dc810e39 225 reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
252b5132
RH
226#endif
227}
228
229static unsigned int
7920ce38 230coff_swap_reloc_out (bfd * abfd, void * src, void * dst)
252b5132 231{
dc810e39
AM
232 struct internal_reloc *reloc_src = (struct internal_reloc *) src;
233 struct external_reloc *reloc_dst = (struct external_reloc *) dst;
7920ce38 234
dc810e39
AM
235 PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
236 H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
dc810e39 237 H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
252b5132
RH
238
239#ifdef SWAP_OUT_RELOC_OFFSET
dc810e39 240 SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset);
252b5132
RH
241#endif
242#ifdef SWAP_OUT_RELOC_EXTRA
dc810e39 243 SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
252b5132
RH
244#endif
245
6b3b007b 246 return bfd_coff_relsz (abfd);
252b5132
RH
247}
248
249#endif /* NO_COFF_RELOCS */
250
251static void
7920ce38 252coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
252b5132
RH
253{
254 FILHDR *filehdr_src = (FILHDR *) src;
255 struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
beb1bf64 256
252b5132
RH
257#ifdef COFF_ADJUST_FILEHDR_IN_PRE
258 COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst);
259#endif
7920ce38
NC
260 filehdr_dst->f_magic = H_GET_16 (abfd, filehdr_src->f_magic);
261 filehdr_dst->f_nscns = H_GET_16 (abfd, filehdr_src->f_nscns);
dc810e39
AM
262 filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
263 filehdr_dst->f_symptr = GET_FILEHDR_SYMPTR (abfd, filehdr_src->f_symptr);
7920ce38 264 filehdr_dst->f_nsyms = H_GET_32 (abfd, filehdr_src->f_nsyms);
dc810e39 265 filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src->f_opthdr);
7920ce38 266 filehdr_dst->f_flags = H_GET_16 (abfd, filehdr_src->f_flags);
252b5132 267#ifdef TIC80_TARGET_ID
dc810e39 268 filehdr_dst->f_target_id = H_GET_16 (abfd, filehdr_src->f_target_id);
252b5132
RH
269#endif
270
271#ifdef COFF_ADJUST_FILEHDR_IN_POST
272 COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst);
273#endif
274}
275
276static unsigned int
7920ce38 277coff_swap_filehdr_out (bfd *abfd, void * in, void * out)
252b5132 278{
dc810e39
AM
279 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
280 FILHDR *filehdr_out = (FILHDR *) out;
252b5132
RH
281
282#ifdef COFF_ADJUST_FILEHDR_OUT_PRE
283 COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out);
284#endif
dc810e39
AM
285 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
286 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
287 H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
288 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
289 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
290 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
291 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
252b5132 292#ifdef TIC80_TARGET_ID
dc810e39 293 H_PUT_16 (abfd, filehdr_in->f_target_id, filehdr_out->f_target_id);
252b5132
RH
294#endif
295
296#ifdef COFF_ADJUST_FILEHDR_OUT_POST
297 COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out);
298#endif
6b3b007b 299 return bfd_coff_filhsz (abfd);
252b5132
RH
300}
301
252b5132
RH
302#ifndef NO_COFF_SYMBOLS
303
304static void
7920ce38 305coff_swap_sym_in (bfd * abfd, void * ext1, void * in1)
252b5132 306{
dc810e39
AM
307 SYMENT *ext = (SYMENT *) ext1;
308 struct internal_syment *in = (struct internal_syment *) in1;
309
310 if (ext->e.e_name[0] == 0)
311 {
312 in->_n._n_n._n_zeroes = 0;
313 in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
314 }
315 else
316 {
252b5132 317#if SYMNMLEN != E_SYMNMLEN
7920ce38 318#error we need to cope with truncating or extending SYMNMLEN
252b5132 319#else
dc810e39
AM
320 memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
321#endif
322 }
7920ce38 323
dc810e39 324 in->n_value = H_GET_32 (abfd, ext->e_value);
9ae678af 325 in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
dc810e39 326 if (sizeof (ext->e_type) == 2)
7920ce38 327 in->n_type = H_GET_16 (abfd, ext->e_type);
dc810e39 328 else
7920ce38 329 in->n_type = H_GET_32 (abfd, ext->e_type);
dc810e39
AM
330 in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
331 in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
6c784c9a
TW
332#ifdef COFF_ADJUST_SYM_IN_POST
333 COFF_ADJUST_SYM_IN_POST (abfd, ext1, in1);
334#endif
252b5132
RH
335}
336
337static unsigned int
7920ce38 338coff_swap_sym_out (bfd * abfd, void * inp, void * extp)
252b5132 339{
dc810e39
AM
340 struct internal_syment *in = (struct internal_syment *) inp;
341 SYMENT *ext =(SYMENT *) extp;
026df7c5
NC
342
343#ifdef COFF_ADJUST_SYM_OUT_PRE
344 COFF_ADJUST_SYM_OUT_PRE (abfd, inp, extp);
345#endif
346
347 if (in->_n._n_name[0] == 0)
dc810e39
AM
348 {
349 H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
350 H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
351 }
352 else
353 {
252b5132 354#if SYMNMLEN != E_SYMNMLEN
7920ce38 355#error we need to cope with truncating or extending SYMNMLEN
252b5132 356#else
026df7c5 357 memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
252b5132 358#endif
dc810e39 359 }
026df7c5 360
dc810e39
AM
361 H_PUT_32 (abfd, in->n_value, ext->e_value);
362 H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
026df7c5 363
e60b52c6 364 if (sizeof (ext->e_type) == 2)
7920ce38 365 H_PUT_16 (abfd, in->n_type, ext->e_type);
252b5132 366 else
7920ce38 367 H_PUT_32 (abfd, in->n_type, ext->e_type);
026df7c5 368
dc810e39
AM
369 H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
370 H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
026df7c5 371
6c784c9a
TW
372#ifdef COFF_ADJUST_SYM_OUT_POST
373 COFF_ADJUST_SYM_OUT_POST (abfd, inp, extp);
374#endif
026df7c5 375
252b5132
RH
376 return SYMESZ;
377}
378
379static void
7920ce38
NC
380coff_swap_aux_in (bfd *abfd,
381 void * ext1,
382 int type,
96d56e9f 383 int in_class,
7920ce38
NC
384 int indx,
385 int numaux,
386 void * in1)
252b5132 387{
dc810e39
AM
388 AUXENT *ext = (AUXENT *) ext1;
389 union internal_auxent *in = (union internal_auxent *) in1;
252b5132
RH
390
391#ifdef COFF_ADJUST_AUX_IN_PRE
96d56e9f 392 COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, in_class, indx, numaux, in1);
252b5132 393#endif
026df7c5 394
96d56e9f 395 switch (in_class)
dc810e39 396 {
252b5132 397 case C_FILE:
dc810e39
AM
398 if (ext->x_file.x_fname[0] == 0)
399 {
252b5132 400 in->x_file.x_n.x_zeroes = 0;
dc810e39
AM
401 in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
402 }
403 else
404 {
252b5132 405#if FILNMLEN != E_FILNMLEN
7920ce38 406#error we need to cope with truncating or extending FILNMLEN
252b5132 407#else
dc810e39
AM
408 if (numaux > 1)
409 {
410 if (indx == 0)
411 memcpy (in->x_file.x_fname, ext->x_file.x_fname,
412 numaux * sizeof (AUXENT));
413 }
414 else
026df7c5 415 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
dc810e39
AM
416#endif
417 }
252b5132
RH
418 goto end;
419
252b5132
RH
420 case C_STAT:
421#ifdef C_LEAFSTAT
422 case C_LEAFSTAT:
423#endif
424 case C_HIDDEN:
dc810e39
AM
425 if (type == T_NULL)
426 {
427 in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
428 in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
429 in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
252b5132
RH
430
431 /* PE defines some extra fields; we zero them out for
07d6d2b8 432 safety. */
252b5132
RH
433 in->x_scn.x_checksum = 0;
434 in->x_scn.x_associated = 0;
435 in->x_scn.x_comdat = 0;
436
437 goto end;
438 }
439 break;
440 }
441
dc810e39 442 in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
252b5132 443#ifndef NO_TVNDX
dc810e39 444 in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
252b5132
RH
445#endif
446
96d56e9f
NC
447 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
448 || ISTAG (in_class))
252b5132
RH
449 {
450 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
451 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
452 }
453 else
454 {
455#if DIMNUM != E_DIMNUM
dc810e39 456#error we need to cope with truncating or extending DIMNUM
252b5132
RH
457#endif
458 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
dc810e39 459 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
252b5132 460 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
dc810e39 461 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
252b5132 462 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
dc810e39 463 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
252b5132 464 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
dc810e39 465 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
252b5132
RH
466 }
467
026df7c5 468 if (ISFCN (type))
7920ce38 469 in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
dc810e39
AM
470 else
471 {
472 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
473 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
474 }
252b5132 475
dc810e39 476 end: ;
252b5132
RH
477
478#ifdef COFF_ADJUST_AUX_IN_POST
96d56e9f 479 COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, in_class, indx, numaux, in1);
252b5132
RH
480#endif
481}
482
483static unsigned int
7920ce38
NC
484coff_swap_aux_out (bfd * abfd,
485 void * inp,
486 int type,
96d56e9f 487 int in_class,
7920ce38
NC
488 int indx ATTRIBUTE_UNUSED,
489 int numaux ATTRIBUTE_UNUSED,
490 void * extp)
252b5132 491{
7920ce38 492 union internal_auxent * in = (union internal_auxent *) inp;
dc810e39 493 AUXENT *ext = (AUXENT *) extp;
252b5132
RH
494
495#ifdef COFF_ADJUST_AUX_OUT_PRE
96d56e9f 496 COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, in_class, indx, numaux, extp);
252b5132 497#endif
026df7c5 498
7920ce38 499 memset (ext, 0, AUXESZ);
026df7c5 500
96d56e9f 501 switch (in_class)
dc810e39
AM
502 {
503 case C_FILE:
504 if (in->x_file.x_fname[0] == 0)
505 {
506 H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
507 H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
508 }
509 else
510 {
252b5132 511#if FILNMLEN != E_FILNMLEN
7920ce38 512#error we need to cope with truncating or extending FILNMLEN
252b5132 513#else
dc810e39 514 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
252b5132 515#endif
dc810e39
AM
516 }
517 goto end;
252b5132 518
dc810e39 519 case C_STAT:
252b5132 520#ifdef C_LEAFSTAT
dc810e39 521 case C_LEAFSTAT:
252b5132 522#endif
dc810e39
AM
523 case C_HIDDEN:
524 if (type == T_NULL)
525 {
526 PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
527 PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
528 PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
529 goto end;
530 }
531 break;
252b5132 532 }
252b5132 533
dc810e39 534 H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
252b5132 535#ifndef NO_TVNDX
dc810e39 536 H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
252b5132
RH
537#endif
538
96d56e9f
NC
539 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
540 || ISTAG (in_class))
252b5132 541 {
dc810e39
AM
542 PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
543 PUT_FCN_ENDNDX (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
252b5132
RH
544 }
545 else
546 {
547#if DIMNUM != E_DIMNUM
dc810e39
AM
548#error we need to cope with truncating or extending DIMNUM
549#endif
550 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
551 ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
552 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
553 ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
554 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
555 ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
556 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
557 ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
252b5132
RH
558 }
559
560 if (ISFCN (type))
dc810e39 561 H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
252b5132
RH
562 else
563 {
564 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
565 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
566 }
567
dc810e39 568 end:
252b5132 569#ifdef COFF_ADJUST_AUX_OUT_POST
96d56e9f 570 COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, in_class, indx, numaux, extp);
252b5132
RH
571#endif
572 return AUXESZ;
573}
574
575#endif /* NO_COFF_SYMBOLS */
576
577#ifndef NO_COFF_LINENOS
578
579static void
7920ce38 580coff_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
252b5132 581{
dc810e39
AM
582 LINENO *ext = (LINENO *) ext1;
583 struct internal_lineno *in = (struct internal_lineno *) in1;
252b5132 584
dc810e39
AM
585 in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
586 in->l_lnno = GET_LINENO_LNNO (abfd, ext);
252b5132
RH
587}
588
589static unsigned int
7920ce38 590coff_swap_lineno_out (bfd * abfd, void * inp, void * outp)
252b5132 591{
dc810e39
AM
592 struct internal_lineno *in = (struct internal_lineno *) inp;
593 struct external_lineno *ext = (struct external_lineno *) outp;
594 H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
252b5132
RH
595
596 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
597 return LINESZ;
598}
599
600#endif /* NO_COFF_LINENOS */
601
602static void
7920ce38 603coff_swap_aouthdr_in (bfd * abfd, void * aouthdr_ext1, void * aouthdr_int1)
252b5132 604{
dc810e39
AM
605 AOUTHDR *aouthdr_ext;
606 struct internal_aouthdr *aouthdr_int;
607
608 aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
609 aouthdr_int = (struct internal_aouthdr *) aouthdr_int1;
610 aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
611 aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
612 aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
613 aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
614 aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
615 aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
252b5132 616 aouthdr_int->text_start =
dc810e39 617 GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
252b5132 618 aouthdr_int->data_start =
dc810e39 619 GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
252b5132 620
252b5132 621#ifdef RS6000COFF_C
7f6d05e8 622#ifdef XCOFF64
dc810e39 623 aouthdr_int->o_toc = H_GET_64 (abfd, aouthdr_ext->o_toc);
7f6d05e8 624#else
dc810e39
AM
625 aouthdr_int->o_toc = H_GET_32 (abfd, aouthdr_ext->o_toc);
626#endif
026df7c5
NC
627 aouthdr_int->o_snentry = H_GET_16 (abfd, aouthdr_ext->o_snentry);
628 aouthdr_int->o_sntext = H_GET_16 (abfd, aouthdr_ext->o_sntext);
629 aouthdr_int->o_sndata = H_GET_16 (abfd, aouthdr_ext->o_sndata);
630 aouthdr_int->o_sntoc = H_GET_16 (abfd, aouthdr_ext->o_sntoc);
dc810e39 631 aouthdr_int->o_snloader = H_GET_16 (abfd, aouthdr_ext->o_snloader);
026df7c5 632 aouthdr_int->o_snbss = H_GET_16 (abfd, aouthdr_ext->o_snbss);
dc810e39
AM
633 aouthdr_int->o_algntext = H_GET_16 (abfd, aouthdr_ext->o_algntext);
634 aouthdr_int->o_algndata = H_GET_16 (abfd, aouthdr_ext->o_algndata);
026df7c5
NC
635 aouthdr_int->o_modtype = H_GET_16 (abfd, aouthdr_ext->o_modtype);
636 aouthdr_int->o_cputype = H_GET_16 (abfd, aouthdr_ext->o_cputype);
7f6d05e8 637#ifdef XCOFF64
dc810e39 638 aouthdr_int->o_maxstack = H_GET_64 (abfd, aouthdr_ext->o_maxstack);
026df7c5 639 aouthdr_int->o_maxdata = H_GET_64 (abfd, aouthdr_ext->o_maxdata);
7f6d05e8 640#else
dc810e39 641 aouthdr_int->o_maxstack = H_GET_32 (abfd, aouthdr_ext->o_maxstack);
026df7c5 642 aouthdr_int->o_maxdata = H_GET_32 (abfd, aouthdr_ext->o_maxdata);
252b5132 643#endif
7f6d05e8 644#endif
252b5132
RH
645
646#ifdef MIPSECOFF
026df7c5
NC
647 aouthdr_int->bss_start = H_GET_32 (abfd, aouthdr_ext->bss_start);
648 aouthdr_int->gp_value = H_GET_32 (abfd, aouthdr_ext->gp_value);
649 aouthdr_int->gprmask = H_GET_32 (abfd, aouthdr_ext->gprmask);
dc810e39
AM
650 aouthdr_int->cprmask[0] = H_GET_32 (abfd, aouthdr_ext->cprmask[0]);
651 aouthdr_int->cprmask[1] = H_GET_32 (abfd, aouthdr_ext->cprmask[1]);
652 aouthdr_int->cprmask[2] = H_GET_32 (abfd, aouthdr_ext->cprmask[2]);
653 aouthdr_int->cprmask[3] = H_GET_32 (abfd, aouthdr_ext->cprmask[3]);
252b5132
RH
654#endif
655
656#ifdef ALPHAECOFF
dc810e39 657 aouthdr_int->bss_start = H_GET_64 (abfd, aouthdr_ext->bss_start);
026df7c5
NC
658 aouthdr_int->gp_value = H_GET_64 (abfd, aouthdr_ext->gp_value);
659 aouthdr_int->gprmask = H_GET_32 (abfd, aouthdr_ext->gprmask);
660 aouthdr_int->fprmask = H_GET_32 (abfd, aouthdr_ext->fprmask);
252b5132
RH
661#endif
662}
663
664static unsigned int
7920ce38 665coff_swap_aouthdr_out (bfd * abfd, void * in, void * out)
252b5132 666{
dc810e39
AM
667 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
668 AOUTHDR *aouthdr_out = (AOUTHDR *) out;
669
670 H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->magic);
671 H_PUT_16 (abfd, aouthdr_in->vstamp, aouthdr_out->vstamp);
672 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->tsize);
673 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->dsize);
674 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->bsize);
675 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->entry);
252b5132 676 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
dc810e39 677 aouthdr_out->text_start);
252b5132 678 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
dc810e39 679 aouthdr_out->data_start);
252b5132 680
252b5132 681#ifdef RS6000COFF_C
7f6d05e8 682#ifdef XCOFF64
dc810e39 683 H_PUT_64 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
7f6d05e8 684#else
dc810e39
AM
685 H_PUT_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
686#endif
687 H_PUT_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
688 H_PUT_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
689 H_PUT_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
690 H_PUT_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
691 H_PUT_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
692 H_PUT_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
693 H_PUT_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
694 H_PUT_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
695 H_PUT_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
696 H_PUT_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype);
7f6d05e8 697#ifdef XCOFF64
dc810e39
AM
698 H_PUT_64 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
699 H_PUT_64 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
7f6d05e8 700#else
dc810e39
AM
701 H_PUT_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
702 H_PUT_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
7f6d05e8 703#endif
252b5132 704 memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2);
7f6d05e8
CP
705#ifdef XCOFF64
706 memset (aouthdr_out->o_debugger, 0, sizeof aouthdr_out->o_debugger);
707 memset (aouthdr_out->o_resv3, 0, sizeof aouthdr_out->o_resv3);
708#endif
252b5132
RH
709#endif
710
711#ifdef MIPSECOFF
dc810e39
AM
712 H_PUT_32 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start);
713 H_PUT_32 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value);
714 H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask);
715 H_PUT_32 (abfd, aouthdr_in->cprmask[0], aouthdr_out->cprmask[0]);
716 H_PUT_32 (abfd, aouthdr_in->cprmask[1], aouthdr_out->cprmask[1]);
717 H_PUT_32 (abfd, aouthdr_in->cprmask[2], aouthdr_out->cprmask[2]);
718 H_PUT_32 (abfd, aouthdr_in->cprmask[3], aouthdr_out->cprmask[3]);
252b5132
RH
719#endif
720
721#ifdef ALPHAECOFF
722 /* FIXME: What does bldrev mean? */
dc810e39
AM
723 H_PUT_16 (abfd, 2, aouthdr_out->bldrev);
724 H_PUT_16 (abfd, 0, aouthdr_out->padding);
725 H_PUT_64 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start);
726 H_PUT_64 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value);
727 H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask);
728 H_PUT_32 (abfd, aouthdr_in->fprmask, aouthdr_out->fprmask);
252b5132
RH
729#endif
730
731 return AOUTSZ;
732}
733
734static void
7920ce38 735coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
252b5132
RH
736{
737 SCNHDR *scnhdr_ext = (SCNHDR *) ext;
738 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
739
740#ifdef COFF_ADJUST_SCNHDR_IN_PRE
741 COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in);
742#endif
026df7c5
NC
743 memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
744
dc810e39
AM
745 scnhdr_int->s_vaddr = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
746 scnhdr_int->s_paddr = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
747 scnhdr_int->s_size = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
748
749 scnhdr_int->s_scnptr = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
750 scnhdr_int->s_relptr = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
751 scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
752 scnhdr_int->s_flags = GET_SCNHDR_FLAGS (abfd, scnhdr_ext->s_flags);
753 scnhdr_int->s_nreloc = GET_SCNHDR_NRELOC (abfd, scnhdr_ext->s_nreloc);
754 scnhdr_int->s_nlnno = GET_SCNHDR_NLNNO (abfd, scnhdr_ext->s_nlnno);
252b5132
RH
755#ifdef COFF_ADJUST_SCNHDR_IN_POST
756 COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in);
757#endif
758}
759
760static unsigned int
7920ce38 761coff_swap_scnhdr_out (bfd * abfd, void * in, void * out)
252b5132 762{
dc810e39
AM
763 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
764 SCNHDR *scnhdr_ext = (SCNHDR *) out;
6b3b007b 765 unsigned int ret = bfd_coff_scnhsz (abfd);
252b5132
RH
766
767#ifdef COFF_ADJUST_SCNHDR_OUT_PRE
768 COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out);
769#endif
dc810e39 770 memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
252b5132 771
dc810e39
AM
772 PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr, scnhdr_ext->s_vaddr);
773 PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr, scnhdr_ext->s_paddr);
774 PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size, scnhdr_ext->s_size);
775 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr, scnhdr_ext->s_scnptr);
776 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr, scnhdr_ext->s_relptr);
777 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr, scnhdr_ext->s_lnnoptr);
778 PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
7f6d05e8 779 if (scnhdr_int->s_nlnno <= MAX_SCNHDR_NLNNO)
dc810e39 780 PUT_SCNHDR_NLNNO (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
252b5132
RH
781 else
782 {
783 char buf[sizeof (scnhdr_int->s_name) + 1];
784
785 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
786 buf[sizeof (scnhdr_int->s_name)] = '\0';
4eca0228 787 _bfd_error_handler
695344c0 788 /* xgettext:c-format */
871b3ab2 789 (_("%pB: warning: %s: line number overflow: 0x%lx > 0xffff"),
dae82561 790 abfd, buf, scnhdr_int->s_nlnno);
dc810e39 791 PUT_SCNHDR_NLNNO (abfd, 0xffff, scnhdr_ext->s_nlnno);
252b5132 792 }
026df7c5 793
7f6d05e8 794 if (scnhdr_int->s_nreloc <= MAX_SCNHDR_NRELOC)
dc810e39 795 PUT_SCNHDR_NRELOC (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
252b5132
RH
796 else
797 {
798 char buf[sizeof (scnhdr_int->s_name) + 1];
799
800 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
801 buf[sizeof (scnhdr_int->s_name)] = '\0';
695344c0 802 /* xgettext:c-format */
871b3ab2 803 _bfd_error_handler (_("%pB: %s: reloc overflow: 0x%lx > 0xffff"),
dae82561 804 abfd, buf, scnhdr_int->s_nreloc);
252b5132 805 bfd_set_error (bfd_error_file_truncated);
dc810e39 806 PUT_SCNHDR_NRELOC (abfd, 0xffff, scnhdr_ext->s_nreloc);
252b5132
RH
807 ret = 0;
808 }
252b5132 809
252b5132
RH
810#ifdef COFF_ADJUST_SCNHDR_OUT_POST
811 COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out);
812#endif
813 return ret;
814}
This page took 0.933117 seconds and 4 git commands to generate.