| # |
| # Copyright (c) 2021, 2022, 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" |
| 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 |
| ]) |
| |
| ################################################################################ |
| # |
| # 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_DIR="$CONFIGURESUPPORT_OUTPUTDIR/binutils" |
| |
| 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_DIR; then |
| $MKDIR -p $BINUTILS_DIR |
| fi |
| |
| if test -e $BINUTILS_DIR/bfd/libbfd.a && \ |
| test -e $BINUTILS_DIR/opcodes/libopcodes.a && \ |
| test -e $BINUTILS_DIR/libiberty/libiberty.a && \ |
| test -e $BINUTILS_DIR/zlib/libz.a; then |
| AC_MSG_NOTICE([Found binutils binaries in binutils source 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_DIR && $BINUTILS_SRC/configure --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target]) |
| saved_dir=`pwd` |
| cd "$BINUTILS_DIR" |
| $BINUTILS_SRC/configure --disable-nls CFLAGS="$binutils_cflags" CC="$binutils_cc" AR="$AR" $binutils_target |
| if test $? -ne 0 || ! test -e $BINUTILS_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 |
| 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 |
| 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_DIR. |
| LIB_BUILD_BINUTILS |
| fi |
| |
| if test "x$with_binutils" != x; then |
| BINUTILS_DIR="$with_binutils" |
| fi |
| |
| binutils_system_error="" |
| HSDIS_LIBS="" |
| if test "x$BINUTILS_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(iberty, xmalloc, [ HSDIS_LIBS="$HSDIS_LIBS -liberty" ], [ binutils_system_error="libiberty not found" ]) |
| AC_CHECK_LIB(z, deflate, [ HSDIS_LIBS="$HSDIS_LIBS -lz" ], [ binutils_system_error="libz not found" ]) |
| HSDIS_CFLAGS="-DLIBARCH_$OPENJDK_TARGET_CPU_LEGACY_LIB" |
| elif test "x$BINUTILS_DIR" != x; then |
| if test -e $BINUTILS_DIR/bfd/libbfd.a && \ |
| test -e $BINUTILS_DIR/opcodes/libopcodes.a && \ |
| test -e $BINUTILS_DIR/libiberty/libiberty.a && \ |
| test -e $BINUTILS_DIR/zlib/libz.a; then |
| HSDIS_CFLAGS="-DLIBARCH_$OPENJDK_TARGET_CPU_LEGACY_LIB" |
| if test -n "$BINUTILS_SRC"; then |
| HSDIS_CFLAGS="$HSDIS_CFLAGS -I$BINUTILS_SRC/include -I$BINUTILS_DIR/bfd" |
| else |
| HSDIS_CFLAGS="$HSDIS_CFLAGS -I$BINUTILS_DIR/include -I$BINUTILS_DIR/bfd" |
| fi |
| HSDIS_LDFLAGS="" |
| HSDIS_LIBS="$BINUTILS_DIR/bfd/libbfd.a $BINUTILS_DIR/opcodes/libopcodes.a $BINUTILS_DIR/libiberty/libiberty.a $BINUTILS_DIR/zlib/libz.a" |
| fi |
| fi |
| |
| AC_MSG_CHECKING([for binutils to use with hsdis]) |
| case "x$BINUTILS_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_DIR]) |
| else |
| AC_MSG_RESULT([invalid]) |
| AC_MSG_ERROR([$BINUTILS_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_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) |
| ]) |