12159047fSniklas /* Assorted BFD support routines, only used internally.
2b55d4692Sfgsch Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3*007c2a45Smiod 2000, 2001, 2002, 2003, 2004
4b305b0f1Sespie Free Software Foundation, Inc.
52159047fSniklas Written by Cygnus Support.
62159047fSniklas
72159047fSniklas This file is part of BFD, the Binary File Descriptor library.
82159047fSniklas
92159047fSniklas This program is free software; you can redistribute it and/or modify
102159047fSniklas it under the terms of the GNU General Public License as published by
112159047fSniklas the Free Software Foundation; either version 2 of the License, or
122159047fSniklas (at your option) any later version.
132159047fSniklas
142159047fSniklas This program is distributed in the hope that it will be useful,
152159047fSniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
162159047fSniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
172159047fSniklas GNU General Public License for more details.
182159047fSniklas
192159047fSniklas You should have received a copy of the GNU General Public License
202159047fSniklas along with this program; if not, write to the Free Software
212159047fSniklas Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
222159047fSniklas
232159047fSniklas #include "bfd.h"
242159047fSniklas #include "sysdep.h"
252159047fSniklas #include "libbfd.h"
262159047fSniklas
270c6d0228Sniklas #ifndef HAVE_GETPAGESIZE
280c6d0228Sniklas #define getpagesize() 2048
290c6d0228Sniklas #endif
300c6d0228Sniklas
312159047fSniklas /*
322159047fSniklas SECTION
332159047fSniklas Internal functions
342159047fSniklas
352159047fSniklas DESCRIPTION
362159047fSniklas These routines are used within BFD.
372159047fSniklas They are not intended for export, but are documented here for
382159047fSniklas completeness.
392159047fSniklas */
402159047fSniklas
412159047fSniklas /* A routine which is used in target vectors for unsupported
422159047fSniklas operations. */
432159047fSniklas
44c074d1c9Sdrahn bfd_boolean
bfd_false(bfd * ignore ATTRIBUTE_UNUSED)45*007c2a45Smiod bfd_false (bfd *ignore ATTRIBUTE_UNUSED)
462159047fSniklas {
472159047fSniklas bfd_set_error (bfd_error_invalid_operation);
48c074d1c9Sdrahn return FALSE;
492159047fSniklas }
502159047fSniklas
512159047fSniklas /* A routine which is used in target vectors for supported operations
522159047fSniklas which do not actually do anything. */
532159047fSniklas
54c074d1c9Sdrahn bfd_boolean
bfd_true(bfd * ignore ATTRIBUTE_UNUSED)55*007c2a45Smiod bfd_true (bfd *ignore ATTRIBUTE_UNUSED)
562159047fSniklas {
57c074d1c9Sdrahn return TRUE;
582159047fSniklas }
592159047fSniklas
602159047fSniklas /* A routine which is used in target vectors for unsupported
612159047fSniklas operations which return a pointer value. */
622159047fSniklas
63*007c2a45Smiod void *
bfd_nullvoidptr(bfd * ignore ATTRIBUTE_UNUSED)64*007c2a45Smiod bfd_nullvoidptr (bfd *ignore ATTRIBUTE_UNUSED)
652159047fSniklas {
662159047fSniklas bfd_set_error (bfd_error_invalid_operation);
672159047fSniklas return NULL;
682159047fSniklas }
692159047fSniklas
702159047fSniklas int
bfd_0(bfd * ignore ATTRIBUTE_UNUSED)71*007c2a45Smiod bfd_0 (bfd *ignore ATTRIBUTE_UNUSED)
722159047fSniklas {
732159047fSniklas return 0;
742159047fSniklas }
752159047fSniklas
762159047fSniklas unsigned int
bfd_0u(bfd * ignore ATTRIBUTE_UNUSED)77*007c2a45Smiod bfd_0u (bfd *ignore ATTRIBUTE_UNUSED)
782159047fSniklas {
792159047fSniklas return 0;
802159047fSniklas }
812159047fSniklas
822159047fSniklas long
bfd_0l(bfd * ignore ATTRIBUTE_UNUSED)83*007c2a45Smiod bfd_0l (bfd *ignore ATTRIBUTE_UNUSED)
842159047fSniklas {
852159047fSniklas return 0;
862159047fSniklas }
872159047fSniklas
882159047fSniklas /* A routine which is used in target vectors for unsupported
892159047fSniklas operations which return -1 on error. */
902159047fSniklas
912159047fSniklas long
_bfd_n1(bfd * ignore_abfd ATTRIBUTE_UNUSED)92*007c2a45Smiod _bfd_n1 (bfd *ignore_abfd ATTRIBUTE_UNUSED)
932159047fSniklas {
942159047fSniklas bfd_set_error (bfd_error_invalid_operation);
952159047fSniklas return -1;
962159047fSniklas }
972159047fSniklas
982159047fSniklas void
bfd_void(bfd * ignore ATTRIBUTE_UNUSED)99*007c2a45Smiod bfd_void (bfd *ignore ATTRIBUTE_UNUSED)
1002159047fSniklas {
1012159047fSniklas }
1022159047fSniklas
103c074d1c9Sdrahn bfd_boolean
_bfd_nocore_core_file_matches_executable_p(bfd * ignore_core_bfd ATTRIBUTE_UNUSED,bfd * ignore_exec_bfd ATTRIBUTE_UNUSED)104*007c2a45Smiod _bfd_nocore_core_file_matches_executable_p
105*007c2a45Smiod (bfd *ignore_core_bfd ATTRIBUTE_UNUSED,
106*007c2a45Smiod bfd *ignore_exec_bfd ATTRIBUTE_UNUSED)
1072159047fSniklas {
1082159047fSniklas bfd_set_error (bfd_error_invalid_operation);
109c074d1c9Sdrahn return FALSE;
1102159047fSniklas }
1112159047fSniklas
1122159047fSniklas /* Routine to handle core_file_failing_command entry point for targets
1132159047fSniklas without core file support. */
1142159047fSniklas
1152159047fSniklas char *
_bfd_nocore_core_file_failing_command(bfd * ignore_abfd ATTRIBUTE_UNUSED)116*007c2a45Smiod _bfd_nocore_core_file_failing_command (bfd *ignore_abfd ATTRIBUTE_UNUSED)
1172159047fSniklas {
1182159047fSniklas bfd_set_error (bfd_error_invalid_operation);
119*007c2a45Smiod return NULL;
1202159047fSniklas }
1212159047fSniklas
1222159047fSniklas /* Routine to handle core_file_failing_signal entry point for targets
1232159047fSniklas without core file support. */
1242159047fSniklas
1252159047fSniklas int
_bfd_nocore_core_file_failing_signal(bfd * ignore_abfd ATTRIBUTE_UNUSED)126*007c2a45Smiod _bfd_nocore_core_file_failing_signal (bfd *ignore_abfd ATTRIBUTE_UNUSED)
1272159047fSniklas {
1282159047fSniklas bfd_set_error (bfd_error_invalid_operation);
1292159047fSniklas return 0;
1302159047fSniklas }
1312159047fSniklas
1322159047fSniklas const bfd_target *
_bfd_dummy_target(bfd * ignore_abfd ATTRIBUTE_UNUSED)133*007c2a45Smiod _bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED)
1342159047fSniklas {
1352159047fSniklas bfd_set_error (bfd_error_wrong_format);
1362159047fSniklas return 0;
1372159047fSniklas }
1382159047fSniklas
139c88b1d6cSniklas /* Allocate memory using malloc. */
1402159047fSniklas
141*007c2a45Smiod void *
bfd_malloc(bfd_size_type size)142*007c2a45Smiod bfd_malloc (bfd_size_type size)
1432159047fSniklas {
144*007c2a45Smiod void *ptr;
1452159047fSniklas
146c074d1c9Sdrahn if (size != (size_t) size)
147c074d1c9Sdrahn {
148c88b1d6cSniklas bfd_set_error (bfd_error_no_memory);
149c074d1c9Sdrahn return NULL;
150c074d1c9Sdrahn }
151c074d1c9Sdrahn
152*007c2a45Smiod ptr = malloc ((size_t) size);
153c074d1c9Sdrahn if (ptr == NULL && (size_t) size != 0)
154c074d1c9Sdrahn bfd_set_error (bfd_error_no_memory);
155c074d1c9Sdrahn
156c88b1d6cSniklas return ptr;
157c88b1d6cSniklas }
158c88b1d6cSniklas
159c88b1d6cSniklas /* Reallocate memory using realloc. */
160c88b1d6cSniklas
161*007c2a45Smiod void *
bfd_realloc(void * ptr,bfd_size_type size)162*007c2a45Smiod bfd_realloc (void *ptr, bfd_size_type size)
163c88b1d6cSniklas {
164*007c2a45Smiod void *ret;
165c88b1d6cSniklas
166c074d1c9Sdrahn if (size != (size_t) size)
167c074d1c9Sdrahn {
168c074d1c9Sdrahn bfd_set_error (bfd_error_no_memory);
169c074d1c9Sdrahn return NULL;
170c074d1c9Sdrahn }
171c88b1d6cSniklas
172c074d1c9Sdrahn if (ptr == NULL)
173*007c2a45Smiod ret = malloc ((size_t) size);
174c074d1c9Sdrahn else
175*007c2a45Smiod ret = realloc (ptr, (size_t) size);
176c074d1c9Sdrahn
177c074d1c9Sdrahn if (ret == NULL && (size_t) size != 0)
178c88b1d6cSniklas bfd_set_error (bfd_error_no_memory);
179c88b1d6cSniklas
180c88b1d6cSniklas return ret;
181c88b1d6cSniklas }
182c88b1d6cSniklas
183c88b1d6cSniklas /* Allocate memory using malloc and clear it. */
184c88b1d6cSniklas
185*007c2a45Smiod void *
bfd_zmalloc(bfd_size_type size)186*007c2a45Smiod bfd_zmalloc (bfd_size_type size)
187c88b1d6cSniklas {
188*007c2a45Smiod void *ptr;
189c88b1d6cSniklas
190c074d1c9Sdrahn if (size != (size_t) size)
191c074d1c9Sdrahn {
192c074d1c9Sdrahn bfd_set_error (bfd_error_no_memory);
193c074d1c9Sdrahn return NULL;
194c074d1c9Sdrahn }
195c88b1d6cSniklas
196*007c2a45Smiod ptr = malloc ((size_t) size);
197c074d1c9Sdrahn
198c074d1c9Sdrahn if ((size_t) size != 0)
199c88b1d6cSniklas {
200c88b1d6cSniklas if (ptr == NULL)
201c88b1d6cSniklas bfd_set_error (bfd_error_no_memory);
202c88b1d6cSniklas else
203c074d1c9Sdrahn memset (ptr, 0, (size_t) size);
204c88b1d6cSniklas }
2052159047fSniklas
2062159047fSniklas return ptr;
2072159047fSniklas }
2082159047fSniklas /*
2092159047fSniklas INTERNAL_FUNCTION
2102159047fSniklas bfd_write_bigendian_4byte_int
2112159047fSniklas
2122159047fSniklas SYNOPSIS
213c074d1c9Sdrahn bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
2142159047fSniklas
2152159047fSniklas DESCRIPTION
2162159047fSniklas Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
2172159047fSniklas endian order regardless of what else is going on. This is useful in
2182159047fSniklas archives.
2192159047fSniklas
2202159047fSniklas */
221c074d1c9Sdrahn bfd_boolean
bfd_write_bigendian_4byte_int(bfd * abfd,unsigned int i)222*007c2a45Smiod bfd_write_bigendian_4byte_int (bfd *abfd, unsigned int i)
2232159047fSniklas {
2242159047fSniklas bfd_byte buffer[4];
225c074d1c9Sdrahn bfd_putb32 ((bfd_vma) i, buffer);
226*007c2a45Smiod return bfd_bwrite (buffer, (bfd_size_type) 4, abfd) == 4;
2272159047fSniklas }
2282159047fSniklas
2292159047fSniklas
2302159047fSniklas /** The do-it-yourself (byte) sex-change kit */
2312159047fSniklas
2322159047fSniklas /* The middle letter e.g. get<b>short indicates Big or Little endian
2332159047fSniklas target machine. It doesn't matter what the byte order of the host
2342159047fSniklas machine is; these routines work for either. */
2352159047fSniklas
2362159047fSniklas /* FIXME: Should these take a count argument?
2372159047fSniklas Answer (gnu@cygnus.com): No, but perhaps they should be inline
2382159047fSniklas functions in swap.h #ifdef __GNUC__.
2392159047fSniklas Gprof them later and find out. */
2402159047fSniklas
2412159047fSniklas /*
2422159047fSniklas FUNCTION
2432159047fSniklas bfd_put_size
2442159047fSniklas FUNCTION
2452159047fSniklas bfd_get_size
2462159047fSniklas
2472159047fSniklas DESCRIPTION
2482159047fSniklas These macros as used for reading and writing raw data in
2492159047fSniklas sections; each access (except for bytes) is vectored through
2502159047fSniklas the target format of the BFD and mangled accordingly. The
2512159047fSniklas mangling performs any necessary endian translations and
2522159047fSniklas removes alignment restrictions. Note that types accepted and
2532159047fSniklas returned by these macros are identical so they can be swapped
2542159047fSniklas around in macros---for example, @file{libaout.h} defines <<GET_WORD>>
2552159047fSniklas to either <<bfd_get_32>> or <<bfd_get_64>>.
2562159047fSniklas
2572159047fSniklas In the put routines, @var{val} must be a <<bfd_vma>>. If we are on a
2582159047fSniklas system without prototypes, the caller is responsible for making
2592159047fSniklas sure that is true, with a cast if necessary. We don't cast
2602159047fSniklas them in the macro definitions because that would prevent <<lint>>
2612159047fSniklas or <<gcc -Wall>> from detecting sins such as passing a pointer.
2622159047fSniklas To detect calling these with less than a <<bfd_vma>>, use
2632159047fSniklas <<gcc -Wconversion>> on a host with 64 bit <<bfd_vma>>'s.
2642159047fSniklas
2652159047fSniklas .
2662159047fSniklas .{* Byte swapping macros for user section data. *}
2672159047fSniklas .
2682159047fSniklas .#define bfd_put_8(abfd, val, ptr) \
269*007c2a45Smiod . ((void) (*((unsigned char *) (ptr)) = (val) & 0xff))
2702159047fSniklas .#define bfd_put_signed_8 \
2712159047fSniklas . bfd_put_8
2722159047fSniklas .#define bfd_get_8(abfd, ptr) \
273c074d1c9Sdrahn . (*(unsigned char *) (ptr) & 0xff)
2742159047fSniklas .#define bfd_get_signed_8(abfd, ptr) \
275c074d1c9Sdrahn . (((*(unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
2762159047fSniklas .
2772159047fSniklas .#define bfd_put_16(abfd, val, ptr) \
2782159047fSniklas . BFD_SEND (abfd, bfd_putx16, ((val),(ptr)))
2792159047fSniklas .#define bfd_put_signed_16 \
2802159047fSniklas . bfd_put_16
2812159047fSniklas .#define bfd_get_16(abfd, ptr) \
2822159047fSniklas . BFD_SEND (abfd, bfd_getx16, (ptr))
2832159047fSniklas .#define bfd_get_signed_16(abfd, ptr) \
2842159047fSniklas . BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
2852159047fSniklas .
2862159047fSniklas .#define bfd_put_32(abfd, val, ptr) \
2872159047fSniklas . BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
2882159047fSniklas .#define bfd_put_signed_32 \
2892159047fSniklas . bfd_put_32
2902159047fSniklas .#define bfd_get_32(abfd, ptr) \
2912159047fSniklas . BFD_SEND (abfd, bfd_getx32, (ptr))
2922159047fSniklas .#define bfd_get_signed_32(abfd, ptr) \
2932159047fSniklas . BFD_SEND (abfd, bfd_getx_signed_32, (ptr))
2942159047fSniklas .
2952159047fSniklas .#define bfd_put_64(abfd, val, ptr) \
2962159047fSniklas . BFD_SEND (abfd, bfd_putx64, ((val), (ptr)))
2972159047fSniklas .#define bfd_put_signed_64 \
2982159047fSniklas . bfd_put_64
2992159047fSniklas .#define bfd_get_64(abfd, ptr) \
3002159047fSniklas . BFD_SEND (abfd, bfd_getx64, (ptr))
3012159047fSniklas .#define bfd_get_signed_64(abfd, ptr) \
3022159047fSniklas . BFD_SEND (abfd, bfd_getx_signed_64, (ptr))
3032159047fSniklas .
304b305b0f1Sespie .#define bfd_get(bits, abfd, ptr) \
305c074d1c9Sdrahn . ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \
306b305b0f1Sespie . : (bits) == 16 ? bfd_get_16 (abfd, ptr) \
307b305b0f1Sespie . : (bits) == 32 ? bfd_get_32 (abfd, ptr) \
308b305b0f1Sespie . : (bits) == 64 ? bfd_get_64 (abfd, ptr) \
309b305b0f1Sespie . : (abort (), (bfd_vma) - 1))
310b305b0f1Sespie .
311b305b0f1Sespie .#define bfd_put(bits, abfd, val, ptr) \
312b305b0f1Sespie . ((bits) == 8 ? bfd_put_8 (abfd, val, ptr) \
313b305b0f1Sespie . : (bits) == 16 ? bfd_put_16 (abfd, val, ptr) \
314b305b0f1Sespie . : (bits) == 32 ? bfd_put_32 (abfd, val, ptr) \
315b305b0f1Sespie . : (bits) == 64 ? bfd_put_64 (abfd, val, ptr) \
316b305b0f1Sespie . : (abort (), (void) 0))
317b305b0f1Sespie .
3182159047fSniklas */
3192159047fSniklas
3202159047fSniklas /*
3212159047fSniklas FUNCTION
3222159047fSniklas bfd_h_put_size
3232159047fSniklas bfd_h_get_size
3242159047fSniklas
3252159047fSniklas DESCRIPTION
3262159047fSniklas These macros have the same function as their <<bfd_get_x>>
327c074d1c9Sdrahn brethren, except that they are used for removing information
3282159047fSniklas for the header records of object files. Believe it or not,
3292159047fSniklas some object files keep their header records in big endian
3302159047fSniklas order and their data in little endian order.
3312159047fSniklas .
3322159047fSniklas .{* Byte swapping macros for file header data. *}
3332159047fSniklas .
3342159047fSniklas .#define bfd_h_put_8(abfd, val, ptr) \
3352159047fSniklas . bfd_put_8 (abfd, val, ptr)
3362159047fSniklas .#define bfd_h_put_signed_8(abfd, val, ptr) \
3372159047fSniklas . bfd_put_8 (abfd, val, ptr)
3382159047fSniklas .#define bfd_h_get_8(abfd, ptr) \
3392159047fSniklas . bfd_get_8 (abfd, ptr)
3402159047fSniklas .#define bfd_h_get_signed_8(abfd, ptr) \
3412159047fSniklas . bfd_get_signed_8 (abfd, ptr)
3422159047fSniklas .
3432159047fSniklas .#define bfd_h_put_16(abfd, val, ptr) \
3442159047fSniklas . BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
3452159047fSniklas .#define bfd_h_put_signed_16 \
3462159047fSniklas . bfd_h_put_16
3472159047fSniklas .#define bfd_h_get_16(abfd, ptr) \
3482159047fSniklas . BFD_SEND (abfd, bfd_h_getx16, (ptr))
3492159047fSniklas .#define bfd_h_get_signed_16(abfd, ptr) \
3502159047fSniklas . BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
3512159047fSniklas .
3522159047fSniklas .#define bfd_h_put_32(abfd, val, ptr) \
3532159047fSniklas . BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
3542159047fSniklas .#define bfd_h_put_signed_32 \
3552159047fSniklas . bfd_h_put_32
3562159047fSniklas .#define bfd_h_get_32(abfd, ptr) \
3572159047fSniklas . BFD_SEND (abfd, bfd_h_getx32, (ptr))
3582159047fSniklas .#define bfd_h_get_signed_32(abfd, ptr) \
3592159047fSniklas . BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
3602159047fSniklas .
3612159047fSniklas .#define bfd_h_put_64(abfd, val, ptr) \
3622159047fSniklas . BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
3632159047fSniklas .#define bfd_h_put_signed_64 \
3642159047fSniklas . bfd_h_put_64
3652159047fSniklas .#define bfd_h_get_64(abfd, ptr) \
3662159047fSniklas . BFD_SEND (abfd, bfd_h_getx64, (ptr))
3672159047fSniklas .#define bfd_h_get_signed_64(abfd, ptr) \
3682159047fSniklas . BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
3692159047fSniklas .
370*007c2a45Smiod .{* Aliases for the above, which should eventually go away. *}
371c074d1c9Sdrahn .
372*007c2a45Smiod .#define H_PUT_64 bfd_h_put_64
373*007c2a45Smiod .#define H_PUT_32 bfd_h_put_32
374*007c2a45Smiod .#define H_PUT_16 bfd_h_put_16
375c074d1c9Sdrahn .#define H_PUT_8 bfd_h_put_8
376*007c2a45Smiod .#define H_PUT_S64 bfd_h_put_signed_64
377*007c2a45Smiod .#define H_PUT_S32 bfd_h_put_signed_32
378*007c2a45Smiod .#define H_PUT_S16 bfd_h_put_signed_16
379c074d1c9Sdrahn .#define H_PUT_S8 bfd_h_put_signed_8
380*007c2a45Smiod .#define H_GET_64 bfd_h_get_64
381*007c2a45Smiod .#define H_GET_32 bfd_h_get_32
382*007c2a45Smiod .#define H_GET_16 bfd_h_get_16
383c074d1c9Sdrahn .#define H_GET_8 bfd_h_get_8
384*007c2a45Smiod .#define H_GET_S64 bfd_h_get_signed_64
385*007c2a45Smiod .#define H_GET_S32 bfd_h_get_signed_32
386*007c2a45Smiod .#define H_GET_S16 bfd_h_get_signed_16
387c074d1c9Sdrahn .#define H_GET_S8 bfd_h_get_signed_8
388c074d1c9Sdrahn .
389c074d1c9Sdrahn .*/
3902159047fSniklas
3912159047fSniklas /* Sign extension to bfd_signed_vma. */
3922159047fSniklas #define COERCE16(x) (((bfd_signed_vma) (x) ^ 0x8000) - 0x8000)
393*007c2a45Smiod #define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
394*007c2a45Smiod #define EIGHT_GAZILLION ((bfd_int64_t) 1 << 63)
3952159047fSniklas #define COERCE64(x) \
396*007c2a45Smiod (((bfd_int64_t) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION)
3972159047fSniklas
3982159047fSniklas bfd_vma
bfd_getb16(const void * p)399*007c2a45Smiod bfd_getb16 (const void *p)
4002159047fSniklas {
401*007c2a45Smiod const bfd_byte *addr = p;
4022159047fSniklas return (addr[0] << 8) | addr[1];
4032159047fSniklas }
4042159047fSniklas
4052159047fSniklas bfd_vma
bfd_getl16(const void * p)406*007c2a45Smiod bfd_getl16 (const void *p)
4072159047fSniklas {
408*007c2a45Smiod const bfd_byte *addr = p;
4092159047fSniklas return (addr[1] << 8) | addr[0];
4102159047fSniklas }
4112159047fSniklas
4122159047fSniklas bfd_signed_vma
bfd_getb_signed_16(const void * p)413*007c2a45Smiod bfd_getb_signed_16 (const void *p)
4142159047fSniklas {
415*007c2a45Smiod const bfd_byte *addr = p;
4162159047fSniklas return COERCE16 ((addr[0] << 8) | addr[1]);
4172159047fSniklas }
4182159047fSniklas
4192159047fSniklas bfd_signed_vma
bfd_getl_signed_16(const void * p)420*007c2a45Smiod bfd_getl_signed_16 (const void *p)
4212159047fSniklas {
422*007c2a45Smiod const bfd_byte *addr = p;
4232159047fSniklas return COERCE16 ((addr[1] << 8) | addr[0]);
4242159047fSniklas }
4252159047fSniklas
4262159047fSniklas void
bfd_putb16(bfd_vma data,void * p)427*007c2a45Smiod bfd_putb16 (bfd_vma data, void *p)
4282159047fSniklas {
429*007c2a45Smiod bfd_byte *addr = p;
430*007c2a45Smiod addr[0] = (data >> 8) & 0xff;
431*007c2a45Smiod addr[1] = data & 0xff;
4322159047fSniklas }
4332159047fSniklas
4342159047fSniklas void
bfd_putl16(bfd_vma data,void * p)435*007c2a45Smiod bfd_putl16 (bfd_vma data, void *p)
4362159047fSniklas {
437*007c2a45Smiod bfd_byte *addr = p;
438*007c2a45Smiod addr[0] = data & 0xff;
439*007c2a45Smiod addr[1] = (data >> 8) & 0xff;
4402159047fSniklas }
4412159047fSniklas
4422159047fSniklas bfd_vma
bfd_getb32(const void * p)443*007c2a45Smiod bfd_getb32 (const void *p)
4442159047fSniklas {
445*007c2a45Smiod const bfd_byte *addr = p;
446b305b0f1Sespie unsigned long v;
447b305b0f1Sespie
448b305b0f1Sespie v = (unsigned long) addr[0] << 24;
449b305b0f1Sespie v |= (unsigned long) addr[1] << 16;
450b305b0f1Sespie v |= (unsigned long) addr[2] << 8;
451b305b0f1Sespie v |= (unsigned long) addr[3];
452*007c2a45Smiod return v;
4532159047fSniklas }
4542159047fSniklas
4552159047fSniklas bfd_vma
bfd_getl32(const void * p)456*007c2a45Smiod bfd_getl32 (const void *p)
4572159047fSniklas {
458*007c2a45Smiod const bfd_byte *addr = p;
459b305b0f1Sespie unsigned long v;
460b305b0f1Sespie
461b305b0f1Sespie v = (unsigned long) addr[0];
462b305b0f1Sespie v |= (unsigned long) addr[1] << 8;
463b305b0f1Sespie v |= (unsigned long) addr[2] << 16;
464b305b0f1Sespie v |= (unsigned long) addr[3] << 24;
465*007c2a45Smiod return v;
4662159047fSniklas }
4672159047fSniklas
4682159047fSniklas bfd_signed_vma
bfd_getb_signed_32(const void * p)469*007c2a45Smiod bfd_getb_signed_32 (const void *p)
4702159047fSniklas {
471*007c2a45Smiod const bfd_byte *addr = p;
472b305b0f1Sespie unsigned long v;
473b305b0f1Sespie
474b305b0f1Sespie v = (unsigned long) addr[0] << 24;
475b305b0f1Sespie v |= (unsigned long) addr[1] << 16;
476b305b0f1Sespie v |= (unsigned long) addr[2] << 8;
477b305b0f1Sespie v |= (unsigned long) addr[3];
478b305b0f1Sespie return COERCE32 (v);
4792159047fSniklas }
4802159047fSniklas
4812159047fSniklas bfd_signed_vma
bfd_getl_signed_32(const void * p)482*007c2a45Smiod bfd_getl_signed_32 (const void *p)
4832159047fSniklas {
484*007c2a45Smiod const bfd_byte *addr = p;
485b305b0f1Sespie unsigned long v;
486b305b0f1Sespie
487b305b0f1Sespie v = (unsigned long) addr[0];
488b305b0f1Sespie v |= (unsigned long) addr[1] << 8;
489b305b0f1Sespie v |= (unsigned long) addr[2] << 16;
490b305b0f1Sespie v |= (unsigned long) addr[3] << 24;
491b305b0f1Sespie return COERCE32 (v);
4922159047fSniklas }
4932159047fSniklas
494*007c2a45Smiod bfd_uint64_t
bfd_getb64(const void * p ATTRIBUTE_UNUSED)495*007c2a45Smiod bfd_getb64 (const void *p ATTRIBUTE_UNUSED)
4962159047fSniklas {
497*007c2a45Smiod #ifdef BFD_HOST_64_BIT
498*007c2a45Smiod const bfd_byte *addr = p;
499*007c2a45Smiod bfd_uint64_t v;
5002159047fSniklas
501*007c2a45Smiod v = addr[0]; v <<= 8;
502*007c2a45Smiod v |= addr[1]; v <<= 8;
503*007c2a45Smiod v |= addr[2]; v <<= 8;
504*007c2a45Smiod v |= addr[3]; v <<= 8;
505*007c2a45Smiod v |= addr[4]; v <<= 8;
506*007c2a45Smiod v |= addr[5]; v <<= 8;
507*007c2a45Smiod v |= addr[6]; v <<= 8;
508*007c2a45Smiod v |= addr[7];
5092159047fSniklas
510*007c2a45Smiod return v;
5112159047fSniklas #else
5122159047fSniklas BFD_FAIL();
5132159047fSniklas return 0;
5142159047fSniklas #endif
5152159047fSniklas }
5162159047fSniklas
517*007c2a45Smiod bfd_uint64_t
bfd_getl64(const void * p ATTRIBUTE_UNUSED)518*007c2a45Smiod bfd_getl64 (const void *p ATTRIBUTE_UNUSED)
5192159047fSniklas {
520*007c2a45Smiod #ifdef BFD_HOST_64_BIT
521*007c2a45Smiod const bfd_byte *addr = p;
522*007c2a45Smiod bfd_uint64_t v;
5232159047fSniklas
524*007c2a45Smiod v = addr[7]; v <<= 8;
525*007c2a45Smiod v |= addr[6]; v <<= 8;
526*007c2a45Smiod v |= addr[5]; v <<= 8;
527*007c2a45Smiod v |= addr[4]; v <<= 8;
528*007c2a45Smiod v |= addr[3]; v <<= 8;
529*007c2a45Smiod v |= addr[2]; v <<= 8;
530*007c2a45Smiod v |= addr[1]; v <<= 8;
531*007c2a45Smiod v |= addr[0];
5322159047fSniklas
533*007c2a45Smiod return v;
5342159047fSniklas #else
5352159047fSniklas BFD_FAIL();
5362159047fSniklas return 0;
5372159047fSniklas #endif
5382159047fSniklas
5392159047fSniklas }
5402159047fSniklas
541*007c2a45Smiod bfd_int64_t
bfd_getb_signed_64(const void * p ATTRIBUTE_UNUSED)542*007c2a45Smiod bfd_getb_signed_64 (const void *p ATTRIBUTE_UNUSED)
5432159047fSniklas {
544*007c2a45Smiod #ifdef BFD_HOST_64_BIT
545*007c2a45Smiod const bfd_byte *addr = p;
546*007c2a45Smiod bfd_uint64_t v;
5472159047fSniklas
548*007c2a45Smiod v = addr[0]; v <<= 8;
549*007c2a45Smiod v |= addr[1]; v <<= 8;
550*007c2a45Smiod v |= addr[2]; v <<= 8;
551*007c2a45Smiod v |= addr[3]; v <<= 8;
552*007c2a45Smiod v |= addr[4]; v <<= 8;
553*007c2a45Smiod v |= addr[5]; v <<= 8;
554*007c2a45Smiod v |= addr[6]; v <<= 8;
555*007c2a45Smiod v |= addr[7];
5562159047fSniklas
557*007c2a45Smiod return COERCE64 (v);
5582159047fSniklas #else
5592159047fSniklas BFD_FAIL();
5602159047fSniklas return 0;
5612159047fSniklas #endif
5622159047fSniklas }
5632159047fSniklas
564*007c2a45Smiod bfd_int64_t
bfd_getl_signed_64(const void * p ATTRIBUTE_UNUSED)565*007c2a45Smiod bfd_getl_signed_64 (const void *p ATTRIBUTE_UNUSED)
5662159047fSniklas {
567*007c2a45Smiod #ifdef BFD_HOST_64_BIT
568*007c2a45Smiod const bfd_byte *addr = p;
569*007c2a45Smiod bfd_uint64_t v;
5702159047fSniklas
571*007c2a45Smiod v = addr[7]; v <<= 8;
572*007c2a45Smiod v |= addr[6]; v <<= 8;
573*007c2a45Smiod v |= addr[5]; v <<= 8;
574*007c2a45Smiod v |= addr[4]; v <<= 8;
575*007c2a45Smiod v |= addr[3]; v <<= 8;
576*007c2a45Smiod v |= addr[2]; v <<= 8;
577*007c2a45Smiod v |= addr[1]; v <<= 8;
578*007c2a45Smiod v |= addr[0];
5792159047fSniklas
580*007c2a45Smiod return COERCE64 (v);
5812159047fSniklas #else
5822159047fSniklas BFD_FAIL();
5832159047fSniklas return 0;
5842159047fSniklas #endif
5852159047fSniklas }
5862159047fSniklas
5872159047fSniklas void
bfd_putb32(bfd_vma data,void * p)588*007c2a45Smiod bfd_putb32 (bfd_vma data, void *p)
5892159047fSniklas {
590*007c2a45Smiod bfd_byte *addr = p;
591*007c2a45Smiod addr[0] = (data >> 24) & 0xff;
592*007c2a45Smiod addr[1] = (data >> 16) & 0xff;
593*007c2a45Smiod addr[2] = (data >> 8) & 0xff;
594*007c2a45Smiod addr[3] = data & 0xff;
5952159047fSniklas }
5962159047fSniklas
5972159047fSniklas void
bfd_putl32(bfd_vma data,void * p)598*007c2a45Smiod bfd_putl32 (bfd_vma data, void *p)
5992159047fSniklas {
600*007c2a45Smiod bfd_byte *addr = p;
601*007c2a45Smiod addr[0] = data & 0xff;
602*007c2a45Smiod addr[1] = (data >> 8) & 0xff;
603*007c2a45Smiod addr[2] = (data >> 16) & 0xff;
604*007c2a45Smiod addr[3] = (data >> 24) & 0xff;
6052159047fSniklas }
6062159047fSniklas
6072159047fSniklas void
bfd_putb64(bfd_uint64_t data ATTRIBUTE_UNUSED,void * p ATTRIBUTE_UNUSED)608*007c2a45Smiod bfd_putb64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
6092159047fSniklas {
610*007c2a45Smiod #ifdef BFD_HOST_64_BIT
611*007c2a45Smiod bfd_byte *addr = p;
612*007c2a45Smiod addr[0] = (data >> (7*8)) & 0xff;
613*007c2a45Smiod addr[1] = (data >> (6*8)) & 0xff;
614*007c2a45Smiod addr[2] = (data >> (5*8)) & 0xff;
615*007c2a45Smiod addr[3] = (data >> (4*8)) & 0xff;
616*007c2a45Smiod addr[4] = (data >> (3*8)) & 0xff;
617*007c2a45Smiod addr[5] = (data >> (2*8)) & 0xff;
618*007c2a45Smiod addr[6] = (data >> (1*8)) & 0xff;
619*007c2a45Smiod addr[7] = (data >> (0*8)) & 0xff;
6202159047fSniklas #else
6212159047fSniklas BFD_FAIL();
6222159047fSniklas #endif
6232159047fSniklas }
6242159047fSniklas
6252159047fSniklas void
bfd_putl64(bfd_uint64_t data ATTRIBUTE_UNUSED,void * p ATTRIBUTE_UNUSED)626*007c2a45Smiod bfd_putl64 (bfd_uint64_t data ATTRIBUTE_UNUSED, void *p ATTRIBUTE_UNUSED)
6272159047fSniklas {
628*007c2a45Smiod #ifdef BFD_HOST_64_BIT
629*007c2a45Smiod bfd_byte *addr = p;
630*007c2a45Smiod addr[7] = (data >> (7*8)) & 0xff;
631*007c2a45Smiod addr[6] = (data >> (6*8)) & 0xff;
632*007c2a45Smiod addr[5] = (data >> (5*8)) & 0xff;
633*007c2a45Smiod addr[4] = (data >> (4*8)) & 0xff;
634*007c2a45Smiod addr[3] = (data >> (3*8)) & 0xff;
635*007c2a45Smiod addr[2] = (data >> (2*8)) & 0xff;
636*007c2a45Smiod addr[1] = (data >> (1*8)) & 0xff;
637*007c2a45Smiod addr[0] = (data >> (0*8)) & 0xff;
6382159047fSniklas #else
6392159047fSniklas BFD_FAIL();
6402159047fSniklas #endif
6412159047fSniklas }
642b55d4692Sfgsch
643b55d4692Sfgsch void
bfd_put_bits(bfd_uint64_t data,void * p,int bits,bfd_boolean big_p)644*007c2a45Smiod bfd_put_bits (bfd_uint64_t data, void *p, int bits, bfd_boolean big_p)
645b55d4692Sfgsch {
646*007c2a45Smiod bfd_byte *addr = p;
647b55d4692Sfgsch int i;
648b55d4692Sfgsch int bytes;
649b55d4692Sfgsch
650b55d4692Sfgsch if (bits % 8 != 0)
651b55d4692Sfgsch abort ();
652b55d4692Sfgsch
653b55d4692Sfgsch bytes = bits / 8;
654b55d4692Sfgsch for (i = 0; i < bytes; i++)
655b55d4692Sfgsch {
656b55d4692Sfgsch int index = big_p ? bytes - i - 1 : i;
657b55d4692Sfgsch
658*007c2a45Smiod addr[index] = data & 0xff;
659b55d4692Sfgsch data >>= 8;
660b55d4692Sfgsch }
661b55d4692Sfgsch }
662b55d4692Sfgsch
663*007c2a45Smiod bfd_uint64_t
bfd_get_bits(const void * p,int bits,bfd_boolean big_p)664*007c2a45Smiod bfd_get_bits (const void *p, int bits, bfd_boolean big_p)
665b55d4692Sfgsch {
666*007c2a45Smiod const bfd_byte *addr = p;
667*007c2a45Smiod bfd_uint64_t data;
668b55d4692Sfgsch int i;
669b55d4692Sfgsch int bytes;
670b55d4692Sfgsch
671b55d4692Sfgsch if (bits % 8 != 0)
672b55d4692Sfgsch abort ();
673b55d4692Sfgsch
674b55d4692Sfgsch data = 0;
675b55d4692Sfgsch bytes = bits / 8;
676b55d4692Sfgsch for (i = 0; i < bytes; i++)
677b55d4692Sfgsch {
678b55d4692Sfgsch int index = big_p ? i : bytes - i - 1;
679b55d4692Sfgsch
680b55d4692Sfgsch data = (data << 8) | addr[index];
681b55d4692Sfgsch }
682b55d4692Sfgsch
683b55d4692Sfgsch return data;
684b55d4692Sfgsch }
6852159047fSniklas
6862159047fSniklas /* Default implementation */
6872159047fSniklas
688c074d1c9Sdrahn bfd_boolean
_bfd_generic_get_section_contents(bfd * abfd,sec_ptr section,void * location,file_ptr offset,bfd_size_type count)689*007c2a45Smiod _bfd_generic_get_section_contents (bfd *abfd,
690*007c2a45Smiod sec_ptr section,
691*007c2a45Smiod void *location,
692*007c2a45Smiod file_ptr offset,
693*007c2a45Smiod bfd_size_type count)
6942159047fSniklas {
6952159047fSniklas if (count == 0)
696c074d1c9Sdrahn return TRUE;
697b305b0f1Sespie
698c074d1c9Sdrahn if (offset + count > section->_raw_size)
699b305b0f1Sespie {
700b305b0f1Sespie bfd_set_error (bfd_error_invalid_operation);
701c074d1c9Sdrahn return FALSE;
702b305b0f1Sespie }
703b305b0f1Sespie
704b305b0f1Sespie if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
705c074d1c9Sdrahn || bfd_bread (location, count, abfd) != count)
706c074d1c9Sdrahn return FALSE;
707b305b0f1Sespie
708c074d1c9Sdrahn return TRUE;
7092159047fSniklas }
7102159047fSniklas
711c074d1c9Sdrahn bfd_boolean
_bfd_generic_get_section_contents_in_window(bfd * abfd ATTRIBUTE_UNUSED,sec_ptr section ATTRIBUTE_UNUSED,bfd_window * w ATTRIBUTE_UNUSED,file_ptr offset ATTRIBUTE_UNUSED,bfd_size_type count ATTRIBUTE_UNUSED)712*007c2a45Smiod _bfd_generic_get_section_contents_in_window
713*007c2a45Smiod (bfd *abfd ATTRIBUTE_UNUSED,
714*007c2a45Smiod sec_ptr section ATTRIBUTE_UNUSED,
715*007c2a45Smiod bfd_window *w ATTRIBUTE_UNUSED,
716*007c2a45Smiod file_ptr offset ATTRIBUTE_UNUSED,
717*007c2a45Smiod bfd_size_type count ATTRIBUTE_UNUSED)
7182159047fSniklas {
7192159047fSniklas #ifdef USE_MMAP
7202159047fSniklas if (count == 0)
721c074d1c9Sdrahn return TRUE;
722*007c2a45Smiod if (abfd->xvec->_bfd_get_section_contents
723*007c2a45Smiod != _bfd_generic_get_section_contents)
7242159047fSniklas {
7252159047fSniklas /* We don't know what changes the bfd's get_section_contents
7262159047fSniklas method may have to make. So punt trying to map the file
7272159047fSniklas window, and let get_section_contents do its thing. */
7282159047fSniklas /* @@ FIXME : If the internal window has a refcount of 1 and was
7292159047fSniklas allocated with malloc instead of mmap, just reuse it. */
7302159047fSniklas bfd_free_window (w);
731*007c2a45Smiod w->i = bfd_zmalloc (sizeof (bfd_window_internal));
7322159047fSniklas if (w->i == NULL)
733c074d1c9Sdrahn return FALSE;
734*007c2a45Smiod w->i->data = bfd_malloc (count);
7352159047fSniklas if (w->i->data == NULL)
7362159047fSniklas {
7372159047fSniklas free (w->i);
7382159047fSniklas w->i = NULL;
739c074d1c9Sdrahn return FALSE;
7402159047fSniklas }
7412159047fSniklas w->i->mapped = 0;
7422159047fSniklas w->i->refcount = 1;
7432159047fSniklas w->size = w->i->size = count;
7442159047fSniklas w->data = w->i->data;
7452159047fSniklas return bfd_get_section_contents (abfd, section, w->data, offset, count);
7462159047fSniklas }
747c074d1c9Sdrahn if (offset + count > section->_raw_size
748c074d1c9Sdrahn || ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
749c074d1c9Sdrahn TRUE))
750c074d1c9Sdrahn return FALSE;
751c074d1c9Sdrahn return TRUE;
7522159047fSniklas #else
7532159047fSniklas abort ();
7542159047fSniklas #endif
7552159047fSniklas }
7562159047fSniklas
7572159047fSniklas /* This generic function can only be used in implementations where creating
7582159047fSniklas NEW sections is disallowed. It is useful in patching existing sections
7592159047fSniklas in read-write files, though. See other set_section_contents functions
7602159047fSniklas to see why it doesn't work for new sections. */
761c074d1c9Sdrahn bfd_boolean
_bfd_generic_set_section_contents(bfd * abfd,sec_ptr section,const void * location,file_ptr offset,bfd_size_type count)762*007c2a45Smiod _bfd_generic_set_section_contents (bfd *abfd,
763*007c2a45Smiod sec_ptr section,
764*007c2a45Smiod const void *location,
765*007c2a45Smiod file_ptr offset,
766*007c2a45Smiod bfd_size_type count)
7672159047fSniklas {
7682159047fSniklas if (count == 0)
769c074d1c9Sdrahn return TRUE;
7702159047fSniklas
771c074d1c9Sdrahn if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
772c074d1c9Sdrahn || bfd_bwrite (location, count, abfd) != count)
773c074d1c9Sdrahn return FALSE;
7742159047fSniklas
775c074d1c9Sdrahn return TRUE;
7762159047fSniklas }
7772159047fSniklas
7782159047fSniklas /*
7792159047fSniklas INTERNAL_FUNCTION
7802159047fSniklas bfd_log2
7812159047fSniklas
7822159047fSniklas SYNOPSIS
7832159047fSniklas unsigned int bfd_log2 (bfd_vma x);
7842159047fSniklas
7852159047fSniklas DESCRIPTION
7862159047fSniklas Return the log base 2 of the value supplied, rounded up. E.g., an
787c074d1c9Sdrahn @var{x} of 1025 returns 11. A @var{x} of 0 returns 0.
7882159047fSniklas */
7892159047fSniklas
790b305b0f1Sespie unsigned int
bfd_log2(bfd_vma x)791*007c2a45Smiod bfd_log2 (bfd_vma x)
7922159047fSniklas {
793b305b0f1Sespie unsigned int result = 0;
794b305b0f1Sespie
795b305b0f1Sespie while ((x = (x >> 1)) != 0)
796b305b0f1Sespie ++result;
7972159047fSniklas return result;
7982159047fSniklas }
7992159047fSniklas
800c074d1c9Sdrahn bfd_boolean
bfd_generic_is_local_label_name(bfd * abfd,const char * name)801*007c2a45Smiod bfd_generic_is_local_label_name (bfd *abfd, const char *name)
8022159047fSniklas {
8032159047fSniklas char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
8042159047fSniklas
805c074d1c9Sdrahn return name[0] == locals_prefix;
8062159047fSniklas }
8072159047fSniklas
808b305b0f1Sespie /* Can be used from / for bfd_merge_private_bfd_data to check that
809b305b0f1Sespie endianness matches between input and output file. Returns
810c074d1c9Sdrahn TRUE for a match, otherwise returns FALSE and emits an error. */
811c074d1c9Sdrahn bfd_boolean
_bfd_generic_verify_endian_match(bfd * ibfd,bfd * obfd)812*007c2a45Smiod _bfd_generic_verify_endian_match (bfd *ibfd, bfd *obfd)
813b305b0f1Sespie {
814b305b0f1Sespie if (ibfd->xvec->byteorder != obfd->xvec->byteorder
815b55d4692Sfgsch && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
816b305b0f1Sespie && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
817b305b0f1Sespie {
818b55d4692Sfgsch const char *msg;
819b55d4692Sfgsch
820b55d4692Sfgsch if (bfd_big_endian (ibfd))
821b55d4692Sfgsch msg = _("%s: compiled for a big endian system and target is little endian");
822b55d4692Sfgsch else
823b55d4692Sfgsch msg = _("%s: compiled for a little endian system and target is big endian");
824b55d4692Sfgsch
825c074d1c9Sdrahn (*_bfd_error_handler) (msg, bfd_archive_filename (ibfd));
826b305b0f1Sespie
827b305b0f1Sespie bfd_set_error (bfd_error_wrong_format);
828c074d1c9Sdrahn return FALSE;
829b305b0f1Sespie }
830b305b0f1Sespie
831c074d1c9Sdrahn return TRUE;
832c074d1c9Sdrahn }
833c074d1c9Sdrahn
834c074d1c9Sdrahn /* Give a warning at runtime if someone compiles code which calls
835c074d1c9Sdrahn old routines. */
836c074d1c9Sdrahn
837c074d1c9Sdrahn void
warn_deprecated(const char * what,const char * file,int line,const char * func)838*007c2a45Smiod warn_deprecated (const char *what,
839*007c2a45Smiod const char *file,
840*007c2a45Smiod int line,
841*007c2a45Smiod const char *func)
842c074d1c9Sdrahn {
843c074d1c9Sdrahn /* Poor man's tracking of functions we've already warned about. */
844c074d1c9Sdrahn static size_t mask = 0;
845c074d1c9Sdrahn
846c074d1c9Sdrahn if (~(size_t) func & ~mask)
847c074d1c9Sdrahn {
848c074d1c9Sdrahn /* Note: separate sentences in order to allow
849c074d1c9Sdrahn for translation into other languages. */
850c074d1c9Sdrahn if (func)
851c074d1c9Sdrahn fprintf (stderr, _("Deprecated %s called at %s line %d in %s\n"),
852c074d1c9Sdrahn what, file, line, func);
853c074d1c9Sdrahn else
854c074d1c9Sdrahn fprintf (stderr, _("Deprecated %s called\n"), what);
855c074d1c9Sdrahn mask |= ~(size_t) func;
856c074d1c9Sdrahn }
857b305b0f1Sespie }
858