From 9e76c212e6311abaee4d02473473f7d6dcad972f Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Fri, 23 Dec 2016 12:11:12 +0000 Subject: [PATCH] opcodes: Use autoconf to check for `bfd_mips_elf_get_abiflags' in BFD Fix a regression introduced with commit 5e7fc731f80e ("MIPS/opcodes: Also set disassembler's ASE flags from ELF structures"), further updated with commit 4df995c77118 ("MIPS/opcodes: Also set disassembler's ASE flags from ELF structures"), and use autoconf to check for the presence of `bfd_mips_elf_get_abiflags' in BFD. opcodes/ * mips-dis.c (set_default_mips_dis_options): Use HAVE_BFD_MIPS_ELF_GET_ABIFLAGS rather than BFD64 to guard the call to `bfd_mips_elf_get_abiflags'. * configure.ac: Check for `bfd_mips_elf_get_abiflags' in BFD. * Makefile.am (CONFIG_STATUS_DEPENDENCIES): Add `libbfd.la'. * aclocal.m4: Regenerate. * configure: Regenerate. * config.in: Regenerate. * Makefile.in: Regenerate. --- opcodes/ChangeLog | 12 ++++++ opcodes/Makefile.am | 5 ++- opcodes/Makefile.in | 11 +++-- opcodes/aclocal.m4 | 1 + opcodes/config.in | 3 ++ opcodes/configure | 100 ++++++++++++++++++++++++++++++++++++++++++- opcodes/configure.ac | 19 ++++++++ opcodes/mips-dis.c | 11 ++--- 8 files changed, 150 insertions(+), 12 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index bfd18f918bd..9938992f4ff 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,15 @@ +2016-12-23 Maciej W. Rozycki + + * mips-dis.c (set_default_mips_dis_options): Use + HAVE_BFD_MIPS_ELF_GET_ABIFLAGS rather than BFD64 to guard the + call to `bfd_mips_elf_get_abiflags'. + * configure.ac: Check for `bfd_mips_elf_get_abiflags' in BFD. + * Makefile.am (CONFIG_STATUS_DEPENDENCIES): Add `libbfd.la'. + * aclocal.m4: Regenerate. + * configure: Regenerate. + * config.in: Regenerate. + * Makefile.in: Regenerate. + 2016-12-23 Tristan Gingold * configure: Regenerate. diff --git a/opcodes/Makefile.am b/opcodes/Makefile.am index 737e8e3d004..3e9dc54a172 100644 --- a/opcodes/Makefile.am +++ b/opcodes/Makefile.am @@ -300,8 +300,9 @@ ALL_MACHINES = $(TARGET_LIBOPCODES_CFILES:.c=.lo) OFILES = @BFD_MACHINES@ -# development.sh is used to determine -Werror default. -CONFIG_STATUS_DEPENDENCIES = $(BFDDIR)/development.sh +# development.sh is used to determine -Werror default, libbfd.la is needed +# for function availability checks. +CONFIG_STATUS_DEPENDENCIES = $(BFDDIR)/development.sh ../bfd/libbfd.la AM_CPPFLAGS = -I. -I$(srcdir) -I../bfd -I$(INCDIR) -I$(BFDDIR) @HDEFINES@ @INCINTL@ diff --git a/opcodes/Makefile.in b/opcodes/Makefile.in index cf8e5aa8f8a..0d75cd68beb 100644 --- a/opcodes/Makefile.in +++ b/opcodes/Makefile.in @@ -80,7 +80,9 @@ DIST_COMMON = ChangeLog $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/po/Make-in $(srcdir)/../depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../bfd/acinclude.m4 \ - $(top_srcdir)/../bfd/warning.m4 $(top_srcdir)/../config/acx.m4 \ + $(top_srcdir)/../bfd/warning.m4 \ + $(top_srcdir)/../config/acinclude.m4 \ + $(top_srcdir)/../config/acx.m4 \ $(top_srcdir)/../config/depstand.m4 \ $(top_srcdir)/../config/gettext-sister.m4 \ $(top_srcdir)/../config/lead-dot.m4 \ @@ -187,6 +189,8 @@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ +BFDHDIR = @BFDHDIR@ +BFDLIB = @BFDLIB@ BFD_MACHINES = @BFD_MACHINES@ BUILD_LIBS = @BUILD_LIBS@ BUILD_LIB_DEPS = @BUILD_LIB_DEPS@ @@ -603,8 +607,9 @@ CFILES = \ ALL_MACHINES = $(TARGET_LIBOPCODES_CFILES:.c=.lo) OFILES = @BFD_MACHINES@ -# development.sh is used to determine -Werror default. -CONFIG_STATUS_DEPENDENCIES = $(BFDDIR)/development.sh +# development.sh is used to determine -Werror default, libbfd.la is needed +# for function availability checks. +CONFIG_STATUS_DEPENDENCIES = $(BFDDIR)/development.sh ../bfd/libbfd.la AM_CPPFLAGS = -I. -I$(srcdir) -I../bfd -I$(INCDIR) -I$(BFDDIR) @HDEFINES@ @INCINTL@ libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c # It's desirable to list ../bfd/libbfd.la in DEPENDENCIES and LIBADD. diff --git a/opcodes/aclocal.m4 b/opcodes/aclocal.m4 index 7e5b3d2f910..3c2c69d7424 100644 --- a/opcodes/aclocal.m4 +++ b/opcodes/aclocal.m4 @@ -990,6 +990,7 @@ AC_SUBST([am__untar]) m4_include([../bfd/acinclude.m4]) m4_include([../bfd/warning.m4]) +m4_include([../config/acinclude.m4]) m4_include([../config/acx.m4]) m4_include([../config/depstand.m4]) m4_include([../config/gettext-sister.m4]) diff --git a/opcodes/config.in b/opcodes/config.in index 55a80fd9fe4..37b5d440bc4 100644 --- a/opcodes/config.in +++ b/opcodes/config.in @@ -11,6 +11,9 @@ language is requested. */ #undef ENABLE_NLS +/* Define to 1 if you have the `bfd_mips_elf_get_abiflags' function. */ +#undef HAVE_BFD_MIPS_ELF_GET_ABIFLAGS + /* Define to 1 if you have the declaration of `basename', and to 0 if you don't. */ #undef HAVE_DECL_BASENAME diff --git a/opcodes/configure b/opcodes/configure index c3aa76e1c0a..386352e4d9e 100755 --- a/opcodes/configure +++ b/opcodes/configure @@ -604,6 +604,8 @@ LTLIBOBJS LIBOBJS BFD_MACHINES archdefs +BFDLIB +BFDHDIR SHARED_DEPENDENCIES SHARED_LIBADD SHARED_LDFLAGS @@ -11151,7 +11153,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11154 "configure" +#line 11156 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11257,7 +11259,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11260 "configure" +#line 11262 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12586,6 +12588,100 @@ fi # target-specific stuff: +# Check if `bfd_mips_elf_get_abiflags' is present in BFD, needed by +# `mips-dis.c'. Avoid using AC_CHECK_LIB as it uses a cache variable +# which could hold the wrong value if we are rerun due to the +# `../bfd/libbfd.la' dependency for `config.status', so use a handcoded +# sequence which is equivalent but does not use the cache. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the bfd header in the build tree" >&5 +$as_echo_n "checking for the bfd header in the build tree... " >&6; } +dirlist=".. ../../ ../../../ ../../../../ ../../../../../ ../../../../../../ ../../../../../../.. ../../../../../../../.. ../../../../../../../../.. ../../../../../../../../../.." +if test "${ac_cv_c_bfdh+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +for i in $dirlist; do + if test -f "$i/bfd/bfd.h" ; then + ac_cv_c_bfdh=`(cd $i/bfd; ${PWDCMD-pwd})` + break + fi +done + +fi + +if test x"${ac_cv_c_bfdh}" != x; then + BFDHDIR="-I${ac_cv_c_bfdh}" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_bfdh}" >&5 +$as_echo "${ac_cv_c_bfdh}" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the bfd library in the build tree" >&5 +$as_echo_n "checking for the bfd library in the build tree... " >&6; } +if test "${ac_cv_c_bfdlib+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +for i in $dirlist; do + if test -f "$i/bfd/Makefile" ; then + ac_cv_c_bfdlib=`(cd $i/bfd; ${PWDCMD-pwd})` + fi +done + +fi + +if test x"${ac_cv_c_bfdlib}" != x; then + BFDLIB="-L${ac_cv_c_bfdlib} -L${ac_cv_c_bfdlib}/.libs" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_bfdlib}" >&5 +$as_echo "${ac_cv_c_bfdlib}" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bfd_mips_elf_get_abiflags in -lbfd" >&5 +$as_echo_n "checking for bfd_mips_elf_get_abiflags in -lbfd... " >&6; } +opcodes_save_LIBS=$LIBS +LIBS="$BFDLIB -lbfd ../libiberty/libiberty.a `test -e ../bfd/libbfd.la && . ../bfd/libbfd.la; echo $dependency_libs`" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char bfd_mips_elf_get_abiflags (); +int +main () +{ +return bfd_mips_elf_get_abiflags (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + opcodes_lib_bfd_bfd_mips_elf_get_abiflags=yes +else + opcodes_lib_bfd_bfd_mips_elf_get_abiflags=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$opcodes_save_LIBS +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $opcodes_lib_bfd_bfd_mips_elf_get_abiflags" >&5 +$as_echo "$opcodes_lib_bfd_bfd_mips_elf_get_abiflags" >&6; } +if test x"$opcodes_lib_bfd_bfd_mips_elf_get_abiflags" = xyes; then + +$as_echo "#define HAVE_BFD_MIPS_ELF_GET_ABIFLAGS 1" >>confdefs.h + +fi + # Canonicalize the secondary target names. if test -n "$enable_targets" ; then for targ in `echo $enable_targets | sed 's/,/ /g'` diff --git a/opcodes/configure.ac b/opcodes/configure.ac index 3475d491c5f..b0825beb9a2 100644 --- a/opcodes/configure.ac +++ b/opcodes/configure.ac @@ -210,6 +210,25 @@ AC_SUBST(SHARED_DEPENDENCIES) # target-specific stuff: +# Check if `bfd_mips_elf_get_abiflags' is present in BFD, needed by +# `mips-dis.c'. Avoid using AC_CHECK_LIB as it uses a cache variable +# which could hold the wrong value if we are rerun due to the +# `../bfd/libbfd.la' dependency for `config.status', so use a handcoded +# sequence which is equivalent but does not use the cache. +CYG_AC_PATH_BFD +AC_MSG_CHECKING([for bfd_mips_elf_get_abiflags in -lbfd]) +opcodes_save_LIBS=$LIBS +LIBS="$BFDLIB -lbfd ../libiberty/libiberty.a `test -e ../bfd/libbfd.la && . ../bfd/libbfd.la; echo $dependency_libs`" +AC_LINK_IFELSE([AC_LANG_CALL([], [bfd_mips_elf_get_abiflags])], + [opcodes_lib_bfd_bfd_mips_elf_get_abiflags=yes], + [opcodes_lib_bfd_bfd_mips_elf_get_abiflags=no]) +LIBS=$opcodes_save_LIBS +AC_MSG_RESULT([$opcodes_lib_bfd_bfd_mips_elf_get_abiflags]) +if test x"$opcodes_lib_bfd_bfd_mips_elf_get_abiflags" = xyes; then + AC_DEFINE([HAVE_BFD_MIPS_ELF_GET_ABIFLAGS], [1], + [Define to 1 if you have the `bfd_mips_elf_get_abiflags' function.]) +fi + # Canonicalize the secondary target names. if test -n "$enable_targets" ; then for targ in `echo $enable_targets | sed 's/,/ /g'` diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c index 9cf737dedeb..4bc1f595089 100644 --- a/opcodes/mips-dis.c +++ b/opcodes/mips-dis.c @@ -847,11 +847,12 @@ set_default_mips_dis_options (struct disassemble_info *info) Elf_Internal_Ehdr *header = elf_elfheader (abfd); Elf_Internal_ABIFlags_v0 *abiflags = NULL; - /* We won't ever get here if !BFD64, because we won't then have - a MIPS/ELF BFD, however we need to guard against a link error - in a `--enable-targets=...' configuration with a 32-bit host, - where the MIPS target is a secondary. */ -#ifdef BFD64 + /* We won't ever get here if !HAVE_BFD_MIPS_ELF_GET_ABIFLAGS, + because we won't then have a MIPS/ELF BFD, however we need + to guard against a link error in a `--enable-targets=...' + configuration with a 32-bit host where the MIPS target is + a secondary, or with MIPS/ECOFF configurations. */ +#ifdef HAVE_BFD_MIPS_ELF_GET_ABIFLAGS abiflags = bfd_mips_elf_get_abiflags (abfd); #endif /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */ -- 2.30.2