dnl Autoconf configure snippets for common.
dnl Copyright (C) 1995-2024 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
  # Some systems (e.g. Solaris) have `socketpair' in libsocket.
  AC_SEARCH_LIBS(socketpair, socket)
  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=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>])
      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 mentionning 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 mentionning 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
	  ])
