Provide a way for programs to recognize BFD_ASSERT calls.
* bfd.c (bfd_assert_handler_type): New API type. (bfd_set_assert_handler, bfd_get_assert_handler): New API functions. (_bfd_assert_handler): New variable. (_bfd_default_assert_handler): New function. (bfd_assert): Call _bfd_assert_handler, not _bfd_error_handler. * libbfd-in.h (_bfd_assert_handler): Declare. * libbfd.h, bfd-in2.h: Regenerate.
This commit is contained in:
parent
2c54b4f422
commit
2b56b3f35a
|
@ -1,3 +1,14 @@
|
||||||
|
2012-04-26 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
|
Provide a way for programs to recognize BFD_ASSERT calls.
|
||||||
|
* bfd.c (bfd_assert_handler_type): New API type.
|
||||||
|
(bfd_set_assert_handler, bfd_get_assert_handler): New API functions.
|
||||||
|
(_bfd_assert_handler): New variable.
|
||||||
|
(_bfd_default_assert_handler): New function.
|
||||||
|
(bfd_assert): Call _bfd_assert_handler, not _bfd_error_handler.
|
||||||
|
* libbfd-in.h (_bfd_assert_handler): Declare.
|
||||||
|
* libbfd.h, bfd-in2.h: Regenerate.
|
||||||
|
|
||||||
2012-04-24 Hans-Peter Nilsson <hp@axis.com>
|
2012-04-24 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
PR ld/13990
|
PR ld/13990
|
||||||
|
|
|
@ -5637,6 +5637,15 @@ void bfd_set_error_program_name (const char *);
|
||||||
|
|
||||||
bfd_error_handler_type bfd_get_error_handler (void);
|
bfd_error_handler_type bfd_get_error_handler (void);
|
||||||
|
|
||||||
|
typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg,
|
||||||
|
const char *bfd_version,
|
||||||
|
const char *bfd_file,
|
||||||
|
int bfd_line);
|
||||||
|
|
||||||
|
bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type);
|
||||||
|
|
||||||
|
bfd_assert_handler_type bfd_get_assert_handler (void);
|
||||||
|
|
||||||
long bfd_get_reloc_upper_bound (bfd *abfd, asection *sect);
|
long bfd_get_reloc_upper_bound (bfd *abfd, asection *sect);
|
||||||
|
|
||||||
long bfd_canonicalize_reloc
|
long bfd_canonicalize_reloc
|
||||||
|
|
90
bfd/bfd.c
90
bfd/bfd.c
|
@ -797,6 +797,88 @@ bfd_get_error_handler (void)
|
||||||
{
|
{
|
||||||
return _bfd_error_handler;
|
return _bfd_error_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SUBSECTION
|
||||||
|
BFD assert handler
|
||||||
|
|
||||||
|
If BFD finds an internal inconsistency, the bfd assert
|
||||||
|
handler is called with information on the BFD version, BFD
|
||||||
|
source file and line. If this happens, most programs linked
|
||||||
|
against BFD are expected to want to exit with an error, or mark
|
||||||
|
the current BFD operation as failed, so it is recommended to
|
||||||
|
override the default handler, which just calls
|
||||||
|
_bfd_error_handler and continues.
|
||||||
|
|
||||||
|
CODE_FRAGMENT
|
||||||
|
.
|
||||||
|
.typedef void (*bfd_assert_handler_type) (const char *bfd_formatmsg,
|
||||||
|
. const char *bfd_version,
|
||||||
|
. const char *bfd_file,
|
||||||
|
. int bfd_line);
|
||||||
|
.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Note the use of bfd_ prefix on the parameter names above: we want to
|
||||||
|
show which one is the message and which is the version by naming the
|
||||||
|
parameters, but avoid polluting the program-using-bfd namespace as
|
||||||
|
the typedef is visible in the exported headers that the program
|
||||||
|
includes. Below, it's just for consistency. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
_bfd_default_assert_handler (const char *bfd_formatmsg,
|
||||||
|
const char *bfd_version,
|
||||||
|
const char *bfd_file,
|
||||||
|
int bfd_line)
|
||||||
|
|
||||||
|
{
|
||||||
|
(*_bfd_error_handler) (bfd_formatmsg, bfd_version, bfd_file, bfd_line);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Similar to _bfd_error_handler, a program can decide to exit on an
|
||||||
|
internal BFD error. We use a non-variadic type to simplify passing
|
||||||
|
on parameters to other functions, e.g. _bfd_error_handler. */
|
||||||
|
|
||||||
|
bfd_assert_handler_type _bfd_assert_handler = _bfd_default_assert_handler;
|
||||||
|
|
||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
bfd_set_assert_handler
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
bfd_assert_handler_type bfd_set_assert_handler (bfd_assert_handler_type);
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Set the BFD assert handler function. Returns the previous
|
||||||
|
function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bfd_assert_handler_type
|
||||||
|
bfd_set_assert_handler (bfd_assert_handler_type pnew)
|
||||||
|
{
|
||||||
|
bfd_assert_handler_type pold;
|
||||||
|
|
||||||
|
pold = _bfd_assert_handler;
|
||||||
|
_bfd_assert_handler = pnew;
|
||||||
|
return pold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
bfd_get_assert_handler
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
bfd_assert_handler_type bfd_get_assert_handler (void);
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Return the BFD assert handler function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bfd_assert_handler_type
|
||||||
|
bfd_get_assert_handler (void)
|
||||||
|
{
|
||||||
|
return _bfd_assert_handler;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SECTION
|
SECTION
|
||||||
|
@ -942,8 +1024,14 @@ bfd_set_file_flags (bfd *abfd, flagword flags)
|
||||||
void
|
void
|
||||||
bfd_assert (const char *file, int line)
|
bfd_assert (const char *file, int line)
|
||||||
{
|
{
|
||||||
(*_bfd_error_handler) (_("BFD %s assertion fail %s:%d"),
|
(*_bfd_assert_handler) (_("BFD %s assertion fail %s:%d"),
|
||||||
BFD_VERSION_STRING, file, line);
|
BFD_VERSION_STRING, file, line);
|
||||||
|
|
||||||
|
/* We used to just return from bfd_assert, but that caused more
|
||||||
|
grief than relief. The different code paths for bfd_assert and
|
||||||
|
_bfd_abort could be united but keeping them separate can
|
||||||
|
simplify debugging. */
|
||||||
|
_exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A more or less friendly abort message. In libbfd.h abort is
|
/* A more or less friendly abort message. In libbfd.h abort is
|
||||||
|
|
|
@ -117,6 +117,7 @@ extern void *bfd_zmalloc2
|
||||||
|
|
||||||
extern void _bfd_default_error_handler (const char *s, ...);
|
extern void _bfd_default_error_handler (const char *s, ...);
|
||||||
extern bfd_error_handler_type _bfd_error_handler;
|
extern bfd_error_handler_type _bfd_error_handler;
|
||||||
|
extern bfd_assert_handler_type _bfd_assert_handler;
|
||||||
|
|
||||||
/* These routines allocate and free things on the BFD's objalloc. */
|
/* These routines allocate and free things on the BFD's objalloc. */
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,7 @@ extern void *bfd_zmalloc2
|
||||||
|
|
||||||
extern void _bfd_default_error_handler (const char *s, ...);
|
extern void _bfd_default_error_handler (const char *s, ...);
|
||||||
extern bfd_error_handler_type _bfd_error_handler;
|
extern bfd_error_handler_type _bfd_error_handler;
|
||||||
|
extern bfd_assert_handler_type _bfd_assert_handler;
|
||||||
|
|
||||||
/* These routines allocate and free things on the BFD's objalloc. */
|
/* These routines allocate and free things on the BFD's objalloc. */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue