Fix Control.Arrow (***) diagram (fixes #25698)
[ghc.git] / m4 / fp_bfd_support.m4
blobfcc1dcca9ecdf70b8dd2e4921bf50f4e5c6ba971
1 # FP_BFD_SUPPORT()
2 # ----------------------
3 # Whether to use libbfd for debugging RTS
5 # Sets:
6 #   UseLibbfd: [YES|NO]
7 AC_DEFUN([FP_BFD_FLAG], [
8   UseLibbfd=NO
9   AC_ARG_ENABLE(bfd-debug,
10     [AS_HELP_STRING([--enable-bfd-debug],
11           [Enable symbol resolution for -debug rts ('+RTS -Di') via binutils' libbfd [default=no]])],
12     [UseLibbfd=YES],
13     [UseLibbfd=NO])
16 # FP_WHEN_ENABLED_BFD
17 # ----------------------
18 # Checks for libraries in the default way, which will define various
19 # `HAVE_*` macros.
20 AC_DEFUN([FP_WHEN_ENABLED_BFD], [
21   # don't pollute general LIBS environment
22   save_LIBS="$LIBS"
23   AC_CHECK_HEADERS([bfd.h])
24   dnl ** check whether this machine has BFD and libiberty installed (used for debugging)
25   dnl    the order of these tests matters: bfd needs libiberty
26   AC_CHECK_LIB(iberty, xmalloc)
27   dnl 'bfd_init' is a rare non-macro in libbfd
28   AC_CHECK_LIB(bfd,    bfd_init)
30   AC_LINK_IFELSE(
31     [AC_LANG_PROGRAM(
32       [[#include <bfd.h>]],
33       [[
34         /* mimic our rts/Printer.c */
35         bfd* abfd;
36         const char * name;
37         char **matching;
39         name = "some.executable";
40         bfd_init();
41         abfd = bfd_openr(name, "default");
42         bfd_check_format_matches (abfd, bfd_object, &matching);
43         {
44             long storage_needed;
45             storage_needed = bfd_get_symtab_upper_bound (abfd);
46         }
47         {
48             asymbol **symbol_table;
49             long number_of_symbols;
50             symbol_info info;
52             number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
53             bfd_get_symbol_info(abfd,symbol_table[0],&info);
54         }
55       ]])],
56     [], dnl bfd seems to work
57     [AC_MSG_ERROR([can't use 'bfd' library])])
58   LIBS="$save_LIBS"