xref: /openbsd-src/gnu/usr.bin/binutils/bfd/doc/libbfd.texi (revision cf2f2c5620d6d9a4fd01930983c4b9a1f76d7aa3)
1fddef416Sniklas@section Internal functions
2fddef416Sniklas
3f7cc78ecSespie
4fddef416Sniklas@strong{Description}@*
5fddef416SniklasThese routines are used within BFD.
6fddef416SniklasThey are not intended for export, but are documented here for
7fddef416Sniklascompleteness.
8f7cc78ecSespie
9fddef416Sniklas@findex bfd_write_bigendian_4byte_int
10fddef416Sniklas@subsubsection @code{bfd_write_bigendian_4byte_int}
11fddef416Sniklas@strong{Synopsis}
12fddef416Sniklas@example
13d2201f2fSdrahnbfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
14fddef416Sniklas@end example
15fddef416Sniklas@strong{Description}@*
16fddef416SniklasWrite a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
17fddef416Sniklasendian order regardless of what else is going on.  This is useful in
18fddef416Sniklasarchives.
19f7cc78ecSespie
20fddef416Sniklas@findex bfd_put_size
21fddef416Sniklas@subsubsection @code{bfd_put_size}
22fddef416Sniklas@findex bfd_get_size
23fddef416Sniklas@subsubsection @code{bfd_get_size}
24fddef416Sniklas@strong{Description}@*
25fddef416SniklasThese macros as used for reading and writing raw data in
26fddef416Sniklassections; each access (except for bytes) is vectored through
27fddef416Sniklasthe target format of the BFD and mangled accordingly. The
28fddef416Sniklasmangling performs any necessary endian translations and
29fddef416Sniklasremoves alignment restrictions.  Note that types accepted and
30fddef416Sniklasreturned by these macros are identical so they can be swapped
31fddef416Sniklasaround in macros---for example, @file{libaout.h} defines @code{GET_WORD}
32fddef416Sniklasto either @code{bfd_get_32} or @code{bfd_get_64}.
33fddef416Sniklas
34fddef416SniklasIn the put routines, @var{val} must be a @code{bfd_vma}.  If we are on a
35fddef416Sniklassystem without prototypes, the caller is responsible for making
36fddef416Sniklassure that is true, with a cast if necessary.  We don't cast
37fddef416Sniklasthem in the macro definitions because that would prevent @code{lint}
38fddef416Sniklasor @code{gcc -Wall} from detecting sins such as passing a pointer.
39fddef416SniklasTo detect calling these with less than a @code{bfd_vma}, use
40fddef416Sniklas@code{gcc -Wconversion} on a host with 64 bit @code{bfd_vma}'s.
41fddef416Sniklas@example
42fddef416Sniklas
43fddef416Sniklas/* Byte swapping macros for user section data.  */
44fddef416Sniklas
45fddef416Sniklas#define bfd_put_8(abfd, val, ptr) \
46*cf2f2c56Smiod  ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
47fddef416Sniklas#define bfd_put_signed_8 \
48fddef416Sniklas  bfd_put_8
49fddef416Sniklas#define bfd_get_8(abfd, ptr) \
50d2201f2fSdrahn  (*(unsigned char *) (ptr) & 0xff)
51fddef416Sniklas#define bfd_get_signed_8(abfd, ptr) \
52d2201f2fSdrahn  (((*(unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
53fddef416Sniklas
54fddef416Sniklas#define bfd_put_16(abfd, val, ptr) \
55fddef416Sniklas  BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
56fddef416Sniklas#define bfd_put_signed_16 \
57fddef416Sniklas  bfd_put_16
58fddef416Sniklas#define bfd_get_16(abfd, ptr) \
59fddef416Sniklas  BFD_SEND (abfd, bfd_getx16, (ptr))
60fddef416Sniklas#define bfd_get_signed_16(abfd, ptr) \
61fddef416Sniklas  BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
62fddef416Sniklas
63fddef416Sniklas#define bfd_put_32(abfd, val, ptr) \
64fddef416Sniklas  BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
65fddef416Sniklas#define bfd_put_signed_32 \
66fddef416Sniklas  bfd_put_32
67fddef416Sniklas#define bfd_get_32(abfd, ptr) \
68fddef416Sniklas  BFD_SEND (abfd, bfd_getx32, (ptr))
69fddef416Sniklas#define bfd_get_signed_32(abfd, ptr) \
70fddef416Sniklas  BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
71fddef416Sniklas
72fddef416Sniklas#define bfd_put_64(abfd, val, ptr) \
73fddef416Sniklas  BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
74fddef416Sniklas#define bfd_put_signed_64 \
75fddef416Sniklas  bfd_put_64
76fddef416Sniklas#define bfd_get_64(abfd, ptr) \
77fddef416Sniklas  BFD_SEND (abfd, bfd_getx64, (ptr))
78fddef416Sniklas#define bfd_get_signed_64(abfd, ptr) \
79fddef416Sniklas  BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
80fddef416Sniklas
81f7cc78ecSespie#define bfd_get(bits, abfd, ptr)                       \
82d2201f2fSdrahn  ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr)       \
83f7cc78ecSespie   : (bits) == 16 ? bfd_get_16 (abfd, ptr)             \
84f7cc78ecSespie   : (bits) == 32 ? bfd_get_32 (abfd, ptr)             \
85f7cc78ecSespie   : (bits) == 64 ? bfd_get_64 (abfd, ptr)             \
86f7cc78ecSespie   : (abort (), (bfd_vma) - 1))
87f7cc78ecSespie
88f7cc78ecSespie#define bfd_put(bits, abfd, val, ptr)                  \
89f7cc78ecSespie  ((bits) == 8 ? bfd_put_8  (abfd, val, ptr)           \
90f7cc78ecSespie   : (bits) == 16 ? bfd_put_16 (abfd, val, ptr)                \
91f7cc78ecSespie   : (bits) == 32 ? bfd_put_32 (abfd, val, ptr)                \
92f7cc78ecSespie   : (bits) == 64 ? bfd_put_64 (abfd, val, ptr)                \
93f7cc78ecSespie   : (abort (), (void) 0))
94f7cc78ecSespie
95fddef416Sniklas@end example
96f7cc78ecSespie
97fddef416Sniklas@findex bfd_h_put_size
98fddef416Sniklas@subsubsection @code{bfd_h_put_size}
99fddef416Sniklas@strong{Description}@*
100fddef416SniklasThese macros have the same function as their @code{bfd_get_x}
101d2201f2fSdrahnbrethren, except that they are used for removing information
102fddef416Sniklasfor the header records of object files. Believe it or not,
103fddef416Sniklassome object files keep their header records in big endian
104fddef416Sniklasorder and their data in little endian order.
105fddef416Sniklas@example
106fddef416Sniklas
107fddef416Sniklas/* Byte swapping macros for file header data.  */
108fddef416Sniklas
109fddef416Sniklas#define bfd_h_put_8(abfd, val, ptr) \
110fddef416Sniklas  bfd_put_8 (abfd, val, ptr)
111fddef416Sniklas#define bfd_h_put_signed_8(abfd, val, ptr) \
112fddef416Sniklas  bfd_put_8 (abfd, val, ptr)
113fddef416Sniklas#define bfd_h_get_8(abfd, ptr) \
114fddef416Sniklas  bfd_get_8 (abfd, ptr)
115fddef416Sniklas#define bfd_h_get_signed_8(abfd, ptr) \
116fddef416Sniklas  bfd_get_signed_8 (abfd, ptr)
117fddef416Sniklas
118fddef416Sniklas#define bfd_h_put_16(abfd, val, ptr) \
119fddef416Sniklas  BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
120fddef416Sniklas#define bfd_h_put_signed_16 \
121fddef416Sniklas  bfd_h_put_16
122fddef416Sniklas#define bfd_h_get_16(abfd, ptr) \
123fddef416Sniklas  BFD_SEND (abfd, bfd_h_getx16, (ptr))
124fddef416Sniklas#define bfd_h_get_signed_16(abfd, ptr) \
125fddef416Sniklas  BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
126fddef416Sniklas
127fddef416Sniklas#define bfd_h_put_32(abfd, val, ptr) \
128fddef416Sniklas  BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
129fddef416Sniklas#define bfd_h_put_signed_32 \
130fddef416Sniklas  bfd_h_put_32
131fddef416Sniklas#define bfd_h_get_32(abfd, ptr) \
132fddef416Sniklas  BFD_SEND (abfd, bfd_h_getx32, (ptr))
133fddef416Sniklas#define bfd_h_get_signed_32(abfd, ptr) \
134fddef416Sniklas  BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
135fddef416Sniklas
136fddef416Sniklas#define bfd_h_put_64(abfd, val, ptr) \
137fddef416Sniklas  BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
138fddef416Sniklas#define bfd_h_put_signed_64 \
139fddef416Sniklas  bfd_h_put_64
140fddef416Sniklas#define bfd_h_get_64(abfd, ptr) \
141fddef416Sniklas  BFD_SEND (abfd, bfd_h_getx64, (ptr))
142fddef416Sniklas#define bfd_h_get_signed_64(abfd, ptr) \
143fddef416Sniklas  BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
144fddef416Sniklas
145*cf2f2c56Smiod/* Aliases for the above, which should eventually go away.  */
146d2201f2fSdrahn
147*cf2f2c56Smiod#define H_PUT_64  bfd_h_put_64
148*cf2f2c56Smiod#define H_PUT_32  bfd_h_put_32
149*cf2f2c56Smiod#define H_PUT_16  bfd_h_put_16
150d2201f2fSdrahn#define H_PUT_8   bfd_h_put_8
151*cf2f2c56Smiod#define H_PUT_S64 bfd_h_put_signed_64
152*cf2f2c56Smiod#define H_PUT_S32 bfd_h_put_signed_32
153*cf2f2c56Smiod#define H_PUT_S16 bfd_h_put_signed_16
154d2201f2fSdrahn#define H_PUT_S8  bfd_h_put_signed_8
155*cf2f2c56Smiod#define H_GET_64  bfd_h_get_64
156*cf2f2c56Smiod#define H_GET_32  bfd_h_get_32
157*cf2f2c56Smiod#define H_GET_16  bfd_h_get_16
158d2201f2fSdrahn#define H_GET_8   bfd_h_get_8
159*cf2f2c56Smiod#define H_GET_S64 bfd_h_get_signed_64
160*cf2f2c56Smiod#define H_GET_S32 bfd_h_get_signed_32
161*cf2f2c56Smiod#define H_GET_S16 bfd_h_get_signed_16
162d2201f2fSdrahn#define H_GET_S8  bfd_h_get_signed_8
163d2201f2fSdrahn
164d2201f2fSdrahn
165fddef416Sniklas@end example
166f7cc78ecSespie
167fddef416Sniklas@findex bfd_log2
168fddef416Sniklas@subsubsection @code{bfd_log2}
169fddef416Sniklas@strong{Synopsis}
170fddef416Sniklas@example
171fddef416Sniklasunsigned int bfd_log2 (bfd_vma x);
172fddef416Sniklas@end example
173fddef416Sniklas@strong{Description}@*
174fddef416SniklasReturn the log base 2 of the value supplied, rounded up.  E.g., an
175d2201f2fSdrahn@var{x} of 1025 returns 11.  A @var{x} of 0 returns 0.
176f7cc78ecSespie
177