| # | |
| # Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. | |
| # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| # | |
| # This code is free software; you can redistribute it and/or modify it | |
| # under the terms of the GNU General Public License version 2 only, as | |
| # published by the Free Software Foundation. Oracle designates this | |
| # particular file as subject to the "Classpath" exception as provided | |
| # by Oracle in the LICENSE file that accompanied this code. | |
| # | |
| # This code is distributed in the hope that it will be useful, but WITHOUT | |
| # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| # version 2 for more details (a copy is included in the LICENSE file that | |
| # accompanied this code). | |
| # | |
| # You should have received a copy of the GNU General Public License version | |
| # 2 along with this work; if not, write to the Free Software Foundation, | |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| # | |
| # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| # or visit www.oracle.com if you need additional information or have any | |
| # questions. | |
| # | |
| ################################################################################ | |
| # | |
| # Helper function to setup hsdis using Capstone | |
| # | |
| AC_DEFUN([LIB_SETUP_HSDIS_CAPSTONE], | |
| [ | |
| AC_ARG_WITH(capstone, [AS_HELP_STRING([--with-capstone], | |
| [where to find the Capstone files needed for hsdis/capstone])]) | |
| if test "x$with_capstone" != x; then | |
| AC_MSG_CHECKING([for capstone]) | |
| CAPSTONE="$with_capstone" | |
| AC_MSG_RESULT([$CAPSTONE]) | |
| HSDIS_CFLAGS="-I${CAPSTONE}/include/capstone" | |
| if test "x$OPENJDK_TARGET_OS" != xwindows; then | |
| HSDIS_LDFLAGS="-L${CAPSTONE}/lib" | |
| if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" ; then | |
| HSDIS_LDFLAGS="-L${CAPSTONE}/lib64 $HSDIS_LDFLAGS" | |
| fi | |
| HSDIS_LIBS="-lcapstone" | |
| else | |
| HSDIS_LDFLAGS="-nodefaultlib:libcmt.lib" | |
| HSDIS_LIBS="${CAPSTONE}/capstone.lib" | |
| fi | |
| else | |
| if test "x$OPENJDK_TARGET_OS" = xwindows; then | |
| # There is no way to auto-detect capstone on Windows | |
| AC_MSG_NOTICE([You must specify capstone location using --with-capstone=<path>]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| PKG_CHECK_MODULES(CAPSTONE, capstone, [CAPSTONE_FOUND=yes], [CAPSTONE_FOUND=no]) | |
| if test "x$CAPSTONE_FOUND" = xyes; then | |
| HSDIS_CFLAGS="$CAPSTONE_CFLAGS" | |
| HSDIS_LDFLAGS="$CAPSTONE_LDFLAGS" | |
| HSDIS_LIBS="$CAPSTONE_LIBS" | |
| else | |
| HELP_MSG_MISSING_DEPENDENCY([capstone]) | |
| AC_MSG_NOTICE([Cannot locate capstone which is needed for hsdis/capstone. Try using --with-capstone=<path>. $HELP_MSG]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| fi | |
| capstone_header="\"$CAPSTONE/include/capstone/capstone.h\"" | |
| AC_MSG_CHECKING([capstone aarch64 arch name]) | |
| AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include $capstone_header],[[cs_arch test = CS_ARCH_AARCH64]])], | |
| [ | |
| AC_MSG_RESULT([AARCH64]) | |
| CAPSTONE_ARCH_AARCH64_NAME="AARCH64" | |
| ], | |
| [ | |
| AC_MSG_RESULT([ARM64]) | |
| CAPSTONE_ARCH_AARCH64_NAME="ARM64" | |
| ] | |
| ) | |
| ]) | |
| ################################################################################ | |
| # | |
| # Helper function to setup hsdis using LLVM | |
| # | |
| AC_DEFUN([LIB_SETUP_HSDIS_LLVM], | |
| [ | |
| AC_ARG_WITH([llvm], [AS_HELP_STRING([--with-llvm], | |
| [where to find the LLVM files needed for hsdis/llvm])]) | |
| if test "x$with_llvm" != x; then | |
| LLVM_DIR="$with_llvm" | |
| fi | |
| if test "x$OPENJDK_TARGET_OS" != xwindows; then | |
| if test "x$LLVM_DIR" = x; then | |
| # Macs with homebrew can have llvm in different places | |
| UTIL_LOOKUP_PROGS(LLVM_CONFIG, llvm-config, [$PATH:/usr/local/opt/llvm/bin:/opt/homebrew/opt/llvm/bin]) | |
| if test "x$LLVM_CONFIG" = x; then | |
| AC_MSG_NOTICE([Cannot locate llvm-config which is needed for hsdis/llvm. Try using --with-llvm=<LLVM home>.]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| else | |
| UTIL_LOOKUP_PROGS(LLVM_CONFIG, llvm-config, [$LLVM_DIR/bin]) | |
| if test "x$LLVM_CONFIG" = x; then | |
| AC_MSG_NOTICE([Cannot locate llvm-config in $LLVM_DIR. Check your --with-llvm argument.]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| fi | |
| # We need the LLVM flags and libs, and llvm-config provides them for us. | |
| HSDIS_CFLAGS=`$LLVM_CONFIG --cflags` | |
| HSDIS_LDFLAGS=`$LLVM_CONFIG --ldflags` | |
| HSDIS_LIBS=`$LLVM_CONFIG --libs $OPENJDK_TARGET_CPU_ARCH ${OPENJDK_TARGET_CPU_ARCH}disassembler` | |
| else | |
| if test "x$LLVM_DIR" = x; then | |
| AC_MSG_NOTICE([--with-llvm is needed on Windows to point out the LLVM home]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| # Official Windows installation of LLVM do not ship llvm-config, and self-built llvm-config | |
| # produced unusable output, so just ignore it on Windows. | |
| if ! test -e $LLVM_DIR/include/llvm-c/lto.h; then | |
| AC_MSG_NOTICE([$LLVM_DIR does not seem like a valid LLVM home; include dir is missing]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| if ! test -e $LLVM_DIR/include/llvm-c/Disassembler.h; then | |
| AC_MSG_NOTICE([$LLVM_DIR does not point to a complete LLVM installation. ]) | |
| AC_MSG_NOTICE([The official LLVM distribution is missing crucical files; you need to build LLVM yourself or get all include files elsewhere]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| if ! test -e $LLVM_DIR/lib/llvm-c.lib; then | |
| AC_MSG_NOTICE([$LLVM_DIR does not seem like a valid LLVM home; lib dir is missing]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| HSDIS_CFLAGS="-I$LLVM_DIR/include" | |
| HSDIS_LDFLAGS="-libpath:$LLVM_DIR/lib" | |
| HSDIS_LIBS="llvm-c.lib" | |
| fi | |
| ]) | |
| ################################################################################ | |
| # | |
| # Helper function to build binutils from source. | |
| # | |
| AC_DEFUN([LIB_BUILD_BINUTILS], | |
| [ | |
| BINUTILS_SRC="$with_binutils_src" | |
| UTIL_FIXUP_PATH(BINUTILS_SRC) | |
| BINUTILS_BUILD_DIR="$CONFIGURESUPPORT_OUTPUTDIR/binutils" | |
| BINUTILS_INSTALL_DIR="$CONFIGURESUPPORT_OUTPUTDIR/binutils-install" | |
| if ! test -d $BINUTILS_SRC; then | |
| AC_MSG_ERROR([--with-binutils-src is not pointing to a directory]) | |
| fi | |
| if ! test -x $BINUTILS_SRC/configure; then | |
| AC_MSG_ERROR([--with-binutils-src does not look like a binutils source directory]) | |
| fi | |
| if ! test -d $BINUTILS_BUILD_DIR; then | |
| $MKDIR -p $BINUTILS_BUILD_DIR | |
| fi | |
| # We don't know the version, not checking for libsframe.a | |
| if test -e $BINUTILS_INSTALL_DIR/lib/libbfd.a && \ | |
| test -e $BINUTILS_INSTALL_DIR/lib/libopcodes.a && \ | |
| test -e $BINUTILS_INSTALL_DIR/lib/libiberty.a; then | |
| AC_MSG_NOTICE([Found binutils binaries in binutils install directory -- not building]) | |
| else | |
| # On Windows, we cannot build with the normal Microsoft CL, but must instead use | |
| # a separate mingw toolchain. | |
| if test "x$OPENJDK_BUILD_OS" = xwindows; then | |
| if test "x$OPENJDK_TARGET_CPU" = "xx86"; then | |
| target_base="i686-w64-mingw32" | |
| else | |
| target_base="$OPENJDK_TARGET_CPU-w64-mingw32" | |
| fi | |
| binutils_cc="$target_base-gcc" | |
| binutils_target="--host=$target_base --target=$target_base" | |
| # Somehow the uint typedef is not included when building with mingw | |
| binutils_cflags="-Duint=unsigned" | |
| compiler_version=`$binutils_cc --version 2>&1` | |
| if ! [ [[ "$compiler_version" =~ GCC ]] ]; then | |
| AC_MSG_NOTICE([Could not find correct mingw compiler $binutils_cc.]) | |
| HELP_MSG_MISSING_DEPENDENCY([$binutils_cc]) | |
| AC_MSG_ERROR([Cannot continue. $HELP_MSG]) | |
| else | |
| AC_MSG_NOTICE([Using compiler $binutils_cc with version $compiler_version]) | |
| fi | |
| elif test "x$OPENJDK_BUILD_OS" = xmacosx; then | |
| if test "x$OPENJDK_TARGET_CPU" = "xaarch64"; then | |
| binutils_target="--enable-targets=aarch64-darwin" | |
| else | |
| binutils_target="" | |
| fi | |
| else | |
| binutils_cc="$CC $SYSROOT_CFLAGS" | |
| if test "x$COMPILE_TYPE" = xcross; then | |
| binutils_target="--host=$OPENJDK_TARGET_AUTOCONF_NAME" | |
| else | |
| binutils_target="" | |
| fi | |
| fi | |
| binutils_cflags="$binutils_cflags $MACHINE_FLAG $JVM_PICFLAG $C_O_FLAG_NORM" | |
| AC_MSG_NOTICE([Running binutils configure]) | |
| AC_MSG_NOTICE([configure command line: cd $BINUTILS_BUILD_DIR && $BINUTILS_SRC/configure --disable-werror --prefix=$BINUTILS_INSTALL_DIR --enable-install-libiberty --with-system-zlib --without-zstd --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target]) | |
| saved_dir=`pwd` | |
| cd "$BINUTILS_BUILD_DIR" | |
| $BINUTILS_SRC/configure --disable-werror --prefix=$BINUTILS_INSTALL_DIR --enable-install-libiberty --with-system-zlib --without-zstd --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target | |
| if test $? -ne 0 || ! test -e $BINUTILS_BUILD_DIR/Makefile; then | |
| AC_MSG_NOTICE([Automatic building of binutils failed on configure. Try building it manually]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| AC_MSG_NOTICE([Running binutils make]) | |
| $MAKE all-opcodes all-libiberty | |
| if test $? -ne 0; then | |
| AC_MSG_NOTICE([Automatic building of binutils failed on make. Try building it manually]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| AC_MSG_NOTICE([Running binutils make install]) | |
| $MAKE install-opcodes install-libiberty | |
| if test $? -ne 0; then | |
| AC_MSG_NOTICE([Automatic building, install step, of binutils failed on make. Try building it manually]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| fi | |
| cd $saved_dir | |
| AC_MSG_NOTICE([Building of binutils done]) | |
| fi | |
| ]) | |
| ################################################################################ | |
| # | |
| # Helper function to setup hsdis using binutils | |
| # | |
| AC_DEFUN([LIB_SETUP_HSDIS_BINUTILS], | |
| [ | |
| AC_ARG_WITH([binutils], [AS_HELP_STRING([--with-binutils], | |
| [where to find the binutils files needed for hsdis/binutils])]) | |
| AC_ARG_WITH([binutils-src], [AS_HELP_STRING([--with-binutils-src], | |
| [where to find the binutils source for building])]) | |
| # We need the binutils static libs and includes. | |
| if test "x$with_binutils_src" != x; then | |
| # Try building the source first. If it succeeds, it sets $BINUTILS_INSTALL_DIR. | |
| LIB_BUILD_BINUTILS | |
| fi | |
| if test "x$with_binutils" != x; then | |
| BINUTILS_INSTALL_DIR="$with_binutils" | |
| fi | |
| binutils_system_error="" | |
| HSDIS_LDFLAGS="" | |
| HSDIS_LIBS="" | |
| disasm_header="<dis-asm.h>" | |
| if test "x$BINUTILS_INSTALL_DIR" = xsystem; then | |
| AC_CHECK_LIB(bfd, bfd_openr, [ HSDIS_LIBS="-lbfd" ], [ binutils_system_error="libbfd not found" ]) | |
| AC_CHECK_LIB(opcodes, disassembler, [ HSDIS_LIBS="$HSDIS_LIBS -lopcodes" ], [ binutils_system_error="libopcodes not found" ]) | |
| AC_CHECK_LIB(z, deflate, [ HSDIS_LIBS="$HSDIS_LIBS -lz" ], [ binutils_system_error="libz not found" ]) | |
| # libiberty is not required on Ubuntu | |
| AC_CHECK_LIB(iberty, xmalloc, [ HSDIS_LIBS="$HSDIS_LIBS -liberty" ]) | |
| AC_CHECK_LIB(sframe, frame, [ HSDIS_LIBS="$HSDIS_LIBS -lsframe" ], ) | |
| HSDIS_CFLAGS="-DLIBARCH_$OPENJDK_TARGET_CPU_LEGACY_LIB" | |
| elif test "x$BINUTILS_INSTALL_DIR" != x; then | |
| disasm_header="\"$BINUTILS_INSTALL_DIR/include/dis-asm.h\"" | |
| if (test -e $BINUTILS_INSTALL_DIR/lib/libbfd.a || \ | |
| test -e $BINUTILS_INSTALL_DIR/lib64/libbfd.a) && \ | |
| (test -e $BINUTILS_INSTALL_DIR/lib/libopcodes.a || \ | |
| test -e $BINUTILS_INSTALL_DIR/lib64/libopcodes.a) && \ | |
| (test -e $BINUTILS_INSTALL_DIR/lib/libiberty.a || \ | |
| test -e $BINUTILS_INSTALL_DIR/lib64/libiberty.a || \ | |
| test -e $BINUTILS_INSTALL_DIR/lib32/libiberty.a); then | |
| HSDIS_CFLAGS="-DLIBARCH_$OPENJDK_TARGET_CPU_LEGACY_LIB -I$BINUTILS_INSTALL_DIR/include" | |
| # libiberty ignores --libdir and may be installed in $BINUTILS_INSTALL_DIR/lib, $BINUTILS_INSTALL_DIR/lib32 | |
| # or $BINUTILS_INSTALL_DIR/lib64, depending on system setup | |
| LIBOPCODES_LIB="" | |
| LIBBFD_LIB="" | |
| LIBIBERTY_LIB="" | |
| if test -e $BINUTILS_INSTALL_DIR/lib/libbfd.a; then | |
| LIBBFD_LIB="$BINUTILS_INSTALL_DIR/lib/libbfd.a" | |
| else | |
| LIBBFD_LIB="$BINUTILS_INSTALL_DIR/lib64/libbfd.a" | |
| fi | |
| if test -e $BINUTILS_INSTALL_DIR/lib/libopcodes.a; then | |
| LIBOPCODES_LIB="$BINUTILS_INSTALL_DIR/lib/libopcodes.a" | |
| else | |
| LIBOPCODES_LIB="$BINUTILS_INSTALL_DIR/lib64/libopcodes.a" | |
| fi | |
| if test -e $BINUTILS_INSTALL_DIR/lib/libiberty.a; then | |
| LIBIBERTY_LIB="$BINUTILS_INSTALL_DIR/lib/libiberty.a" | |
| elif test -e $BINUTILS_INSTALL_DIR/lib32/libiberty.a; then | |
| LIBIBERTY_LIB="$BINUTILS_INSTALL_DIR/lib32/libiberty.a" | |
| else | |
| LIBIBERTY_LIB="$BINUTILS_INSTALL_DIR/lib64/libiberty.a" | |
| fi | |
| HSDIS_LIBS="$LIBBFD_LIB $LIBOPCODES_LIB $LIBIBERTY_LIB" | |
| # If we have libsframe add it. | |
| if test -e $BINUTILS_INSTALL_DIR/lib/libsframe.a; then | |
| HSDIS_LIBS="$HSDIS_LIBS $BINUTILS_INSTALL_DIR/lib/libsframe.a" | |
| fi | |
| AC_CHECK_LIB(z, deflate, [ HSDIS_LIBS="$HSDIS_LIBS -lz" ], AC_MSG_ERROR([libz not found])) | |
| else | |
| AC_MSG_ERROR(["$BINUTILS_INSTALL_DIR/lib[64] must contain libbfd.a, libopcodes.a and libiberty.a"]) | |
| fi | |
| fi | |
| AC_MSG_CHECKING([Checking binutils API]) | |
| AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include $disasm_header],[[init_disassemble_info(0, 0, 0, 0);]])], | |
| [ | |
| AC_MSG_RESULT([New API]) | |
| HSDIS_CFLAGS="$HSDIS_CFLAGS -DBINUTILS_NEW_API" | |
| ], | |
| [ | |
| AC_MSG_RESULT([Old API]) | |
| ] | |
| ) | |
| AC_MSG_CHECKING([for binutils to use with hsdis]) | |
| case "x$BINUTILS_INSTALL_DIR" in | |
| xsystem) | |
| if test "x$OPENJDK_TARGET_OS" != xlinux; then | |
| AC_MSG_RESULT([invalid]) | |
| AC_MSG_ERROR([binutils on system is supported for Linux only]) | |
| elif test "x$binutils_system_error" = x; then | |
| AC_MSG_RESULT([system]) | |
| HSDIS_CFLAGS="$HSDIS_CFLAGS -DSYSTEM_BINUTILS" | |
| else | |
| AC_MSG_RESULT([invalid]) | |
| AC_MSG_ERROR([$binutils_system_error]) | |
| fi | |
| ;; | |
| x) | |
| AC_MSG_RESULT([missing]) | |
| AC_MSG_NOTICE([--with-hsdis=binutils requires specifying a binutils installation.]) | |
| AC_MSG_NOTICE([Download binutils from https://www.gnu.org/software/binutils and unpack it,]) | |
| AC_MSG_NOTICE([and point --with-binutils-src to the resulting directory, or use]) | |
| AC_MSG_NOTICE([--with-binutils to point to a pre-built binutils installation.]) | |
| AC_MSG_ERROR([Cannot continue]) | |
| ;; | |
| *) | |
| if test "x$HSDIS_LIBS" != x; then | |
| AC_MSG_RESULT([$BINUTILS_INSTALL_DIR]) | |
| else | |
| AC_MSG_RESULT([invalid]) | |
| AC_MSG_ERROR([$BINUTILS_INSTALL_DIR does not contain a proper binutils installation]) | |
| fi | |
| ;; | |
| esac | |
| ]) | |
| ################################################################################ | |
| # | |
| # Determine if hsdis should be built, and if so, with which backend. | |
| # | |
| AC_DEFUN_ONCE([LIB_SETUP_HSDIS], | |
| [ | |
| AC_ARG_WITH([hsdis], [AS_HELP_STRING([--with-hsdis], | |
| [what hsdis backend to use ('none', 'capstone', 'llvm', 'binutils') @<:@none@:>@])]) | |
| UTIL_ARG_ENABLE(NAME: hsdis-bundling, DEFAULT: false, | |
| RESULT: ENABLE_HSDIS_BUNDLING, | |
| DESC: [enable bundling of hsdis to allow HotSpot disassembly out-of-the-box]) | |
| AC_MSG_CHECKING([what hsdis backend to use]) | |
| if test "x$with_hsdis" = xyes; then | |
| AC_MSG_ERROR([--with-hsdis must have a value]) | |
| elif test "x$with_hsdis" = xnone || test "x$with_hsdis" = xno || test "x$with_hsdis" = x; then | |
| HSDIS_BACKEND=none | |
| AC_MSG_RESULT(['none', hsdis will not be built]) | |
| elif test "x$with_hsdis" = xcapstone; then | |
| HSDIS_BACKEND=capstone | |
| AC_MSG_RESULT(['capstone']) | |
| LIB_SETUP_HSDIS_CAPSTONE | |
| elif test "x$with_hsdis" = xllvm; then | |
| HSDIS_BACKEND=llvm | |
| AC_MSG_RESULT(['llvm']) | |
| LIB_SETUP_HSDIS_LLVM | |
| elif test "x$with_hsdis" = xbinutils; then | |
| HSDIS_BACKEND=binutils | |
| AC_MSG_RESULT(['binutils']) | |
| LIB_SETUP_HSDIS_BINUTILS | |
| else | |
| AC_MSG_RESULT([invalid]) | |
| AC_MSG_ERROR([Incorrect hsdis backend "$with_hsdis"]) | |
| fi | |
| AC_SUBST(HSDIS_BACKEND) | |
| AC_SUBST(HSDIS_CFLAGS) | |
| AC_SUBST(HSDIS_LDFLAGS) | |
| AC_SUBST(HSDIS_LIBS) | |
| AC_SUBST(CAPSTONE_ARCH_AARCH64_NAME) | |
| AC_MSG_CHECKING([if hsdis should be bundled]) | |
| if test "x$ENABLE_HSDIS_BUNDLING" = "xtrue"; then | |
| if test "x$HSDIS_BACKEND" = xnone; then | |
| AC_MSG_RESULT([no, backend missing]) | |
| AC_MSG_ERROR([hsdis-bundling requires a hsdis backend. Please set --with-hsdis=<backend>]); | |
| fi | |
| AC_MSG_RESULT([yes]) | |
| if test "x$HSDIS_BACKEND" = xbinutils; then | |
| AC_MSG_WARN([The resulting build might not be redistributable. Seek legal advice before distributing.]) | |
| fi | |
| else | |
| AC_MSG_RESULT([no]) | |
| fi | |
| AC_SUBST(ENABLE_HSDIS_BUNDLING) | |
| ]) |