mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
c560a5fbae
Currently, the configure check for std::thread relies on pthreads existing. However, this means that if std::thread is implemented for a non-pthreads host, then the check will yield the wrong answer. This happened in AdaCore internal builds. Here, we have this GCC patch: https://gcc.gnu.org/legacy-ml/gcc-patches/2019-06/msg01840.html ... which adds mingw support to GCC's gthreads implementation, and also to std::thread. This configure change fixes this problem and enables threading for gdb.
219 lines
6.9 KiB
Plaintext
219 lines
6.9 KiB
Plaintext
dnl Autoconf configure snippets for common.
|
|
dnl Copyright (C) 1995-2022 Free Software Foundation, Inc.
|
|
dnl
|
|
dnl This file is part of GDB.
|
|
dnl
|
|
dnl This program is free software; you can redistribute it and/or modify
|
|
dnl it under the terms of the GNU General Public License as published by
|
|
dnl the Free Software Foundation; either version 3 of the License, or
|
|
dnl (at your option) any later version.
|
|
dnl
|
|
dnl This program is distributed in the hope that it will be useful,
|
|
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
dnl GNU General Public License for more details.
|
|
dnl
|
|
dnl You should have received a copy of the GNU General Public License
|
|
dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
dnl Invoke configury needed by the files in 'common'.
|
|
AC_DEFUN([GDB_AC_COMMON], [
|
|
# Set the 'development' global.
|
|
. $srcdir/../bfd/development.sh
|
|
|
|
AC_HEADER_STDC
|
|
AC_FUNC_ALLOCA
|
|
|
|
WIN32APILIBS=
|
|
case ${host} in
|
|
*mingw32*)
|
|
AC_DEFINE(USE_WIN32API, 1,
|
|
[Define if we should use the Windows API, instead of the
|
|
POSIX API. On Windows, we use the Windows API when
|
|
building for MinGW, but the POSIX API when building
|
|
for Cygwin.])
|
|
WIN32APILIBS="-lws2_32"
|
|
;;
|
|
esac
|
|
|
|
dnl Note that this requires codeset.m4, which is included
|
|
dnl by the users of common.m4.
|
|
AM_LANGINFO_CODESET
|
|
|
|
AC_CHECK_HEADERS(linux/perf_event.h locale.h memory.h signal.h dnl
|
|
sys/resource.h sys/socket.h dnl
|
|
sys/un.h sys/wait.h dnl
|
|
thread_db.h wait.h dnl
|
|
termios.h dnl
|
|
dlfcn.h dnl
|
|
linux/elf.h proc_service.h dnl
|
|
poll.h sys/poll.h sys/select.h)
|
|
|
|
AC_FUNC_MMAP
|
|
AC_FUNC_FORK
|
|
AC_CHECK_FUNCS([fdwalk getrlimit pipe pipe2 poll socketpair sigaction \
|
|
ptrace64 sbrk setns sigaltstack sigprocmask \
|
|
setpgid setpgrp getrusage getauxval sigtimedwait])
|
|
|
|
# This is needed for RHEL 5 and uclibc-ng < 1.0.39.
|
|
# These did not define ADDR_NO_RANDOMIZE in sys/personality.h,
|
|
# only in linux/personality.h.
|
|
AC_CHECK_DECLS([ADDR_NO_RANDOMIZE],,, [#include <sys/personality.h>])
|
|
|
|
AC_CHECK_DECLS([strstr])
|
|
|
|
# ----------------------- #
|
|
# Checks for structures. #
|
|
# ----------------------- #
|
|
|
|
AC_CHECK_MEMBERS([struct stat.st_blocks, struct stat.st_blksize])
|
|
|
|
# On FreeBSD we need libutil for the kinfo_get* functions. On
|
|
# GNU/kFreeBSD systems, FreeBSD libutil is renamed to libutil-freebsd.
|
|
# Figure out which one to use.
|
|
AC_SEARCH_LIBS(kinfo_getfile, util util-freebsd)
|
|
|
|
# Define HAVE_KINFO_GETFILE if kinfo_getfile is available.
|
|
AC_CHECK_FUNCS(kinfo_getfile)
|
|
|
|
# ----------------------- #
|
|
# Check for threading. #
|
|
# ----------------------- #
|
|
|
|
AC_ARG_ENABLE(threading,
|
|
AS_HELP_STRING([--enable-threading], [include support for parallel processing of data (yes/no)]),
|
|
[case "$enableval" in
|
|
yes) want_threading=yes ;;
|
|
no) want_threading=no ;;
|
|
*) AC_MSG_ERROR([bad value $enableval for threading]) ;;
|
|
esac],
|
|
[want_threading=yes])
|
|
|
|
# Check for std::thread. This does not work on some platforms, like
|
|
# mingw and DJGPP.
|
|
AC_LANG_PUSH([C++])
|
|
AX_PTHREAD([threads=yes], [threads=no])
|
|
save_LIBS="$LIBS"
|
|
LIBS="$PTHREAD_LIBS $LIBS"
|
|
save_CXXFLAGS="$CXXFLAGS"
|
|
CXXFLAGS="$PTHREAD_CFLAGS $save_CXXFLAGS"
|
|
AC_CACHE_CHECK([for std::thread],
|
|
gdb_cv_cxx_std_thread,
|
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|
[[#include <thread>
|
|
void callback() { }]],
|
|
[[std::thread t(callback);]])],
|
|
gdb_cv_cxx_std_thread=yes,
|
|
gdb_cv_cxx_std_thread=no)])
|
|
|
|
if test "$threads" = "yes"; then
|
|
# This check must be here, while LIBS includes any necessary
|
|
# threading library.
|
|
AC_CHECK_FUNCS([pthread_sigmask pthread_setname_np])
|
|
fi
|
|
LIBS="$save_LIBS"
|
|
CXXFLAGS="$save_CXXFLAGS"
|
|
|
|
if test "$want_threading" = "yes"; then
|
|
if test "$gdb_cv_cxx_std_thread" = "yes"; then
|
|
AC_DEFINE(CXX_STD_THREAD, 1,
|
|
[Define to 1 if std::thread works.])
|
|
fi
|
|
fi
|
|
AC_LANG_POP
|
|
|
|
dnl Check if sigsetjmp is available. Using AC_CHECK_FUNCS won't
|
|
dnl do since sigsetjmp might only be defined as a macro.
|
|
AC_CACHE_CHECK(
|
|
[for sigsetjmp],
|
|
[gdb_cv_func_sigsetjmp],
|
|
[AC_COMPILE_IFELSE(
|
|
[AC_LANG_PROGRAM(
|
|
[#include <setjmp.h>],
|
|
[sigjmp_buf env;
|
|
while (! sigsetjmp (env, 1))
|
|
siglongjmp (env, 1);]
|
|
)],
|
|
[gdb_cv_func_sigsetjmp=yes],
|
|
[gdb_cv_func_sigsetjmp=no]
|
|
)]
|
|
)
|
|
if test "$gdb_cv_func_sigsetjmp" = "yes"; then
|
|
AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available. ])
|
|
fi
|
|
|
|
AC_ARG_WITH(intel_pt,
|
|
AS_HELP_STRING([--with-intel-pt], [include Intel Processor Trace support (auto/yes/no)]),
|
|
[], [with_intel_pt=auto])
|
|
AC_MSG_CHECKING([whether to use intel pt])
|
|
AC_MSG_RESULT([$with_intel_pt])
|
|
|
|
if test "${with_intel_pt}" = no; then
|
|
AC_MSG_WARN([Intel Processor Trace support disabled; some features may be unavailable.])
|
|
HAVE_LIBIPT=no
|
|
else
|
|
AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
|
|
#include <linux/perf_event.h>
|
|
#ifndef PERF_ATTR_SIZE_VER5
|
|
# error
|
|
#endif
|
|
]])], [perf_event=yes], [perf_event=no])
|
|
if test "$perf_event" != yes; then
|
|
if test "$with_intel_pt" = yes; then
|
|
AC_MSG_ERROR([linux/perf_event.h missing or too old])
|
|
else
|
|
AC_MSG_WARN([linux/perf_event.h missing or too old; some features may be unavailable.])
|
|
fi
|
|
fi
|
|
|
|
AC_LIB_HAVE_LINKFLAGS([ipt], [], [#include "intel-pt.h"], [pt_insn_alloc_decoder (0);])
|
|
if test "$HAVE_LIBIPT" != yes; then
|
|
if test "$with_intel_pt" = yes; then
|
|
AC_MSG_ERROR([libipt is missing or unusable])
|
|
else
|
|
AC_MSG_WARN([libipt is missing or unusable; some features may be unavailable.])
|
|
fi
|
|
else
|
|
save_LIBS=$LIBS
|
|
LIBS="$LIBS $LIBIPT"
|
|
AC_CHECK_FUNCS(pt_insn_event)
|
|
AC_CHECK_MEMBERS([struct pt_insn.enabled, struct pt_insn.resynced], [], [],
|
|
[#include <intel-pt.h>])
|
|
LIBS=$save_LIBS
|
|
fi
|
|
fi
|
|
|
|
# Check if the compiler and runtime support printing long longs.
|
|
|
|
AC_CACHE_CHECK([for long long support in printf],
|
|
gdb_cv_printf_has_long_long,
|
|
[AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
|
|
[[char buf[32];
|
|
long long l = 0;
|
|
l = (l << 16) + 0x0123;
|
|
l = (l << 16) + 0x4567;
|
|
l = (l << 16) + 0x89ab;
|
|
l = (l << 16) + 0xcdef;
|
|
sprintf (buf, "0x%016llx", l);
|
|
return (strcmp ("0x0123456789abcdef", buf));]])],
|
|
gdb_cv_printf_has_long_long=yes,
|
|
gdb_cv_printf_has_long_long=no,
|
|
gdb_cv_printf_has_long_long=no)])
|
|
if test "$gdb_cv_printf_has_long_long" = yes; then
|
|
AC_DEFINE(PRINTF_HAS_LONG_LONG, 1,
|
|
[Define to 1 if the "%ll" format works to print long longs.])
|
|
fi
|
|
|
|
BFD_SYS_PROCFS_H
|
|
if test "$ac_cv_header_sys_procfs_h" = yes; then
|
|
BFD_HAVE_SYS_PROCFS_TYPE(gregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(fpregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(prgregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(prfpregset_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(prgregset32_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(lwpid_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(psaddr_t)
|
|
BFD_HAVE_SYS_PROCFS_TYPE(elf_fpregset_t)
|
|
fi
|
|
])
|