dnl Autoconf configure snippets for common.
dnl Copyright (C) 1995-2025 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_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([ \
  dlfcn.h \
  linux/elf.h \
  linux/perf_event.h  \
  locale.h \
  memory.h \
  poll.h \
  proc_service.h \
  signal.h \
  sys/poll.h \
  sys/resource.h \
  sys/select.h \
  sys/socket.h \
  sys/un.h \
  sys/wait.h \
  termios.h \
  thread_db.h \
  wait.h \
])

  AC_FUNC_MMAP
  AC_FUNC_FORK
  # Some systems (e.g. Solaris) have `socketpair' in libsocket.
  AC_SEARCH_LIBS(socketpair, socket)
  AC_CHECK_FUNCS([ \
    fdwalk \
    getauxval \
    getrlimit \
    getrusage \
    pipe \
    pipe2 \
    poll \
    ptrace64 \
    sbrk \
    setns \
    setpgid \
    setpgrp \
    sigaction \
    sigaltstack \
    sigprocmask \
    sigtimedwait \
    socketpair \
  ])

  # 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=auto])

  # Check for std::thread.  This does not work on some platforms, like
  # mingw using the win32 threads model with gcc older than 13, 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(
  dnl NOTE: this must be kept in sync with common-defs.h.
  [[#if defined (__MINGW32__) || defined (__CYGWIN__)
    # ifdef _WIN32_WINNT
    #  if _WIN32_WINNT < 0x0501
    #   undef _WIN32_WINNT
    #   define _WIN32_WINNT 0x0501
    #  endif
    # else
    #  define _WIN32_WINNT 0x0501
    # endif
    #endif	/* __MINGW32__ || __CYGWIN__ */
    #include <thread>
    #include <mutex>
    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" != "no"; then
    if test "$gdb_cv_cxx_std_thread" = "yes"; then
      AC_DEFINE(CXX_STD_THREAD, 1,
		[Define to 1 if std::thread works.])
    else
	if test "$want_threading" = "yes"; then
	    AC_MSG_ERROR([std::thread does not work; disable threading])
	else
	    AC_MSG_WARN([std::thread does not work; disabling threading])
	fi
    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>])
      AC_CHECK_MEMBERS([struct pt_event.variant.ptwrite], [], [],
		       [#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

  dnl xxhash support
  # Check for xxhash
  AC_ARG_WITH(xxhash,
    AS_HELP_STRING([--with-xxhash], [use libxxhash for hashing (faster) (auto/yes/no)]),
    [], [with_xxhash=auto])

  if test "x$with_xxhash" != "xno"; then
    AC_LIB_HAVE_LINKFLAGS([xxhash], [],
			  [#include <xxhash.h>],
			  [XXH32("foo", 3, 0);
			  ])
    if test "$HAVE_LIBXXHASH" != yes; then
      if test "$with_xxhash" = yes; then
	AC_MSG_ERROR([xxhash is missing or unusable])
      fi
    fi
    if test "x$with_xxhash" = "xauto"; then
      with_xxhash="$HAVE_LIBXXHASH"
    fi
  fi

  AC_MSG_CHECKING([whether to use xxhash])
  AC_MSG_RESULT([$with_xxhash])
])

dnl Check that the provided value ($1) is either "yes" or "no".  If not,
dnl emit an error message mentioning the configure option $2, and abort
dnl the script.
AC_DEFUN([GDB_CHECK_YES_NO_VAL],
	 [
	   case $1 in
	     yes | no)
	       ;;
	     *)
	       AC_MSG_ERROR([bad value $1 for $2])
	       ;;
	   esac
	  ])

dnl Check that the provided value ($1) is either "yes", "no" or "auto".  If not,
dnl emit an error message mentioning the configure option $2, and abort
dnl the script.
AC_DEFUN([GDB_CHECK_YES_NO_AUTO_VAL],
	 [
	   case $1 in
	     yes | no | auto)
	       ;;
	     *)
	       AC_MSG_ERROR([bad value $1 for $2])
	       ;;
	   esac
	  ])
