# HG changeset patch # User duke # Date 1499276800 -7200 # Node ID 89731ae72a761afdf4262e8b9513f302f6563f89 # Parent d51dc26476ec2edf0c9b71a83a91c203aad195b1# Parent 53fd25d388dac232f26a34c8319b0e476c422f8c Merge diff -r 53fd25d388da -r 89731ae72a76 .hgtags-top-repo --- a/.hgtags-top-repo Wed Jul 05 19:45:37 2017 +0200 +++ b/.hgtags-top-repo Wed Jul 05 19:46:40 2017 +0200 @@ -261,3 +261,4 @@ cf22a728521f91a4692b433d39d730a0a1b23155 jdk9-b16 24152ee0ee1abef54a8bab04c099261dba7bcca5 jdk9-b17 65abab59f783fcf02ff8e133431c252f9e5f07d5 jdk9-b18 +75a08df650eb3126bab0c4d15241f5886162393c jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 common/autoconf/flags.m4 --- a/common/autoconf/flags.m4 Wed Jul 05 19:45:37 2017 +0200 +++ b/common/autoconf/flags.m4 Wed Jul 05 19:46:40 2017 +0200 @@ -116,15 +116,15 @@ AC_SUBST(RC_FLAGS) if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - # FIXME: likely bug, should be CCXXFLAGS_JDK? or one for C or CXX. - CCXXFLAGS="$CCXXFLAGS -nologo" + # silence copyright notice and other headers. + COMMON_CCXXFLAGS="$COMMON_CCXXFLAGS -nologo" fi if test "x$SYSROOT" != "x"; then if test "x$TOOLCHAIN_TYPE" = xsolstudio; then if test "x$OPENJDK_TARGET_OS" = xsolaris; then # Solaris Studio does not have a concept of sysroot. Instead we must - # make sure the default include and lib dirs are appended to each + # make sure the default include and lib dirs are appended to each # compile and link command line. SYSROOT_CFLAGS="-I$SYSROOT/usr/include" SYSROOT_LDFLAGS="-L$SYSROOT/usr/lib$OPENJDK_TARGET_CPU_ISADIR \ @@ -302,6 +302,7 @@ # Debug symbols if test "x$TOOLCHAIN_TYPE" = xgcc; then if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then + # reduce from default "-g2" option to save space CFLAGS_DEBUG_SYMBOLS="-g1" CXXFLAGS_DEBUG_SYMBOLS="-g1" else @@ -313,6 +314,7 @@ CXXFLAGS_DEBUG_SYMBOLS="-g" elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then CFLAGS_DEBUG_SYMBOLS="-g -xs" + # FIXME: likely a bug, this disables debug symbols rather than enables them CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs" elif test "x$TOOLCHAIN_TYPE" = xxlc; then CFLAGS_DEBUG_SYMBOLS="-g" @@ -321,6 +323,31 @@ AC_SUBST(CFLAGS_DEBUG_SYMBOLS) AC_SUBST(CXXFLAGS_DEBUG_SYMBOLS) + # bounds, memory and behavior checking options + if test "x$TOOLCHAIN_TYPE" = xgcc; then + case $DEBUG_LEVEL in + release ) + # no adjustment + ;; + fastdebug ) + # Add compile time bounds checks. + CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1" + CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1" + ;; + slowdebug ) + # Add runtime bounds checks and symbol info. + CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1" + CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1" + if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then + CFLAGS_DEBUG_OPTIONS="$CFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG" + CXXFLAGS_DEBUG_OPTIONS="$CXXFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG" + fi + ;; + esac + fi + AC_SUBST(CFLAGS_DEBUG_OPTIONS) + AC_SUBST(CXXFLAGS_DEBUG_OPTIONS) + # Optimization levels if test "x$TOOLCHAIN_TYPE" = xsolstudio; then CC_HIGHEST="$CC_HIGHEST -fns -fsimple -fsingle -xbuiltin=%all -xdepend -xrestrict -xlibmil" @@ -330,10 +357,12 @@ C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xalias_level=basic -xregs=no%frameptr" C_O_FLAG_HI="-xO4 -Wu,-O4~yz -xregs=no%frameptr" C_O_FLAG_NORM="-xO2 -Wu,-O2~yz -xregs=no%frameptr" + C_O_FLAG_DEBUG="-xregs=no%frameptr" C_O_FLAG_NONE="-xregs=no%frameptr" CXX_O_FLAG_HIGHEST="-xO4 -Qoption ube -O4~yz $CC_HIGHEST -xregs=no%frameptr" CXX_O_FLAG_HI="-xO4 -Qoption ube -O4~yz -xregs=no%frameptr" CXX_O_FLAG_NORM="-xO2 -Qoption ube -O2~yz -xregs=no%frameptr" + CXX_O_FLAG_DEBUG="-xregs=no%frameptr" CXX_O_FLAG_NONE="-xregs=no%frameptr" if test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then C_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST -xchip=pentium" @@ -343,10 +372,12 @@ C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xalias_level=basic -xprefetch=auto,explicit -xchip=ultra" C_O_FLAG_HI="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0" C_O_FLAG_NORM="-xO2 -Wc,-Qrm-s -Wc,-Qiselect-T0" + C_O_FLAG_DEBUG="" C_O_FLAG_NONE="" CXX_O_FLAG_HIGHEST="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra" CXX_O_FLAG_HI="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0" CXX_O_FLAG_NORM="-xO2 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0" + C_O_FLAG_DEBUG="" CXX_O_FLAG_NONE="" fi else @@ -359,13 +390,17 @@ C_O_FLAG_HIGHEST="-Os" C_O_FLAG_HI="-Os" C_O_FLAG_NORM="-Os" - C_O_FLAG_NONE="" else C_O_FLAG_HIGHEST="-O3" C_O_FLAG_HI="-O3" C_O_FLAG_NORM="-O2" - C_O_FLAG_NONE="-O0" fi + if test "x$HAS_CFLAG_OPTIMIZE_DEBUG" = "xtrue"; then + C_O_FLAG_DEBUG="$CFLAG_OPTIMIZE_DEBUG_FLAG" + else + C_O_FLAG_DEBUG="-O0" + fi + C_O_FLAG_NONE="-O0" elif test "x$TOOLCHAIN_TYPE" = xclang; then if test "x$OPENJDK_TARGET_OS" = xmacosx; then # On MacOSX we optimize for size, something @@ -373,37 +408,63 @@ C_O_FLAG_HIGHEST="-Os" C_O_FLAG_HI="-Os" C_O_FLAG_NORM="-Os" - C_O_FLAG_NONE="" else C_O_FLAG_HIGHEST="-O3" C_O_FLAG_HI="-O3" C_O_FLAG_NORM="-O2" - C_O_FLAG_NONE="-O0" fi + C_O_FLAG_DEBUG="-O0" + C_O_FLAG_NONE="-O0" elif test "x$TOOLCHAIN_TYPE" = xxlc; then C_O_FLAG_HIGHEST="-O3" C_O_FLAG_HI="-O3 -qstrict" C_O_FLAG_NORM="-O2" - C_O_FLAG_NONE="" + C_O_FLAG_DEBUG="-qnoopt" + C_O_FLAG_NONE="-qnoop" elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then C_O_FLAG_HIGHEST="-O2" C_O_FLAG_HI="-O1" C_O_FLAG_NORM="-O1" + C_O_FLAG_DEBUG="-Od" C_O_FLAG_NONE="-Od" fi CXX_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST" CXX_O_FLAG_HI="$C_O_FLAG_HI" CXX_O_FLAG_NORM="$C_O_FLAG_NORM" + CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG" CXX_O_FLAG_NONE="$C_O_FLAG_NONE" fi + # Adjust optimization flags according to debug level. + case $DEBUG_LEVEL in + release ) + # no adjustment + ;; + fastdebug ) + # Not quite so much optimization + C_O_FLAG_HI="$C_O_FLAG_NORM" + CXX_O_FLAG_HI="$CXX_O_FLAG_NORM" + ;; + slowdebug ) + # Disable optimization + C_O_FLAG_HIGHEST="$C_O_FLAG_DEBUG" + C_O_FLAG_HI="$C_O_FLAG_DEBUG" + C_O_FLAG_NORM="$C_O_FLAG_DEBUG" + CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_DEBUG" + CXX_O_FLAG_HI="$CXX_O_FLAG_DEBUG" + CXX_O_FLAG_NORM="$CXX_O_FLAG_DEBUG" + ;; + esac + AC_SUBST(C_O_FLAG_HIGHEST) AC_SUBST(C_O_FLAG_HI) AC_SUBST(C_O_FLAG_NORM) + AC_SUBST(C_O_FLAG_DEBUG) AC_SUBST(C_O_FLAG_NONE) AC_SUBST(CXX_O_FLAG_HIGHEST) AC_SUBST(CXX_O_FLAG_HI) AC_SUBST(CXX_O_FLAG_NORM) + AC_SUBST(CXX_O_FLAG_DEBUG) AC_SUBST(CXX_O_FLAG_NONE) ]) @@ -461,11 +522,12 @@ # Later we will also have CFLAGS and LDFLAGS for the hotspot subrepo build. # - # Setup compiler/platform specific flags to CFLAGS_JDK, - # CXXFLAGS_JDK and CCXXFLAGS_JDK (common to C and CXX?) + # Setup compiler/platform specific flags into + # CFLAGS_JDK - C Compiler flags + # CXXFLAGS_JDK - C++ Compiler flags + # COMMON_CCXXFLAGS_JDK - common to C and C++ if test "x$TOOLCHAIN_TYPE" = xgcc; then - # these options are used for both C and C++ compiles - CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \ + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \ -pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE" case $OPENJDK_TARGET_CPU_ARCH in arm ) @@ -477,31 +539,31 @@ CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing" ;; * ) - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -fno-omit-frame-pointer" CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing" ;; esac elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then - CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" if test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE" fi - + CFLAGS_JDK="$CFLAGS_JDK -xc99=%none -xCC -errshort=tags -Xa -v -mt -W0,-noglobal" CXXFLAGS_JDK="$CXXFLAGS_JDK -errtags=yes +w -mt -features=no%except -DCC_NOEX -norunpath -xnolib" elif test "x$TOOLCHAIN_TYPE" = xxlc; then CFLAGS_JDK="$CFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC" CXXFLAGS_JDK="$CXXFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC" elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \ + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \ -D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \ -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE \ -DWIN32 -DIAL" if test "x$OPENJDK_TARGET_CPU" = xx86_64; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_AMD64_ -Damd64" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_AMD64_ -Damd64" else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_X86_ -Dx86" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_X86_ -Dx86" fi fi @@ -509,28 +571,20 @@ # Adjust flags according to debug level. case $DEBUG_LEVEL in - fastdebug ) - CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS" - CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS" - C_O_FLAG_HI="$C_O_FLAG_NORM" - C_O_FLAG_NORM="$C_O_FLAG_NORM" - CXX_O_FLAG_HI="$CXX_O_FLAG_NORM" - CXX_O_FLAG_NORM="$CXX_O_FLAG_NORM" + fastdebug | slowdebug ) + CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS $CFLAGS_DEBUG_OPTIONS" + CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS $CXXFLAGS_DEBUG_OPTIONS" JAVAC_FLAGS="$JAVAC_FLAGS -g" ;; - slowdebug ) - CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS" - CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS" - C_O_FLAG_HI="$C_O_FLAG_NONE" - C_O_FLAG_NORM="$C_O_FLAG_NONE" - CXX_O_FLAG_HI="$CXX_O_FLAG_NONE" - CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE" - JAVAC_FLAGS="$JAVAC_FLAGS -g" + release ) + ;; + * ) + AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL]) ;; esac # Setup LP64 - CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK $ADD_LP64" # Set some common defines. These works for all compilers, but assume # -D is universally accepted. @@ -543,49 +597,49 @@ # Note: -Dmacro is the same as #define macro 1 # -Dmacro= is the same as #define macro if test "x$OPENJDK_TARGET_OS" = xsolaris; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN=" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN=" else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN" fi else # Same goes for _BIG_ENDIAN. Do we really need to set *ENDIAN on Solaris if they # are defined in the system? if test "x$OPENJDK_TARGET_OS" = xsolaris; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN=" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN=" else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN" fi fi - + # Setup target OS define. Use OS target name but in upper case. OPENJDK_TARGET_OS_UPPERCASE=`$ECHO $OPENJDK_TARGET_OS | $TR 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE" # Setup target CPU - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY" - + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY" + # Setup debug/release defines if test "x$DEBUG_LEVEL" = xrelease; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DNDEBUG" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DNDEBUG" if test "x$OPENJDK_TARGET_OS" = xsolaris; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DTRIMMED" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DTRIMMED" fi else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DDEBUG" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DDEBUG" fi # Setup release name - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'" # Set some additional per-OS defines. if test "x$OPENJDK_TARGET_OS" = xmacosx; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT" elif test "x$OPENJDK_TARGET_OS" = xaix; then # FIXME: PPC64 should not be here. - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DPPC64" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DPPC64" elif test "x$OPENJDK_TARGET_OS" = xbsd; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE" fi # Additional macosx handling @@ -595,22 +649,22 @@ # FIXME: clean this up, and/or move it elsewhere. # Setting these parameters makes it an error to link to macosx APIs that are - # newer than the given OS version and makes the linked binaries compatible + # newer than the given OS version and makes the linked binaries compatible # even if built on a newer version of the OS. # The expected format is X.Y.Z MACOSX_VERSION_MIN=10.7.0 AC_SUBST(MACOSX_VERSION_MIN) - + # The macro takes the version with no dots, ex: 1070 # Let the flags variables get resolved in make for easier override on make # command line. - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)" LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)" fi fi # Setup some hard coded includes - CCXXFLAGS_JDK="$CCXXFLAGS_JDK \ + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \ -I${JDK_OUTPUTDIR}/include \ -I${JDK_OUTPUTDIR}/include/$OPENJDK_TARGET_OS \ -I${JDK_TOPDIR}/src/share/javavm/export \ @@ -619,12 +673,12 @@ -I${JDK_TOPDIR}/src/$OPENJDK_TARGET_OS_API_DIR/native/common" # The shared libraries are compiled using the picflag. - CFLAGS_JDKLIB="$CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA" - CXXFLAGS_JDKLIB="$CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA " + CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA" + CXXFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA " # Executable flags - CFLAGS_JDKEXE="$CCXXFLAGS_JDK $CFLAGS_JDK" - CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK" + CFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK" + CXXFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK" AC_SUBST(CFLAGS_JDKLIB) AC_SUBST(CFLAGS_JDKEXE) @@ -633,6 +687,7 @@ # Setup LDFLAGS et al. # + # Now this is odd. The JDK native libraries have to link against libjvm.so # On 32-bit machines there is normally two distinct libjvm.so:s, client and server. # Which should we link to? Are we lucky enough that the binary api to the libjvm.so library @@ -648,39 +703,93 @@ fi # TODO: make -debug optional "--disable-full-debug-symbols" LDFLAGS_JDK="$LDFLAGS_JDK -debug" - LDFLAGS_JDKLIB="${LDFLAGS_JDK} -dll -libpath:${JDK_OUTPUTDIR}/lib" - LDFLAGS_JDKLIB_SUFFIX="" + elif test "x$TOOLCHAIN_TYPE" = xgcc; then + # If this is a --hash-style=gnu system, use --hash-style=both, why? + # We have previously set HAS_GNU_HASH if this is the case + if test -n "$HAS_GNU_HASH"; then + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both" + fi + if test "x$OPENJDK_TARGET_OS" = xlinux; then + # And since we now know that the linker is gnu, then add -z defs, to forbid + # undefined symbols in object files. + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" + case $DEBUG_LEVEL in + release ) + # tell linker to optimize libraries. + # Should this be supplied to the OSS linker as well? + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + ;; + slowdebug ) + if test "x$HAS_LINKER_NOW" = "xtrue"; then + # do relocations at load + LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_NOW_FLAG" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_NOW_FLAG" + fi + if test "x$HAS_LINKER_RELRO" = "xtrue"; then + # mark relocations read only + LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG" + fi + ;; + fastdebug ) + if test "x$HAS_LINKER_RELRO" = "xtrue"; then + # mark relocations read only + LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG" + fi + ;; + * ) + AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL]) + ;; + esac + fi + elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then + LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib" + fi + + if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then + # If undefined behaviour detection is enabled then we need to tell linker. + case $DEBUG_LEVEL in + release | fastdebug ) + ;; + slowdebug ) + AC_MSG_WARN([$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR]) + if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then + # enable undefined behaviour checking + LDFLAGS_JDK="$LDFLAGS_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`" + fi + ;; + * ) + AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL]) + ;; + esac + fi + + # Customize LDFLAGS for executables + + LDFLAGS_JDKEXE="${LDFLAGS_JDK}" + + if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then LDFLAGS_STACK_SIZE=1048576 else LDFLAGS_STACK_SIZE=327680 fi - LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE" + LDFLAGS_JDKEXE="${LDFLAGS_JDKEXE} /STACK:$LDFLAGS_STACK_SIZE" + elif test "x$OPENJDK_TARGET_OS" = xlinux; then + LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined" + fi + + # Customize LDFLAGS for libs + LDFLAGS_JDKLIB="${LDFLAGS_JDK}" + + if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then + LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${JDK_OUTPUTDIR}/lib" + LDFLAGS_JDKLIB_SUFFIX="" else - if test "x$TOOLCHAIN_TYPE" = xgcc; then - # If this is a --hash-style=gnu system, use --hash-style=both, why? - # We have previously set HAS_GNU_HASH if this is the case - if test -n "$HAS_GNU_HASH"; then - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both " - fi - if test "x$OPENJDK_TARGET_OS" = xlinux; then - # And since we now know that the linker is gnu, then add -z defs, to forbid - # undefined symbols in object files. - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" - if test "x$DEBUG_LEVEL" = "xrelease"; then - # When building release libraries, tell the linker optimize them. - # Should this be supplied to the OSS linker as well? - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" - fi - fi - fi - - if test "x$TOOLCHAIN_TYPE" = xsolstudio; then - LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext" - LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib" - fi - - LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \ + LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}" # On some platforms (mac) the linker warns about non existing -L dirs. @@ -701,12 +810,8 @@ if test "x$TOOLCHAIN_TYPE" = xsolstudio; then LDFLAGS_JDKLIB_SUFFIX="$LDFLAGS_JDKLIB_SUFFIX -lc" fi + fi - LDFLAGS_JDKEXE="${LDFLAGS_JDK}" - if test "x$OPENJDK_TARGET_OS" = xlinux; then - LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined" - fi - fi AC_SUBST(LDFLAGS_JDKLIB) AC_SUBST(LDFLAGS_JDKEXE) AC_SUBST(LDFLAGS_JDKLIB_SUFFIX) @@ -714,7 +819,6 @@ AC_SUBST(LDFLAGS_CXX_JDK) ]) - # FLAGS_COMPILER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE], # [RUN-IF-FALSE]) # ------------------------------------------------------------ @@ -727,7 +831,7 @@ saved_cflags="$CFLAGS" CFLAGS="$CFLAGS $1" AC_LANG_PUSH([C]) - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [], + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [], [supports=no]) AC_LANG_POP([C]) CFLAGS="$saved_cflags" @@ -735,7 +839,7 @@ saved_cxxflags="$CXXFLAGS" CXXFLAGS="$CXXFLAG $1" AC_LANG_PUSH([C++]) - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [], + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i;]])], [], [supports=no]) AC_LANG_POP([C++]) CXXFLAGS="$saved_cxxflags" @@ -748,6 +852,31 @@ fi ]) +# FLAGS_LINKER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE], +# [RUN-IF-FALSE]) +# ------------------------------------------------------------ +# Check that the linker support an argument +AC_DEFUN([FLAGS_LINKER_CHECK_ARGUMENTS], +[ + AC_MSG_CHECKING([if linker supports "$1"]) + supports=yes + + saved_ldflags="$LDFLAGS" + LDFLAGS="$LDFLAGS $1" + AC_LANG_PUSH([C]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])], + [], [supports=no]) + AC_LANG_POP([C]) + LDFLAGS="$saved_ldflags" + + AC_MSG_RESULT([$supports]) + if test "x$supports" = "xyes" ; then + m4_ifval([$2], [$2], [:]) + else + m4_ifval([$3], [$3], [:]) + fi +]) + AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_MISC], [ # Some Zero and Shark settings. diff -r 53fd25d388da -r 89731ae72a76 common/autoconf/generated-configure.sh --- a/common/autoconf/generated-configure.sh Wed Jul 05 19:45:37 2017 +0200 +++ b/common/autoconf/generated-configure.sh Wed Jul 05 19:46:40 2017 +0200 @@ -692,13 +692,17 @@ LEGACY_EXTRA_CXXFLAGS LEGACY_EXTRA_CFLAGS CXX_O_FLAG_NONE +CXX_O_FLAG_DEBUG CXX_O_FLAG_NORM CXX_O_FLAG_HI CXX_O_FLAG_HIGHEST C_O_FLAG_NONE +C_O_FLAG_DEBUG C_O_FLAG_NORM C_O_FLAG_HI C_O_FLAG_HIGHEST +CXXFLAGS_DEBUG_OPTIONS +CFLAGS_DEBUG_OPTIONS CXXFLAGS_DEBUG_SYMBOLS CFLAGS_DEBUG_SYMBOLS CXX_FLAG_DEPS @@ -2346,6 +2350,52 @@ } # ac_fn_objc_try_compile +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using @@ -3761,13 +3811,18 @@ - # FLAGS_COMPILER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE], # [RUN-IF-FALSE]) # ------------------------------------------------------------ # Check that the c and c++ compilers support an argument +# FLAGS_LINKER_CHECK_ARGUMENTS([ARGUMENT], [RUN-IF-TRUE], +# [RUN-IF-FALSE]) +# ------------------------------------------------------------ +# Check that the linker support an argument + + # @@ -4253,7 +4308,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1399969244 +DATE_WHEN_GENERATED=1402614845 ############################################################################### # @@ -40264,6 +40319,8 @@ + + # The package path is used only on macosx? # FIXME: clean this up, and/or move it elsewhere. PACKAGE_PATH=/opt/local @@ -40289,6 +40346,242 @@ # If this is a --hash-style=gnu system, use --hash-style=both, why? HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` # This is later checked when setting flags. + + # "-Og" suppported for GCC 4.8 and later + CFLAG_OPTIMIZE_DEBUG_FLAG="-Og" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"$CFLAG_OPTIMIZE_DEBUG_FLAG\"" >&5 +$as_echo_n "checking if compiler supports \"$CFLAG_OPTIMIZE_DEBUG_FLAG\"... " >&6; } + supports=yes + + saved_cflags="$CFLAGS" + CFLAGS="$CFLAGS $CFLAG_OPTIMIZE_DEBUG_FLAG" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + supports=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + CFLAGS="$saved_cflags" + + saved_cxxflags="$CXXFLAGS" + CXXFLAGS="$CXXFLAG $CFLAG_OPTIMIZE_DEBUG_FLAG" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + supports=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + CXXFLAGS="$saved_cxxflags" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5 +$as_echo "$supports" >&6; } + if test "x$supports" = "xyes" ; then + HAS_CFLAG_OPTIMIZE_DEBUG=true + else + HAS_CFLAG_OPTIMIZE_DEBUG=false + fi + + + # "-fsanitize=undefined" supported for GCC 4.9 and later + CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG="-fsanitize=undefined -fsanitize-recover" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG\"" >&5 +$as_echo_n "checking if compiler supports \"$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG\"... " >&6; } + supports=yes + + saved_cflags="$CFLAGS" + CFLAGS="$CFLAGS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + supports=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + CFLAGS="$saved_cflags" + + saved_cxxflags="$CXXFLAGS" + CXXFLAGS="$CXXFLAG $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + supports=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + CXXFLAGS="$saved_cxxflags" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5 +$as_echo "$supports" >&6; } + if test "x$supports" = "xyes" ; then + HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=true + else + HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=false + fi + + + # "-z relro" supported in GNU binutils 2.17 and later + LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if linker supports \"$LINKER_RELRO_FLAG\"" >&5 +$as_echo_n "checking if linker supports \"$LINKER_RELRO_FLAG\"... " >&6; } + supports=yes + + saved_ldflags="$LDFLAGS" + LDFLAGS="$LDFLAGS $LINKER_RELRO_FLAG" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + supports=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + LDFLAGS="$saved_ldflags" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5 +$as_echo "$supports" >&6; } + if test "x$supports" = "xyes" ; then + HAS_LINKER_RELRO=true + else + HAS_LINKER_RELRO=false + fi + + + # "-z now" supported in GNU binutils 2.11 and later + LINKER_NOW_FLAG="-Xlinker -z -Xlinker now" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if linker supports \"$LINKER_NOW_FLAG\"" >&5 +$as_echo_n "checking if linker supports \"$LINKER_NOW_FLAG\"... " >&6; } + supports=yes + + saved_ldflags="$LDFLAGS" + LDFLAGS="$LDFLAGS $LINKER_NOW_FLAG" + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + supports=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + LDFLAGS="$saved_ldflags" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supports" >&5 +$as_echo "$supports" >&6; } + if test "x$supports" = "xyes" ; then + HAS_LINKER_NOW=true + else + HAS_LINKER_NOW=false + fi + fi # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed @@ -40297,8 +40590,8 @@ if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$TOOLCHAIN_TYPE" = xgcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken SuSE 'ld' which only understands anonymous version tags in executables" >&5 $as_echo_n "checking for broken SuSE 'ld' which only understands anonymous version tags in executables... " >&6; } - echo "SUNWprivate_1.1 { local: *; };" > version-script.map - echo "int main() { }" > main.c + $ECHO "SUNWprivate_1.1 { local: *; };" > version-script.map + $ECHO "int main() { }" > main.c if $CXX -Xlinker -version-script=version-script.map main.c 2>&5 >&5; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -40768,8 +41061,8 @@ if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - # FIXME: likely bug, should be CCXXFLAGS_JDK? or one for C or CXX. - CCXXFLAGS="$CCXXFLAGS -nologo" + # silence copyright notice and other headers. + COMMON_CCXXFLAGS="$COMMON_CCXXFLAGS -nologo" fi if test "x$SYSROOT" != "x"; then @@ -40803,7 +41096,6 @@ # Now we can test some aspects on the target using configure macros. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : @@ -41488,6 +41780,7 @@ # Debug symbols if test "x$TOOLCHAIN_TYPE" = xgcc; then if test "x$OPENJDK_TARGET_CPU_BITS" = "x64" && test "x$DEBUG_LEVEL" = "xfastdebug"; then + # reduce from default "-g2" option to save space CFLAGS_DEBUG_SYMBOLS="-g1" CXXFLAGS_DEBUG_SYMBOLS="-g1" else @@ -41499,6 +41792,7 @@ CXXFLAGS_DEBUG_SYMBOLS="-g" elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then CFLAGS_DEBUG_SYMBOLS="-g -xs" + # FIXME: likely a bug, this disables debug symbols rather than enables them CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs" elif test "x$TOOLCHAIN_TYPE" = xxlc; then CFLAGS_DEBUG_SYMBOLS="-g" @@ -41507,6 +41801,31 @@ + # bounds, memory and behavior checking options + if test "x$TOOLCHAIN_TYPE" = xgcc; then + case $DEBUG_LEVEL in + release ) + # no adjustment + ;; + fastdebug ) + # Add compile time bounds checks. + CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1" + CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1" + ;; + slowdebug ) + # Add runtime bounds checks and symbol info. + CFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1" + CXXFLAGS_DEBUG_OPTIONS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1" + if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then + CFLAGS_DEBUG_OPTIONS="$CFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG" + CXXFLAGS_DEBUG_OPTIONS="$CXXFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG" + fi + ;; + esac + fi + + + # Optimization levels if test "x$TOOLCHAIN_TYPE" = xsolstudio; then CC_HIGHEST="$CC_HIGHEST -fns -fsimple -fsingle -xbuiltin=%all -xdepend -xrestrict -xlibmil" @@ -41516,10 +41835,12 @@ C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xalias_level=basic -xregs=no%frameptr" C_O_FLAG_HI="-xO4 -Wu,-O4~yz -xregs=no%frameptr" C_O_FLAG_NORM="-xO2 -Wu,-O2~yz -xregs=no%frameptr" + C_O_FLAG_DEBUG="-xregs=no%frameptr" C_O_FLAG_NONE="-xregs=no%frameptr" CXX_O_FLAG_HIGHEST="-xO4 -Qoption ube -O4~yz $CC_HIGHEST -xregs=no%frameptr" CXX_O_FLAG_HI="-xO4 -Qoption ube -O4~yz -xregs=no%frameptr" CXX_O_FLAG_NORM="-xO2 -Qoption ube -O2~yz -xregs=no%frameptr" + CXX_O_FLAG_DEBUG="-xregs=no%frameptr" CXX_O_FLAG_NONE="-xregs=no%frameptr" if test "x$OPENJDK_TARGET_CPU_BITS" = "x32"; then C_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST -xchip=pentium" @@ -41529,10 +41850,12 @@ C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xalias_level=basic -xprefetch=auto,explicit -xchip=ultra" C_O_FLAG_HI="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0" C_O_FLAG_NORM="-xO2 -Wc,-Qrm-s -Wc,-Qiselect-T0" + C_O_FLAG_DEBUG="" C_O_FLAG_NONE="" CXX_O_FLAG_HIGHEST="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra" CXX_O_FLAG_HI="-xO4 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0" CXX_O_FLAG_NORM="-xO2 -Qoption cg -Qrm-s -Qoption cg -Qiselect-T0" + C_O_FLAG_DEBUG="" CXX_O_FLAG_NONE="" fi else @@ -41545,13 +41868,17 @@ C_O_FLAG_HIGHEST="-Os" C_O_FLAG_HI="-Os" C_O_FLAG_NORM="-Os" - C_O_FLAG_NONE="" else C_O_FLAG_HIGHEST="-O3" C_O_FLAG_HI="-O3" C_O_FLAG_NORM="-O2" - C_O_FLAG_NONE="-O0" - fi + fi + if test "x$HAS_CFLAG_OPTIMIZE_DEBUG" = "xtrue"; then + C_O_FLAG_DEBUG="$CFLAG_OPTIMIZE_DEBUG_FLAG" + else + C_O_FLAG_DEBUG="-O0" + fi + C_O_FLAG_NONE="-O0" elif test "x$TOOLCHAIN_TYPE" = xclang; then if test "x$OPENJDK_TARGET_OS" = xmacosx; then # On MacOSX we optimize for size, something @@ -41559,30 +41886,56 @@ C_O_FLAG_HIGHEST="-Os" C_O_FLAG_HI="-Os" C_O_FLAG_NORM="-Os" - C_O_FLAG_NONE="" else C_O_FLAG_HIGHEST="-O3" C_O_FLAG_HI="-O3" C_O_FLAG_NORM="-O2" - C_O_FLAG_NONE="-O0" - fi + fi + C_O_FLAG_DEBUG="-O0" + C_O_FLAG_NONE="-O0" elif test "x$TOOLCHAIN_TYPE" = xxlc; then C_O_FLAG_HIGHEST="-O3" C_O_FLAG_HI="-O3 -qstrict" C_O_FLAG_NORM="-O2" - C_O_FLAG_NONE="" + C_O_FLAG_DEBUG="-qnoopt" + C_O_FLAG_NONE="-qnoop" elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then C_O_FLAG_HIGHEST="-O2" C_O_FLAG_HI="-O1" C_O_FLAG_NORM="-O1" + C_O_FLAG_DEBUG="-Od" C_O_FLAG_NONE="-Od" fi CXX_O_FLAG_HIGHEST="$C_O_FLAG_HIGHEST" CXX_O_FLAG_HI="$C_O_FLAG_HI" CXX_O_FLAG_NORM="$C_O_FLAG_NORM" + CXX_O_FLAG_DEBUG="$C_O_FLAG_DEBUG" CXX_O_FLAG_NONE="$C_O_FLAG_NONE" fi + # Adjust optimization flags according to debug level. + case $DEBUG_LEVEL in + release ) + # no adjustment + ;; + fastdebug ) + # Not quite so much optimization + C_O_FLAG_HI="$C_O_FLAG_NORM" + CXX_O_FLAG_HI="$CXX_O_FLAG_NORM" + ;; + slowdebug ) + # Disable optimization + C_O_FLAG_HIGHEST="$C_O_FLAG_DEBUG" + C_O_FLAG_HI="$C_O_FLAG_DEBUG" + C_O_FLAG_NORM="$C_O_FLAG_DEBUG" + CXX_O_FLAG_HIGHEST="$CXX_O_FLAG_DEBUG" + CXX_O_FLAG_HI="$CXX_O_FLAG_DEBUG" + CXX_O_FLAG_NORM="$CXX_O_FLAG_DEBUG" + ;; + esac + + + @@ -41660,11 +42013,12 @@ # Later we will also have CFLAGS and LDFLAGS for the hotspot subrepo build. # - # Setup compiler/platform specific flags to CFLAGS_JDK, - # CXXFLAGS_JDK and CCXXFLAGS_JDK (common to C and CXX?) + # Setup compiler/platform specific flags into + # CFLAGS_JDK - C Compiler flags + # CXXFLAGS_JDK - C++ Compiler flags + # COMMON_CCXXFLAGS_JDK - common to C and C++ if test "x$TOOLCHAIN_TYPE" = xgcc; then - # these options are used for both C and C++ compiles - CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \ + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wno-parentheses -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \ -pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE" case $OPENJDK_TARGET_CPU_ARCH in arm ) @@ -41676,14 +42030,14 @@ CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing" ;; * ) - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -fno-omit-frame-pointer" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -fno-omit-frame-pointer" CFLAGS_JDK="${CFLAGS_JDK} -fno-strict-aliasing" ;; esac elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then - CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" if test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE" fi @@ -41693,14 +42047,14 @@ CFLAGS_JDK="$CFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC" CXXFLAGS_JDK="$CXXFLAGS_JDK -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE -DSTDC" elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \ + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \ -D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \ -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE \ -DWIN32 -DIAL" if test "x$OPENJDK_TARGET_CPU" = xx86_64; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_AMD64_ -Damd64" - else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_X86_ -Dx86" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_AMD64_ -Damd64" + else + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_X86_ -Dx86" fi fi @@ -41708,28 +42062,20 @@ # Adjust flags according to debug level. case $DEBUG_LEVEL in - fastdebug ) - CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS" - CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS" - C_O_FLAG_HI="$C_O_FLAG_NORM" - C_O_FLAG_NORM="$C_O_FLAG_NORM" - CXX_O_FLAG_HI="$CXX_O_FLAG_NORM" - CXX_O_FLAG_NORM="$CXX_O_FLAG_NORM" + fastdebug | slowdebug ) + CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS $CFLAGS_DEBUG_OPTIONS" + CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS $CXXFLAGS_DEBUG_OPTIONS" JAVAC_FLAGS="$JAVAC_FLAGS -g" ;; - slowdebug ) - CFLAGS_JDK="$CFLAGS_JDK $CFLAGS_DEBUG_SYMBOLS" - CXXFLAGS_JDK="$CXXFLAGS_JDK $CXXFLAGS_DEBUG_SYMBOLS" - C_O_FLAG_HI="$C_O_FLAG_NONE" - C_O_FLAG_NORM="$C_O_FLAG_NONE" - CXX_O_FLAG_HI="$CXX_O_FLAG_NONE" - CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE" - JAVAC_FLAGS="$JAVAC_FLAGS -g" + release ) + ;; + * ) + as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5 ;; esac # Setup LP64 - CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK $ADD_LP64" # Set some common defines. These works for all compilers, but assume # -D is universally accepted. @@ -41742,49 +42088,49 @@ # Note: -Dmacro is the same as #define macro 1 # -Dmacro= is the same as #define macro if test "x$OPENJDK_TARGET_OS" = xsolaris; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN=" - else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_LITTLE_ENDIAN" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN=" + else + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_LITTLE_ENDIAN" fi else # Same goes for _BIG_ENDIAN. Do we really need to set *ENDIAN on Solaris if they # are defined in the system? if test "x$OPENJDK_TARGET_OS" = xsolaris; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN=" - else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN=" + else + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_BIG_ENDIAN" fi fi # Setup target OS define. Use OS target name but in upper case. OPENJDK_TARGET_OS_UPPERCASE=`$ECHO $OPENJDK_TARGET_OS | $TR 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D$OPENJDK_TARGET_OS_UPPERCASE" # Setup target CPU - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DARCH='\"$OPENJDK_TARGET_CPU_LEGACY\"' -D$OPENJDK_TARGET_CPU_LEGACY" # Setup debug/release defines if test "x$DEBUG_LEVEL" = xrelease; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DNDEBUG" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DNDEBUG" if test "x$OPENJDK_TARGET_OS" = xsolaris; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DTRIMMED" - fi - else - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DDEBUG" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DTRIMMED" + fi + else + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DDEBUG" fi # Setup release name - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DRELEASE='\"\$(RELEASE)\"'" # Set some additional per-OS defines. if test "x$OPENJDK_TARGET_OS" = xmacosx; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT" elif test "x$OPENJDK_TARGET_OS" = xaix; then # FIXME: PPC64 should not be here. - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DPPC64" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DPPC64" elif test "x$OPENJDK_TARGET_OS" = xbsd; then - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_ALLBSD_SOURCE" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -D_ALLBSD_SOURCE" fi # Additional macosx handling @@ -41803,13 +42149,13 @@ # The macro takes the version with no dots, ex: 1070 # Let the flags variables get resolved in make for easier override on make # command line. - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)" + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)" LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)" fi fi # Setup some hard coded includes - CCXXFLAGS_JDK="$CCXXFLAGS_JDK \ + COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \ -I${JDK_OUTPUTDIR}/include \ -I${JDK_OUTPUTDIR}/include/$OPENJDK_TARGET_OS \ -I${JDK_TOPDIR}/src/share/javavm/export \ @@ -41818,12 +42164,12 @@ -I${JDK_TOPDIR}/src/$OPENJDK_TARGET_OS_API_DIR/native/common" # The shared libraries are compiled using the picflag. - CFLAGS_JDKLIB="$CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA" - CXXFLAGS_JDKLIB="$CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA " + CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA" + CXXFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK $PICFLAG $CXXFLAGS_JDKLIB_EXTRA " # Executable flags - CFLAGS_JDKEXE="$CCXXFLAGS_JDK $CFLAGS_JDK" - CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK" + CFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK" + CXXFLAGS_JDKEXE="$COMMON_CCXXFLAGS_JDK $CXXFLAGS_JDK" @@ -41832,6 +42178,7 @@ # Setup LDFLAGS et al. # + # Now this is odd. The JDK native libraries have to link against libjvm.so # On 32-bit machines there is normally two distinct libjvm.so:s, client and server. # Which should we link to? Are we lucky enough that the binary api to the libjvm.so library @@ -41847,39 +42194,94 @@ fi # TODO: make -debug optional "--disable-full-debug-symbols" LDFLAGS_JDK="$LDFLAGS_JDK -debug" - LDFLAGS_JDKLIB="${LDFLAGS_JDK} -dll -libpath:${JDK_OUTPUTDIR}/lib" - LDFLAGS_JDKLIB_SUFFIX="" + elif test "x$TOOLCHAIN_TYPE" = xgcc; then + # If this is a --hash-style=gnu system, use --hash-style=both, why? + # We have previously set HAS_GNU_HASH if this is the case + if test -n "$HAS_GNU_HASH"; then + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both" + fi + if test "x$OPENJDK_TARGET_OS" = xlinux; then + # And since we now know that the linker is gnu, then add -z defs, to forbid + # undefined symbols in object files. + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" + case $DEBUG_LEVEL in + release ) + # tell linker to optimize libraries. + # Should this be supplied to the OSS linker as well? + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + ;; + slowdebug ) + if test "x$HAS_LINKER_NOW" = "xtrue"; then + # do relocations at load + LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_NOW_FLAG" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_NOW_FLAG" + fi + if test "x$HAS_LINKER_RELRO" = "xtrue"; then + # mark relocations read only + LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG" + fi + ;; + fastdebug ) + if test "x$HAS_LINKER_RELRO" = "xtrue"; then + # mark relocations read only + LDFLAGS_JDK="$LDFLAGS_JDK $LINKER_RELRO_FLAG" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK $LINKER_RELRO_FLAG" + fi + ;; + * ) + as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5 + ;; + esac + fi + elif test "x$TOOLCHAIN_TYPE" = xsolstudio; then + LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib" + fi + + if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then + # If undefined behaviour detection is enabled then we need to tell linker. + case $DEBUG_LEVEL in + release | fastdebug ) + ;; + slowdebug ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" >&5 +$as_echo "$as_me: WARNING: $HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" >&2;} + if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then + # enable undefined behaviour checking + LDFLAGS_JDK="$LDFLAGS_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/ *\(^ \+\)/ -Xlinker \1/g"`" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/ *\(^ \+\)/ -Xlinker \1/g"`" + fi + ;; + * ) + as_fn_error $? "Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL" "$LINENO" 5 + ;; + esac + fi + + # Customize LDFLAGS for executables + + LDFLAGS_JDKEXE="${LDFLAGS_JDK}" + + if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then LDFLAGS_STACK_SIZE=1048576 else LDFLAGS_STACK_SIZE=327680 fi - LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE" - else - if test "x$TOOLCHAIN_TYPE" = xgcc; then - # If this is a --hash-style=gnu system, use --hash-style=both, why? - # We have previously set HAS_GNU_HASH if this is the case - if test -n "$HAS_GNU_HASH"; then - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both " - fi - if test "x$OPENJDK_TARGET_OS" = xlinux; then - # And since we now know that the linker is gnu, then add -z defs, to forbid - # undefined symbols in object files. - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" - if test "x$DEBUG_LEVEL" = "xrelease"; then - # When building release libraries, tell the linker optimize them. - # Should this be supplied to the OSS linker as well? - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" - fi - fi - fi - - if test "x$TOOLCHAIN_TYPE" = xsolstudio; then - LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext" - LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib" - fi - - LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \ + LDFLAGS_JDKEXE="${LDFLAGS_JDKEXE} /STACK:$LDFLAGS_STACK_SIZE" + elif test "x$OPENJDK_TARGET_OS" = xlinux; then + LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined" + fi + + # Customize LDFLAGS for libs + LDFLAGS_JDKLIB="${LDFLAGS_JDK}" + + if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then + LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${JDK_OUTPUTDIR}/lib" + LDFLAGS_JDKLIB_SUFFIX="" + else + LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}" # On some platforms (mac) the linker warns about non existing -L dirs. @@ -41900,11 +42302,6 @@ if test "x$TOOLCHAIN_TYPE" = xsolstudio; then LDFLAGS_JDKLIB_SUFFIX="$LDFLAGS_JDKLIB_SUFFIX -lc" fi - - LDFLAGS_JDKEXE="${LDFLAGS_JDK}" - if test "x$OPENJDK_TARGET_OS" = xlinux; then - LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE -Xlinker --allow-shlib-undefined" - fi fi diff -r 53fd25d388da -r 89731ae72a76 common/autoconf/toolchain.m4 --- a/common/autoconf/toolchain.m4 Wed Jul 05 19:45:37 2017 +0200 +++ b/common/autoconf/toolchain.m4 Wed Jul 05 19:46:40 2017 +0200 @@ -24,11 +24,11 @@ # ######################################################################## -# This file is responsible for detecting, verifying and setting up the -# toolchain, i.e. the compiler, linker and related utilities. It will setup +# This file is responsible for detecting, verifying and setting up the +# toolchain, i.e. the compiler, linker and related utilities. It will setup # proper paths to the binaries, but it will not setup any flags. # -# The binaries used is determined by the toolchain type, which is the family of +# The binaries used is determined by the toolchain type, which is the family of # compilers and related tools that are used. ######################################################################## @@ -83,7 +83,7 @@ AC_SUBST(SHARED_LIBRARY) AC_SUBST(STATIC_LIBRARY) AC_SUBST(OBJ_SUFFIX) - AC_SUBST(EXE_SUFFIX) + AC_SUBST(EXE_SUFFIX) ]) # Determine which toolchain type to use, and make sure it is valid for this @@ -117,7 +117,7 @@ # First toolchain type in the list is the default DEFAULT_TOOLCHAIN=${VALID_TOOLCHAINS%% *} fi - + if test "x$with_toolchain_type" = xlist; then # List all toolchains AC_MSG_NOTICE([The following toolchains are valid on this platform:]) @@ -126,7 +126,7 @@ TOOLCHAIN_DESCRIPTION=${!toolchain_var_name} $PRINTF " %-10s %s\n" $toolchain "$TOOLCHAIN_DESCRIPTION" done - + exit 0 elif test "x$with_toolchain_type" != x; then # User override; check that it is valid @@ -168,10 +168,10 @@ AC_MSG_NOTICE([Using default toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION)]) else AC_MSG_NOTICE([Using user selected toolchain $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION). Default toolchain is $DEFAULT_TOOLCHAIN.]) - fi + fi ]) -# Before we start detecting the toolchain executables, we might need some +# Before we start detecting the toolchain executables, we might need some # special setup, e.g. additional paths etc. AC_DEFUN_ONCE([TOOLCHAIN_PRE_DETECTION], [ @@ -184,7 +184,7 @@ ORG_OBJCFLAGS="$OBJCFLAGS" # On Windows, we need to detect the visual studio installation first. - # This will change the PATH, but we need to keep that new PATH even + # This will change the PATH, but we need to keep that new PATH even # after toolchain detection is done, since the compiler (on x86) uses # it for DLL resolution in runtime. if test "x$OPENJDK_BUILD_OS" = "xwindows" && test "x$TOOLCHAIN_TYPE" = "xmicrosoft"; then @@ -208,7 +208,7 @@ PATH="/usr/ccs/bin:$PATH" fi - # Finally add TOOLCHAIN_PATH at the beginning, to allow --with-tools-dir to + # Finally add TOOLCHAIN_PATH at the beginning, to allow --with-tools-dir to # override all other locations. if test "x$TOOLCHAIN_PATH" != x; then PATH=$TOOLCHAIN_PATH:$PATH @@ -254,7 +254,7 @@ AC_MSG_NOTICE([The result from running with --version was: "$ALT_VERSION_OUTPUT"]) AC_MSG_ERROR([A $TOOLCHAIN_TYPE compiler is required. Try setting --with-tools-dir.]) fi - # Remove usage instructions (if present), and + # Remove usage instructions (if present), and # collapse compiler output into a single line COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \ $SED -e 's/ *@<:@Uu@:>@sage:.*//'` @@ -282,7 +282,7 @@ # There is no specific version flag, but all output starts with a version string. # First line typically looks something like: # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 - COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'` + COMPILER_VERSION_OUTPUT=`$COMPILER 2>&1 | $HEAD -n 1 | $TR -d '\r'` # Check that this is likely to be Microsoft CL.EXE. $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Microsoft.*Compiler" > /dev/null if test $? -ne 0; then @@ -360,7 +360,7 @@ AC_MSG_NOTICE([Will use user supplied compiler $1=[$]$1]) if test "x`basename [$]$1`" = "x[$]$1"; then # A command without a complete path is provided, search $PATH. - + AC_PATH_PROGS(POTENTIAL_$1, [$]$1) if test "x$POTENTIAL_$1" != x; then $1=$POTENTIAL_$1 @@ -375,12 +375,12 @@ fi else # No user supplied value. Locate compiler ourselves. - + # If we are cross compiling, assume cross compilation tools follows the # cross compilation standard where they are prefixed with the autoconf - # standard name for the target. For example the binary + # standard name for the target. For example the binary # i686-sun-solaris2.10-gcc will cross compile for i686-sun-solaris2.10. - # If we are not cross compiling, then the default compiler name will be + # If we are not cross compiling, then the default compiler name will be # used. $1= @@ -450,9 +450,9 @@ TOOLCHAIN_CHECK_COMPILER_VERSION([$1], [$COMPILER_NAME]) ]) -# Detect the core components of the toolchain, i.e. the compilers (CC and CXX), -# preprocessor (CPP and CXXCPP), the linker (LD), the assembler (AS) and the -# archiver (AR). Verify that the compilers are correct according to the +# Detect the core components of the toolchain, i.e. the compilers (CC and CXX), +# preprocessor (CPP and CXXCPP), the linker (LD), the assembler (AS) and the +# archiver (AR). Verify that the compilers are correct according to the # toolchain type. AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_CORE], [ @@ -529,7 +529,7 @@ ]) # Setup additional tools that is considered a part of the toolchain, but not the -# core part. Many of these are highly platform-specific and do not exist, +# core part. Many of these are highly platform-specific and do not exist, # and/or are not needed on all platforms. AC_DEFUN_ONCE([TOOLCHAIN_DETECT_TOOLCHAIN_EXTRA], [ @@ -551,7 +551,7 @@ AC_CHECK_PROG([DUMPBIN], [dumpbin], [dumpbin],,,) BASIC_FIXUP_EXECUTABLE(DUMPBIN) fi - + if test "x$OPENJDK_TARGET_OS" = xsolaris; then BASIC_PATH_PROGS(STRIP, strip) BASIC_FIXUP_EXECUTABLE(STRIP) @@ -559,7 +559,7 @@ BASIC_FIXUP_EXECUTABLE(NM) BASIC_PATH_PROGS(GNM, gnm) BASIC_FIXUP_EXECUTABLE(GNM) - + BASIC_PATH_PROGS(MCS, mcs) BASIC_FIXUP_EXECUTABLE(MCS) elif test "x$OPENJDK_TARGET_OS" != xwindows; then @@ -592,17 +592,17 @@ # Setup the build tools (i.e, the compiler and linker used to build programs # that should be run on the build platform, not the target platform, as a build -# helper). Since the non-cross-compile case uses the normal, target compilers +# helper). Since the non-cross-compile case uses the normal, target compilers # for this, we can only do this after these have been setup. AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS], -[ +[ if test "x$COMPILE_TYPE" = "xcross"; then # Now we need to find a C/C++ compiler that can build executables for the # build platform. We can't use the AC_PROG_CC macro, since it can only be # used once. Also, we need to do this without adding a tools dir to the # path, otherwise we might pick up cross-compilers which don't use standard # naming. - + # FIXME: we should list the discovered compilers as an exclude pattern! # If we do that, we can do this detection before POST_DETECTION, and still # find the build compilers in the tools dir, if needed. @@ -690,15 +690,39 @@ # If this is a --hash-style=gnu system, use --hash-style=both, why? HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` # This is later checked when setting flags. + + # "-Og" suppported for GCC 4.8 and later + CFLAG_OPTIMIZE_DEBUG_FLAG="-Og" + FLAGS_COMPILER_CHECK_ARGUMENTS([$CFLAG_OPTIMIZE_DEBUG_FLAG], + [HAS_CFLAG_OPTIMIZE_DEBUG=true], + [HAS_CFLAG_OPTIMIZE_DEBUG=false]) + + # "-fsanitize=undefined" supported for GCC 4.9 and later + CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG="-fsanitize=undefined -fsanitize-recover" + FLAGS_COMPILER_CHECK_ARGUMENTS([$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG], + [HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=true], + [HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=false]) + + # "-z relro" supported in GNU binutils 2.17 and later + LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro" + FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_RELRO_FLAG], + [HAS_LINKER_RELRO=true], + [HAS_LINKER_RELRO=false]) + + # "-z now" supported in GNU binutils 2.11 and later + LINKER_NOW_FLAG="-Xlinker -z -Xlinker now" + FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_NOW_FLAG], + [HAS_LINKER_NOW=true], + [HAS_LINKER_NOW=false]) fi - # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed + # Check for broken SuSE 'ld' for which 'Only anonymous version tag is allowed # in executable.' USING_BROKEN_SUSE_LD=no if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$TOOLCHAIN_TYPE" = xgcc; then AC_MSG_CHECKING([for broken SuSE 'ld' which only understands anonymous version tags in executables]) - echo "SUNWprivate_1.1 { local: *; };" > version-script.map - echo "int main() { }" > main.c + $ECHO "SUNWprivate_1.1 { local: *; };" > version-script.map + $ECHO "int main() { }" > main.c if $CXX -Xlinker -version-script=version-script.map main.c 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD; then AC_MSG_RESULT(no) USING_BROKEN_SUSE_LD=no diff -r 53fd25d388da -r 89731ae72a76 corba/.hgtags --- a/corba/.hgtags Wed Jul 05 19:45:37 2017 +0200 +++ b/corba/.hgtags Wed Jul 05 19:46:40 2017 +0200 @@ -261,3 +261,4 @@ 422ef9d29d84f571453f015c4cb8713c3af70ee4 jdk9-b16 4c75c2ca7cf3e0618315879acf17f42c8fcd0c09 jdk9-b17 77565aaaa2bb814e94817e92d680168052a25395 jdk9-b18 +eecc1b6adc7e193d00a0641eb0963add5a4c06e8 jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 hotspot/.hgtags --- a/hotspot/.hgtags Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/.hgtags Wed Jul 05 19:46:40 2017 +0200 @@ -421,3 +421,4 @@ b14e7c0b7d3ec04127f565cda1d84122e205680c jdk9-b16 14b656df31c2cb09c505921061e79977823de71a jdk9-b17 871fd128548480095e0dc3fc34c422666baeec75 jdk9-b18 +d4cffb3ae6213c66c7522ebffe0349360a45f0ef jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 hotspot/make/bsd/makefiles/fastdebug.make --- a/hotspot/make/bsd/makefiles/fastdebug.make Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/make/bsd/makefiles/fastdebug.make Wed Jul 05 19:46:40 2017 +0200 @@ -24,37 +24,30 @@ # Sets make macros for making debug version of VM +# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make +# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_CFLAGS. + +FASTDEBUG_CFLAGS$(FASTDEBUG_CFLAGS) = $(DEBUG_CFLAGS) + # Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS) OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@)) # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) -ifeq ($(BUILDARCH), ia64) - # Bug in GCC, causes hang. -O1 will override the -O3 specified earlier - OPT_CFLAGS/callGenerator.o += -O1 - OPT_CFLAGS/ciTypeFlow.o += -O1 - OPT_CFLAGS/compile.o += -O1 - OPT_CFLAGS/concurrentMarkSweepGeneration.o += -O1 - OPT_CFLAGS/doCall.o += -O1 - OPT_CFLAGS/generateOopMap.o += -O1 - OPT_CFLAGS/generateOptoStub.o += -O1 - OPT_CFLAGS/graphKit.o += -O1 - OPT_CFLAGS/instanceKlass.o += -O1 - OPT_CFLAGS/interpreterRT_ia64.o += -O1 - OPT_CFLAGS/output.o += -O1 - OPT_CFLAGS/parse1.o += -O1 - OPT_CFLAGS/runtime.o += -O1 - OPT_CFLAGS/synchronizer.o += -O1 -endif - - # If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE) # Set the environment variable HOTSPARC_GENERIC to "true" # to inhibit the effect of the previous line on CFLAGS. +# The following lines are copied from debug.make, except that we +# consult FASTDEBUG_CFLAGS instead of DEBUG_CFLAGS. +# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make +DEBUG_CFLAGS/DEFAULT= $(FASTDEBUG_CFLAGS) +DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@)) +CFLAGS += $(DEBUG_CFLAGS/BYFILE) + # Linker mapfile MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug ifeq ($(OS_VENDOR), Darwin) diff -r 53fd25d388da -r 89731ae72a76 hotspot/make/bsd/makefiles/gcc.make --- a/hotspot/make/bsd/makefiles/gcc.make Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/make/bsd/makefiles/gcc.make Wed Jul 05 19:46:40 2017 +0200 @@ -19,7 +19,7 @@ # 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. -# +# # OS_VENDOR = $(shell uname -s) @@ -80,7 +80,7 @@ HOSTCC = $(CC) endif - AS = $(CC) -c + AS = $(CC) -c endif ifeq ($(OS_VENDOR), Darwin) @@ -100,7 +100,7 @@ endif ifeq ($(USE_CLANG), true) - # clang has precompiled headers support by default, but the user can switch + # Clang has precompiled headers support by default, but the user can switch # it off by using 'USE_PRECOMPILED_HEADER=0'. ifdef LP64 ifeq ($(USE_PRECOMPILED_HEADER),) @@ -112,29 +112,29 @@ # Clang produces an error if the PCH file was compiled with other options than the actual compilation unit. USE_PRECOMPILED_HEADER=0 endif - + ifeq ($(USE_PRECOMPILED_HEADER),1) - + ifndef LP64 $(error " Precompiled Headers only supported on 64-bit platforms!") endif - + PRECOMPILED_HEADER_DIR=. PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.pch - + PCH_FLAG = -include precompiled.hpp PCH_FLAG/DEFAULT = $(PCH_FLAG) PCH_FLAG/NO_PCH = -DNO_PCH PCH_FLAG/BY_FILE = $(PCH_FLAG/$@)$(PCH_FLAG/DEFAULT$(PCH_FLAG/$@)) - + VM_PCH_FLAG/LIBJVM = $(PCH_FLAG/BY_FILE) VM_PCH_FLAG/AOUT = VM_PCH_FLAG = $(VM_PCH_FLAG/$(LINK_INTO)) - + # We only use precompiled headers for the JVM build CFLAGS += $(VM_PCH_FLAG) - + # The following files are compiled at various optimization # levels due to optimization issues encountered at the # 'OPT_CFLAGS_DEFAULT' level. The Clang compiler issues a compile @@ -149,7 +149,7 @@ PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH) PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH) PCH_FLAG/unsafe.o = $(PCH_FLAG/NO_PCH) - + endif else # ($(USE_CLANG), true) # check for precompiled headers support @@ -272,21 +272,24 @@ CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS) # Special cases -CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) +CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) # XXXDARWIN: for _dyld_bind_fully_image_containing_address ifeq ($(OS_VENDOR), Darwin) CFLAGS_WARN/os_bsd.o = $(CFLAGS_WARN/DEFAULT) -Wno-deprecated-declarations endif +# optimization control flags (Used by fastdebug and release variants) +OPT_CFLAGS/NOOPT=-O0 +ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1" + # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination) + OPT_CFLAGS/DEBUG=-Og +else + # Allow no optimizations. + OPT_CFLAGS/DEBUG=-O0 +endif OPT_CFLAGS/SIZE=-Os OPT_CFLAGS/SPEED=-O3 -# Hotspot uses very unstrict aliasing turn this optimization off -# This option is added to CFLAGS rather than OPT_CFLAGS -# so that OPT_CFLAGS overrides get this option too. -CFLAGS += -fno-strict-aliasing - -# The flags to use for an Optimized g++ build ifeq ($(OS_VENDOR), Darwin) # use -Os by default, unless -O3 can be proved to be worth the cost, as per policy # @@ -295,6 +298,11 @@ OPT_CFLAGS_DEFAULT ?= SPEED endif +# Hotspot uses very unstrict aliasing turn this optimization off +# This option is added to CFLAGS rather than OPT_CFLAGS +# so that OPT_CFLAGS overrides get this option too. +CFLAGS += -fno-strict-aliasing + ifdef OPT_CFLAGS ifneq ("$(origin OPT_CFLAGS)", "command line") $(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.") @@ -309,8 +317,6 @@ OPT_CFLAGS += -fno-expensive-optimizations endif -OPT_CFLAGS/NOOPT=-O0 - # Work around some compiler bugs. ifeq ($(USE_CLANG), true) ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1) @@ -338,7 +344,7 @@ endif ifeq ($(OS_VENDOR), Darwin) - # Setting these parameters makes it an error to link to macosx APIs that are + # Setting these parameters makes it an error to link to macosx APIs that are # newer than the given OS version and makes the linked binaries compatible even # if built on a newer version of the OS. # The expected format is X.Y.Z @@ -371,10 +377,22 @@ ifeq ($(USE_CLANG),) # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x. - ifneq ("${CC_VER_MAJOR}", "2") + ifneq ($(CC_VER_MAJOR), 2) STATIC_LIBGCC += -static-libgcc endif + ifneq ($(OS_VENDOR), Darwin) + ifneq (, findstring(debug,$(BUILD_FLAVOR))) + # for relocations read-only + LFLAGS += -Xlinker -z -Xlinker relro + + ifeq ($(BUILD_FLAVOR), debug) + # disable incremental relocations linking + LFLAGS += -Xlinker -z -Xlinker now + endif + endif + endif + ifeq ($(BUILDARCH), ia64) LFLAGS += -Wl,-relax endif @@ -425,6 +443,14 @@ CFLAGS += -flimit-debug-info endif +ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1" + # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination) + DEBUG_CFLAGS=-Og +else + # Allow no optimizations. + DEBUG_CFLAGS=-O0 +endif + # DEBUG_BINARIES uses full -g debug information for all configs ifeq ($(DEBUG_BINARIES), true) CFLAGS += -g @@ -441,9 +467,14 @@ DEBUG_CFLAGS/ppc = -g DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH)) ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),) - DEBUG_CFLAGS += -gstabs + ifeq ($(USE_CLANG), true) + # Clang doesn't understand -gstabs + DEBUG_CFLAGS += -g + else + DEBUG_CFLAGS += -gstabs + endif endif - + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) FASTDEBUG_CFLAGS/ia64 = -g FASTDEBUG_CFLAGS/amd64 = -g @@ -458,7 +489,7 @@ FASTDEBUG_CFLAGS += -gstabs endif endif - + OPT_CFLAGS/ia64 = -g OPT_CFLAGS/amd64 = -g OPT_CFLAGS/arm = -g @@ -475,6 +506,18 @@ endif endif +ifeq ($(USE_CLANG),) + # Enable bounds checking. + # _FORTIFY_SOURCE appears in GCC 4.0+ + ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1" + # compile time size bounds checks + FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 + + # and runtime size bounds checks and paranoid stack smashing checks. + DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1 + endif +endif + # If we are building HEADLESS, pass on to VM # so it can set the java.awt.headless property ifdef HEADLESS diff -r 53fd25d388da -r 89731ae72a76 hotspot/make/linux/makefiles/fastdebug.make --- a/hotspot/make/linux/makefiles/fastdebug.make Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/make/linux/makefiles/fastdebug.make Wed Jul 05 19:46:40 2017 +0200 @@ -24,6 +24,11 @@ # Sets make macros for making debug version of VM +# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make +# They may also specify FASTDEBUG_CFLAGS, but it defaults to DEBUG_CFLAGS. + +FASTDEBUG_CFLAGS$(FASTDEBUG_CFLAGS) = $(DEBUG_CFLAGS) + # Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS) OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@)) @@ -54,6 +59,12 @@ # Set the environment variable HOTSPARC_GENERIC to "true" # to inhibit the effect of the previous line on CFLAGS. +# The following lines are copied from debug.make, except that we +# consult FASTDEBUG_CFLAGS instead of DEBUG_CFLAGS. +# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make +DEBUG_CFLAGS/DEFAULT= $(FASTDEBUG_CFLAGS) +DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@)) +CFLAGS += $(DEBUG_CFLAGS/BYFILE) # Linker mapfile MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug diff -r 53fd25d388da -r 89731ae72a76 hotspot/make/linux/makefiles/gcc.make --- a/hotspot/make/linux/makefiles/gcc.make Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/make/linux/makefiles/gcc.make Wed Jul 05 19:46:40 2017 +0200 @@ -19,7 +19,7 @@ # 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. -# +# # #------------------------------------------------------------------------ @@ -62,7 +62,6 @@ CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2) endif - ifeq ($(USE_CLANG), true) # Clang has precompiled headers support by default, but the user can switch # it off by using 'USE_PRECOMPILED_HEADER=0'. @@ -104,7 +103,7 @@ # But Clang doesn't support a precompiled header which was compiled with -O3 # to be used in a compilation unit which uses '-O0'. We could also prepare an # extra '-O0' PCH file for the opt build and use it here, but it's probably - # not worth the effoert as long as only two files need this special handling. + # not worth the effort as long as only two files need this special handling. PCH_FLAG/loopTransform.o = $(PCH_FLAG/NO_PCH) PCH_FLAG/sharedRuntimeTrig.o = $(PCH_FLAG/NO_PCH) PCH_FLAG/sharedRuntimeTrans.o = $(PCH_FLAG/NO_PCH) @@ -226,19 +225,28 @@ endif CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS) + # Special cases -CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) +CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) -# The flags to use for an Optimized g++ build +# optimization control flags (Used by fastdebug and release variants) +OPT_CFLAGS/NOOPT=-O0 +ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1" + # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination) + OPT_CFLAGS/DEBUG=-Og +else + # Allow no optimizations. + OPT_CFLAGS/DEBUG=-O0 +endif OPT_CFLAGS/SIZE=-Os OPT_CFLAGS/SPEED=-O3 +OPT_CFLAGS_DEFAULT ?= SPEED + # Hotspot uses very unstrict aliasing turn this optimization off # This option is added to CFLAGS rather than OPT_CFLAGS # so that OPT_CFLAGS overrides get this option too. -CFLAGS += -fno-strict-aliasing - -OPT_CFLAGS_DEFAULT ?= SPEED +CFLAGS += -fno-strict-aliasing ifdef OPT_CFLAGS ifneq ("$(origin OPT_CFLAGS)", "command line") @@ -248,14 +256,12 @@ OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS) -# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp +# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp # if we use expensive-optimizations ifeq ($(BUILDARCH), ia64) OPT_CFLAGS += -fno-expensive-optimizations endif -OPT_CFLAGS/NOOPT=-O0 - # Work around some compiler bugs. ifeq ($(USE_CLANG), true) ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1) @@ -271,7 +277,7 @@ # Flags for generating make dependency flags. DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) ifeq ($(USE_CLANG),) - ifneq ("${CC_VER_MAJOR}", "2") + ifneq ($(CC_VER_MAJOR), 2) DEPFLAGS += -fpch-deps endif endif @@ -282,21 +288,26 @@ # statically link libstdc++.so, work with gcc but ignored by g++ STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic +# Enable linker optimization +LFLAGS += -Xlinker -O1 + ifeq ($(USE_CLANG),) - # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x. - ifneq ("${CC_VER_MAJOR}", "2") - STATIC_LIBGCC += -static-libgcc + STATIC_LIBGCC += -static-libgcc + + ifneq (, findstring(debug,$(BUILD_FLAVOR))) + # for relocations read-only + LFLAGS += -Xlinker -z -Xlinker relro + + ifeq ($(BUILD_FLAVOR), debug) + # disable incremental relocations linking + LFLAGS += -Xlinker -z -Xlinker now + endif endif ifeq ($(BUILDARCH), ia64) LFLAGS += -Wl,-relax endif -endif -# Enable linker optimization -LFLAGS += -Xlinker -O1 - -ifeq ($(USE_CLANG),) # If this is a --hash-style=gnu system, use --hash-style=both # The gnu .hash section won't work on some Linux systems like SuSE 10. _HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu') @@ -333,6 +344,14 @@ CFLAGS += -flimit-debug-info endif +ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1" + # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination) + DEBUG_CFLAGS=-Og +else + # Allow no optimizations. + DEBUG_CFLAGS=-O0 +endif + # DEBUG_BINARIES uses full -g debug information for all configs ifeq ($(DEBUG_BINARIES), true) CFLAGS += -g @@ -355,6 +374,18 @@ endif endif +ifeq ($(USE_CLANG),) + # Enable bounds checking. + # _FORTIFY_SOURCE appears in GCC 4.0+ + ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1" + # compile time size bounds checks + FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 + + # and runtime size bounds checks and paranoid stack smashing checks. + DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1 + endif +endif + # If we are building HEADLESS, pass on to VM # so it can set the java.awt.headless property ifdef HEADLESS diff -r 53fd25d388da -r 89731ae72a76 hotspot/make/solaris/makefiles/gcc.make --- a/hotspot/make/solaris/makefiles/gcc.make Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/make/solaris/makefiles/gcc.make Wed Jul 05 19:46:40 2017 +0200 @@ -19,7 +19,7 @@ # 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. -# +# # #------------------------------------------------------------------------ @@ -40,7 +40,7 @@ CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1) CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2) -# Check for the versions of C++ and C compilers ($CXX and $CC) used. +# Check for the versions of C++ and C compilers ($CXX and $CC) used. # Get the last thing on the line that looks like x.x+ (x is a digit). COMPILER_REV := \ @@ -98,7 +98,7 @@ ifeq ($(BUILDARCH), amd64) ASFLAGS += -march=k8 -march=amd64 -LFLAGS += -march=k8 +LFLAGS += -march=k8 endif @@ -115,21 +115,44 @@ endif -# Compiler warnings are treated as errors -WARNINGS_ARE_ERRORS = -Werror +# Compiler warnings are treated as errors +WARNINGS_ARE_ERRORS = -Werror + # Enable these warnings. See 'info gcc' about details on these options WARNING_FLAGS = -Wpointer-arith -Wconversion -Wsign-compare -Wundef -Wformat=2 CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS) -# Special cases -CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) + +# Special cases +CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) -# The flags to use for an Optimized g++ build -OPT_CFLAGS += -O3 +# optimization control flags (Used by fastdebug and release variants) +OPT_CFLAGS/NOOPT=-O0 +ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1" + # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination) + OPT_CFLAGS/DEBUG=-Og ++else + # Allow no optimizations. + OPT_CFLAGS/DEBUG=-O0 +endif +OPT_CFLAGS/SIZE=-Os +OPT_CFLAGS/SPEED=-O3 + +OPT_CFLAGS_DEFAULT ?= SPEED # Hotspot uses very unstrict aliasing turn this optimization off -OPT_CFLAGS += -fno-strict-aliasing +# This option is added to CFLAGS rather than OPT_CFLAGS +# so that OPT_CFLAGS overrides get this option too. +CFLAGS += -fno-strict-aliasing -# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp +ifdef OPT_CFLAGS + ifneq ("$(origin OPT_CFLAGS)", "command line") + $(error " Use OPT_EXTRAS instead of OPT_CFLAGS to add extra flags to OPT_CFLAGS.") + endif +endif + +OPT_CFLAGS = $(OPT_CFLAGS/$(OPT_CFLAGS_DEFAULT)) $(OPT_EXTRAS) + +# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp # if we use expensive-optimizations # Note: all ia64 setting reflect the ones for linux # No actial testing was performed: there is no Solaris on ia64 presently @@ -137,10 +160,20 @@ OPT_CFLAGS/bytecodeInterpreter.o += -fno-expensive-optimizations endif -OPT_CFLAGS/NOOPT=-O0 +# Work around some compiler bugs. +ifeq ($(USE_CLANG), true) + ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1) + OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT) + endif +else + # 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation. + ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 3), 1) + OPT_CFLAGS/mulnode.o += $(OPT_CFLAGS/NOOPT) + endif +endif # Flags for generating make dependency flags. -ifneq ("${CC_VER_MAJOR}", "2") +ifneq ($(CC_VER_MAJOR), 2) DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) endif @@ -155,26 +188,37 @@ # statically link libstdc++.so, work with gcc but ignored by g++ STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic -# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x. -ifneq ("${CC_VER_MAJOR}", "2") -STATIC_LIBGCC += -static-libgcc -endif - -ifeq ($(BUILDARCH), ia64) -# Note: all ia64 setting reflect the ones for linux -# No actial testing was performed: there is no Solaris on ia64 presently -LFLAGS += -Wl,-relax -endif ifdef USE_GNULD -# Enable linker optimization -LFLAGS += -Xlinker -O1 + # statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x. + ifneq ($(CC_VER_MAJOR), 2) + STATIC_LIBGCC += -static-libgcc + endif + + # Enable linker optimization + LFLAGS += -Xlinker -O1 + + ifneq (, findstring(debug,$(BUILD_FLAVOR))) + # for relocations read-only + LFLAGS += -Xlinker -z -Xlinker relro -# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file. -MAPFLAG = -Xlinker --version-script=FILENAME -else -MAPFLAG = -Xlinker -M -Xlinker FILENAME -endif + ifeq ($(BUILD_FLAVOR), debug) + # disable incremental relocations linking + LFLAGS += -Xlinker -z -Xlinker now + endif + endif + + ifeq ($(BUILDARCH), ia64) + # Note: all ia64 setting reflect the ones for linux + # No actual testing was performed: there is no Solaris on ia64 presently + LFLAGS += -Wl,-relax + endif + + # Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file. + MAPFLAG = -Xlinker --version-script=FILENAME +else + MAPFLAG = -Xlinker -M -Xlinker FILENAME +endif # Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj SONAMEFLAG = -Xlinker -soname=SONAME @@ -185,15 +229,34 @@ #------------------------------------------------------------------------ # Debug flags -# Use the stabs format for debugging information (this is the default -# on gcc-2.91). It's good enough, has all the information about line -# numbers and local variables, and libjvm.so is only about 16M. -# Change this back to "-g" if you want the most expressive format. -# (warning: that could easily inflate libjvm.so to 150M!) -# Note: The Itanium gcc compiler crashes when using -gstabs. -DEBUG_CFLAGS/ia64 = -g -DEBUG_CFLAGS/amd64 = -g -DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH)) -ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),) -DEBUG_CFLAGS += -gstabs -endif +ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1" + # Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination) + DEBUG_CFLAGS=-Og +else + # Allow no optimizations. + DEBUG_CFLAGS=-O0 +endif + + +# Use the stabs format for debugging information (this is the default +# on gcc-2.91). It's good enough, has all the information about line +# numbers and local variables, and libjvm.so is only about 16M. +# Change this back to "-g" if you want the most expressive format. +# (warning: that could easily inflate libjvm.so to 150M!) +# Note: The Itanium gcc compiler crashes when using -gstabs. +DEBUG_CFLAGS/ia64 = -g +DEBUG_CFLAGS/amd64 = -g +DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH)) +ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),) + DEBUG_CFLAGS += -gstabs +endif + +# Enable bounds checking. +# _FORTIFY_SOURCE appears in GCC 4.0+ +ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1" + # compile time size bounds checks + FASTDEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 + + # and runtime size bounds checks and paranoid stack smashing checks. + DEBUG_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-all --param ssp-buffer-size=1 +endif diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/ppc/vm/ppc.ad --- a/hotspot/src/cpu/ppc/vm/ppc.ad Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/ppc/vm/ppc.ad Wed Jul 05 19:46:40 2017 +0200 @@ -1285,9 +1285,9 @@ void MachConstantBaseNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) { Compile *C = ra_->C; - iRegPdstOper *op_dst = new (C) iRegPdstOper(); - MachNode *m1 = new (C) loadToc_hiNode(); - MachNode *m2 = new (C) loadToc_loNode(); + iRegPdstOper *op_dst = new iRegPdstOper(); + MachNode *m1 = new loadToc_hiNode(); + MachNode *m2 = new loadToc_loNode(); m1->add_req(NULL); m2->add_req(NULL, m1); @@ -2232,9 +2232,9 @@ MachTypeNode *Matcher::make_decode_node(Compile *C) { assert(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0, "This method is only implemented for unscaled cOops mode so far"); - MachTypeNode *decode = new (C) decodeN_unscaledNode(); - decode->set_opnd_array(0, new (C) iRegPdstOper()); - decode->set_opnd_array(1, new (C) iRegNsrcOper()); + MachTypeNode *decode = new decodeN_unscaledNode(); + decode->set_opnd_array(0, new iRegPdstOper()); + decode->set_opnd_array(1, new iRegNsrcOper()); return decode; } */ @@ -2600,20 +2600,20 @@ const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; if (large_constant_pool) { // Create new nodes. - loadConL_hiNode *m1 = new (C) loadConL_hiNode(); - loadConL_loNode *m2 = new (C) loadConL_loNode(); + loadConL_hiNode *m1 = new loadConL_hiNode(); + loadConL_loNode *m2 = new loadConL_loNode(); // inputs for new nodes m1->add_req(NULL, toc); m2->add_req(NULL, m1); // operands for new nodes - m1->_opnds[0] = new (C) iRegLdstOper(); // dst - m1->_opnds[1] = immSrc; // src - m1->_opnds[2] = new (C) iRegPdstOper(); // toc - m2->_opnds[0] = new (C) iRegLdstOper(); // dst - m2->_opnds[1] = immSrc; // src - m2->_opnds[2] = new (C) iRegLdstOper(); // base + m1->_opnds[0] = new iRegLdstOper(); // dst + m1->_opnds[1] = immSrc; // src + m1->_opnds[2] = new iRegPdstOper(); // toc + m2->_opnds[0] = new iRegLdstOper(); // dst + m2->_opnds[1] = immSrc; // src + m2->_opnds[2] = new iRegLdstOper(); // base // Initialize ins_attrib TOC fields. m1->_const_toc_offset = -1; @@ -2633,15 +2633,15 @@ nodes._last = nodes._large_lo; assert(m2->bottom_type()->isa_long(), "must be long"); } else { - loadConLNode *m2 = new (C) loadConLNode(); + loadConLNode *m2 = new loadConLNode(); // inputs for new nodes m2->add_req(NULL, toc); // operands for new nodes - m2->_opnds[0] = new (C) iRegLdstOper(); // dst - m2->_opnds[1] = immSrc; // src - m2->_opnds[2] = new (C) iRegPdstOper(); // toc + m2->_opnds[0] = new iRegLdstOper(); // dst + m2->_opnds[1] = immSrc; // src + m2->_opnds[2] = new iRegPdstOper(); // toc // Initialize ins_attrib instruction offset. m2->_cbuf_insts_offset = -1; @@ -2750,20 +2750,20 @@ const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; if (large_constant_pool) { // Create new nodes. - loadConP_hiNode *m1 = new (C) loadConP_hiNode(); - loadConP_loNode *m2 = new (C) loadConP_loNode(); + loadConP_hiNode *m1 = new loadConP_hiNode(); + loadConP_loNode *m2 = new loadConP_loNode(); // inputs for new nodes m1->add_req(NULL, n_toc); m2->add_req(NULL, m1); // operands for new nodes - m1->_opnds[0] = new (C) iRegPdstOper(); // dst - m1->_opnds[1] = op_src; // src - m1->_opnds[2] = new (C) iRegPdstOper(); // toc - m2->_opnds[0] = new (C) iRegPdstOper(); // dst - m2->_opnds[1] = op_src; // src - m2->_opnds[2] = new (C) iRegLdstOper(); // base + m1->_opnds[0] = new iRegPdstOper(); // dst + m1->_opnds[1] = op_src; // src + m1->_opnds[2] = new iRegPdstOper(); // toc + m2->_opnds[0] = new iRegPdstOper(); // dst + m2->_opnds[1] = op_src; // src + m2->_opnds[2] = new iRegLdstOper(); // base // Initialize ins_attrib TOC fields. m1->_const_toc_offset = -1; @@ -2777,15 +2777,15 @@ nodes->push(m2); assert(m2->bottom_type()->isa_ptr(), "must be ptr"); } else { - loadConPNode *m2 = new (C) loadConPNode(); + loadConPNode *m2 = new loadConPNode(); // inputs for new nodes m2->add_req(NULL, n_toc); // operands for new nodes - m2->_opnds[0] = new (C) iRegPdstOper(); // dst - m2->_opnds[1] = op_src; // src - m2->_opnds[2] = new (C) iRegPdstOper(); // toc + m2->_opnds[0] = new iRegPdstOper(); // dst + m2->_opnds[1] = op_src; // src + m2->_opnds[2] = new iRegPdstOper(); // toc // Register allocation for new nodes. ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); @@ -2802,9 +2802,9 @@ MachNode *m2; if (large_constant_pool) { - m2 = new (C) loadConFCompNode(); + m2 = new loadConFCompNode(); } else { - m2 = new (C) loadConFNode(); + m2 = new loadConFNode(); } // inputs for new nodes m2->add_req(NULL, n_toc); @@ -2812,7 +2812,7 @@ // operands for new nodes m2->_opnds[0] = op_dst; m2->_opnds[1] = op_src; - m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase + m2->_opnds[2] = new iRegPdstOper(); // constanttablebase // register allocation for new nodes ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); @@ -2826,9 +2826,9 @@ MachNode *m2; if (large_constant_pool) { - m2 = new (C) loadConDCompNode(); + m2 = new loadConDCompNode(); } else { - m2 = new (C) loadConDNode(); + m2 = new loadConDNode(); } // inputs for new nodes m2->add_req(NULL, n_toc); @@ -2836,7 +2836,7 @@ // operands for new nodes m2->_opnds[0] = op_dst; m2->_opnds[1] = op_src; - m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase + m2->_opnds[2] = new iRegPdstOper(); // constanttablebase // register allocation for new nodes ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); @@ -2918,15 +2918,15 @@ if (VM_Version::has_isel()) { // use isel instruction with Power 7 - cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node(); - encodeP_subNode *n_sub_base = new (C) encodeP_subNode(); - encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode(); - cond_set_0_oopNode *n_cond_set = new (C) cond_set_0_oopNode(); + cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node(); + encodeP_subNode *n_sub_base = new encodeP_subNode(); + encodeP_shiftNode *n_shift = new encodeP_shiftNode(); + cond_set_0_oopNode *n_cond_set = new cond_set_0_oopNode(); n_compare->add_req(n_region, n_src); n_compare->_opnds[0] = op_crx; n_compare->_opnds[1] = op_src; - n_compare->_opnds[2] = new (C) immL16Oper(0); + n_compare->_opnds[2] = new immL16Oper(0); n_sub_base->add_req(n_region, n_src); n_sub_base->_opnds[0] = op_dst; @@ -2956,10 +2956,10 @@ } else { // before Power 7 - moveRegNode *n_move = new (C) moveRegNode(); - cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node(); - encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode(); - cond_sub_baseNode *n_sub_base = new (C) cond_sub_baseNode(); + moveRegNode *n_move = new moveRegNode(); + cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node(); + encodeP_shiftNode *n_shift = new encodeP_shiftNode(); + cond_sub_baseNode *n_sub_base = new cond_sub_baseNode(); n_move->add_req(n_region, n_src); n_move->_opnds[0] = op_dst; @@ -2971,7 +2971,7 @@ n_compare->_opnds[0] = op_crx; n_compare->_opnds[1] = op_src; - n_compare->_opnds[2] = new (C) immL16Oper(0); + n_compare->_opnds[2] = new immL16Oper(0); n_sub_base->add_req(n_region, n_compare, n_src); n_sub_base->_opnds[0] = op_dst; @@ -3000,13 +3000,13 @@ enc_class postalloc_expand_encode_oop_not_null(iRegNdst dst, iRegPdst src) %{ - encodeP_subNode *n1 = new (C) encodeP_subNode(); + encodeP_subNode *n1 = new encodeP_subNode(); n1->add_req(n_region, n_src); n1->_opnds[0] = op_dst; n1->_opnds[1] = op_src; n1->_bottom_type = _bottom_type; - encodeP_shiftNode *n2 = new (C) encodeP_shiftNode(); + encodeP_shiftNode *n2 = new encodeP_shiftNode(); n2->add_req(n_region, n1); n2->_opnds[0] = op_dst; n2->_opnds[1] = op_dst; @@ -3020,13 +3020,13 @@ %} enc_class postalloc_expand_decode_oop(iRegPdst dst, iRegNsrc src, flagsReg crx) %{ - decodeN_shiftNode *n_shift = new (C) decodeN_shiftNode(); - cmpN_reg_imm0Node *n_compare = new (C) cmpN_reg_imm0Node(); + decodeN_shiftNode *n_shift = new decodeN_shiftNode(); + cmpN_reg_imm0Node *n_compare = new cmpN_reg_imm0Node(); n_compare->add_req(n_region, n_src); n_compare->_opnds[0] = op_crx; n_compare->_opnds[1] = op_src; - n_compare->_opnds[2] = new (C) immN_0Oper(TypeNarrowOop::NULL_PTR); + n_compare->_opnds[2] = new immN_0Oper(TypeNarrowOop::NULL_PTR); n_shift->add_req(n_region, n_src); n_shift->_opnds[0] = op_dst; @@ -3036,13 +3036,13 @@ if (VM_Version::has_isel()) { // use isel instruction with Power 7 - decodeN_addNode *n_add_base = new (C) decodeN_addNode(); + decodeN_addNode *n_add_base = new decodeN_addNode(); n_add_base->add_req(n_region, n_shift); n_add_base->_opnds[0] = op_dst; n_add_base->_opnds[1] = op_dst; n_add_base->_bottom_type = _bottom_type; - cond_set_0_ptrNode *n_cond_set = new (C) cond_set_0_ptrNode(); + cond_set_0_ptrNode *n_cond_set = new cond_set_0_ptrNode(); n_cond_set->add_req(n_region, n_compare, n_add_base); n_cond_set->_opnds[0] = op_dst; n_cond_set->_opnds[1] = op_crx; @@ -3064,7 +3064,7 @@ } else { // before Power 7 - cond_add_baseNode *n_add_base = new (C) cond_add_baseNode(); + cond_add_baseNode *n_add_base = new cond_add_baseNode(); n_add_base->add_req(n_region, n_compare, n_shift); n_add_base->_opnds[0] = op_dst; @@ -3086,13 +3086,13 @@ %} enc_class postalloc_expand_decode_oop_not_null(iRegPdst dst, iRegNsrc src) %{ - decodeN_shiftNode *n1 = new (C) decodeN_shiftNode(); + decodeN_shiftNode *n1 = new decodeN_shiftNode(); n1->add_req(n_region, n_src); n1->_opnds[0] = op_dst; n1->_opnds[1] = op_src; n1->_bottom_type = _bottom_type; - decodeN_addNode *n2 = new (C) decodeN_addNode(); + decodeN_addNode *n2 = new decodeN_addNode(); n2->add_req(n_region, n1); n2->_opnds[0] = op_dst; n2->_opnds[1] = op_dst; @@ -3388,7 +3388,7 @@ // Create new nodes. // Make an operand with the bit pattern to load as float. - immLOper *op_repl = new (C) immLOper((jlong)replicate_immF(op_src->constantF())); + immLOper *op_repl = new immLOper((jlong)replicate_immF(op_src->constantF())); loadConLNodesTuple loadConLNodes = loadConLNodesTuple_create(C, ra_, n_toc, op_repl, @@ -3611,11 +3611,11 @@ // Create the nodes for loading the IC from the TOC. loadConLNodesTuple loadConLNodes_IC = - loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong)Universe::non_oop_word()), + loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong)Universe::non_oop_word()), OptoReg::Name(R19_H_num), OptoReg::Name(R19_num)); // Create the call node. - CallDynamicJavaDirectSchedNode *call = new (C) CallDynamicJavaDirectSchedNode(); + CallDynamicJavaDirectSchedNode *call = new CallDynamicJavaDirectSchedNode(); call->_method_handle_invoke = _method_handle_invoke; call->_vtable_index = _vtable_index; call->_method = _method; @@ -3765,7 +3765,7 @@ #if defined(ABI_ELFv2) jlong entry_address = (jlong) this->entry_point(); assert(entry_address, "need address here"); - loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address), + loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address), OptoReg::Name(R12_H_num), OptoReg::Name(R12_num)); #else // Get the struct that describes the function we are about to call. @@ -3777,42 +3777,42 @@ loadConLNodesTuple loadConLNodes_Toc; // Create nodes and operands for loading the entry point. - loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address), + loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address), OptoReg::Name(R12_H_num), OptoReg::Name(R12_num)); // Create nodes and operands for loading the env pointer. if (fd->env() != NULL) { - loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->env()), + loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->env()), OptoReg::Name(R11_H_num), OptoReg::Name(R11_num)); } else { loadConLNodes_Env._large_hi = NULL; loadConLNodes_Env._large_lo = NULL; loadConLNodes_Env._small = NULL; - loadConLNodes_Env._last = new (C) loadConL16Node(); - loadConLNodes_Env._last->_opnds[0] = new (C) iRegLdstOper(); - loadConLNodes_Env._last->_opnds[1] = new (C) immL16Oper(0); + loadConLNodes_Env._last = new loadConL16Node(); + loadConLNodes_Env._last->_opnds[0] = new iRegLdstOper(); + loadConLNodes_Env._last->_opnds[1] = new immL16Oper(0); ra_->set_pair(loadConLNodes_Env._last->_idx, OptoReg::Name(R11_H_num), OptoReg::Name(R11_num)); } // Create nodes and operands for loading the Toc point. - loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->toc()), + loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->toc()), OptoReg::Name(R2_H_num), OptoReg::Name(R2_num)); #endif // ABI_ELFv2 // mtctr node - MachNode *mtctr = new (C) CallLeafDirect_mtctrNode(); + MachNode *mtctr = new CallLeafDirect_mtctrNode(); assert(loadConLNodes_Entry._last != NULL, "entry must exist"); mtctr->add_req(0, loadConLNodes_Entry._last); - mtctr->_opnds[0] = new (C) iRegLdstOper(); - mtctr->_opnds[1] = new (C) iRegLdstOper(); + mtctr->_opnds[0] = new iRegLdstOper(); + mtctr->_opnds[1] = new iRegLdstOper(); // call node - MachCallLeafNode *call = new (C) CallLeafDirectNode(); + MachCallLeafNode *call = new CallLeafDirectNode(); call->_opnds[0] = _opnds[0]; - call->_opnds[1] = new (C) methodOper((intptr_t) entry_address); // May get set later. + call->_opnds[1] = new methodOper((intptr_t) entry_address); // May get set later. // Make the new call node look like the old one. call->_name = _name; @@ -6050,9 +6050,9 @@ format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask postalloc_expand %{ - MachNode *m1 = new (C) loadConN_hiNode(); - MachNode *m2 = new (C) loadConN_loNode(); - MachNode *m3 = new (C) clearMs32bNode(); + MachNode *m1 = new loadConN_hiNode(); + MachNode *m2 = new loadConN_loNode(); + MachNode *m3 = new clearMs32bNode(); m1->add_req(NULL); m2->add_req(NULL, m1); m3->add_req(NULL, m2); @@ -6117,7 +6117,7 @@ format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask postalloc_expand %{ // Load high bits into register. Sign extended. - MachNode *m1 = new (C) loadConNKlass_hiNode(); + MachNode *m1 = new loadConNKlass_hiNode(); m1->add_req(NULL); m1->_opnds[0] = op_dst; m1->_opnds[1] = op_src; @@ -6127,7 +6127,7 @@ MachNode *m2 = m1; if (!Assembler::is_uimm((jlong)Klass::encode_klass((Klass *)op_src->constant()), 31)) { // Value might be 1-extended. Mask out these bits. - m2 = new (C) clearMs32bNode(); + m2 = new clearMs32bNode(); m2->add_req(NULL, m1); m2->_opnds[0] = op_dst; m2->_opnds[1] = op_dst; @@ -6135,7 +6135,7 @@ nodes->push(m2); } - MachNode *m3 = new (C) loadConNKlass_loNode(); + MachNode *m3 = new loadConNKlass_loNode(); m3->add_req(NULL, m2); m3->_opnds[0] = op_dst; m3->_opnds[1] = op_src; @@ -6987,14 +6987,14 @@ format %{ "EncodePKlass $dst, $src\t// $src != Null, postalloc expanded" %} postalloc_expand %{ - encodePKlass_sub_baseNode *n1 = new (C) encodePKlass_sub_baseNode(); + encodePKlass_sub_baseNode *n1 = new encodePKlass_sub_baseNode(); n1->add_req(n_region, n_base, n_src); n1->_opnds[0] = op_dst; n1->_opnds[1] = op_base; n1->_opnds[2] = op_src; n1->_bottom_type = _bottom_type; - encodePKlass_shiftNode *n2 = new (C) encodePKlass_shiftNode(); + encodePKlass_shiftNode *n2 = new encodePKlass_shiftNode(); n2->add_req(n_region, n1); n2->_opnds[0] = op_dst; n2->_opnds[1] = op_dst; @@ -7064,14 +7064,14 @@ format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != NULL, postalloc expanded" %} postalloc_expand %{ - decodeNKlass_add_baseNode *n1 = new (C) decodeNKlass_add_baseNode(); + decodeNKlass_add_baseNode *n1 = new decodeNKlass_add_baseNode(); n1->add_req(n_region, n_base, n_src); n1->_opnds[0] = op_dst; n1->_opnds[1] = op_base; n1->_opnds[2] = op_src; n1->_bottom_type = _bottom_type; - decodeNKlass_shiftNode *n2 = new (C) decodeNKlass_shiftNode(); + decodeNKlass_shiftNode *n2 = new decodeNKlass_shiftNode(); n2->add_req(n_region, n1); n2->_opnds[0] = op_dst; n2->_opnds[1] = op_dst; @@ -9773,8 +9773,8 @@ // // Create new nodes. - MachNode *m1 = new (C) loadConI16Node(); - MachNode *m2 = new (C) cmovI_bso_stackSlotLNode(); + MachNode *m1 = new loadConI16Node(); + MachNode *m2 = new cmovI_bso_stackSlotLNode(); // inputs for new nodes m1->add_req(n_region); @@ -9785,7 +9785,7 @@ // operands for new nodes m1->_opnds[0] = op_dst; - m1->_opnds[1] = new (C) immI16Oper(0); + m1->_opnds[1] = new immI16Oper(0); m2->_opnds[0] = op_dst; m2->_opnds[1] = op_crx; @@ -9942,8 +9942,8 @@ // // Create new nodes. - MachNode *m1 = new (C) loadConL16Node(); - MachNode *m2 = new (C) cmovL_bso_stackSlotLNode(); + MachNode *m1 = new loadConL16Node(); + MachNode *m2 = new cmovL_bso_stackSlotLNode(); // inputs for new nodes m1->add_req(n_region); @@ -9952,7 +9952,7 @@ // operands for new nodes m1->_opnds[0] = op_dst; - m1->_opnds[1] = new (C) immL16Oper(0); + m1->_opnds[1] = new immL16Oper(0); m2->_opnds[0] = op_dst; m2->_opnds[1] = op_crx; m2->_opnds[2] = op_mem; @@ -10288,8 +10288,8 @@ // // Create new nodes. - MachNode *m1 = new (C) loadConI16Node(); - MachNode *m2 = new (C) cmovI_conIvalueMinus1_conIvalue1Node(); + MachNode *m1 = new loadConI16Node(); + MachNode *m2 = new cmovI_conIvalueMinus1_conIvalue1Node(); // inputs for new nodes m1->add_req(n_region); @@ -10298,7 +10298,7 @@ // operands for new nodes m1->_opnds[0] = op_dst; - m1->_opnds[1] = new (C) immI16Oper(0); + m1->_opnds[1] = new immI16Oper(0); m2->_opnds[0] = op_dst; m2->_opnds[1] = op_crx; @@ -10623,8 +10623,8 @@ // // Create new nodes. - MachNode *m1 = new (C) cmpFUnordered_reg_regNode(); - MachNode *m2 = new (C) cmov_bns_lessNode(); + MachNode *m1 = new cmpFUnordered_reg_regNode(); + MachNode *m2 = new cmov_bns_lessNode(); // inputs for new nodes m1->add_req(n_region, n_src1, n_src2); @@ -10698,8 +10698,8 @@ // // create new nodes - MachNode *m1 = new (C) cmpDUnordered_reg_regNode(); - MachNode *m2 = new (C) cmov_bns_lessNode(); + MachNode *m1 = new cmpDUnordered_reg_regNode(); + MachNode *m2 = new cmov_bns_lessNode(); // inputs for new nodes m1->add_req(n_region, n_src1, n_src2); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/assembler_sparc.hpp --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -123,6 +123,7 @@ fpop2_op3 = 0x35, impdep1_op3 = 0x36, aes3_op3 = 0x36, + sha_op3 = 0x36, alignaddr_op3 = 0x36, faligndata_op3 = 0x36, flog3_op3 = 0x36, @@ -223,7 +224,11 @@ mwtos_opf = 0x119, aes_kexpand0_opf = 0x130, - aes_kexpand2_opf = 0x131 + aes_kexpand2_opf = 0x131, + + sha1_opf = 0x141, + sha256_opf = 0x142, + sha512_opf = 0x143 }; enum op5s { @@ -595,6 +600,11 @@ // AES crypto instructions supported only on certain processors static void aes_only() { assert( VM_Version::has_aes(), "This instruction only works on SPARC with AES instructions support"); } + // SHA crypto instructions supported only on certain processors + static void sha1_only() { assert( VM_Version::has_sha1(), "This instruction only works on SPARC with SHA1"); } + static void sha256_only() { assert( VM_Version::has_sha256(), "This instruction only works on SPARC with SHA256"); } + static void sha512_only() { assert( VM_Version::has_sha512(), "This instruction only works on SPARC with SHA512"); } + // instruction only in VIS1 static void vis1_only() { assert( VM_Version::has_vis1(), "This instruction only works on SPARC with VIS1"); } @@ -1179,7 +1189,6 @@ u_field(3, 29, 25) | immed(true) | simm(simm13a, 13)); } inline void wrfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); } - // VIS1 instructions void alignaddr( Register s1, Register s2, Register d ) { vis1_only(); emit_int32( op(arith_op) | rd(d) | op3(alignaddr_op3) | rs1(s1) | opf(alignaddr_opf) | rs2(s2)); } @@ -1203,6 +1212,12 @@ void movwtos( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(mftoi_op3) | opf(mwtos_opf) | rs2(s)); } void movxtod( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(mftoi_op3) | opf(mxtod_opf) | rs2(s)); } + // Crypto SHA instructions + + void sha1() { sha1_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha1_opf)); } + void sha256() { sha256_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha256_opf)); } + void sha512() { sha512_only(); emit_int32( op(arith_op) | op3(sha_op3) | opf(sha512_opf)); } + // Creation Assembler(CodeBuffer* code) : AbstractAssembler(code) { #ifdef CHECK_DELAY diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1612,13 +1612,10 @@ __ set((intptr_t)os::get_polling_page(), tmp->as_register()); if (info != NULL) { add_debug_info_for_branch(info); - } else { - __ relocate(relocInfo::poll_type); } - int offset = __ offset(); + __ relocate(relocInfo::poll_type); __ ld_ptr(tmp->as_register(), 0, G0); - return offset; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -872,21 +872,19 @@ void LIRGenerator::do_NewInstance(NewInstance* x) { + print_if_not_loaded(x); + // This instruction can be deoptimized in the slow path : use // O0 as result register. const LIR_Opr reg = result_register_for(x->type()); -#ifndef PRODUCT - if (PrintNotLoaded && !x->klass()->is_loaded()) { - tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); - } -#endif + CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr tmp1 = FrameMap::G1_oop_opr; LIR_Opr tmp2 = FrameMap::G3_oop_opr; LIR_Opr tmp3 = FrameMap::G4_oop_opr; LIR_Opr tmp4 = FrameMap::O1_oop_opr; LIR_Opr klass_reg = FrameMap::G5_metadata_opr; - new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info); + new_instance(reg, x->klass(), x->is_unresolved(), tmp1, tmp2, tmp3, tmp4, klass_reg, info); LIR_Opr result = rlock_result(x); __ move(reg, result); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -135,7 +135,7 @@ if (TraceICs) { ResourceMark rm; tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s", - instruction_address(), + p2i(instruction_address()), callee->name_and_sig_as_C_string()); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/debug_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/debug_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/debug_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -42,20 +42,24 @@ intptr_t *pc = NULL; intptr_t *next_pc = NULL; int count = 0; - tty->print("register window backtrace from %#x:\n", sp); + tty->print_cr("register window backtrace from " INTPTR_FORMAT ":", p2i(sp)); while (sp != NULL && ((intptr_t)sp & 7) == 0 && sp > prev_sp && sp < prev_sp+1000) { pc = next_pc; next_pc = (intptr_t*) sp[I7->sp_offset_in_saved_window()]; - tty->print("[%d] sp=%#x pc=", count, sp); + tty->print("[%d] sp=" INTPTR_FORMAT " pc=", count, p2i(sp)); findpc((intptr_t)pc); if (WizardMode && Verbose) { // print register window contents also - tty->print_cr(" L0..L7: {%#x %#x %#x %#x %#x %#x %#x %#x}", - sp[0+0],sp[0+1],sp[0+2],sp[0+3], - sp[0+4],sp[0+5],sp[0+6],sp[0+7]); - tty->print_cr(" I0..I7: {%#x %#x %#x %#x %#x %#x %#x %#x}", - sp[8+0],sp[8+1],sp[8+2],sp[8+3], - sp[8+4],sp[8+5],sp[8+6],sp[8+7]); + tty->print_cr(" L0..L7: {" + INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " + INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " ", + sp[0+0], sp[0+1], sp[0+2], sp[0+3], + sp[0+4], sp[0+5], sp[0+6], sp[0+7]); + tty->print_cr(" I0..I7: {" + INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " + INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " ", + sp[8+0], sp[8+1], sp[8+2], sp[8+3], + sp[8+4], sp[8+5], sp[8+6], sp[8+7]); // (and print stack frame contents too??) CodeBlob *b = CodeCache::find_blob((address) pc); @@ -74,7 +78,7 @@ count += 1; } if (sp != NULL) - tty->print("[%d] sp=%#x [bogus sp!]", count, sp); + tty->print("[%d] sp=" INTPTR_FORMAT " [bogus sp!]", count, p2i(sp)); } #endif // PRODUCT diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/frame_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -557,7 +557,8 @@ // QQQ this assert is invalid (or too strong anyway) sice _pc could // be original pc and frame could have the deopt pc. // assert(_pc == *O7_addr() + pc_return_offset, "frame has wrong pc"); - tty->print_cr("patch_pc at address 0x%x [0x%x -> 0x%x] ", O7_addr(), _pc, pc); + tty->print_cr("patch_pc at address " INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "]", + p2i(O7_addr()), p2i(_pc), p2i(pc)); } _cb = CodeCache::find_blob(pc); *O7_addr() = pc - pc_return_offset; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1202,7 +1202,7 @@ if ( j != last ) s->print(" - f%d", last); s->print(" = %f", val); s->fill_to(25); - s->print_cr(" (0x%x)", val); + s->print_cr(" (0x%x)", *(int*)&val); j = last + 1; } s->cr(); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -483,7 +483,7 @@ const char* mh_reg_name = has_mh ? "G3_mh" : "G3"; tty->print_cr("MH %s %s="INTPTR_FORMAT " saved_sp=" INTPTR_FORMAT " args=" INTPTR_FORMAT, adaptername, mh_reg_name, - (intptr_t) mh, saved_sp, args); + p2i(mh), p2i(saved_sp), p2i(args)); if (Verbose) { // dumping last frame with frame::describe diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -78,7 +78,7 @@ } void NativeInstruction::print() { - tty->print_cr(INTPTR_FORMAT ": 0x%x", addr_at(0), long_at(0)); + tty->print_cr(INTPTR_FORMAT ": 0x%x", p2i(addr_at(0)), long_at(0)); } void NativeInstruction::set_long_at(int offset, int i) { @@ -142,7 +142,7 @@ } void NativeCall::print() { - tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, instruction_address(), destination()); + tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, p2i(instruction_address()), p2i(destination())); } @@ -271,7 +271,7 @@ } void NativeFarCall::print() { - tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, instruction_address(), destination()); + tty->print_cr(INTPTR_FORMAT ": call " INTPTR_FORMAT, p2i(instruction_address()), p2i(destination())); } bool NativeFarCall::destination_is_compiled_verified_entry_point() { @@ -324,7 +324,7 @@ void NativeMovConstReg::print() { - tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, instruction_address(), data()); + tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, p2i(instruction_address()), data()); } @@ -446,7 +446,7 @@ void NativeMovConstRegPatching::print() { - tty->print_cr(INTPTR_FORMAT ": mov reg, " INTPTR_FORMAT, instruction_address(), data()); + tty->print_cr(INTPTR_FORMAT ": mov reg, 0x%x", p2i(instruction_address()), data()); } @@ -585,9 +585,10 @@ void NativeMovRegMem::print() { if (is_immediate()) { - tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %x]", instruction_address(), offset()); + // offset is a signed 13-bit immediate, so casting it to int will not lose significant bits + tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %d]", p2i(instruction_address()), (int)offset()); } else { - tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", instruction_address()); + tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", p2i(instruction_address())); } } @@ -689,149 +690,6 @@ // End code for unit testing implementation of NativeMovRegMem class -//-------------------------------------------------------------------------------- - - -void NativeMovRegMemPatching::copy_instruction_to(address new_instruction_address) { - Untested("copy_instruction_to"); - int instruction_size = next_instruction_address() - instruction_address(); - for (int i = 0; i < instruction_size; i += wordSize) { - *(long*)(new_instruction_address + i) = *(long*)(address(this) + i); - } -} - - -void NativeMovRegMemPatching::verify() { - NativeInstruction::verify(); - // make sure code pattern is actually a "ld" or "st" of some sort. - int i0 = long_at(0); - int op3 = inv_op3(i0); - - assert((int)nop_offset == (int)NativeMovConstReg::add_offset, "sethi size ok"); - - if (!(is_op(i0, Assembler::ldst_op) && - inv_immed(i0) && - 0 != (op3 < op3_ldst_int_limit - ? (1 << op3 ) & (op3_mask_ld | op3_mask_st) - : (1 << (op3 - op3_ldst_int_limit)) & (op3_mask_ldf | op3_mask_stf)))) { - int i1 = long_at(ldst_offset); - Register rd = inv_rd(i0); - - op3 = inv_op3(i1); - if (!is_op(i1, Assembler::ldst_op) && rd == inv_rs2(i1) && - 0 != (op3 < op3_ldst_int_limit - ? (1 << op3 ) & (op3_mask_ld | op3_mask_st) - : (1 << (op3 - op3_ldst_int_limit)) & (op3_mask_ldf | op3_mask_stf))) { - fatal("not a ld* or st* op"); - } - } -} - - -void NativeMovRegMemPatching::print() { - if (is_immediate()) { - tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + %x]", instruction_address(), offset()); - } else { - tty->print_cr(INTPTR_FORMAT ": mov reg, [reg + reg]", instruction_address()); - } -} - - -// Code for unit testing implementation of NativeMovRegMemPatching class -void NativeMovRegMemPatching::test() { -#ifdef ASSERT - ResourceMark rm; - CodeBuffer cb("test", 1000, 1000); - MacroAssembler* a = new MacroAssembler(&cb); - NativeMovRegMemPatching* nm; - uint idx = 0; - uint idx1; - int offsets[] = { - 0x0, - 0xffffffff, - 0x7fffffff, - 0x80000000, - 4096, - 4097, - 0x20, - 0x4000, - }; - - VM_Version::allow_all(); - - AddressLiteral al(0xffffffff, relocInfo::external_word_type); - a->ldsw( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->ldsw( G5, I3, G4 ); idx++; - a->ldsb( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->ldsb( G5, I3, G4 ); idx++; - a->ldsh( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->ldsh( G5, I3, G4 ); idx++; - a->lduw( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->lduw( G5, I3, G4 ); idx++; - a->ldub( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->ldub( G5, I3, G4 ); idx++; - a->lduh( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->lduh( G5, I3, G4 ); idx++; - a->ldx( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->ldx( G5, I3, G4 ); idx++; - a->ldd( G5, al.low10(), G4); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->ldd( G5, I3, G4 ); idx++; - a->ldf( FloatRegisterImpl::D, O2, -1, F14 ); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->ldf( FloatRegisterImpl::S, O0, I3, F15 ); idx++; - - a->stw( G5, G4, al.low10()); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->stw( G5, G4, I3 ); idx++; - a->stb( G5, G4, al.low10()); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->stb( G5, G4, I3 ); idx++; - a->sth( G5, G4, al.low10()); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->sth( G5, G4, I3 ); idx++; - a->stx( G5, G4, al.low10()); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->stx( G5, G4, I3 ); idx++; - a->std( G5, G4, al.low10()); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->std( G5, G4, I3 ); idx++; - a->stf( FloatRegisterImpl::S, F18, O2, -1 ); idx++; - a->sethi(al, I3); a->nop(); a->add(I3, al.low10(), I3); - a->stf( FloatRegisterImpl::S, F15, O0, I3 ); idx++; - - nm = nativeMovRegMemPatching_at( cb.insts_begin() ); - nm->print(); - nm->set_offset( low10(0) ); - nm->print(); - nm->add_offset_in_bytes( low10(0xbb) * wordSize ); - nm->print(); - - while (--idx) { - nm = nativeMovRegMemPatching_at( nm->next_instruction_address() ); - nm->print(); - for (idx1 = 0; idx1 < ARRAY_SIZE(offsets); idx1++) { - nm->set_offset( nm->is_immediate() ? low10(offsets[idx1]) : offsets[idx1] ); - assert(nm->offset() == (nm->is_immediate() ? low10(offsets[idx1]) : offsets[idx1]), - "check unit test"); - nm->print(); - } - nm->add_offset_in_bytes( low10(0xbb) * wordSize ); - nm->print(); - } - - VM_Version::revert(); -#endif // ASSERT -} -// End code for unit testing implementation of NativeMovRegMemPatching class - //-------------------------------------------------------------------------------- @@ -863,7 +721,7 @@ void NativeJump::print() { - tty->print_cr(INTPTR_FORMAT ": jmpl reg, " INTPTR_FORMAT, instruction_address(), jump_destination()); + tty->print_cr(INTPTR_FORMAT ": jmpl reg, " INTPTR_FORMAT, p2i(instruction_address()), p2i(jump_destination())); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp --- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -38,7 +38,6 @@ // - - NativeMovConstReg // - - NativeMovConstRegPatching // - - NativeMovRegMem -// - - NativeMovRegMemPatching // - - NativeJump // - - NativeGeneralJump // - - NativeIllegalInstruction @@ -710,96 +709,6 @@ }; -// An interface for accessing/manipulating native memory ops -// ld* [reg + offset], reg -// st* reg, [reg + offset] -// sethi %hi(imm), reg; nop; add reg, %lo(imm), reg; ld* [reg1 + reg], reg2 -// sethi %hi(imm), reg; nop; add reg, %lo(imm), reg; st* reg2, [reg1 + reg] -// Ops covered: {lds,ldu,st}{w,b,h}, {ld,st}{d,x} -// -// Note that it is identical to NativeMovRegMem with the exception of a nop between the -// sethi and the add. The nop is required to be in the delay slot of the call instruction -// which overwrites the sethi during patching. -class NativeMovRegMemPatching; -inline NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address); -class NativeMovRegMemPatching: public NativeInstruction { - public: - enum Sparc_specific_constants { - op3_mask_ld = 1 << Assembler::lduw_op3 | - 1 << Assembler::ldub_op3 | - 1 << Assembler::lduh_op3 | - 1 << Assembler::ldd_op3 | - 1 << Assembler::ldsw_op3 | - 1 << Assembler::ldsb_op3 | - 1 << Assembler::ldsh_op3 | - 1 << Assembler::ldx_op3, - op3_mask_st = 1 << Assembler::stw_op3 | - 1 << Assembler::stb_op3 | - 1 << Assembler::sth_op3 | - 1 << Assembler::std_op3 | - 1 << Assembler::stx_op3, - op3_ldst_int_limit = Assembler::ldf_op3, - op3_mask_ldf = 1 << (Assembler::ldf_op3 - op3_ldst_int_limit) | - 1 << (Assembler::lddf_op3 - op3_ldst_int_limit), - op3_mask_stf = 1 << (Assembler::stf_op3 - op3_ldst_int_limit) | - 1 << (Assembler::stdf_op3 - op3_ldst_int_limit), - - offset_width = 13, - sethi_offset = 0, -#ifdef _LP64 - nop_offset = 7 * BytesPerInstWord, -#else - nop_offset = 4, -#endif - add_offset = nop_offset + BytesPerInstWord, - ldst_offset = add_offset + BytesPerInstWord - }; - bool is_immediate() const { - // check if instruction is ld* [reg + offset], reg or st* reg, [reg + offset] - int i0 = long_at(0); - return (is_op(i0, Assembler::ldst_op)); - } - - address instruction_address() const { return addr_at(0); } - address next_instruction_address() const { - return addr_at(is_immediate()? 4 : 16); - } - int offset() const { - return is_immediate()? inv_simm(long_at(0), offset_width) : - nativeMovConstRegPatching_at(addr_at(0))->data(); - } - void set_offset(int x) { - if (is_immediate()) { - guarantee(fits_in_simm(x, offset_width), "data block offset overflow"); - set_long_at(0, set_simm(long_at(0), x, offset_width)); - } - else - nativeMovConstRegPatching_at(addr_at(0))->set_data(x); - } - - void add_offset_in_bytes(intptr_t radd_offset) { - set_offset (offset() + radd_offset); - } - - void copy_instruction_to(address new_instruction_address); - - void verify(); - void print (); - - // unit test stuff - static void test(); - - private: - friend inline NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address) { - NativeMovRegMemPatching* test = (NativeMovRegMemPatching*)address; - #ifdef ASSERT - test->verify(); - #endif - return test; - } -}; - - // An interface for accessing/manipulating native jumps // jump_to addr // == sethi %hi22(addr), temp ; jumpl reg, %lo10(addr), G0 ; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/sparc.ad --- a/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 19:46:40 2017 +0200 @@ -1206,10 +1206,10 @@ } if (Assembler::is_simm13(-framesize)) { - st->print ("SAVE R_SP,-%d,R_SP",framesize); + st->print ("SAVE R_SP,-" SIZE_FORMAT ",R_SP",framesize); } else { - st->print_cr("SETHI R_SP,hi%%(-%d),R_G3",framesize); st->print("\t"); - st->print_cr("ADD R_G3,lo%%(-%d),R_G3",framesize); st->print("\t"); + st->print_cr("SETHI R_SP,hi%%(-" SIZE_FORMAT "),R_G3",framesize); st->print("\t"); + st->print_cr("ADD R_G3,lo%%(-" SIZE_FORMAT "),R_G3",framesize); st->print("\t"); st->print ("SAVE R_SP,R_G3,R_SP"); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -4575,6 +4575,219 @@ return start; } + address generate_sha1_implCompress(bool multi_block, const char *name) { + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", name); + address start = __ pc(); + + Label L_sha1_loop, L_sha1_unaligned_input, L_sha1_unaligned_input_loop; + int i; + + Register buf = O0; // byte[] source+offset + Register state = O1; // int[] SHA.state + Register ofs = O2; // int offset + Register limit = O3; // int limit + + // load state into F0-F4 + for (i = 0; i < 5; i++) { + __ ldf(FloatRegisterImpl::S, state, i*4, as_FloatRegister(i)); + } + + __ andcc(buf, 7, G0); + __ br(Assembler::notZero, false, Assembler::pn, L_sha1_unaligned_input); + __ delayed()->nop(); + + __ BIND(L_sha1_loop); + // load buf into F8-F22 + for (i = 0; i < 8; i++) { + __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8)); + } + __ sha1(); + if (multi_block) { + __ add(ofs, 64, ofs); + __ add(buf, 64, buf); + __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha1_loop); + __ mov(ofs, O0); // to be returned + } + + // store F0-F4 into state and return + for (i = 0; i < 4; i++) { + __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4); + } + __ retl(); + __ delayed()->stf(FloatRegisterImpl::S, F4, state, 0x10); + + __ BIND(L_sha1_unaligned_input); + __ alignaddr(buf, G0, buf); + + __ BIND(L_sha1_unaligned_input_loop); + // load buf into F8-F22 + for (i = 0; i < 9; i++) { + __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8)); + } + for (i = 0; i < 8; i++) { + __ faligndata(as_FloatRegister(i*2 + 8), as_FloatRegister(i*2 + 10), as_FloatRegister(i*2 + 8)); + } + __ sha1(); + if (multi_block) { + __ add(ofs, 64, ofs); + __ add(buf, 64, buf); + __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha1_unaligned_input_loop); + __ mov(ofs, O0); // to be returned + } + + // store F0-F4 into state and return + for (i = 0; i < 4; i++) { + __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4); + } + __ retl(); + __ delayed()->stf(FloatRegisterImpl::S, F4, state, 0x10); + + return start; + } + + address generate_sha256_implCompress(bool multi_block, const char *name) { + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", name); + address start = __ pc(); + + Label L_sha256_loop, L_sha256_unaligned_input, L_sha256_unaligned_input_loop; + int i; + + Register buf = O0; // byte[] source+offset + Register state = O1; // int[] SHA2.state + Register ofs = O2; // int offset + Register limit = O3; // int limit + + // load state into F0-F7 + for (i = 0; i < 8; i++) { + __ ldf(FloatRegisterImpl::S, state, i*4, as_FloatRegister(i)); + } + + __ andcc(buf, 7, G0); + __ br(Assembler::notZero, false, Assembler::pn, L_sha256_unaligned_input); + __ delayed()->nop(); + + __ BIND(L_sha256_loop); + // load buf into F8-F22 + for (i = 0; i < 8; i++) { + __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8)); + } + __ sha256(); + if (multi_block) { + __ add(ofs, 64, ofs); + __ add(buf, 64, buf); + __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha256_loop); + __ mov(ofs, O0); // to be returned + } + + // store F0-F7 into state and return + for (i = 0; i < 7; i++) { + __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4); + } + __ retl(); + __ delayed()->stf(FloatRegisterImpl::S, F7, state, 0x1c); + + __ BIND(L_sha256_unaligned_input); + __ alignaddr(buf, G0, buf); + + __ BIND(L_sha256_unaligned_input_loop); + // load buf into F8-F22 + for (i = 0; i < 9; i++) { + __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 8)); + } + for (i = 0; i < 8; i++) { + __ faligndata(as_FloatRegister(i*2 + 8), as_FloatRegister(i*2 + 10), as_FloatRegister(i*2 + 8)); + } + __ sha256(); + if (multi_block) { + __ add(ofs, 64, ofs); + __ add(buf, 64, buf); + __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha256_unaligned_input_loop); + __ mov(ofs, O0); // to be returned + } + + // store F0-F7 into state and return + for (i = 0; i < 7; i++) { + __ stf(FloatRegisterImpl::S, as_FloatRegister(i), state, i*4); + } + __ retl(); + __ delayed()->stf(FloatRegisterImpl::S, F7, state, 0x1c); + + return start; + } + + address generate_sha512_implCompress(bool multi_block, const char *name) { + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", name); + address start = __ pc(); + + Label L_sha512_loop, L_sha512_unaligned_input, L_sha512_unaligned_input_loop; + int i; + + Register buf = O0; // byte[] source+offset + Register state = O1; // long[] SHA5.state + Register ofs = O2; // int offset + Register limit = O3; // int limit + + // load state into F0-F14 + for (i = 0; i < 8; i++) { + __ ldf(FloatRegisterImpl::D, state, i*8, as_FloatRegister(i*2)); + } + + __ andcc(buf, 7, G0); + __ br(Assembler::notZero, false, Assembler::pn, L_sha512_unaligned_input); + __ delayed()->nop(); + + __ BIND(L_sha512_loop); + // load buf into F16-F46 + for (i = 0; i < 16; i++) { + __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 16)); + } + __ sha512(); + if (multi_block) { + __ add(ofs, 128, ofs); + __ add(buf, 128, buf); + __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha512_loop); + __ mov(ofs, O0); // to be returned + } + + // store F0-F14 into state and return + for (i = 0; i < 7; i++) { + __ stf(FloatRegisterImpl::D, as_FloatRegister(i*2), state, i*8); + } + __ retl(); + __ delayed()->stf(FloatRegisterImpl::D, F14, state, 0x38); + + __ BIND(L_sha512_unaligned_input); + __ alignaddr(buf, G0, buf); + + __ BIND(L_sha512_unaligned_input_loop); + // load buf into F16-F46 + for (i = 0; i < 17; i++) { + __ ldf(FloatRegisterImpl::D, buf, i*8, as_FloatRegister(i*2 + 16)); + } + for (i = 0; i < 16; i++) { + __ faligndata(as_FloatRegister(i*2 + 16), as_FloatRegister(i*2 + 18), as_FloatRegister(i*2 + 16)); + } + __ sha512(); + if (multi_block) { + __ add(ofs, 128, ofs); + __ add(buf, 128, buf); + __ cmp_and_brx_short(ofs, limit, Assembler::lessEqual, Assembler::pt, L_sha512_unaligned_input_loop); + __ mov(ofs, O0); // to be returned + } + + // store F0-F14 into state and return + for (i = 0; i < 7; i++) { + __ stf(FloatRegisterImpl::D, as_FloatRegister(i*2), state, i*8); + } + __ retl(); + __ delayed()->stf(FloatRegisterImpl::D, F14, state, 0x38); + + return start; + } + void generate_initial() { // Generates all stubs and initializes the entry points @@ -4647,6 +4860,20 @@ StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel(); } + + // generate SHA1/SHA256/SHA512 intrinsics code + if (UseSHA1Intrinsics) { + StubRoutines::_sha1_implCompress = generate_sha1_implCompress(false, "sha1_implCompress"); + StubRoutines::_sha1_implCompressMB = generate_sha1_implCompress(true, "sha1_implCompressMB"); + } + if (UseSHA256Intrinsics) { + StubRoutines::_sha256_implCompress = generate_sha256_implCompress(false, "sha256_implCompress"); + StubRoutines::_sha256_implCompressMB = generate_sha256_implCompress(true, "sha256_implCompressMB"); + } + if (UseSHA512Intrinsics) { + StubRoutines::_sha512_implCompress = generate_sha512_implCompress(false, "sha512_implCompress"); + StubRoutines::_sha512_implCompressMB = generate_sha512_implCompress(true, "sha512_implCompressMB"); + } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp --- a/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -41,7 +41,7 @@ enum /* platform_dependent_constants */ { // %%%%%%%% May be able to shrink this a lot code_size1 = 20000, // simply increase if too small (assembler will crash if too small) - code_size2 = 22000 // simply increase if too small (assembler will crash if too small) + code_size2 = 23000 // simply increase if too small (assembler will crash if too small) }; class Sparc { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1722,15 +1722,15 @@ if (caller->is_interpreted_frame()) { tty->print("interpreted "); } - tty->print_cr("caller fp=0x%x sp=0x%x", caller->fp(), caller->sp()); - tty->print_cr("save area = 0x%x, 0x%x", caller->sp(), caller->sp() + 16); - tty->print_cr("save area = 0x%x, 0x%x", caller->fp(), caller->fp() + 16); - tty->print_cr("interpreter fp=0x%x sp=0x%x", interpreter_frame->fp(), interpreter_frame->sp()); - tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->sp(), interpreter_frame->sp() + 16); - tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->fp(), interpreter_frame->fp() + 16); - tty->print_cr("Llocals = 0x%x", locals); - tty->print_cr("Lesp = 0x%x", esp); - tty->print_cr("Lmonitors = 0x%x", monitors); + tty->print_cr("caller fp=" INTPTR_FORMAT " sp=" INTPTR_FORMAT, p2i(caller->fp()), p2i(caller->sp())); + tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(caller->sp()), p2i(caller->sp() + 16)); + tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(caller->fp()), p2i(caller->fp() + 16)); + tty->print_cr("interpreter fp=" INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->fp()), p2i(interpreter_frame->sp())); + tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->sp()), p2i(interpreter_frame->sp() + 16)); + tty->print_cr("save area = " INTPTR_FORMAT ", " INTPTR_FORMAT, p2i(interpreter_frame->fp()), p2i(interpreter_frame->fp() + 16)); + tty->print_cr("Llocals = " INTPTR_FORMAT, p2i(locals)); + tty->print_cr("Lesp = " INTPTR_FORMAT, p2i(esp)); + tty->print_cr("Lmonitors = " INTPTR_FORMAT, p2i(monitors)); } if (method->max_locals() > 0) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -234,7 +234,7 @@ assert((OptoLoopAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size"); char buf[512]; - jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", (has_v9() ? ", v9" : (has_v8() ? ", v8" : "")), (has_hardware_popc() ? ", popc" : ""), (has_vis1() ? ", vis1" : ""), @@ -243,6 +243,9 @@ (has_blk_init() ? ", blk_init" : ""), (has_cbcond() ? ", cbcond" : ""), (has_aes() ? ", aes" : ""), + (has_sha1() ? ", sha1" : ""), + (has_sha256() ? ", sha256" : ""), + (has_sha512() ? ", sha512" : ""), (is_ultra3() ? ", ultra3" : ""), (is_sun4v() ? ", sun4v" : ""), (is_niagara_plus() ? ", niagara_plus" : (is_niagara() ? ", niagara" : "")), @@ -301,6 +304,58 @@ } } + // SHA1, SHA256, and SHA512 instructions were added to SPARC T-series at different times + if (has_sha1() || has_sha256() || has_sha512()) { + if (UseVIS > 0) { // SHA intrinsics use VIS1 instructions + if (FLAG_IS_DEFAULT(UseSHA)) { + FLAG_SET_DEFAULT(UseSHA, true); + } + } else { + if (UseSHA) { + warning("SPARC SHA intrinsics require VIS1 instruction support. Intrinsics will be disabled."); + FLAG_SET_DEFAULT(UseSHA, false); + } + } + } else if (UseSHA) { + warning("SHA instructions are not available on this CPU"); + FLAG_SET_DEFAULT(UseSHA, false); + } + + if (!UseSHA) { + FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); + FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); + FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); + } else { + if (has_sha1()) { + if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA1Intrinsics, true); + } + } else if (UseSHA1Intrinsics) { + warning("SHA1 instruction is not available on this CPU."); + FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); + } + if (has_sha256()) { + if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA256Intrinsics, true); + } + } else if (UseSHA256Intrinsics) { + warning("SHA256 instruction (for SHA-224 and SHA-256) is not available on this CPU."); + FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); + } + + if (has_sha512()) { + if (FLAG_IS_DEFAULT(UseSHA512Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA512Intrinsics, true); + } + } else if (UseSHA512Intrinsics) { + warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU."); + FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); + } + if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA, false); + } + } + if (FLAG_IS_DEFAULT(ContendedPaddingWidth) && (cache_line_size > ContendedPaddingWidth)) ContendedPaddingWidth = cache_line_size; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp --- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, 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 @@ -50,7 +50,10 @@ T_family = 16, T1_model = 17, sparc5_instructions = 18, - aes_instructions = 19 + aes_instructions = 19, + sha1_instruction = 20, + sha256_instruction = 21, + sha512_instruction = 22 }; enum Feature_Flag_Set { @@ -77,6 +80,9 @@ T1_model_m = 1 << T1_model, sparc5_instructions_m = 1 << sparc5_instructions, aes_instructions_m = 1 << aes_instructions, + sha1_instruction_m = 1 << sha1_instruction, + sha256_instruction_m = 1 << sha256_instruction, + sha512_instruction_m = 1 << sha512_instruction, generic_v8_m = v8_instructions_m | hardware_mul32_m | hardware_div32_m | hardware_fsmuld_m, generic_v9_m = generic_v8_m | v9_instructions_m, @@ -129,6 +135,9 @@ static bool has_cbcond() { return (_features & cbcond_instructions_m) != 0; } static bool has_sparc5_instr() { return (_features & sparc5_instructions_m) != 0; } static bool has_aes() { return (_features & aes_instructions_m) != 0; } + static bool has_sha1() { return (_features & sha1_instruction_m) != 0; } + static bool has_sha256() { return (_features & sha256_instruction_m) != 0; } + static bool has_sha512() { return (_features & sha512_instruction_m) != 0; } static bool supports_compare_and_exchange() { return has_v9(); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -111,7 +111,7 @@ if (PrintMiscellaneous && (WizardMode || Verbose)) { tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d", - vtable_index, s->entry_point(), + vtable_index, p2i(s->entry_point()), (int)(s->code_end() - s->entry_point()), (int)(s->code_end() - __ pc())); } @@ -206,7 +206,7 @@ if (PrintMiscellaneous && (WizardMode || Verbose)) { tty->print_cr("itable #%d at "PTR_FORMAT"[%d] left over: %d", - itable_index, s->entry_point(), + itable_index, p2i(s->entry_point()), (int)(s->code_end() - s->entry_point()), (int)(s->code_end() - __ pc())); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp --- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1085,14 +1085,11 @@ void LIRGenerator::do_NewInstance(NewInstance* x) { -#ifndef PRODUCT - if (PrintNotLoaded && !x->klass()->is_loaded()) { - tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci()); - } -#endif + print_if_not_loaded(x); + CodeEmitInfo* info = state_for(x, x->state()); LIR_Opr reg = result_register_for(x->type()); - new_instance(reg, x->klass(), + new_instance(reg, x->klass(), x->is_unresolved(), FrameMap::rcx_oop_opr, FrameMap::rdi_oop_opr, FrameMap::rsi_oop_opr, diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/x86/vm/nativeInst_x86.hpp --- a/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/x86/vm/nativeInst_x86.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -327,18 +327,6 @@ return test; } -class NativeMovRegMemPatching: public NativeMovRegMem { - private: - friend NativeMovRegMemPatching* nativeMovRegMemPatching_at (address address) { - NativeMovRegMemPatching* test = (NativeMovRegMemPatching*)(address - instruction_offset); - #ifdef ASSERT - test->verify(); - #endif - return test; - } -}; - - // An interface for accessing/manipulating native leal instruction of form: // leal reg, [reg + offset] diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/x86/vm/vm_version_x86.cpp --- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -590,6 +590,17 @@ FLAG_SET_DEFAULT(UseAESIntrinsics, false); } + if (UseSHA) { + warning("SHA instructions are not available on this CPU"); + FLAG_SET_DEFAULT(UseSHA, false); + } + if (UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics) { + warning("SHA intrinsics are not available on this CPU"); + FLAG_SET_DEFAULT(UseSHA1Intrinsics, false); + FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); + FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); + } + // Adjust RTM (Restricted Transactional Memory) flags if (!supports_rtm() && UseRTMLocking) { // Can't continue because UseRTMLocking affects UseBiasedLocking flag diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/cpu/x86/vm/x86_32.ad --- a/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 05 19:46:40 2017 +0200 @@ -1401,22 +1401,22 @@ // No transformation necessary. return; case INDIRECT: - new_memory = new (C) indirect_win95_safeOper( ); + new_memory = new indirect_win95_safeOper( ); break; case INDOFFSET8: - new_memory = new (C) indOffset8_win95_safeOper(memory->disp(NULL, NULL, 0)); + new_memory = new indOffset8_win95_safeOper(memory->disp(NULL, NULL, 0)); break; case INDOFFSET32: - new_memory = new (C) indOffset32_win95_safeOper(memory->disp(NULL, NULL, 0)); + new_memory = new indOffset32_win95_safeOper(memory->disp(NULL, NULL, 0)); break; case INDINDEXOFFSET: - new_memory = new (C) indIndexOffset_win95_safeOper(memory->disp(NULL, NULL, 0)); + new_memory = new indIndexOffset_win95_safeOper(memory->disp(NULL, NULL, 0)); break; case INDINDEXSCALE: - new_memory = new (C) indIndexScale_win95_safeOper(memory->scale()); + new_memory = new indIndexScale_win95_safeOper(memory->scale()); break; case INDINDEXSCALEOFFSET: - new_memory = new (C) indIndexScaleOffset_win95_safeOper(memory->scale(), memory->disp(NULL, NULL, 0)); + new_memory = new indIndexScaleOffset_win95_safeOper(memory->scale(), memory->disp(NULL, NULL, 0)); break; case LOAD_LONG_INDIRECT: case LOAD_LONG_INDOFFSET32: diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/os/aix/vm/os_aix.cpp --- a/hotspot/src/os/aix/vm/os_aix.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -4734,10 +4734,8 @@ // // Thread.interrupt and object.notify{All} both call Event::set. // That is, we treat thread.interrupt as a special case of notification. - // The underlying Solaris implementation, cond_timedwait, admits - // spurious/premature wakeups, but the JLS/JVM spec prevents the - // JVM from making those visible to Java code. As such, we must - // filter out spurious wakeups. We assume all ETIME returns are valid. + // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false. + // We assume all ETIME returns are valid. // // TODO: properly differentiate simultaneous notify+interrupt. // In that case, we should propagate the notify to another waiter. diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/os/bsd/vm/os_bsd.cpp --- a/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -4299,10 +4299,8 @@ // // Thread.interrupt and object.notify{All} both call Event::set. // That is, we treat thread.interrupt as a special case of notification. - // The underlying Solaris implementation, cond_timedwait, admits - // spurious/premature wakeups, but the JLS/JVM spec prevents the - // JVM from making those visible to Java code. As such, we must - // filter out spurious wakeups. We assume all ETIME returns are valid. + // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false. + // We assume all ETIME returns are valid. // // TODO: properly differentiate simultaneous notify+interrupt. // In that case, we should propagate the notify to another waiter. diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/os/linux/vm/os_linux.cpp --- a/hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -5538,10 +5538,8 @@ // // Thread.interrupt and object.notify{All} both call Event::set. // That is, we treat thread.interrupt as a special case of notification. - // The underlying Solaris implementation, cond_timedwait, admits - // spurious/premature wakeups, but the JLS/JVM spec prevents the - // JVM from making those visible to Java code. As such, we must - // filter out spurious wakeups. We assume all ETIME returns are valid. + // We ignore spurious OS wakeups unless FilterSpuriousWakeups is false. + // We assume all ETIME returns are valid. // // TODO: properly differentiate simultaneous notify+interrupt. // In that case, we should propagate the notify to another waiter. diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -234,7 +234,7 @@ SIG_REGS(sc).u_regs[CON_G3], SIG_REGS(sc).u_regs[CON_G4]); st->print_cr(" G5=" INTPTR_FORMAT " G6=" INTPTR_FORMAT - " G7=" INTPTR_FORMAT " Y=" INTPTR_FORMAT, + " G7=" INTPTR_FORMAT " Y=0x%x", SIG_REGS(sc).u_regs[CON_G5], SIG_REGS(sc).u_regs[CON_G6], SIG_REGS(sc).u_regs[CON_G7], @@ -285,7 +285,7 @@ st->cr(); st->cr(); - st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp); + st->print_cr("Top of Stack: (sp=" INTPTR_FORMAT ")", p2i(sp)); print_hex_dump(st, (address)sp, (address)(sp + 32), sizeof(intptr_t)); st->cr(); @@ -293,7 +293,7 @@ // point to garbage if entry point in an nmethod is corrupted. Leave // this at the end, and hope for the best. address pc = os::Linux::ucontext_get_pc(uc); - st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc); + st->print_cr("Instructions: (pc=" INTPTR_FORMAT ")", p2i(pc)); print_hex_dump(st, pc - 32, pc + 32, sizeof(char)); } @@ -453,7 +453,7 @@ && pc < MacroAssembler::_verify_oop_implicit_branch[1] ) { *stub = MacroAssembler::_verify_oop_implicit_branch[2]; warning("fixed up memory fault in +VerifyOops at address " - INTPTR_FORMAT, fault); + INTPTR_FORMAT, p2i(fault)); return true; } return false; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp --- a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -36,7 +36,7 @@ } while (!feof(fp)) { - if (fscanf(fp, "cpu\t\t: %100[^\n]", &cpu) == 1) { + if (fscanf(fp, "cpu\t\t: %100[^\n]", cpu) == 1) { if (strstr(cpu, "Niagara") != NULL) { rv = true; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp --- a/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2014, 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 @@ -137,6 +137,21 @@ #endif if (av & AV_SPARC_AES) features |= aes_instructions_m; +#ifndef AV_SPARC_SHA1 +#define AV_SPARC_SHA1 0x00400000 /* sha1 instruction supported */ +#endif + if (av & AV_SPARC_SHA1) features |= sha1_instruction_m; + +#ifndef AV_SPARC_SHA256 +#define AV_SPARC_SHA256 0x00800000 /* sha256 instruction supported */ +#endif + if (av & AV_SPARC_SHA256) features |= sha256_instruction_m; + +#ifndef AV_SPARC_SHA512 +#define AV_SPARC_SHA512 0x01000000 /* sha512 instruction supported */ +#endif + if (av & AV_SPARC_SHA512) features |= sha512_instruction_m; + } else { // getisax(2) failed, use the old legacy code. #ifndef PRODUCT diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/adlc/output_c.cpp --- a/hotspot/src/share/vm/adlc/output_c.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/adlc/output_c.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1000,7 +1000,7 @@ fprintf(fp_cpp, "void Bundle::initialize_nops(MachNode * nop_list[%d], Compile *C) {\n", nopcnt); int i = 0; for ( _pipeline->_noplist.reset(); (nop = _pipeline->_noplist.iter()) != NULL; i++ ) { - fprintf(fp_cpp, " nop_list[%d] = (MachNode *) new (C) %sNode();\n", i, nop); + fprintf(fp_cpp, " nop_list[%d] = (MachNode *) new %sNode();\n", i, nop); } fprintf(fp_cpp, "};\n\n"); fprintf(fp_cpp, "#ifndef PRODUCT\n"); @@ -1328,7 +1328,7 @@ preplace->next_instruction(root_inst); InstructForm *root_form = globals[root_inst]->is_instruction(); assert( root_form != NULL, "Replacement instruction was not previously defined"); - fprintf(fp, " %sNode *root = new (C) %sNode();\n", root_inst, root_inst); + fprintf(fp, " %sNode *root = new %sNode();\n", root_inst, root_inst); int inst_num; const char *op_name; @@ -1497,11 +1497,11 @@ new_oper = frm->is_operand(); char *tmp = (char *)node->_exprule->_newopconst[new_id]; if (tmp == NULL) { - fprintf(fp," MachOper *op%d = new (C) %sOper();\n", + fprintf(fp," MachOper *op%d = new %sOper();\n", cnt, new_oper->_ident); } else { - fprintf(fp," MachOper *op%d = new (C) %sOper(%s);\n", + fprintf(fp," MachOper *op%d = new %sOper(%s);\n", cnt, new_oper->_ident, tmp); } } @@ -1566,7 +1566,7 @@ } // Build the node for the instruction - fprintf(fp,"\n %sNode *n%d = new (C) %sNode();\n", new_id, cnt, new_id); + fprintf(fp,"\n %sNode *n%d = new %sNode();\n", new_id, cnt, new_id); // Add control edge for this node fprintf(fp," n%d->add_req(_in[0]);\n", cnt); // Build the operand for the value this node defines. @@ -1729,7 +1729,7 @@ declared_def = true; } if (op && op->_interface && op->_interface->is_RegInterface()) { - fprintf(fp," def = new (C) MachTempNode(state->MachOperGenerator( %s, C ));\n", + fprintf(fp," def = new MachTempNode(state->MachOperGenerator( %s, C ));\n", machOperEnum(op->_ident)); fprintf(fp," add_req(def);\n"); // The operand for TEMP is already constructed during @@ -1760,7 +1760,7 @@ } fprintf(fp," kill = "); - fprintf(fp,"new (C) MachProjNode( %s, %d, (%s), Op_%s );\n", + fprintf(fp,"new MachProjNode( %s, %d, (%s), Op_%s );\n", machNode, proj_no++, regmask, ideal_type); fprintf(fp," proj_list.push(kill);\n"); } @@ -2840,7 +2840,7 @@ // generate code to create a clone for a class derived from MachOper // // (0) MachOper *MachOperXOper::clone(Compile* C) const { -// (1) return new (C) MachXOper( _ccode, _c0, _c1, ..., _cn); +// (1) return new MachXOper( _ccode, _c0, _c1, ..., _cn); // (2) } // static void defineClone(FILE *fp, FormDict &globalNames, OperandForm &oper) { @@ -2849,7 +2849,7 @@ const int num_consts = oper.num_consts(globalNames); const bool is_ideal_bool = oper.is_ideal_bool(); if( (num_consts > 0) ) { - fprintf(fp," return new (C) %sOper(", oper._ident); + fprintf(fp," return new %sOper(", oper._ident); // generate parameters for constants int i = 0; fprintf(fp,"_c%d", i); @@ -2861,7 +2861,7 @@ } else { assert( num_consts == 0, "Currently support zero or one constant per operand clone function"); - fprintf(fp," return new (C) %sOper();\n", oper._ident); + fprintf(fp," return new %sOper();\n", oper._ident); } // finish method fprintf(fp,"}\n"); @@ -3106,7 +3106,7 @@ defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper); fprintf(fp,"MachOper *%sOper::clone(Compile* C) const {\n", oper->_ident); - fprintf(fp," return new (C) %sOper(_label, _block_num);\n", oper->_ident); + fprintf(fp," return new %sOper(_label, _block_num);\n", oper->_ident); fprintf(fp,"}\n"); fprintf(fp,"uint %sOper::opcode() const { return %s; }\n", @@ -3125,7 +3125,7 @@ defineIn_RegMask(_CPP_MISC_file._fp, _globalNames, *oper); fprintf(fp,"MachOper *%sOper::clone(Compile* C) const {\n", oper->_ident); - fprintf(fp," return new (C) %sOper(_method);\n", oper->_ident); + fprintf(fp," return new %sOper(_method);\n", oper->_ident); fprintf(fp,"}\n"); fprintf(fp,"uint %sOper::opcode() const { return %s; }\n", @@ -3815,7 +3815,7 @@ // Generate the case statement for this opcode fprintf(fp, " case %s:", opEnumName); - fprintf(fp, "\n return new (C) %sOper(", opName); + fprintf(fp, "\n return new %sOper(", opName); // Access parameters for constructor from the stat object // // Build access to condition code value @@ -3894,7 +3894,7 @@ const char *opClass = inst->_ident; // Create the MachNode object - fprintf(fp_cpp, "%s %sNode *node = new (C) %sNode();\n",indent, opClass,opClass); + fprintf(fp_cpp, "%s %sNode *node = new %sNode();\n",indent, opClass,opClass); if ( (inst->num_post_match_opnds() != 0) ) { // Instruction that contains operands which are not in match rule. @@ -3936,7 +3936,7 @@ // Check for multiple constants and then fill them in. // Just like MachOperGenerator const char *opName = inst->_matrule->_rChild->_opType; - fprintf(fp_cpp, "new (C) %sOper(", opName); + fprintf(fp_cpp, "new %sOper(", opName); // Grab operand form OperandForm *op = (_globalNames[opName])->is_operand(); // Look up the number of constants @@ -4010,7 +4010,7 @@ fprintf(fp_cpp, "// Build CISC version of this instruction\n"); fprintf(fp_cpp, "MachNode *%sNode::cisc_version( int offset, Compile* C ) {\n", this->_ident); // Create the MachNode object - fprintf(fp_cpp, " %sNode *node = new (C) %sNode();\n", name, name); + fprintf(fp_cpp, " %sNode *node = new %sNode();\n", name, name); // Fill in the bottom_type where requested if ( this->captures_bottom_type(AD.globalNames()) ) { fprintf(fp_cpp, " node->_bottom_type = bottom_type();\n"); @@ -4026,7 +4026,7 @@ fprintf(fp_cpp, " fill_new_machnode(node, C);\n"); // Construct operand to access [stack_pointer + offset] fprintf(fp_cpp, " // Construct operand to access [stack_pointer + offset]\n"); - fprintf(fp_cpp, " node->set_opnd_array(cisc_operand(), new (C) %sOper(offset));\n", cisc_oper_name); + fprintf(fp_cpp, " node->set_opnd_array(cisc_operand(), new %sOper(offset));\n", cisc_oper_name); fprintf(fp_cpp, "\n"); // Return result and exit scope @@ -4057,7 +4057,7 @@ fprintf(fp_cpp, "// Build short branch version of this instruction\n"); fprintf(fp_cpp, "MachNode *%sNode::short_branch_version(Compile* C) {\n", this->_ident); // Create the MachNode object - fprintf(fp_cpp, " %sNode *node = new (C) %sNode();\n", name, name); + fprintf(fp_cpp, " %sNode *node = new %sNode();\n", name, name); if( is_ideal_if() ) { fprintf(fp_cpp, " node->_prob = _prob;\n"); fprintf(fp_cpp, " node->_fcnt = _fcnt;\n"); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/c1/c1_GraphBuilder.cpp --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -2054,7 +2054,7 @@ bool will_link; ciKlass* klass = stream()->get_klass(will_link); assert(klass->is_instance_klass(), "must be an instance klass"); - NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before); + NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before, stream()->is_unresolved_klass()); _memory->new_instance(new_instance); apush(append_split(new_instance)); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/c1/c1_Instruction.hpp --- a/hotspot/src/share/vm/c1/c1_Instruction.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -1291,16 +1291,18 @@ LEAF(NewInstance, StateSplit) private: ciInstanceKlass* _klass; + bool _is_unresolved; public: // creation - NewInstance(ciInstanceKlass* klass, ValueStack* state_before) + NewInstance(ciInstanceKlass* klass, ValueStack* state_before, bool is_unresolved) : StateSplit(instanceType, state_before) - , _klass(klass) + , _klass(klass), _is_unresolved(is_unresolved) {} // accessors ciInstanceKlass* klass() const { return _klass; } + bool is_unresolved() const { return _is_unresolved; } virtual bool needs_exception_state() const { return false; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/c1/c1_LIRAssembler.cpp --- a/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -336,7 +336,6 @@ void LIR_Assembler::add_debug_info_for_branch(CodeEmitInfo* info) { - _masm->code_section()->relocate(pc(), relocInfo::poll_type); int pc_offset = code_offset(); flush_debug_info(pc_offset); info->record_debug_info(compilation()->debug_info_recorder(), pc_offset); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/c1/c1_LIRGenerator.cpp --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -466,8 +466,11 @@ } -void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info) { - if (!obj->is_loaded() || PatchALot) { +void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve) { + /* C2 relies on constant pool entries being resolved (ciTypeFlow), so if TieredCompilation + * is active and the class hasn't yet been resolved we need to emit a patch that resolves + * the class. */ + if ((TieredCompilation && need_resolve) || !obj->is_loaded() || PatchALot) { assert(info != NULL, "info must be set if class is not loaded"); __ klass2reg_patch(NULL, r, info); } else { @@ -660,9 +663,18 @@ __ unlock_object(hdr, object, lock, scratch, slow_path); } - -void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) { - klass2reg_with_patching(klass_reg, klass, info); +#ifndef PRODUCT +void LIRGenerator::print_if_not_loaded(const NewInstance* new_instance) { + if (PrintNotLoaded && !new_instance->klass()->is_loaded()) { + tty->print_cr(" ###class not loaded at new bci %d", new_instance->printable_bci()); + } else if (PrintNotLoaded && (TieredCompilation && new_instance->is_unresolved())) { + tty->print_cr(" ###class not resolved at new bci %d", new_instance->printable_bci()); + } +} +#endif + +void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) { + klass2reg_with_patching(klass_reg, klass, info, is_unresolved); // If klass is not loaded we do not know if the klass has finalizers: if (UseFastNewInstance && klass->is_loaded() && !Klass::layout_helper_needs_slow_path(klass->layout_helper())) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/c1/c1_LIRGenerator.hpp --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -169,6 +169,8 @@ return this; } + void print_if_not_loaded(const NewInstance* new_instance) PRODUCT_RETURN; + #ifdef ASSERT LIR_List* lir(const char * file, int line) const { _lir->set_file_and_line(file, line); @@ -307,7 +309,7 @@ void store_stack_parameter (LIR_Opr opr, ByteSize offset_from_sp_in_bytes); - void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info); + void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve = false); // this loads the length and compares against the index void array_range_check (LIR_Opr array, LIR_Opr index, CodeEmitInfo* null_check_info, CodeEmitInfo* range_check_info); @@ -325,7 +327,7 @@ void monitor_enter (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no, CodeEmitInfo* info_for_exception, CodeEmitInfo* info); void monitor_exit (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no); - void new_instance (LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info); + void new_instance (LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info); // machine dependent void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/c1/c1_Runtime1.cpp --- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -123,24 +123,24 @@ int Runtime1::_throw_array_store_exception_count = 0; int Runtime1::_throw_count = 0; -static int _byte_arraycopy_cnt = 0; -static int _short_arraycopy_cnt = 0; -static int _int_arraycopy_cnt = 0; -static int _long_arraycopy_cnt = 0; -static int _oop_arraycopy_cnt = 0; +static int _byte_arraycopy_stub_cnt = 0; +static int _short_arraycopy_stub_cnt = 0; +static int _int_arraycopy_stub_cnt = 0; +static int _long_arraycopy_stub_cnt = 0; +static int _oop_arraycopy_stub_cnt = 0; address Runtime1::arraycopy_count_address(BasicType type) { switch (type) { case T_BOOLEAN: - case T_BYTE: return (address)&_byte_arraycopy_cnt; + case T_BYTE: return (address)&_byte_arraycopy_stub_cnt; case T_CHAR: - case T_SHORT: return (address)&_short_arraycopy_cnt; + case T_SHORT: return (address)&_short_arraycopy_stub_cnt; case T_FLOAT: - case T_INT: return (address)&_int_arraycopy_cnt; + case T_INT: return (address)&_int_arraycopy_stub_cnt; case T_DOUBLE: - case T_LONG: return (address)&_long_arraycopy_cnt; + case T_LONG: return (address)&_long_arraycopy_stub_cnt; case T_ARRAY: - case T_OBJECT: return (address)&_oop_arraycopy_cnt; + case T_OBJECT: return (address)&_oop_arraycopy_stub_cnt; default: ShouldNotReachHere(); return NULL; @@ -1479,13 +1479,13 @@ tty->print_cr(" _ic_miss_cnt: %d", SharedRuntime::_ic_miss_ctr); tty->print_cr(" _generic_arraycopy_cnt: %d", _generic_arraycopy_cnt); tty->print_cr(" _generic_arraycopystub_cnt: %d", _generic_arraycopystub_cnt); - tty->print_cr(" _byte_arraycopy_cnt: %d", _byte_arraycopy_cnt); - tty->print_cr(" _short_arraycopy_cnt: %d", _short_arraycopy_cnt); - tty->print_cr(" _int_arraycopy_cnt: %d", _int_arraycopy_cnt); - tty->print_cr(" _long_arraycopy_cnt: %d", _long_arraycopy_cnt); + tty->print_cr(" _byte_arraycopy_cnt: %d", _byte_arraycopy_stub_cnt); + tty->print_cr(" _short_arraycopy_cnt: %d", _short_arraycopy_stub_cnt); + tty->print_cr(" _int_arraycopy_cnt: %d", _int_arraycopy_stub_cnt); + tty->print_cr(" _long_arraycopy_cnt: %d", _long_arraycopy_stub_cnt); tty->print_cr(" _primitive_arraycopy_cnt: %d", _primitive_arraycopy_cnt); tty->print_cr(" _oop_arraycopy_cnt (C): %d", Runtime1::_oop_arraycopy_cnt); - tty->print_cr(" _oop_arraycopy_cnt (stub): %d", _oop_arraycopy_cnt); + tty->print_cr(" _oop_arraycopy_cnt (stub): %d", _oop_arraycopy_stub_cnt); tty->print_cr(" _arraycopy_slowcase_cnt: %d", _arraycopy_slowcase_cnt); tty->print_cr(" _arraycopy_checkcast_cnt: %d", _arraycopy_checkcast_cnt); tty->print_cr(" _arraycopy_checkcast_attempt_cnt:%d", _arraycopy_checkcast_attempt_cnt); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/classfile/vmSymbols.hpp --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -790,6 +790,26 @@ do_name( decrypt_name, "decrypt") \ do_signature(byteArray_int_int_byteArray_int_signature, "([BII[BI)I") \ \ + /* support for sun.security.provider.SHA */ \ + do_class(sun_security_provider_sha, "sun/security/provider/SHA") \ + do_intrinsic(_sha_implCompress, sun_security_provider_sha, implCompress_name, implCompress_signature, F_R) \ + do_name( implCompress_name, "implCompress") \ + do_signature(implCompress_signature, "([BI)V") \ + \ + /* support for sun.security.provider.SHA2 */ \ + do_class(sun_security_provider_sha2, "sun/security/provider/SHA2") \ + do_intrinsic(_sha2_implCompress, sun_security_provider_sha2, implCompress_name, implCompress_signature, F_R) \ + \ + /* support for sun.security.provider.SHA5 */ \ + do_class(sun_security_provider_sha5, "sun/security/provider/SHA5") \ + do_intrinsic(_sha5_implCompress, sun_security_provider_sha5, implCompress_name, implCompress_signature, F_R) \ + \ + /* support for sun.security.provider.DigestBase */ \ + do_class(sun_security_provider_digestbase, "sun/security/provider/DigestBase") \ + do_intrinsic(_digestBase_implCompressMB, sun_security_provider_digestbase, implCompressMB_name, implCompressMB_signature, F_R) \ + do_name( implCompressMB_name, "implCompressMultiBlock") \ + do_signature(implCompressMB_signature, "([BII)I") \ + \ /* support for java.util.zip */ \ do_class(java_util_zip_CRC32, "java/util/zip/CRC32") \ do_intrinsic(_updateCRC32, java_util_zip_CRC32, update_name, int2_int_signature, F_SN) \ diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/code/relocInfo.cpp --- a/hotspot/src/share/vm/code/relocInfo.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/code/relocInfo.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -877,11 +877,7 @@ void internal_word_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { address target = _target; if (target == NULL) { - if (addr_in_const()) { - target = new_addr_for(*(address*)addr(), src, dest); - } else { - target = new_addr_for(pd_get_address_from_code(), src, dest); - } + target = new_addr_for(this->target(), src, dest); } set_value(target); } @@ -890,7 +886,11 @@ address internal_word_Relocation::target() { address target = _target; if (target == NULL) { - target = pd_get_address_from_code(); + if (addr_in_const()) { + target = *(address*)addr(); + } else { + target = pd_get_address_from_code(); + } } return target; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1341,13 +1341,14 @@ bool CMSAdaptiveSizePolicy::print_adaptive_size_policy_on( outputStream* st) const { - if (!UseAdaptiveSizePolicy) return false; + if (!UseAdaptiveSizePolicy) { + return false; + } GenCollectedHeap* gch = GenCollectedHeap::heap(); - Generation* gen0 = gch->get_gen(0); - DefNewGeneration* def_new = gen0->as_DefNewGeneration(); - return - AdaptiveSizePolicy::print_adaptive_size_policy_on( + Generation* young = gch->get_gen(0); + DefNewGeneration* def_new = young->as_DefNewGeneration(); + return AdaptiveSizePolicy::print_adaptive_size_policy_on( st, def_new->tenuring_threshold()); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -60,21 +60,21 @@ if (UseParNewGC) { if (UseAdaptiveSizePolicy) { _generations[0] = new GenerationSpec(Generation::ASParNew, - _initial_gen0_size, _max_gen0_size); + _initial_young_size, _max_young_size); } else { _generations[0] = new GenerationSpec(Generation::ParNew, - _initial_gen0_size, _max_gen0_size); + _initial_young_size, _max_young_size); } } else { _generations[0] = new GenerationSpec(Generation::DefNew, - _initial_gen0_size, _max_gen0_size); + _initial_young_size, _max_young_size); } if (UseAdaptiveSizePolicy) { _generations[1] = new GenerationSpec(Generation::ASConcurrentMarkSweep, - _initial_gen1_size, _max_gen1_size); + _initial_old_size, _max_old_size); } else { _generations[1] = new GenerationSpec(Generation::ConcurrentMarkSweep, - _initial_gen1_size, _max_gen1_size); + _initial_old_size, _max_old_size); } if (_generations[0] == NULL || _generations[1] == NULL) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1138,8 +1138,8 @@ void CMSCollector::icms_update_allocation_limits() { - Generation* gen0 = GenCollectedHeap::heap()->get_gen(0); - EdenSpace* eden = gen0->as_DefNewGeneration()->eden(); + Generation* young = GenCollectedHeap::heap()->get_gen(0); + EdenSpace* eden = young->as_DefNewGeneration()->eden(); const unsigned int duty_cycle = stats().icms_update_duty_cycle(); if (CMSTraceIncrementalPacing) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -1193,10 +1193,9 @@ // Does a "full" (forced) collection invoked on this generation collect // all younger generations as well? Note that the second conjunct is a // hack to allow the collection of the younger gen first if the flag is - // set. This is better than using th policy's should_collect_gen0_first() - // since that causes us to do an extra unnecessary pair of restart-&-stop-world. + // set. virtual bool full_collects_younger_generations() const { - return UseCMSCompactAtFullCollection && !CollectGen0First; + return UseCMSCompactAtFullCollection && !ScavengeBeforeFullGC; } void space_iterate(SpaceClosure* blk, bool usedOnly = false); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -3622,7 +3622,7 @@ void G1CollectedHeap::print_tracing_info() const { // We'll overload this to mean "trace GC pause statistics." - if (TraceGen0Time || TraceGen1Time) { + if (TraceYoungGenTime || TraceOldGenTime) { // The "G1CollectorPolicy" is keeping track of these stats, so delegate // to that. g1_policy()->print_tracing_info(); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -809,7 +809,7 @@ double full_gc_time_sec = end_sec - _full_collection_start_sec; double full_gc_time_ms = full_gc_time_sec * 1000.0; - _trace_gen1_time_data.record_full_collection(full_gc_time_ms); + _trace_old_gen_time_data.record_full_collection(full_gc_time_ms); update_recent_gc_times(end_sec, full_gc_time_ms); @@ -851,7 +851,7 @@ _g1->used(), _g1->recalculate_used())); double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0; - _trace_gen0_time_data.record_start_collection(s_w_t_ms); + _trace_young_gen_time_data.record_start_collection(s_w_t_ms); _stop_world_start = 0.0; record_heap_size_info_at_start(false /* full */); @@ -906,7 +906,7 @@ void G1CollectorPolicy::record_concurrent_pause() { if (_stop_world_start > 0.0) { double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0; - _trace_gen0_time_data.record_yield_time(yield_ms); + _trace_young_gen_time_data.record_yield_time(yield_ms); } } @@ -993,7 +993,7 @@ evacuation_info.set_bytes_copied(_bytes_copied_during_gc); if (update_stats) { - _trace_gen0_time_data.record_end_collection(pause_time_ms, phase_times()); + _trace_young_gen_time_data.record_end_collection(pause_time_ms, phase_times()); // this is where we update the allocation rate of the application double app_time_ms = (phase_times()->cur_collection_start_sec() * 1000.0 - _prev_collection_pause_end_ms); @@ -1415,8 +1415,8 @@ } void G1CollectorPolicy::print_tracing_info() const { - _trace_gen0_time_data.print(); - _trace_gen1_time_data.print(); + _trace_young_gen_time_data.print(); + _trace_old_gen_time_data.print(); } void G1CollectorPolicy::print_yg_surv_rate_info() const { @@ -1973,9 +1973,9 @@ _last_gc_was_young = gcs_are_young() ? true : false; if (_last_gc_was_young) { - _trace_gen0_time_data.increment_young_collection_count(); + _trace_young_gen_time_data.increment_young_collection_count(); } else { - _trace_gen0_time_data.increment_mixed_collection_count(); + _trace_young_gen_time_data.increment_mixed_collection_count(); } // The young list is laid with the survivor regions from the previous @@ -2156,20 +2156,20 @@ evacuation_info.set_collectionset_regions(cset_region_length()); } -void TraceGen0TimeData::record_start_collection(double time_to_stop_the_world_ms) { - if(TraceGen0Time) { +void TraceYoungGenTimeData::record_start_collection(double time_to_stop_the_world_ms) { + if(TraceYoungGenTime) { _all_stop_world_times_ms.add(time_to_stop_the_world_ms); } } -void TraceGen0TimeData::record_yield_time(double yield_time_ms) { - if(TraceGen0Time) { +void TraceYoungGenTimeData::record_yield_time(double yield_time_ms) { + if(TraceYoungGenTime) { _all_yield_times_ms.add(yield_time_ms); } } -void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) { - if(TraceGen0Time) { +void TraceYoungGenTimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) { + if(TraceYoungGenTime) { _total.add(pause_time_ms); _other.add(pause_time_ms - phase_times->accounted_time_ms()); _root_region_scan_wait.add(phase_times->root_region_scan_wait_time_ms()); @@ -2194,34 +2194,34 @@ } } -void TraceGen0TimeData::increment_young_collection_count() { - if(TraceGen0Time) { +void TraceYoungGenTimeData::increment_young_collection_count() { + if(TraceYoungGenTime) { ++_young_pause_num; } } -void TraceGen0TimeData::increment_mixed_collection_count() { - if(TraceGen0Time) { +void TraceYoungGenTimeData::increment_mixed_collection_count() { + if(TraceYoungGenTime) { ++_mixed_pause_num; } } -void TraceGen0TimeData::print_summary(const char* str, - const NumberSeq* seq) const { +void TraceYoungGenTimeData::print_summary(const char* str, + const NumberSeq* seq) const { double sum = seq->sum(); gclog_or_tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)", str, sum / 1000.0, seq->avg()); } -void TraceGen0TimeData::print_summary_sd(const char* str, - const NumberSeq* seq) const { +void TraceYoungGenTimeData::print_summary_sd(const char* str, + const NumberSeq* seq) const { print_summary(str, seq); gclog_or_tty->print_cr("%+45s = %5d, std dev = %8.2lf ms, max = %8.2lf ms)", "(num", seq->num(), seq->sd(), seq->maximum()); } -void TraceGen0TimeData::print() const { - if (!TraceGen0Time) { +void TraceYoungGenTimeData::print() const { + if (!TraceYoungGenTime) { return; } @@ -2258,14 +2258,14 @@ print_summary_sd(" Yields", &_all_yield_times_ms); } -void TraceGen1TimeData::record_full_collection(double full_gc_time_ms) { - if (TraceGen1Time) { +void TraceOldGenTimeData::record_full_collection(double full_gc_time_ms) { + if (TraceOldGenTime) { _all_full_gc_times.add(full_gc_time_ms); } } -void TraceGen1TimeData::print() const { - if (!TraceGen1Time) { +void TraceOldGenTimeData::print() const { + if (!TraceOldGenTime) { return; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -38,10 +38,10 @@ class CollectionSetChooser; class G1GCPhaseTimes; -// TraceGen0Time collects data on _both_ young and mixed evacuation pauses +// TraceYoungGenTime collects data on _both_ young and mixed evacuation pauses // (the latter may contain non-young regions - i.e. regions that are -// technically in Gen1) while TraceGen1Time collects data about full GCs. -class TraceGen0TimeData : public CHeapObj { +// technically in old) while TraceOldGenTime collects data about full GCs. +class TraceYoungGenTimeData : public CHeapObj { private: unsigned _young_pause_num; unsigned _mixed_pause_num; @@ -66,7 +66,7 @@ void print_summary_sd(const char* str, const NumberSeq* seq) const; public: - TraceGen0TimeData() : _young_pause_num(0), _mixed_pause_num(0) {}; + TraceYoungGenTimeData() : _young_pause_num(0), _mixed_pause_num(0) {}; void record_start_collection(double time_to_stop_the_world_ms); void record_yield_time(double yield_time_ms); void record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times); @@ -75,7 +75,7 @@ void print() const; }; -class TraceGen1TimeData : public CHeapObj { +class TraceOldGenTimeData : public CHeapObj { private: NumberSeq _all_full_gc_times; @@ -187,8 +187,8 @@ TruncatedSeq* _concurrent_mark_remark_times_ms; TruncatedSeq* _concurrent_mark_cleanup_times_ms; - TraceGen0TimeData _trace_gen0_time_data; - TraceGen1TimeData _trace_gen1_time_data; + TraceYoungGenTimeData _trace_young_gen_time_data; + TraceOldGenTimeData _trace_old_gen_time_data; double _stop_world_start; @@ -202,20 +202,20 @@ // locker is active. This should be >= _young_list_target_length; uint _young_list_max_length; - bool _last_gc_was_young; + bool _last_gc_was_young; - bool _during_marking; - bool _in_marking_window; - bool _in_marking_window_im; + bool _during_marking; + bool _in_marking_window; + bool _in_marking_window_im; - SurvRateGroup* _short_lived_surv_rate_group; - SurvRateGroup* _survivor_surv_rate_group; + SurvRateGroup* _short_lived_surv_rate_group; + SurvRateGroup* _survivor_surv_rate_group; // add here any more surv rate groups - double _gc_overhead_perc; + double _gc_overhead_perc; double _reserve_factor; - uint _reserve_regions; + uint _reserve_regions; bool during_marking() { return _during_marking; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -35,14 +35,14 @@ AdjoiningGenerations::AdjoiningGenerations(ReservedSpace old_young_rs, GenerationSizer* policy, size_t alignment) : - _virtual_spaces(old_young_rs, policy->min_gen1_size(), - policy->min_gen0_size(), alignment) { - size_t init_low_byte_size = policy->initial_gen1_size(); - size_t min_low_byte_size = policy->min_gen1_size(); - size_t max_low_byte_size = policy->max_gen1_size(); - size_t init_high_byte_size = policy->initial_gen0_size(); - size_t min_high_byte_size = policy->min_gen0_size(); - size_t max_high_byte_size = policy->max_gen0_size(); + _virtual_spaces(old_young_rs, policy->min_old_size(), + policy->min_young_size(), alignment) { + size_t init_low_byte_size = policy->initial_old_size(); + size_t min_low_byte_size = policy->min_old_size(); + size_t max_low_byte_size = policy->max_old_size(); + size_t init_high_byte_size = policy->initial_young_size(); + size_t min_high_byte_size = policy->min_young_size(); + size_t max_high_byte_size = policy->max_young_size(); assert(min_low_byte_size <= init_low_byte_size && init_low_byte_size <= max_low_byte_size, "Parameter check"); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -32,8 +32,8 @@ SIZE_FORMAT "," SIZE_FORMAT " " SIZE_FORMAT, str, - _min_gen1_size / K, _max_gen1_size / K, - _min_gen0_size / K, _max_gen0_size / K, + _min_old_size / K, _max_old_size / K, + _min_young_size / K, _max_young_size / K, _max_heap_byte_size / K); } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -623,11 +623,11 @@ } void ParallelScavengeHeap::print_tracing_info() const { - if (TraceGen0Time) { + if (TraceYoungGenTime) { double time = PSScavenge::accumulated_time()->seconds(); tty->print_cr("[Accumulated GC generation 0 time %3.7f secs]", time); } - if (TraceGen1Time) { + if (TraceOldGenTime) { double time = UseParallelOldGC ? PSParallelCompact::accumulated_time()->seconds() : PSMarkSweep::accumulated_time()->seconds(); tty->print_cr("[Accumulated GC generation 1 time %3.7f secs]", time); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -174,7 +174,7 @@ TraceCollectorStats tcs(counters()); TraceMemoryManagerStats tms(true /* Full GC */,gc_cause); - if (TraceGen1Time) accumulated_time()->start(); + if (TraceOldGenTime) accumulated_time()->start(); // Let the size policy know we're starting size_policy->major_collection_begin(); @@ -354,7 +354,7 @@ // We collected the heap, recalculate the metaspace capacity MetaspaceGC::compute_new_size(); - if (TraceGen1Time) accumulated_time()->stop(); + if (TraceOldGenTime) accumulated_time()->stop(); if (PrintGC) { if (PrintGCDetails) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -2061,7 +2061,7 @@ TraceCollectorStats tcs(counters()); TraceMemoryManagerStats tms(true /* Full GC */,gc_cause); - if (TraceGen1Time) accumulated_time()->start(); + if (TraceOldGenTime) accumulated_time()->start(); // Let the size policy know we're starting size_policy->major_collection_begin(); @@ -2188,7 +2188,7 @@ // Resize the metaspace capacity after a collection MetaspaceGC::compute_new_size(); - if (TraceGen1Time) accumulated_time()->stop(); + if (TraceOldGenTime) accumulated_time()->stop(); if (PrintGC) { if (PrintGCDetails) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -336,7 +336,7 @@ TraceCollectorStats tcs(counters()); TraceMemoryManagerStats tms(false /* not full GC */,gc_cause); - if (TraceGen0Time) accumulated_time()->start(); + if (TraceYoungGenTime) accumulated_time()->start(); // Let the size policy know we're starting size_policy->minor_collection_begin(); @@ -660,7 +660,7 @@ CardTableExtension::verify_all_young_refs_imprecise(); } - if (TraceGen0Time) accumulated_time()->stop(); + if (TraceYoungGenTime) accumulated_time()->stop(); if (PrintGC) { if (PrintGCDetails) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/memory/collectorPolicy.cpp --- a/hotspot/src/share/vm/memory/collectorPolicy.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -196,13 +196,13 @@ // GenCollectorPolicy methods GenCollectorPolicy::GenCollectorPolicy() : - _min_gen0_size(0), - _initial_gen0_size(0), - _max_gen0_size(0), + _min_young_size(0), + _initial_young_size(0), + _max_young_size(0), _gen_alignment(0), - _min_gen1_size(0), - _initial_gen1_size(0), - _max_gen1_size(0), + _min_old_size(0), + _initial_old_size(0), + _max_old_size(0), _generations(NULL) {} @@ -236,7 +236,7 @@ #ifdef ASSERT void GenCollectorPolicy::assert_flags() { CollectorPolicy::assert_flags(); - assert(NewSize >= _min_gen0_size, "Ergonomics decided on a too small young gen size"); + assert(NewSize >= _min_young_size, "Ergonomics decided on a too small young gen size"); assert(NewSize <= MaxNewSize, "Ergonomics decided on incompatible initial and maximum young gen sizes"); assert(FLAG_IS_DEFAULT(MaxNewSize) || MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young gen and heap sizes"); assert(NewSize % _gen_alignment == 0, "NewSize alignment"); @@ -249,28 +249,28 @@ CollectorPolicy::assert_size_info(); // GenCollectorPolicy::initialize_size_info may update the MaxNewSize assert(MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young and heap sizes"); - assert(NewSize == _initial_gen0_size, "Discrepancy between NewSize flag and local storage"); - assert(MaxNewSize == _max_gen0_size, "Discrepancy between MaxNewSize flag and local storage"); - assert(OldSize == _initial_gen1_size, "Discrepancy between OldSize flag and local storage"); - assert(_min_gen0_size <= _initial_gen0_size, "Ergonomics decided on incompatible minimum and initial young gen sizes"); - assert(_initial_gen0_size <= _max_gen0_size, "Ergonomics decided on incompatible initial and maximum young gen sizes"); - assert(_min_gen0_size % _gen_alignment == 0, "_min_gen0_size alignment"); - assert(_initial_gen0_size % _gen_alignment == 0, "_initial_gen0_size alignment"); - assert(_max_gen0_size % _gen_alignment == 0, "_max_gen0_size alignment"); - assert(_min_gen0_size <= bound_minus_alignment(_min_gen0_size, _min_heap_byte_size), + assert(NewSize == _initial_young_size, "Discrepancy between NewSize flag and local storage"); + assert(MaxNewSize == _max_young_size, "Discrepancy between MaxNewSize flag and local storage"); + assert(OldSize == _initial_old_size, "Discrepancy between OldSize flag and local storage"); + assert(_min_young_size <= _initial_young_size, "Ergonomics decided on incompatible minimum and initial young gen sizes"); + assert(_initial_young_size <= _max_young_size, "Ergonomics decided on incompatible initial and maximum young gen sizes"); + assert(_min_young_size % _gen_alignment == 0, "_min_young_size alignment"); + assert(_initial_young_size % _gen_alignment == 0, "_initial_young_size alignment"); + assert(_max_young_size % _gen_alignment == 0, "_max_young_size alignment"); + assert(_min_young_size <= bound_minus_alignment(_min_young_size, _min_heap_byte_size), "Ergonomics made minimum young generation larger than minimum heap"); - assert(_initial_gen0_size <= bound_minus_alignment(_initial_gen0_size, _initial_heap_byte_size), + assert(_initial_young_size <= bound_minus_alignment(_initial_young_size, _initial_heap_byte_size), "Ergonomics made initial young generation larger than initial heap"); - assert(_max_gen0_size <= bound_minus_alignment(_max_gen0_size, _max_heap_byte_size), + assert(_max_young_size <= bound_minus_alignment(_max_young_size, _max_heap_byte_size), "Ergonomics made maximum young generation lager than maximum heap"); - assert(_min_gen1_size <= _initial_gen1_size, "Ergonomics decided on incompatible minimum and initial old gen sizes"); - assert(_initial_gen1_size <= _max_gen1_size, "Ergonomics decided on incompatible initial and maximum old gen sizes"); - assert(_max_gen1_size % _gen_alignment == 0, "_max_gen1_size alignment"); - assert(_initial_gen1_size % _gen_alignment == 0, "_initial_gen1_size alignment"); - assert(_max_heap_byte_size <= (_max_gen0_size + _max_gen1_size), "Total maximum heap sizes must be sum of generation maximum sizes"); - assert(_min_gen0_size + _min_gen1_size <= _min_heap_byte_size, "Minimum generation sizes exceed minimum heap size"); - assert(_initial_gen0_size + _initial_gen1_size == _initial_heap_byte_size, "Initial generation sizes should match initial heap size"); - assert(_max_gen0_size + _max_gen1_size == _max_heap_byte_size, "Maximum generation sizes should match maximum heap size"); + assert(_min_old_size <= _initial_old_size, "Ergonomics decided on incompatible minimum and initial old gen sizes"); + assert(_initial_old_size <= _max_old_size, "Ergonomics decided on incompatible initial and maximum old gen sizes"); + assert(_max_old_size % _gen_alignment == 0, "_max_old_size alignment"); + assert(_initial_old_size % _gen_alignment == 0, "_initial_old_size alignment"); + assert(_max_heap_byte_size <= (_max_young_size + _max_old_size), "Total maximum heap sizes must be sum of generation maximum sizes"); + assert(_min_young_size + _min_old_size <= _min_heap_byte_size, "Minimum generation sizes exceed minimum heap size"); + assert(_initial_young_size + _initial_old_size == _initial_heap_byte_size, "Initial generation sizes should match initial heap size"); + assert(_max_young_size + _max_old_size == _max_heap_byte_size, "Maximum generation sizes should match maximum heap size"); } #endif // ASSERT @@ -323,8 +323,8 @@ // later when setting the initial and minimum young generation size. NewSize = bounded_new_size; } - _min_gen0_size = smallest_new_size; - _initial_gen0_size = NewSize; + _min_young_size = smallest_new_size; + _initial_young_size = NewSize; if (!FLAG_IS_DEFAULT(MaxNewSize)) { if (MaxNewSize >= MaxHeapSize) { @@ -338,14 +338,14 @@ FLAG_SET_ERGO(uintx, MaxNewSize, smaller_max_new_size); if (NewSize > MaxNewSize) { FLAG_SET_ERGO(uintx, NewSize, MaxNewSize); - _initial_gen0_size = NewSize; + _initial_young_size = NewSize; } - } else if (MaxNewSize < _initial_gen0_size) { - FLAG_SET_ERGO(uintx, MaxNewSize, _initial_gen0_size); + } else if (MaxNewSize < _initial_young_size) { + FLAG_SET_ERGO(uintx, MaxNewSize, _initial_young_size); } else if (!is_size_aligned(MaxNewSize, _gen_alignment)) { FLAG_SET_ERGO(uintx, MaxNewSize, align_size_down(MaxNewSize, _gen_alignment)); } - _max_gen0_size = MaxNewSize; + _max_young_size = MaxNewSize; } if (NewSize > MaxNewSize) { @@ -357,7 +357,7 @@ NewSize/K, MaxNewSize/K, NewSize/K); } FLAG_SET_ERGO(uintx, MaxNewSize, NewSize); - _max_gen0_size = MaxNewSize; + _max_young_size = MaxNewSize; } if (SurvivorRatio < 1 || NewRatio < 1) { @@ -393,7 +393,7 @@ double shrink_factor = (double) MaxHeapSize / calculated_size; uintx smaller_new_size = align_size_down((uintx)(NewSize * shrink_factor), _gen_alignment); FLAG_SET_ERGO(uintx, NewSize, MAX2(young_gen_size_lower_bound(), smaller_new_size)); - _initial_gen0_size = NewSize; + _initial_young_size = NewSize; // OldSize is already aligned because above we aligned MaxHeapSize to // _heap_alignment, and we just made sure that NewSize is aligned to @@ -406,16 +406,16 @@ } } - // Update NewSize, if possible, to avoid sizing gen0 to small when only + // Update NewSize, if possible, to avoid sizing the young gen too small when only // OldSize is set on the command line. if (FLAG_IS_CMDLINE(OldSize) && !FLAG_IS_CMDLINE(NewSize)) { if (OldSize < _initial_heap_byte_size) { size_t new_size = _initial_heap_byte_size - OldSize; - // Need to compare against the flag value for max since _max_gen0_size + // Need to compare against the flag value for max since _max_young_size // might not have been set yet. - if (new_size >= _min_gen0_size && new_size <= MaxNewSize) { + if (new_size >= _min_young_size && new_size <= MaxNewSize) { FLAG_SET_ERGO(uintx, NewSize, new_size); - _initial_gen0_size = NewSize; + _initial_young_size = NewSize; } } } @@ -444,97 +444,77 @@ void GenCollectorPolicy::initialize_size_info() { CollectorPolicy::initialize_size_info(); - // _space_alignment is used for alignment within a generation. - // There is additional alignment done down stream for some - // collectors that sometimes causes unwanted rounding up of - // generations sizes. + _initial_young_size = NewSize; + _max_young_size = MaxNewSize; + _initial_old_size = OldSize; - // Determine maximum size of gen0 + // Determine maximum size of the young generation. - size_t max_new_size = 0; - if (!FLAG_IS_DEFAULT(MaxNewSize)) { - max_new_size = MaxNewSize; - } else { - max_new_size = scale_by_NewRatio_aligned(_max_heap_byte_size); + if (FLAG_IS_DEFAULT(MaxNewSize)) { + _max_young_size = scale_by_NewRatio_aligned(_max_heap_byte_size); // Bound the maximum size by NewSize below (since it historically // would have been NewSize and because the NewRatio calculation could // yield a size that is too small) and bound it by MaxNewSize above. // Ergonomics plays here by previously calculating the desired // NewSize and MaxNewSize. - max_new_size = MIN2(MAX2(max_new_size, NewSize), MaxNewSize); + _max_young_size = MIN2(MAX2(_max_young_size, _initial_young_size), MaxNewSize); } - assert(max_new_size > 0, "All paths should set max_new_size"); - // Given the maximum gen0 size, determine the initial and - // minimum gen0 sizes. + // Given the maximum young size, determine the initial and + // minimum young sizes. if (_max_heap_byte_size == _initial_heap_byte_size) { - // The maxium and initial heap sizes are the same so the generation's + // The maximum and initial heap sizes are the same so the generation's // initial size must be the same as it maximum size. Use NewSize as the // size if set on command line. - size_t fixed_young_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : max_new_size; - - _initial_gen0_size = fixed_young_size; - _max_gen0_size = fixed_young_size; + _max_young_size = FLAG_IS_CMDLINE(NewSize) ? NewSize : _max_young_size; + _initial_young_size = _max_young_size; // Also update the minimum size if min == initial == max. if (_max_heap_byte_size == _min_heap_byte_size) { - _min_gen0_size = fixed_young_size; + _min_young_size = _max_young_size; } } else { - size_t desired_new_size = 0; if (FLAG_IS_CMDLINE(NewSize)) { // If NewSize is set on the command line, we should use it as // the initial size, but make sure it is within the heap bounds. - desired_new_size = - MIN2(max_new_size, bound_minus_alignment(NewSize, _initial_heap_byte_size)); - _min_gen0_size = bound_minus_alignment(desired_new_size, _min_heap_byte_size); + _initial_young_size = + MIN2(_max_young_size, bound_minus_alignment(NewSize, _initial_heap_byte_size)); + _min_young_size = bound_minus_alignment(_initial_young_size, _min_heap_byte_size); } else { // For the case where NewSize is not set on the command line, use // NewRatio to size the initial generation size. Use the current // NewSize as the floor, because if NewRatio is overly large, the resulting // size can be too small. - desired_new_size = - MIN2(max_new_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize)); + _initial_young_size = + MIN2(_max_young_size, MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize)); } - _initial_gen0_size = desired_new_size; - _max_gen0_size = max_new_size; - } - - // Write back to flags if necessary. - if (NewSize != _initial_gen0_size) { - FLAG_SET_ERGO(uintx, NewSize, _initial_gen0_size); - } - - if (MaxNewSize != _max_gen0_size) { - FLAG_SET_ERGO(uintx, MaxNewSize, _max_gen0_size); } if (PrintGCDetails && Verbose) { - gclog_or_tty->print_cr("1: Minimum gen0 " SIZE_FORMAT " Initial gen0 " - SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT, - _min_gen0_size, _initial_gen0_size, _max_gen0_size); + gclog_or_tty->print_cr("1: Minimum young " SIZE_FORMAT " Initial young " + SIZE_FORMAT " Maximum young " SIZE_FORMAT, + _min_young_size, _initial_young_size, _max_young_size); } // At this point the minimum, initial and maximum sizes - // of the overall heap and of gen0 have been determined. - // The maximum gen1 size can be determined from the maximum gen0 + // of the overall heap and of the young generation have been determined. + // The maximum old size can be determined from the maximum young // and maximum heap size since no explicit flags exist - // for setting the gen1 maximum. - _max_gen1_size = MAX2(_max_heap_byte_size - _max_gen0_size, _gen_alignment); + // for setting the old generation maximum. + _max_old_size = MAX2(_max_heap_byte_size - _max_young_size, _gen_alignment); // If no explicit command line flag has been set for the - // gen1 size, use what is left for gen1 + // old generation size, use what is left. if (!FLAG_IS_CMDLINE(OldSize)) { // The user has not specified any value but the ergonomics // may have chosen a value (which may or may not be consistent // with the overall heap size). In either case make // the minimum, maximum and initial sizes consistent - // with the gen0 sizes and the overall heap sizes. - _min_gen1_size = _gen_alignment; - _initial_gen1_size = MIN2(_max_gen1_size, MAX2(_initial_heap_byte_size - _initial_gen0_size, _min_gen1_size)); - // _max_gen1_size has already been made consistent above - FLAG_SET_ERGO(uintx, OldSize, _initial_gen1_size); + // with the young sizes and the overall heap sizes. + _min_old_size = _gen_alignment; + _initial_old_size = MIN2(_max_old_size, MAX2(_initial_heap_byte_size - _initial_young_size, _min_old_size)); + // _max_old_size has already been made consistent above. } else { // OldSize has been explicitly set on the command line. Use it // for the initial size but make sure the minimum allow a young @@ -543,69 +523,68 @@ // with other command line flags, issue a warning. // The generation minimums and the overall heap minimum should // be within one generation alignment. - if (OldSize > _max_gen1_size) { + if (_initial_old_size > _max_old_size) { warning("Inconsistency between maximum heap size and maximum " "generation sizes: using maximum heap = " SIZE_FORMAT " -XX:OldSize flag is being ignored", _max_heap_byte_size); - FLAG_SET_ERGO(uintx, OldSize, _max_gen1_size); + _initial_old_size = _max_old_size; } - _min_gen1_size = MIN2(OldSize, _min_heap_byte_size - _min_gen0_size); - _initial_gen1_size = OldSize; + _min_old_size = MIN2(_initial_old_size, _min_heap_byte_size - _min_young_size); } // The initial generation sizes should match the initial heap size, // if not issue a warning and resize the generations. This behavior // differs from JDK8 where the generation sizes have higher priority // than the initial heap size. - if ((_initial_gen1_size + _initial_gen0_size) != _initial_heap_byte_size) { + if ((_initial_old_size + _initial_young_size) != _initial_heap_byte_size) { warning("Inconsistency between generation sizes and heap size, resizing " "the generations to fit the heap."); - size_t desired_gen0_size = _initial_heap_byte_size - _initial_gen1_size; - if (_initial_heap_byte_size < _initial_gen1_size) { + size_t desired_young_size = _initial_heap_byte_size - _initial_old_size; + if (_initial_heap_byte_size < _initial_old_size) { // Old want all memory, use minimum for young and rest for old - _initial_gen0_size = _min_gen0_size; - _initial_gen1_size = _initial_heap_byte_size - _min_gen0_size; - } else if (desired_gen0_size > _max_gen0_size) { + _initial_young_size = _min_young_size; + _initial_old_size = _initial_heap_byte_size - _min_young_size; + } else if (desired_young_size > _max_young_size) { // Need to increase both young and old generation - _initial_gen0_size = _max_gen0_size; - _initial_gen1_size = _initial_heap_byte_size - _max_gen0_size; - } else if (desired_gen0_size < _min_gen0_size) { + _initial_young_size = _max_young_size; + _initial_old_size = _initial_heap_byte_size - _max_young_size; + } else if (desired_young_size < _min_young_size) { // Need to decrease both young and old generation - _initial_gen0_size = _min_gen0_size; - _initial_gen1_size = _initial_heap_byte_size - _min_gen0_size; + _initial_young_size = _min_young_size; + _initial_old_size = _initial_heap_byte_size - _min_young_size; } else { // The young generation boundaries allow us to only update the // young generation. - _initial_gen0_size = desired_gen0_size; + _initial_young_size = desired_young_size; } if (PrintGCDetails && Verbose) { - gclog_or_tty->print_cr("2: Minimum gen0 " SIZE_FORMAT " Initial gen0 " - SIZE_FORMAT " Maximum gen0 " SIZE_FORMAT, - _min_gen0_size, _initial_gen0_size, _max_gen0_size); + gclog_or_tty->print_cr("2: Minimum young " SIZE_FORMAT " Initial young " + SIZE_FORMAT " Maximum young " SIZE_FORMAT, + _min_young_size, _initial_young_size, _max_young_size); } } - // Write back to flags if necessary - if (NewSize != _initial_gen0_size) { - FLAG_SET_ERGO(uintx, NewSize, _initial_gen0_size); + // Write back to flags if necessary. + if (NewSize != _initial_young_size) { + FLAG_SET_ERGO(uintx, NewSize, _initial_young_size); } - if (MaxNewSize != _max_gen0_size) { - FLAG_SET_ERGO(uintx, MaxNewSize, _max_gen0_size); + if (MaxNewSize != _max_young_size) { + FLAG_SET_ERGO(uintx, MaxNewSize, _max_young_size); } - if (OldSize != _initial_gen1_size) { - FLAG_SET_ERGO(uintx, OldSize, _initial_gen1_size); + if (OldSize != _initial_old_size) { + FLAG_SET_ERGO(uintx, OldSize, _initial_old_size); } if (PrintGCDetails && Verbose) { - gclog_or_tty->print_cr("Minimum gen1 " SIZE_FORMAT " Initial gen1 " - SIZE_FORMAT " Maximum gen1 " SIZE_FORMAT, - _min_gen1_size, _initial_gen1_size, _max_gen1_size); + gclog_or_tty->print_cr("Minimum old " SIZE_FORMAT " Initial old " + SIZE_FORMAT " Maximum old " SIZE_FORMAT, + _min_old_size, _initial_old_size, _max_old_size); } DEBUG_ONLY(GenCollectorPolicy::assert_size_info();) @@ -631,11 +610,11 @@ HandleMark hm; // Discard any handles allocated in each iteration. // First allocation attempt is lock-free. - Generation *gen0 = gch->get_gen(0); - assert(gen0->supports_inline_contig_alloc(), + Generation *young = gch->get_gen(0); + assert(young->supports_inline_contig_alloc(), "Otherwise, must do alloc within heap lock"); - if (gen0->should_allocate(size, is_tlab)) { - result = gen0->par_allocate(size, is_tlab); + if (young->should_allocate(size, is_tlab)) { + result = young->par_allocate(size, is_tlab); if (result != NULL) { assert(gch->is_in_reserved(result), "result not in heap"); return result; @@ -917,8 +896,8 @@ bool GenCollectorPolicy::should_try_older_generation_allocation( size_t word_size) const { GenCollectedHeap* gch = GenCollectedHeap::heap(); - size_t gen0_capacity = gch->get_gen(0)->capacity_before_gc(); - return (word_size > heap_word_size(gen0_capacity)) + size_t young_capacity = gch->get_gen(0)->capacity_before_gc(); + return (word_size > heap_word_size(young_capacity)) || GC_locker::is_active_and_needs_gc() || gch->incremental_collection_failed(); } @@ -940,11 +919,11 @@ } if (UseParNewGC) { - _generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size); + _generations[0] = new GenerationSpec(Generation::ParNew, _initial_young_size, _max_young_size); } else { - _generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size); + _generations[0] = new GenerationSpec(Generation::DefNew, _initial_young_size, _max_young_size); } - _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_gen1_size, _max_gen1_size); + _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_old_size, _max_old_size); if (_generations[0] == NULL || _generations[1] == NULL) { vm_exit_during_initialization("Unable to allocate gen spec"); @@ -978,18 +957,18 @@ flag_value = 20 * M; set_basic_flag_values(); FLAG_SET_CMDLINE(uintx, NewSize, flag_value); - verify_gen0_min(flag_value); + verify_young_min(flag_value); set_basic_flag_values(); FLAG_SET_CMDLINE(uintx, NewSize, flag_value); - verify_gen0_initial(flag_value); + verify_young_initial(flag_value); // If NewSize is set on command line, but is larger than the min // heap size, it should only be used for initial young size. flag_value = 80 * M; set_basic_flag_values(); FLAG_SET_CMDLINE(uintx, NewSize, flag_value); - verify_gen0_initial(flag_value); + verify_young_initial(flag_value); // If NewSize has been ergonomically set, the collector policy // should use it for min but calculate the initial young size @@ -997,11 +976,11 @@ flag_value = 20 * M; set_basic_flag_values(); FLAG_SET_ERGO(uintx, NewSize, flag_value); - verify_gen0_min(flag_value); + verify_young_min(flag_value); set_basic_flag_values(); FLAG_SET_ERGO(uintx, NewSize, flag_value); - verify_scaled_gen0_initial(InitialHeapSize); + verify_scaled_young_initial(InitialHeapSize); restore_flags(); } @@ -1016,11 +995,11 @@ flag_value = 20 * M; set_basic_flag_values(); FLAG_SET_CMDLINE(uintx, OldSize, flag_value); - verify_gen1_min(flag_value); + verify_old_min(flag_value); set_basic_flag_values(); FLAG_SET_CMDLINE(uintx, OldSize, flag_value); - verify_gen1_initial(flag_value); + verify_old_initial(flag_value); // If MaxNewSize is large, the maximum OldSize will be less than // what's requested on the command line and it should be reset @@ -1031,46 +1010,46 @@ FLAG_SET_CMDLINE(uintx, MaxNewSize, 170*M); // Calculate what we expect the flag to be. flag_value = MaxHeapSize - MaxNewSize; - verify_gen1_initial(flag_value); + verify_old_initial(flag_value); } - static void verify_gen0_min(size_t expected) { + static void verify_young_min(size_t expected) { MarkSweepPolicy msp; msp.initialize_all(); - assert(msp.min_gen0_size() <= expected, err_msg("%zu > %zu", msp.min_gen0_size(), expected)); + assert(msp.min_young_size() <= expected, err_msg("%zu > %zu", msp.min_young_size(), expected)); } - static void verify_gen0_initial(size_t expected) { + static void verify_young_initial(size_t expected) { MarkSweepPolicy msp; msp.initialize_all(); - assert(msp.initial_gen0_size() == expected, err_msg("%zu != %zu", msp.initial_gen0_size(), expected)); + assert(msp.initial_young_size() == expected, err_msg("%zu != %zu", msp.initial_young_size(), expected)); } - static void verify_scaled_gen0_initial(size_t initial_heap_size) { + static void verify_scaled_young_initial(size_t initial_heap_size) { MarkSweepPolicy msp; msp.initialize_all(); size_t expected = msp.scale_by_NewRatio_aligned(initial_heap_size); - assert(msp.initial_gen0_size() == expected, err_msg("%zu != %zu", msp.initial_gen0_size(), expected)); + assert(msp.initial_young_size() == expected, err_msg("%zu != %zu", msp.initial_young_size(), expected)); assert(FLAG_IS_ERGO(NewSize) && NewSize == expected, err_msg("NewSize should have been set ergonomically to %zu, but was %zu", expected, NewSize)); } - static void verify_gen1_min(size_t expected) { + static void verify_old_min(size_t expected) { MarkSweepPolicy msp; msp.initialize_all(); - assert(msp.min_gen1_size() <= expected, err_msg("%zu > %zu", msp.min_gen1_size(), expected)); + assert(msp.min_old_size() <= expected, err_msg("%zu > %zu", msp.min_old_size(), expected)); } - static void verify_gen1_initial(size_t expected) { + static void verify_old_initial(size_t expected) { MarkSweepPolicy msp; msp.initialize_all(); - assert(msp.initial_gen1_size() == expected, err_msg("%zu != %zu", msp.initial_gen1_size(), expected)); + assert(msp.initial_old_size() == expected, err_msg("%zu != %zu", msp.initial_old_size(), expected)); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/memory/collectorPolicy.hpp --- a/hotspot/src/share/vm/memory/collectorPolicy.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -219,12 +219,12 @@ class GenCollectorPolicy : public CollectorPolicy { friend class TestGenCollectorPolicy; protected: - size_t _min_gen0_size; - size_t _initial_gen0_size; - size_t _max_gen0_size; - size_t _min_gen1_size; - size_t _initial_gen1_size; - size_t _max_gen1_size; + size_t _min_young_size; + size_t _initial_young_size; + size_t _max_young_size; + size_t _min_old_size; + size_t _initial_old_size; + size_t _max_old_size; // _gen_alignment and _space_alignment will have the same value most of the // time. When using large pages they can differ. @@ -260,13 +260,13 @@ GenCollectorPolicy(); // Accessors - size_t min_gen0_size() { return _min_gen0_size; } - size_t initial_gen0_size() { return _initial_gen0_size; } - size_t max_gen0_size() { return _max_gen0_size; } - size_t gen_alignment() { return _gen_alignment; } - size_t min_gen1_size() { return _min_gen1_size; } - size_t initial_gen1_size() { return _initial_gen1_size; } - size_t max_gen1_size() { return _max_gen1_size; } + size_t min_young_size() { return _min_young_size; } + size_t initial_young_size() { return _initial_young_size; } + size_t max_young_size() { return _max_young_size; } + size_t gen_alignment() { return _gen_alignment; } + size_t min_old_size() { return _min_old_size; } + size_t initial_old_size() { return _initial_old_size; } + size_t max_old_size() { return _max_old_size; } int number_of_generations() { return 2; } @@ -298,7 +298,7 @@ size_t init_survivor_size); virtual void post_heap_initialize() { - assert(_max_gen0_size == MaxNewSize, "Should be taken care of by initialize_size_info"); + assert(_max_young_size == MaxNewSize, "Should be taken care of by initialize_size_info"); } BarrierSet::Name barrier_set_name() { return BarrierSet::CardTableModRef; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/memory/genCollectedHeap.cpp --- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1119,10 +1119,10 @@ } void GenCollectedHeap::print_tracing_info() const { - if (TraceGen0Time) { + if (TraceYoungGenTime) { get_gen(0)->print_summary_info(); } - if (TraceGen1Time) { + if (TraceOldGenTime) { get_gen(1)->print_summary_info(); } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/memory/tenuredGeneration.hpp --- a/hotspot/src/share/vm/memory/tenuredGeneration.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/memory/tenuredGeneration.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -67,10 +67,9 @@ // Does a "full" (forced) collection invoked on this generation collect // all younger generations as well? Note that this is a // hack to allow the collection of the younger gen first if the flag is - // set. This is better than using th policy's should_collect_gen0_first() - // since that causes us to do an extra unnecessary pair of restart-&-stop-world. + // set. virtual bool full_collects_younger_generations() const { - return !CollectGen0First; + return !ScavengeBeforeFullGC; } virtual void gc_prologue(bool full); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/oops/cpCache.cpp --- a/hotspot/src/share/vm/oops/cpCache.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/oops/cpCache.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -407,7 +407,7 @@ oop ConstantPoolCacheEntry::appendix_if_resolved(constantPoolHandle cpool) { - if (is_f1_null() || !has_appendix()) + if (!has_appendix()) return NULL; const int ref_index = f2_as_index() + _indy_resolved_references_appendix_offset; objArrayOop resolved_references = cpool->resolved_references(); @@ -416,7 +416,7 @@ oop ConstantPoolCacheEntry::method_type_if_resolved(constantPoolHandle cpool) { - if (is_f1_null() || !has_method_type()) + if (!has_method_type()) return NULL; const int ref_index = f2_as_index() + _indy_resolved_references_method_type_offset; objArrayOop resolved_references = cpool->resolved_references(); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/oops/cpCache.hpp --- a/hotspot/src/share/vm/oops/cpCache.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/oops/cpCache.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -348,8 +348,8 @@ bool is_final() const { return (_flags & (1 << is_final_shift)) != 0; } bool is_forced_virtual() const { return (_flags & (1 << is_forced_virtual_shift)) != 0; } bool is_vfinal() const { return (_flags & (1 << is_vfinal_shift)) != 0; } - bool has_appendix() const { return (_flags & (1 << has_appendix_shift)) != 0; } - bool has_method_type() const { return (_flags & (1 << has_method_type_shift)) != 0; } + bool has_appendix() const { return (!is_f1_null()) && (_flags & (1 << has_appendix_shift)) != 0; } + bool has_method_type() const { return (!is_f1_null()) && (_flags & (1 << has_method_type_shift)) != 0; } bool is_method_entry() const { return (_flags & (1 << is_field_entry_shift)) == 0; } bool is_field_entry() const { return (_flags & (1 << is_field_entry_shift)) != 0; } bool is_byte() const { return flag_state() == btos; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/oops/methodData.hpp --- a/hotspot/src/share/vm/oops/methodData.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/oops/methodData.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -2053,7 +2053,7 @@ // Whole-method sticky bits and flags enum { - _trap_hist_limit = 20, // decoupled from Deoptimization::Reason_LIMIT + _trap_hist_limit = 21, // decoupled from Deoptimization::Reason_LIMIT _trap_hist_mask = max_jubyte, _extra_data_count = 4 // extra DataLayout headers, for trap history }; // Public flag values diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/addnode.cpp --- a/hotspot/src/share/vm/opto/addnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/addnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -254,47 +254,46 @@ const Type *t_sub1 = phase->type( in1->in(1) ); const Type *t_2 = phase->type( in2 ); if( t_sub1->singleton() && t_2->singleton() && t_sub1 != Type::TOP && t_2 != Type::TOP ) - return new (phase->C) SubINode(phase->makecon( add_ring( t_sub1, t_2 ) ), - in1->in(2) ); + return new SubINode(phase->makecon( add_ring( t_sub1, t_2 ) ), in1->in(2) ); // Convert "(a-b)+(c-d)" into "(a+c)-(b+d)" if( op2 == Op_SubI ) { // Check for dead cycle: d = (a-b)+(c-d) assert( in1->in(2) != this && in2->in(2) != this, "dead loop in AddINode::Ideal" ); - Node *sub = new (phase->C) SubINode(NULL, NULL); - sub->init_req(1, phase->transform(new (phase->C) AddINode(in1->in(1), in2->in(1) ) )); - sub->init_req(2, phase->transform(new (phase->C) AddINode(in1->in(2), in2->in(2) ) )); + Node *sub = new SubINode(NULL, NULL); + sub->init_req(1, phase->transform(new AddINode(in1->in(1), in2->in(1) ) )); + sub->init_req(2, phase->transform(new AddINode(in1->in(2), in2->in(2) ) )); return sub; } // Convert "(a-b)+(b+c)" into "(a+c)" if( op2 == Op_AddI && in1->in(2) == in2->in(1) ) { assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddINode::Ideal"); - return new (phase->C) AddINode(in1->in(1), in2->in(2)); + return new AddINode(in1->in(1), in2->in(2)); } // Convert "(a-b)+(c+b)" into "(a+c)" if( op2 == Op_AddI && in1->in(2) == in2->in(2) ) { assert(in1->in(1) != this && in2->in(1) != this,"dead loop in AddINode::Ideal"); - return new (phase->C) AddINode(in1->in(1), in2->in(1)); + return new AddINode(in1->in(1), in2->in(1)); } // Convert "(a-b)+(b-c)" into "(a-c)" if( op2 == Op_SubI && in1->in(2) == in2->in(1) ) { assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddINode::Ideal"); - return new (phase->C) SubINode(in1->in(1), in2->in(2)); + return new SubINode(in1->in(1), in2->in(2)); } // Convert "(a-b)+(c-a)" into "(c-b)" if( op2 == Op_SubI && in1->in(1) == in2->in(2) ) { assert(in1->in(2) != this && in2->in(1) != this,"dead loop in AddINode::Ideal"); - return new (phase->C) SubINode(in2->in(1), in1->in(2)); + return new SubINode(in2->in(1), in1->in(2)); } } // Convert "x+(0-y)" into "(x-y)" if( op2 == Op_SubI && phase->type(in2->in(1)) == TypeInt::ZERO ) - return new (phase->C) SubINode(in1, in2->in(2) ); + return new SubINode(in1, in2->in(2) ); // Convert "(0-y)+x" into "(x-y)" if( op1 == Op_SubI && phase->type(in1->in(1)) == TypeInt::ZERO ) - return new (phase->C) SubINode( in2, in1->in(2) ); + return new SubINode( in2, in1->in(2) ); // Convert (x>>>z)+y into (x+(y<>>z for small constant z and y. // Helps with array allocation math constant folding @@ -315,8 +314,8 @@ if( z < 5 && -5 < y && y < 0 ) { const Type *t_in11 = phase->type(in1->in(1)); if( t_in11 != Type::TOP && (t_in11->is_int()->_lo >= -(y << z)) ) { - Node *a = phase->transform( new (phase->C) AddINode( in1->in(1), phase->intcon(y<C) URShiftINode( a, in1->in(2) ); + Node *a = phase->transform( new AddINode( in1->in(1), phase->intcon(y<in(2) ); } } } @@ -387,47 +386,46 @@ const Type *t_sub1 = phase->type( in1->in(1) ); const Type *t_2 = phase->type( in2 ); if( t_sub1->singleton() && t_2->singleton() && t_sub1 != Type::TOP && t_2 != Type::TOP ) - return new (phase->C) SubLNode(phase->makecon( add_ring( t_sub1, t_2 ) ), - in1->in(2) ); + return new SubLNode(phase->makecon( add_ring( t_sub1, t_2 ) ), in1->in(2) ); // Convert "(a-b)+(c-d)" into "(a+c)-(b+d)" if( op2 == Op_SubL ) { // Check for dead cycle: d = (a-b)+(c-d) assert( in1->in(2) != this && in2->in(2) != this, "dead loop in AddLNode::Ideal" ); - Node *sub = new (phase->C) SubLNode(NULL, NULL); - sub->init_req(1, phase->transform(new (phase->C) AddLNode(in1->in(1), in2->in(1) ) )); - sub->init_req(2, phase->transform(new (phase->C) AddLNode(in1->in(2), in2->in(2) ) )); + Node *sub = new SubLNode(NULL, NULL); + sub->init_req(1, phase->transform(new AddLNode(in1->in(1), in2->in(1) ) )); + sub->init_req(2, phase->transform(new AddLNode(in1->in(2), in2->in(2) ) )); return sub; } // Convert "(a-b)+(b+c)" into "(a+c)" if( op2 == Op_AddL && in1->in(2) == in2->in(1) ) { assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddLNode::Ideal"); - return new (phase->C) AddLNode(in1->in(1), in2->in(2)); + return new AddLNode(in1->in(1), in2->in(2)); } // Convert "(a-b)+(c+b)" into "(a+c)" if( op2 == Op_AddL && in1->in(2) == in2->in(2) ) { assert(in1->in(1) != this && in2->in(1) != this,"dead loop in AddLNode::Ideal"); - return new (phase->C) AddLNode(in1->in(1), in2->in(1)); + return new AddLNode(in1->in(1), in2->in(1)); } // Convert "(a-b)+(b-c)" into "(a-c)" if( op2 == Op_SubL && in1->in(2) == in2->in(1) ) { assert(in1->in(1) != this && in2->in(2) != this,"dead loop in AddLNode::Ideal"); - return new (phase->C) SubLNode(in1->in(1), in2->in(2)); + return new SubLNode(in1->in(1), in2->in(2)); } // Convert "(a-b)+(c-a)" into "(c-b)" if( op2 == Op_SubL && in1->in(1) == in1->in(2) ) { assert(in1->in(2) != this && in2->in(1) != this,"dead loop in AddLNode::Ideal"); - return new (phase->C) SubLNode(in2->in(1), in1->in(2)); + return new SubLNode(in2->in(1), in1->in(2)); } } // Convert "x+(0-y)" into "(x-y)" if( op2 == Op_SubL && phase->type(in2->in(1)) == TypeLong::ZERO ) - return new (phase->C) SubLNode( in1, in2->in(2) ); + return new SubLNode( in1, in2->in(2) ); // Convert "(0-y)+x" into "(x-y)" if( op1 == Op_SubL && phase->type(in1->in(1)) == TypeInt::ZERO ) - return new (phase->C) SubLNode( in2, in1->in(2) ); + return new SubLNode( in2, in1->in(2) ); // Convert "X+X+X+X+X...+X+Y" into "k*X+Y" or really convert "X+(X+Y)" // into "(X<<1)+Y" and let shift-folding happen. @@ -435,8 +433,8 @@ in2->in(1) == in1 && op1 != Op_ConL && 0 ) { - Node *shift = phase->transform(new (phase->C) LShiftLNode(in1,phase->intcon(1))); - return new (phase->C) AddLNode(shift,in2->in(2)); + Node *shift = phase->transform(new LShiftLNode(in1,phase->intcon(1))); + return new AddLNode(shift,in2->in(2)); } return AddNode::Ideal(phase, can_reshape); @@ -596,7 +594,7 @@ offset = phase->MakeConX(t2->get_con() + t12->get_con()); } else { // Else move the constant to the right. ((A+con)+B) into ((A+B)+con) - address = phase->transform(new (phase->C) AddPNode(in(Base),addp->in(Address),in(Offset))); + address = phase->transform(new AddPNode(in(Base),addp->in(Address),in(Offset))); offset = addp->in(Offset); } PhaseIterGVN *igvn = phase->is_IterGVN(); @@ -616,7 +614,7 @@ // If this is a NULL+long form (from unsafe accesses), switch to a rawptr. if (phase->type(in(Address)) == TypePtr::NULL_PTR) { Node* offset = in(Offset); - return new (phase->C) CastX2PNode(offset); + return new CastX2PNode(offset); } } @@ -628,7 +626,7 @@ if( add->Opcode() == Op_AddX && add->in(1) != add ) { const Type *t22 = phase->type( add->in(2) ); if( t22->singleton() && (t22 != Type::TOP) ) { // Right input is an add of a constant? - set_req(Address, phase->transform(new (phase->C) AddPNode(in(Base),in(Address),add->in(1)))); + set_req(Address, phase->transform(new AddPNode(in(Base),in(Address),add->in(1)))); set_req(Offset, add->in(2)); PhaseIterGVN *igvn = phase->is_IterGVN(); if (add->outcnt() == 0 && igvn) { @@ -858,7 +856,7 @@ // to force a right-spline graph for the rest of MinINode::Ideal(). if( l->Opcode() == Op_MinI ) { assert( l != l->in(1), "dead loop in MinINode::Ideal" ); - r = phase->transform(new (phase->C) MinINode(l->in(2),r)); + r = phase->transform(new MinINode(l->in(2),r)); l = l->in(1); set_req(1, l); set_req(2, r); @@ -906,18 +904,18 @@ } if( x->_idx > y->_idx ) - return new (phase->C) MinINode(r->in(1),phase->transform(new (phase->C) MinINode(l,r->in(2)))); + return new MinINode(r->in(1),phase->transform(new MinINode(l,r->in(2)))); // See if covers: MIN2(x+c0,MIN2(y+c1,z)) if( !phase->eqv(x,y) ) return NULL; // If (y == x) transform MIN2(x+c0, MIN2(x+c1,z)) into // MIN2(x+c0 or x+c1 which less, z). - return new (phase->C) MinINode(phase->transform(new (phase->C) AddINode(x,phase->intcon(MIN2(x_off,y_off)))),r->in(2)); + return new MinINode(phase->transform(new AddINode(x,phase->intcon(MIN2(x_off,y_off)))),r->in(2)); } else { // See if covers: MIN2(x+c0,y+c1) if( !phase->eqv(x,y) ) return NULL; // If (y == x) transform MIN2(x+c0,x+c1) into x+c0 or x+c1 which less. - return new (phase->C) AddINode(x,phase->intcon(MIN2(x_off,y_off))); + return new AddINode(x,phase->intcon(MIN2(x_off,y_off))); } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/block.cpp --- a/hotspot/src/share/vm/opto/block.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/block.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -373,7 +373,7 @@ // I'll need a few machine-specific GotoNodes. Make an Ideal GotoNode, // then Match it into a machine-specific Node. Then clone the machine // Node on demand. - Node *x = new (C) GotoNode(NULL); + Node *x = new GotoNode(NULL); x->init_req(0, x); _goto = matcher.match_tree(x); assert(_goto != NULL, ""); @@ -426,7 +426,7 @@ !p->is_block_start() ); // Make the block begin with one of Region or StartNode. if( !p->is_block_start() ) { - RegionNode *r = new (C) RegionNode( 2 ); + RegionNode *r = new RegionNode( 2 ); r->init_req(1, p); // Insert RegionNode in the way proj->set_req(0, r); // Insert RegionNode in the way p = r; @@ -501,7 +501,7 @@ // get ProjNode corresponding to the succ_no'th successor of the in block ProjNode* proj = in->get_node(in->number_of_nodes() - in->_num_succs + succ_no)->as_Proj(); // create region for basic block - RegionNode* region = new (C) RegionNode(2); + RegionNode* region = new RegionNode(2); region->init_req(1, proj); // setup corresponding basic block Block* block = new (_block_arena) Block(_block_arena, region); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/bytecodeInfo.cpp --- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -361,11 +361,14 @@ set_msg("not an accessor"); return false; } + + // Limit inlining depth in case inlining is forced or + // _max_inline_level was increased to compensate for lambda forms. + if (inline_level() > MaxForceInlineLevel) { + set_msg("MaxForceInlineLevel"); + return false; + } if (inline_level() > _max_inline_level) { - if (callee_method->force_inline() && inline_level() > MaxForceInlineLevel) { - set_msg("MaxForceInlineLevel"); - return false; - } if (!callee_method->force_inline() || !IncrementalInline) { set_msg("inlining too deep"); return false; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/c2_globals.hpp --- a/hotspot/src/share/vm/opto/c2_globals.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/c2_globals.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -650,9 +650,6 @@ product(bool, UseMathExactIntrinsics, true, \ "Enables intrinsification of various java.lang.Math functions") \ \ - experimental(bool, ReplaceInParentMaps, false, \ - "Propagate type improvements in callers of inlinee if possible") \ - \ product(bool, UseTypeSpeculation, true, \ "Speculatively propagate types from profiles") \ \ diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/callGenerator.cpp --- a/hotspot/src/share/vm/opto/callGenerator.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/callGenerator.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -63,12 +63,12 @@ } virtual bool is_parse() const { return true; } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); + virtual JVMState* generate(JVMState* jvms); int is_osr() { return _is_osr; } }; -JVMState* ParseGenerator::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* ParseGenerator::generate(JVMState* jvms) { Compile* C = Compile::current(); C->print_inlining_update(this); @@ -81,7 +81,7 @@ return NULL; // bailing out of the compile; do not try to parse } - Parse parser(jvms, method(), _expected_uses, parent_parser); + Parse parser(jvms, method(), _expected_uses); // Grab signature for matching/allocation #ifdef ASSERT if (parser.tf() != (parser.depth() == 1 ? C->tf() : tf())) { @@ -120,12 +120,12 @@ _separate_io_proj(separate_io_proj) { } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); + virtual JVMState* generate(JVMState* jvms); CallStaticJavaNode* call_node() const { return _call_node; } }; -JVMState* DirectCallGenerator::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* DirectCallGenerator::generate(JVMState* jvms) { GraphKit kit(jvms); kit.C->print_inlining_update(this); bool is_static = method()->is_static(); @@ -136,7 +136,7 @@ kit.C->log()->elem("direct_call bci='%d'", jvms->bci()); } - CallStaticJavaNode *call = new (kit.C) CallStaticJavaNode(kit.C, tf(), target, method(), kit.bci()); + CallStaticJavaNode *call = new CallStaticJavaNode(kit.C, tf(), target, method(), kit.bci()); _call_node = call; // Save the call node in case we need it later if (!is_static) { // Make an explicit receiver null_check as part of this call. @@ -173,10 +173,10 @@ vtable_index >= 0, "either invalid or usable"); } virtual bool is_virtual() const { return true; } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); + virtual JVMState* generate(JVMState* jvms); }; -JVMState* VirtualCallGenerator::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* VirtualCallGenerator::generate(JVMState* jvms) { GraphKit kit(jvms); Node* receiver = kit.argument(0); @@ -225,7 +225,7 @@ "no vtable calls if +UseInlineCaches "); address target = SharedRuntime::get_resolve_virtual_call_stub(); // Normal inline cache used for call - CallDynamicJavaNode *call = new (kit.C) CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci()); + CallDynamicJavaNode *call = new CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci()); kit.set_arguments_for_java_call(call); kit.set_edges_for_java_call(call); Node* ret = kit.set_results_for_java_call(call); @@ -283,7 +283,7 @@ // Convert the CallStaticJava into an inline virtual void do_late_inline(); - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) { + virtual JVMState* generate(JVMState* jvms) { Compile *C = Compile::current(); C->log_inline_id(this); @@ -298,7 +298,7 @@ // that the late inlining logic can distinguish between fall // through and exceptional uses of the memory and io projections // as is done for allocations and macro expansion. - return DirectCallGenerator::generate(jvms, parent_parser); + return DirectCallGenerator::generate(jvms); } virtual void print_inlining_late(const char* msg) { @@ -350,7 +350,7 @@ JVMState* old_jvms = call->jvms(); JVMState* jvms = old_jvms->clone_shallow(C); uint size = call->req(); - SafePointNode* map = new (C) SafePointNode(size, jvms); + SafePointNode* map = new SafePointNode(size, jvms); for (uint i1 = 0; i1 < size; i1++) { map->init_req(i1, call->in(i1)); } @@ -399,7 +399,7 @@ } // Now perform the inlining using the synthesized JVMState - JVMState* new_jvms = _inline_cg->generate(jvms, NULL); + JVMState* new_jvms = _inline_cg->generate(jvms); if (new_jvms == NULL) return; // no change if (C->failing()) return; @@ -417,7 +417,7 @@ C->env()->notice_inlined_method(_inline_cg->method()); C->set_inlining_progress(true); - kit.replace_call(call, result); + kit.replace_call(call, result, true); } @@ -439,8 +439,8 @@ virtual bool is_mh_late_inline() const { return true; } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) { - JVMState* new_jvms = LateInlineCallGenerator::generate(jvms, parent_parser); + virtual JVMState* generate(JVMState* jvms) { + JVMState* new_jvms = LateInlineCallGenerator::generate(jvms); Compile* C = Compile::current(); if (_input_not_const) { @@ -486,14 +486,14 @@ LateInlineStringCallGenerator(ciMethod* method, CallGenerator* inline_cg) : LateInlineCallGenerator(method, inline_cg) {} - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) { + virtual JVMState* generate(JVMState* jvms) { Compile *C = Compile::current(); C->log_inline_id(this); C->add_string_late_inline(this); - JVMState* new_jvms = DirectCallGenerator::generate(jvms, parent_parser); + JVMState* new_jvms = DirectCallGenerator::generate(jvms); return new_jvms; } @@ -510,14 +510,14 @@ LateInlineBoxingCallGenerator(ciMethod* method, CallGenerator* inline_cg) : LateInlineCallGenerator(method, inline_cg) {} - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) { + virtual JVMState* generate(JVMState* jvms) { Compile *C = Compile::current(); C->log_inline_id(this); C->add_boxing_late_inline(this); - JVMState* new_jvms = DirectCallGenerator::generate(jvms, parent_parser); + JVMState* new_jvms = DirectCallGenerator::generate(jvms); return new_jvms; } }; @@ -553,7 +553,7 @@ virtual bool is_virtual() const { return _is_virtual; } virtual bool is_deferred() const { return true; } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); + virtual JVMState* generate(JVMState* jvms); }; @@ -563,14 +563,14 @@ return new WarmCallGenerator(ci, if_cold, if_hot); } -JVMState* WarmCallGenerator::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* WarmCallGenerator::generate(JVMState* jvms) { Compile* C = Compile::current(); C->print_inlining_update(this); if (C->log() != NULL) { C->log()->elem("warm_call bci='%d'", jvms->bci()); } - jvms = _if_cold->generate(jvms, parent_parser); + jvms = _if_cold->generate(jvms); if (jvms != NULL) { Node* m = jvms->map()->control(); if (m->is_CatchProj()) m = m->in(0); else m = C->top(); @@ -631,7 +631,7 @@ virtual bool is_inline() const { return _if_hit->is_inline(); } virtual bool is_deferred() const { return _if_hit->is_deferred(); } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); + virtual JVMState* generate(JVMState* jvms); }; @@ -643,14 +643,13 @@ } -JVMState* PredictedCallGenerator::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* PredictedCallGenerator::generate(JVMState* jvms) { GraphKit kit(jvms); kit.C->print_inlining_update(this); PhaseGVN& gvn = kit.gvn(); // We need an explicit receiver null_check before checking its type. // We share a map with the caller, so his JVMS gets adjusted. Node* receiver = kit.argument(0); - CompileLog* log = kit.C->log(); if (log != NULL) { log->elem("predicted_call bci='%d' klass='%d'", @@ -662,6 +661,10 @@ return kit.transfer_exceptions_into_jvms(); } + // Make a copy of the replaced nodes in case we need to restore them + ReplacedNodes replaced_nodes = kit.map()->replaced_nodes(); + replaced_nodes.clone(); + Node* exact_receiver = receiver; // will get updated in place... Node* slow_ctl = kit.type_check_receiver(receiver, _predicted_receiver, _hit_prob, @@ -672,7 +675,7 @@ { PreserveJVMState pjvms(&kit); kit.set_control(slow_ctl); if (!kit.stopped()) { - slow_jvms = _if_missed->generate(kit.sync_jvms(), parent_parser); + slow_jvms = _if_missed->generate(kit.sync_jvms()); if (kit.failing()) return NULL; // might happen because of NodeCountInliningCutoff assert(slow_jvms != NULL, "must be"); @@ -693,12 +696,12 @@ kit.replace_in_map(receiver, exact_receiver); // Make the hot call: - JVMState* new_jvms = _if_hit->generate(kit.sync_jvms(), parent_parser); + JVMState* new_jvms = _if_hit->generate(kit.sync_jvms()); if (new_jvms == NULL) { // Inline failed, so make a direct call. assert(_if_hit->is_inline(), "must have been a failed inline"); CallGenerator* cg = CallGenerator::for_direct_call(_if_hit->method()); - new_jvms = cg->generate(kit.sync_jvms(), parent_parser); + new_jvms = cg->generate(kit.sync_jvms()); } kit.add_exception_states_from(new_jvms); kit.set_jvms(new_jvms); @@ -715,16 +718,29 @@ return kit.transfer_exceptions_into_jvms(); } + // There are 2 branches and the replaced nodes are only valid on + // one: restore the replaced nodes to what they were before the + // branch. + kit.map()->set_replaced_nodes(replaced_nodes); + // Finish the diamond. kit.C->set_has_split_ifs(true); // Has chance for split-if optimization - RegionNode* region = new (kit.C) RegionNode(3); + RegionNode* region = new RegionNode(3); region->init_req(1, kit.control()); region->init_req(2, slow_map->control()); kit.set_control(gvn.transform(region)); Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO); iophi->set_req(2, slow_map->i_o()); kit.set_i_o(gvn.transform(iophi)); + // Merge memory kit.merge_memory(slow_map->merged_memory(), region, 2); + // Transform new memory Phis. + for (MergeMemStream mms(kit.merged_memory()); mms.next_non_empty();) { + Node* phi = mms.memory(); + if (phi->is_Phi() && phi->in(0) == region) { + mms.set_memory(gvn.transform(phi)); + } + } uint tos = kit.jvms()->stkoff() + kit.sp(); uint limit = slow_map->req(); for (uint i = TypeFunc::Parms; i < limit; i++) { @@ -825,7 +841,7 @@ const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); const Type* sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass()); if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { - Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type)); + Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); kit.set_argument(0, cast_obj); } } @@ -837,7 +853,7 @@ const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass()); if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { - Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type)); + Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); kit.set_argument(receiver_skip + i, cast_obj); } } @@ -882,15 +898,15 @@ } -//------------------------PredictedIntrinsicGenerator------------------------------ -// Internal class which handles all predicted Intrinsic calls. -class PredictedIntrinsicGenerator : public CallGenerator { +//------------------------PredicatedIntrinsicGenerator------------------------------ +// Internal class which handles all predicated Intrinsic calls. +class PredicatedIntrinsicGenerator : public CallGenerator { CallGenerator* _intrinsic; CallGenerator* _cg; public: - PredictedIntrinsicGenerator(CallGenerator* intrinsic, - CallGenerator* cg) + PredicatedIntrinsicGenerator(CallGenerator* intrinsic, + CallGenerator* cg) : CallGenerator(cg->method()) { _intrinsic = intrinsic; @@ -901,108 +917,186 @@ virtual bool is_inlined() const { return true; } virtual bool is_intrinsic() const { return true; } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); + virtual JVMState* generate(JVMState* jvms); }; -CallGenerator* CallGenerator::for_predicted_intrinsic(CallGenerator* intrinsic, - CallGenerator* cg) { - return new PredictedIntrinsicGenerator(intrinsic, cg); +CallGenerator* CallGenerator::for_predicated_intrinsic(CallGenerator* intrinsic, + CallGenerator* cg) { + return new PredicatedIntrinsicGenerator(intrinsic, cg); } -JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* PredicatedIntrinsicGenerator::generate(JVMState* jvms) { + // The code we want to generate here is: + // if (receiver == NULL) + // uncommon_Trap + // if (predicate(0)) + // do_intrinsic(0) + // else + // if (predicate(1)) + // do_intrinsic(1) + // ... + // else + // do_java_comp + GraphKit kit(jvms); PhaseGVN& gvn = kit.gvn(); CompileLog* log = kit.C->log(); if (log != NULL) { - log->elem("predicted_intrinsic bci='%d' method='%d'", + log->elem("predicated_intrinsic bci='%d' method='%d'", jvms->bci(), log->identify(method())); } - Node* slow_ctl = _intrinsic->generate_predicate(kit.sync_jvms()); - if (kit.failing()) - return NULL; // might happen because of NodeCountInliningCutoff - - kit.C->print_inlining_update(this); - SafePointNode* slow_map = NULL; - JVMState* slow_jvms; - if (slow_ctl != NULL) { - PreserveJVMState pjvms(&kit); - kit.set_control(slow_ctl); - if (!kit.stopped()) { - slow_jvms = _cg->generate(kit.sync_jvms(), parent_parser); - if (kit.failing()) - return NULL; // might happen because of NodeCountInliningCutoff - assert(slow_jvms != NULL, "must be"); - kit.add_exception_states_from(slow_jvms); - kit.set_map(slow_jvms->map()); - if (!kit.stopped()) - slow_map = kit.stop(); + if (!method()->is_static()) { + // We need an explicit receiver null_check before checking its type in predicate. + // We share a map with the caller, so his JVMS gets adjusted. + Node* receiver = kit.null_check_receiver_before_call(method()); + if (kit.stopped()) { + return kit.transfer_exceptions_into_jvms(); } } - if (kit.stopped()) { - // Predicate is always false. - kit.set_jvms(slow_jvms); + int n_predicates = _intrinsic->predicates_count(); + assert(n_predicates > 0, "sanity"); + + JVMState** result_jvms = NEW_RESOURCE_ARRAY(JVMState*, (n_predicates+1)); + + // Region for normal compilation code if intrinsic failed. + Node* slow_region = new RegionNode(1); + + int results = 0; + for (int predicate = 0; (predicate < n_predicates) && !kit.stopped(); predicate++) { +#ifdef ASSERT + JVMState* old_jvms = kit.jvms(); + SafePointNode* old_map = kit.map(); + Node* old_io = old_map->i_o(); + Node* old_mem = old_map->memory(); + Node* old_exc = old_map->next_exception(); +#endif + Node* else_ctrl = _intrinsic->generate_predicate(kit.sync_jvms(), predicate); +#ifdef ASSERT + // Assert(no_new_memory && no_new_io && no_new_exceptions) after generate_predicate. + assert(old_jvms == kit.jvms(), "generate_predicate should not change jvm state"); + SafePointNode* new_map = kit.map(); + assert(old_io == new_map->i_o(), "generate_predicate should not change i_o"); + assert(old_mem == new_map->memory(), "generate_predicate should not change memory"); + assert(old_exc == new_map->next_exception(), "generate_predicate should not add exceptions"); +#endif + if (!kit.stopped()) { + PreserveJVMState pjvms(&kit); + // Generate intrinsic code: + JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms()); + if (new_jvms == NULL) { + // Intrinsic failed, use normal compilation path for this predicate. + slow_region->add_req(kit.control()); + } else { + kit.add_exception_states_from(new_jvms); + kit.set_jvms(new_jvms); + if (!kit.stopped()) { + result_jvms[results++] = kit.jvms(); + } + } + } + if (else_ctrl == NULL) { + else_ctrl = kit.C->top(); + } + kit.set_control(else_ctrl); + } + if (!kit.stopped()) { + // Final 'else' after predicates. + slow_region->add_req(kit.control()); + } + if (slow_region->req() > 1) { + PreserveJVMState pjvms(&kit); + // Generate normal compilation code: + kit.set_control(gvn.transform(slow_region)); + JVMState* new_jvms = _cg->generate(kit.sync_jvms()); + if (kit.failing()) + return NULL; // might happen because of NodeCountInliningCutoff + assert(new_jvms != NULL, "must be"); + kit.add_exception_states_from(new_jvms); + kit.set_jvms(new_jvms); + if (!kit.stopped()) { + result_jvms[results++] = kit.jvms(); + } + } + + if (results == 0) { + // All paths ended in uncommon traps. + (void) kit.stop(); return kit.transfer_exceptions_into_jvms(); } - // Generate intrinsic code: - JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms(), parent_parser); - if (new_jvms == NULL) { - // Intrinsic failed, so use slow code or make a direct call. - if (slow_map == NULL) { - CallGenerator* cg = CallGenerator::for_direct_call(method()); - new_jvms = cg->generate(kit.sync_jvms(), parent_parser); - } else { - kit.set_jvms(slow_jvms); - return kit.transfer_exceptions_into_jvms(); - } - } - kit.add_exception_states_from(new_jvms); - kit.set_jvms(new_jvms); - - // Need to merge slow and fast? - if (slow_map == NULL) { - // The fast path is the only path remaining. + if (results == 1) { // Only one path + kit.set_jvms(result_jvms[0]); return kit.transfer_exceptions_into_jvms(); } - if (kit.stopped()) { - // Intrinsic method threw an exception, so it's just the slow path after all. - kit.set_jvms(slow_jvms); - return kit.transfer_exceptions_into_jvms(); + // Merge all paths. + kit.C->set_has_split_ifs(true); // Has chance for split-if optimization + RegionNode* region = new RegionNode(results + 1); + Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO); + for (int i = 0; i < results; i++) { + JVMState* jvms = result_jvms[i]; + int path = i + 1; + SafePointNode* map = jvms->map(); + region->init_req(path, map->control()); + iophi->set_req(path, map->i_o()); + if (i == 0) { + kit.set_jvms(jvms); + } else { + kit.merge_memory(map->merged_memory(), region, path); + } + } + kit.set_control(gvn.transform(region)); + kit.set_i_o(gvn.transform(iophi)); + // Transform new memory Phis. + for (MergeMemStream mms(kit.merged_memory()); mms.next_non_empty();) { + Node* phi = mms.memory(); + if (phi->is_Phi() && phi->in(0) == region) { + mms.set_memory(gvn.transform(phi)); + } } - // Finish the diamond. - kit.C->set_has_split_ifs(true); // Has chance for split-if optimization - RegionNode* region = new (kit.C) RegionNode(3); - region->init_req(1, kit.control()); - region->init_req(2, slow_map->control()); - kit.set_control(gvn.transform(region)); - Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO); - iophi->set_req(2, slow_map->i_o()); - kit.set_i_o(gvn.transform(iophi)); - kit.merge_memory(slow_map->merged_memory(), region, 2); + // Merge debug info. + Node** ins = NEW_RESOURCE_ARRAY(Node*, results); uint tos = kit.jvms()->stkoff() + kit.sp(); - uint limit = slow_map->req(); + Node* map = kit.map(); + uint limit = map->req(); for (uint i = TypeFunc::Parms; i < limit; i++) { // Skip unused stack slots; fast forward to monoff(); if (i == tos) { i = kit.jvms()->monoff(); if( i >= limit ) break; } - Node* m = kit.map()->in(i); - Node* n = slow_map->in(i); - if (m != n) { - const Type* t = gvn.type(m)->meet_speculative(gvn.type(n)); - Node* phi = PhiNode::make(region, m, t); - phi->set_req(2, n); - kit.map()->set_req(i, gvn.transform(phi)); + Node* n = map->in(i); + ins[0] = n; + const Type* t = gvn.type(n); + bool needs_phi = false; + for (int j = 1; j < results; j++) { + JVMState* jvms = result_jvms[j]; + Node* jmap = jvms->map(); + Node* m = NULL; + if (jmap->req() > i) { + m = jmap->in(i); + if (m != n) { + needs_phi = true; + t = t->meet_speculative(gvn.type(m)); + } + } + ins[j] = m; + } + if (needs_phi) { + Node* phi = PhiNode::make(region, n, t); + for (int j = 1; j < results; j++) { + phi->set_req(j + 1, ins[j]); + } + map->set_req(i, gvn.transform(phi)); } } + return kit.transfer_exceptions_into_jvms(); } @@ -1025,7 +1119,7 @@ virtual bool is_virtual() const { ShouldNotReachHere(); return false; } virtual bool is_trap() const { return true; } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); + virtual JVMState* generate(JVMState* jvms); }; @@ -1037,7 +1131,7 @@ } -JVMState* UncommonTrapCallGenerator::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* UncommonTrapCallGenerator::generate(JVMState* jvms) { GraphKit kit(jvms); kit.C->print_inlining_update(this); // Take the trap with arguments pushed on the stack. (Cf. null_check_receiver). diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/callGenerator.hpp --- a/hotspot/src/share/vm/opto/callGenerator.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/callGenerator.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -31,8 +31,6 @@ #include "opto/type.hpp" #include "runtime/deoptimization.hpp" -class Parse; - //---------------------------CallGenerator------------------------------------- // The subclasses of this class handle generation of ideal nodes for // call sites and method entry points. @@ -63,8 +61,9 @@ virtual bool is_virtual() const { return false; } // is_deferred: The decision whether to inline or not is deferred. virtual bool is_deferred() const { return false; } - // is_predicted: Uses an explicit check against a predicted type. - virtual bool is_predicted() const { return false; } + // is_predicated: Uses an explicit check (predicate). + virtual bool is_predicated() const { return false; } + virtual int predicates_count() const { return 0; } // is_trap: Does not return to the caller. (E.g., uncommon trap.) virtual bool is_trap() const { return false; } // does_virtual_dispatch: Should try inlining as normal method first. @@ -114,7 +113,7 @@ // // If the result is NULL, it means that this CallGenerator was unable // to handle the given call, and another CallGenerator should be consulted. - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser) = 0; + virtual JVMState* generate(JVMState* jvms) = 0; // How to generate a call site that is inlined: static CallGenerator* for_inline(ciMethod* m, float expected_uses = -1); @@ -160,9 +159,9 @@ // Registry for intrinsics: static CallGenerator* for_intrinsic(ciMethod* m); static void register_intrinsic(ciMethod* m, CallGenerator* cg); - static CallGenerator* for_predicted_intrinsic(CallGenerator* intrinsic, - CallGenerator* cg); - virtual Node* generate_predicate(JVMState* jvms) { return NULL; }; + static CallGenerator* for_predicated_intrinsic(CallGenerator* intrinsic, + CallGenerator* cg); + virtual Node* generate_predicate(JVMState* jvms, int predicate) { return NULL; }; virtual void print_inlining_late(const char* msg) { ShouldNotReachHere(); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/callnode.cpp --- a/hotspot/src/share/vm/opto/callnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/callnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -74,20 +74,20 @@ case TypeFunc::Control: case TypeFunc::I_O: case TypeFunc::Memory: - return new (match->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); + return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); case TypeFunc::FramePtr: - return new (match->C) MachProjNode(this,proj->_con,Matcher::c_frame_ptr_mask, Op_RegP); + return new MachProjNode(this,proj->_con,Matcher::c_frame_ptr_mask, Op_RegP); case TypeFunc::ReturnAdr: - return new (match->C) MachProjNode(this,proj->_con,match->_return_addr_mask,Op_RegP); + return new MachProjNode(this,proj->_con,match->_return_addr_mask,Op_RegP); case TypeFunc::Parms: default: { uint parm_num = proj->_con - TypeFunc::Parms; const Type *t = _domain->field_at(proj->_con); if (t->base() == Type::Half) // 2nd half of Longs and Doubles - return new (match->C) ConNode(Type::TOP); + return new ConNode(Type::TOP); uint ideal_reg = t->ideal_reg(); RegMask &rm = match->_calling_convention_mask[parm_num]; - return new (match->C) MachProjNode(this,proj->_con,rm,ideal_reg); + return new MachProjNode(this,proj->_con,rm,ideal_reg); } } return NULL; @@ -685,12 +685,12 @@ case TypeFunc::Control: case TypeFunc::I_O: case TypeFunc::Memory: - return new (match->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); + return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); case TypeFunc::Parms+1: // For LONG & DOUBLE returns assert(tf()->_range->field_at(TypeFunc::Parms+1) == Type::HALF, ""); // 2nd half of doubles and longs - return new (match->C) MachProjNode(this,proj->_con, RegMask::Empty, (uint)OptoReg::Bad); + return new MachProjNode(this,proj->_con, RegMask::Empty, (uint)OptoReg::Bad); case TypeFunc::Parms: { // Normal returns uint ideal_reg = tf()->range()->field_at(TypeFunc::Parms)->ideal_reg(); @@ -700,7 +700,7 @@ RegMask rm = RegMask(regs.first()); if( OptoReg::is_valid(regs.second()) ) rm.Insert( regs.second() ); - return new (match->C) MachProjNode(this,proj->_con,rm,ideal_reg); + return new MachProjNode(this,proj->_con,rm,ideal_reg); } case TypeFunc::ReturnAdr: @@ -1090,6 +1090,7 @@ #ifndef PRODUCT void SafePointNode::dump_spec(outputStream *st) const { st->print(" SafePoint "); + _replaced_nodes.dump(st); } #endif @@ -1288,10 +1289,10 @@ Node* nproj = catchproj->clone(); igvn->register_new_node_with_optimizer(nproj); - Node *frame = new (phase->C) ParmNode( phase->C->start(), TypeFunc::FramePtr ); + Node *frame = new ParmNode( phase->C->start(), TypeFunc::FramePtr ); frame = phase->transform(frame); // Halt & Catch Fire - Node *halt = new (phase->C) HaltNode( nproj, frame ); + Node *halt = new HaltNode( nproj, frame ); phase->C->root()->add_req(halt); phase->transform(halt); @@ -1333,7 +1334,7 @@ if (!allow_new_nodes) return NULL; // Create a cast which is control dependent on the initialization to // propagate the fact that the array length must be positive. - length = new (phase->C) CastIINode(length, narrow_length_type); + length = new CastIINode(length, narrow_length_type); length->set_req(0, initialization()->proj_out(0)); } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/callnode.hpp --- a/hotspot/src/share/vm/opto/callnode.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/callnode.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -30,6 +30,7 @@ #include "opto/multnode.hpp" #include "opto/opcodes.hpp" #include "opto/phaseX.hpp" +#include "opto/replacednodes.hpp" #include "opto/type.hpp" // Portions of code courtesy of Clifford Click @@ -335,6 +336,7 @@ OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC JVMState* const _jvms; // Pointer to list of JVM State objects const TypePtr* _adr_type; // What type of memory does this node produce? + ReplacedNodes _replaced_nodes; // During parsing: list of pair of nodes from calls to GraphKit::replace_in_map() // Many calls take *all* of memory as input, // but some produce a limited subset of that memory as output. @@ -426,6 +428,37 @@ void set_next_exception(SafePointNode* n); bool has_exceptions() const { return next_exception() != NULL; } + // Helper methods to operate on replaced nodes + ReplacedNodes replaced_nodes() const { + return _replaced_nodes; + } + + void set_replaced_nodes(ReplacedNodes replaced_nodes) { + _replaced_nodes = replaced_nodes; + } + + void clone_replaced_nodes() { + _replaced_nodes.clone(); + } + void record_replaced_node(Node* initial, Node* improved) { + _replaced_nodes.record(initial, improved); + } + void transfer_replaced_nodes_from(SafePointNode* sfpt, uint idx = 0) { + _replaced_nodes.transfer_from(sfpt->_replaced_nodes, idx); + } + void delete_replaced_nodes() { + _replaced_nodes.reset(); + } + void apply_replaced_nodes() { + _replaced_nodes.apply(this); + } + void merge_replaced_nodes_with(SafePointNode* sfpt) { + _replaced_nodes.merge_with(sfpt->_replaced_nodes); + } + bool has_replaced_nodes() const { + return !_replaced_nodes.is_empty(); + } + // Standard Node stuff virtual int Opcode() const; virtual bool pinned() const { return true; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/castnode.cpp --- a/hotspot/src/share/vm/opto/castnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/castnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -228,11 +228,11 @@ Node* dispX, bool negate = false) { if (negate) { - dispX = new (phase->C) SubXNode(phase->MakeConX(0), phase->transform(dispX)); + dispX = new SubXNode(phase->MakeConX(0), phase->transform(dispX)); } - return new (phase->C) AddPNode(phase->C->top(), - phase->transform(new (phase->C) CastX2PNode(base)), - phase->transform(dispX)); + return new AddPNode(phase->C->top(), + phase->transform(new CastX2PNode(base)), + phase->transform(dispX)); } Node *CastX2PNode::Ideal(PhaseGVN *phase, bool can_reshape) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/cfgnode.cpp --- a/hotspot/src/share/vm/opto/cfgnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/cfgnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -662,17 +662,17 @@ convf2i->in(1) == bot_in ) { // Matched pattern, including LShiftI; RShiftI, replace with integer compares // max test - Node *cmp = gvn->register_new_node_with_optimizer(new (phase->C) CmpINode( convf2i, min )); - Node *boo = gvn->register_new_node_with_optimizer(new (phase->C) BoolNode( cmp, BoolTest::lt )); - IfNode *iff = (IfNode*)gvn->register_new_node_with_optimizer(new (phase->C) IfNode( top_if->in(0), boo, PROB_UNLIKELY_MAG(5), top_if->_fcnt )); - Node *if_min= gvn->register_new_node_with_optimizer(new (phase->C) IfTrueNode (iff)); - Node *ifF = gvn->register_new_node_with_optimizer(new (phase->C) IfFalseNode(iff)); + Node *cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, min )); + Node *boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::lt )); + IfNode *iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( top_if->in(0), boo, PROB_UNLIKELY_MAG(5), top_if->_fcnt )); + Node *if_min= gvn->register_new_node_with_optimizer(new IfTrueNode (iff)); + Node *ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff)); // min test - cmp = gvn->register_new_node_with_optimizer(new (phase->C) CmpINode( convf2i, max )); - boo = gvn->register_new_node_with_optimizer(new (phase->C) BoolNode( cmp, BoolTest::gt )); - iff = (IfNode*)gvn->register_new_node_with_optimizer(new (phase->C) IfNode( ifF, boo, PROB_UNLIKELY_MAG(5), bot_if->_fcnt )); - Node *if_max= gvn->register_new_node_with_optimizer(new (phase->C) IfTrueNode (iff)); - ifF = gvn->register_new_node_with_optimizer(new (phase->C) IfFalseNode(iff)); + cmp = gvn->register_new_node_with_optimizer(new CmpINode( convf2i, max )); + boo = gvn->register_new_node_with_optimizer(new BoolNode( cmp, BoolTest::gt )); + iff = (IfNode*)gvn->register_new_node_with_optimizer(new IfNode( ifF, boo, PROB_UNLIKELY_MAG(5), bot_if->_fcnt )); + Node *if_max= gvn->register_new_node_with_optimizer(new IfTrueNode (iff)); + ifF = gvn->register_new_node_with_optimizer(new IfFalseNode(iff)); // update input edges to region node set_req_X( min_idx, if_min, gvn ); set_req_X( max_idx, if_max, gvn ); @@ -731,7 +731,7 @@ PhiNode* PhiNode::make(Node* r, Node* x, const Type *t, const TypePtr* at) { uint preds = r->req(); // Number of predecessor paths assert(t != Type::MEMORY || at == flatten_phi_adr_type(at), "flatten at"); - PhiNode* p = new (Compile::current()) PhiNode(r, t, at); + PhiNode* p = new PhiNode(r, t, at); for (uint j = 1; j < preds; j++) { // Fill in all inputs, except those which the region does not yet have if (r->in(j) != NULL) @@ -749,7 +749,7 @@ const Type* t = x->bottom_type(); const TypePtr* at = NULL; if (t == Type::MEMORY) at = flatten_phi_adr_type(x->adr_type()); - return new (Compile::current()) PhiNode(r, t, at); + return new PhiNode(r, t, at); } @@ -1258,9 +1258,9 @@ } else return NULL; // Build int->bool conversion - Node *n = new (phase->C) Conv2BNode( cmp->in(1) ); + Node *n = new Conv2BNode( cmp->in(1) ); if( flipped ) - n = new (phase->C) XorINode( phase->transform(n), phase->intcon(1) ); + n = new XorINode( phase->transform(n), phase->intcon(1) ); return n; } @@ -1320,9 +1320,9 @@ if( q->is_Con() && phase->type(q) != TypeInt::ZERO && y->is_Con() ) return NULL; - Node *cmplt = phase->transform( new (phase->C) CmpLTMaskNode(p,q) ); - Node *j_and = phase->transform( new (phase->C) AndINode(cmplt,y) ); - return new (phase->C) AddINode(j_and,x); + Node *cmplt = phase->transform( new CmpLTMaskNode(p,q) ); + Node *j_and = phase->transform( new AndINode(cmplt,y) ); + return new AddINode(j_and,x); } //------------------------------is_absolute------------------------------------ @@ -1384,17 +1384,17 @@ if( sub->Opcode() != Op_SubF || sub->in(2) != x || phase->type(sub->in(1)) != tzero ) return NULL; - x = new (phase->C) AbsFNode(x); + x = new AbsFNode(x); if (flip) { - x = new (phase->C) SubFNode(sub->in(1), phase->transform(x)); + x = new SubFNode(sub->in(1), phase->transform(x)); } } else { if( sub->Opcode() != Op_SubD || sub->in(2) != x || phase->type(sub->in(1)) != tzero ) return NULL; - x = new (phase->C) AbsDNode(x); + x = new AbsDNode(x); if (flip) { - x = new (phase->C) SubDNode(sub->in(1), phase->transform(x)); + x = new SubDNode(sub->in(1), phase->transform(x)); } } @@ -1469,7 +1469,7 @@ // Now start splitting out the flow paths that merge the same value. // Split first the RegionNode. PhaseIterGVN *igvn = phase->is_IterGVN(); - RegionNode *newr = new (phase->C) RegionNode(hit+1); + RegionNode *newr = new RegionNode(hit+1); split_once(igvn, phi, val, r, newr); // Now split all other Phis than this one @@ -1781,13 +1781,13 @@ } if (doit) { if (base == NULL) { - base = new (phase->C) PhiNode(in(0), type, NULL); + base = new PhiNode(in(0), type, NULL); for (uint i = 1; i < req(); i++) { base->init_req(i, in(i)->in(AddPNode::Base)); } phase->is_IterGVN()->register_new_node_with_optimizer(base); } - return new (phase->C) AddPNode(base, base, y); + return new AddPNode(base, base, y); } } } @@ -1864,7 +1864,7 @@ // Phi(...MergeMem(m0, m1:AT1, m2:AT2)...) into // MergeMem(Phi(...m0...), Phi:AT1(...m1...), Phi:AT2(...m2...)) PhaseIterGVN *igvn = phase->is_IterGVN(); - Node* hook = new (phase->C) Node(1); + Node* hook = new Node(1); PhiNode* new_base = (PhiNode*) clone(); // Must eagerly register phis, since they participate in loops. if (igvn) { @@ -1961,7 +1961,7 @@ } else { narrow_t = TypeNarrowKlass::make(this->bottom_type()->is_ptr()); } - PhiNode* new_phi = new (phase->C) PhiNode(r, narrow_t); + PhiNode* new_phi = new PhiNode(r, narrow_t); uint orig_cnt = req(); for (uint i=1; iC) EncodePNode(ii, narrow_t); + new_ii = new EncodePNode(ii, narrow_t); } else { - new_ii = new (phase->C) EncodePKlassNode(ii, narrow_t); + new_ii = new EncodePKlassNode(ii, narrow_t); } igvn->register_new_node_with_optimizer(new_ii); } @@ -1986,9 +1986,9 @@ } igvn->register_new_node_with_optimizer(new_phi, this); if (is_decodeN) { - progress = new (phase->C) DecodeNNode(new_phi, bottom_type()); + progress = new DecodeNNode(new_phi, bottom_type()); } else { - progress = new (phase->C) DecodeNKlassNode(new_phi, bottom_type()); + progress = new DecodeNKlassNode(new_phi, bottom_type()); } } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/chaitin.cpp --- a/hotspot/src/share/vm/opto/chaitin.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/chaitin.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1730,7 +1730,7 @@ // Now we see we need a base-Phi here to merge the bases const Type *t = base->bottom_type(); - base = new (C) PhiNode( derived->in(0), t ); + base = new PhiNode( derived->in(0), t ); for( i = 1; i < derived->req(); i++ ) { base->init_req(i, find_base_for_derived(derived_base_map, derived->in(i), maxlrg)); t = t->meet(base->in(i)->bottom_type()); @@ -1800,7 +1800,7 @@ Block *phi_block = _cfg.get_block_for_node(phi); if (_cfg.get_block_for_node(phi_block->pred(2)) == block) { const RegMask *mask = C->matcher()->idealreg2spillmask[Op_RegI]; - Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::LoopPhiInput, phi, *mask, *mask); + Node *spill = new MachSpillCopyNode(MachSpillCopyNode::LoopPhiInput, phi, *mask, *mask); insert_proj( phi_block, 1, spill, maxlrg++ ); n->set_req(1,spill); must_recompute_live = true; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/coalesce.cpp --- a/hotspot/src/share/vm/opto/coalesce.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/coalesce.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -291,7 +291,7 @@ _phc.clone_projs(pred, pred->end_idx(), m, copy, _phc._lrg_map); } else { const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()]; - copy = new (C) MachSpillCopyNode(MachSpillCopyNode::PhiInput, m, *rm, *rm); + copy = new MachSpillCopyNode(MachSpillCopyNode::PhiInput, m, *rm, *rm); // Find a good place to insert. Kinda tricky, use a subroutine insert_copy_with_overlap(pred,copy,phi_name,src_name); } @@ -325,7 +325,7 @@ l += _phc.clone_projs(b, l, m, copy, _phc._lrg_map); } else { const RegMask *rm = C->matcher()->idealreg2spillmask[m->ideal_reg()]; - copy = new (C) MachSpillCopyNode(MachSpillCopyNode::TwoAddress, m, *rm, *rm); + copy = new MachSpillCopyNode(MachSpillCopyNode::TwoAddress, m, *rm, *rm); // Insert the copy in the basic block, just before us b->insert_node(copy, l++); } @@ -372,7 +372,7 @@ continue; // Live out; do not pre-split // Split the lrg at this use const RegMask *rm = C->matcher()->idealreg2spillmask[inp->ideal_reg()]; - Node* copy = new (C) MachSpillCopyNode(MachSpillCopyNode::DebugUse, inp, *rm, *rm); + Node* copy = new MachSpillCopyNode(MachSpillCopyNode::DebugUse, inp, *rm, *rm); // Insert the copy in the use-def chain n->set_req(inpidx, copy ); // Insert the copy in the basic block, just before us diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/compile.cpp --- a/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -95,7 +95,7 @@ // Constant table base node singleton. MachConstantBaseNode* Compile::mach_constant_base_node() { if (_mach_constant_base_node == NULL) { - _mach_constant_base_node = new (C) MachConstantBaseNode(); + _mach_constant_base_node = new MachConstantBaseNode(); _mach_constant_base_node->add_req(C->root()); } return _mach_constant_base_node; @@ -392,6 +392,11 @@ uint next = 0; while (next < useful.size()) { Node *n = useful.at(next++); + if (n->is_SafePoint()) { + // We're done with a parsing phase. Replaced nodes are not valid + // beyond that point. + n->as_SafePoint()->delete_replaced_nodes(); + } // Use raw traversal of out edges since this code removes out edges int max = n->outcnt(); for (int j = 0; j < max; ++j) { @@ -673,7 +678,6 @@ _print_inlining_stream(NULL), _print_inlining_idx(0), _print_inlining_output(NULL), - _preserve_jvm_state(0), _interpreter_frame_size(0) { C = this; @@ -748,14 +752,14 @@ const TypeTuple *domain = StartOSRNode::osr_domain(); const TypeTuple *range = TypeTuple::make_range(method()->signature()); init_tf(TypeFunc::make(domain, range)); - StartNode* s = new (this) StartOSRNode(root(), domain); + StartNode* s = new StartOSRNode(root(), domain); initial_gvn()->set_type_bottom(s); init_start(s); cg = CallGenerator::for_osr(method(), entry_bci()); } else { // Normal case. init_tf(TypeFunc::make(method())); - StartNode* s = new (this) StartNode(root(), tf()->domain()); + StartNode* s = new StartNode(root(), tf()->domain()); initial_gvn()->set_type_bottom(s); init_start(s); if (method()->intrinsic_id() == vmIntrinsics::_Reference_get && UseG1GC) { @@ -783,7 +787,7 @@ return; } JVMState* jvms = build_start_state(start(), tf()); - if ((jvms = cg->generate(jvms, NULL)) == NULL) { + if ((jvms = cg->generate(jvms)) == NULL) { record_method_not_compilable("method parse failed"); return; } @@ -980,7 +984,6 @@ _print_inlining_stream(NULL), _print_inlining_idx(0), _print_inlining_output(NULL), - _preserve_jvm_state(0), _allowed_reasons(0), _interpreter_frame_size(0) { C = this; @@ -1061,9 +1064,9 @@ // Globally visible Nodes // First set TOP to NULL to give safe behavior during creation of RootNode set_cached_top_node(NULL); - set_root(new (this) RootNode()); + set_root(new RootNode()); // Now that you have a Root to point to, create the real TOP - set_cached_top_node( new (this) ConNode(Type::TOP) ); + set_cached_top_node( new ConNode(Type::TOP) ); set_recent_alloc(NULL, NULL); // Create Debug Information Recorder to record scopes, oopmaps, etc. @@ -1914,6 +1917,8 @@ for_igvn()->clear(); gvn->replace_with(&igvn); + _late_inlines_pos = _late_inlines.length(); + while (_boxing_late_inlines.length() > 0) { CallGenerator* cg = _boxing_late_inlines.pop(); cg->do_late_inline(); @@ -1977,8 +1982,8 @@ if (live_nodes() > (uint)LiveNodeCountInliningCutoff) { if (low_live_nodes < (uint)LiveNodeCountInliningCutoff * 8 / 10) { // PhaseIdealLoop is expensive so we only try it once we are - // out of loop and we only try it again if the previous helped - // got the number of nodes down significantly + // out of live nodes and we only try it again if the previous + // helped got the number of nodes down significantly PhaseIdealLoop ideal_loop( igvn, false, true ); if (failing()) return; low_live_nodes = live_nodes(); @@ -2072,6 +2077,10 @@ // Inline valueOf() methods now. inline_boxing_calls(igvn); + if (AlwaysIncrementalInline) { + inline_incrementally(igvn); + } + print_method(PHASE_INCREMENTAL_BOXING_INLINE, 2); if (failing()) return; @@ -2757,9 +2766,9 @@ // Decode a narrow oop to match address // [R12 + narrow_oop_reg<<3 + offset] if (t->isa_oopptr()) { - nn = new (this) DecodeNNode(nn, t); + nn = new DecodeNNode(nn, t); } else { - nn = new (this) DecodeNKlassNode(nn, t); + nn = new DecodeNKlassNode(nn, t); } n->set_req(AddPNode::Base, nn); n->set_req(AddPNode::Address, nn); @@ -2880,7 +2889,7 @@ } } if (new_in2 != NULL) { - Node* cmpN = new (this) CmpNNode(in1->in(1), new_in2); + Node* cmpN = new CmpNNode(in1->in(1), new_in2); n->subsume_by(cmpN, this); if (in1->outcnt() == 0) { in1->disconnect_inputs(NULL, this); @@ -2979,8 +2988,8 @@ n->subsume_by(divmod->mod_proj(), this); } else { // replace a%b with a-((a/b)*b) - Node* mult = new (this) MulINode(d, d->in(2)); - Node* sub = new (this) SubINode(d->in(1), mult); + Node* mult = new MulINode(d, d->in(2)); + Node* sub = new SubINode(d->in(1), mult); n->subsume_by(sub, this); } } @@ -2999,8 +3008,8 @@ n->subsume_by(divmod->mod_proj(), this); } else { // replace a%b with a-((a/b)*b) - Node* mult = new (this) MulLNode(d, d->in(2)); - Node* sub = new (this) SubLNode(d->in(1), mult); + Node* mult = new MulLNode(d, d->in(2)); + Node* sub = new SubLNode(d->in(1), mult); n->subsume_by(sub, this); } } @@ -3049,7 +3058,7 @@ } } else { if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) { - Node* shift = new (this) AndINode(in2, ConNode::make(this, TypeInt::make(mask))); + Node* shift = new AndINode(in2, ConNode::make(this, TypeInt::make(mask))); n->set_req(2, shift); } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/compile.hpp --- a/hotspot/src/share/vm/opto/compile.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/compile.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -431,9 +431,6 @@ // Remove the speculative part of types and clean up the graph void remove_speculative_types(PhaseIterGVN &igvn); - // Are we within a PreserveJVMState block? - int _preserve_jvm_state; - void* _replay_inline_data; // Pointer to data loaded from file void print_inlining_init(); @@ -1198,21 +1195,6 @@ // Auxiliary method for randomized fuzzing/stressing static bool randomized_select(int count); - - // enter a PreserveJVMState block - void inc_preserve_jvm_state() { - _preserve_jvm_state++; - } - - // exit a PreserveJVMState block - void dec_preserve_jvm_state() { - _preserve_jvm_state--; - assert(_preserve_jvm_state >= 0, "_preserve_jvm_state shouldn't be negative"); - } - - bool has_preserve_jvm_state() const { - return _preserve_jvm_state > 0; - } }; #endif // SHARE_VM_OPTO_COMPILE_HPP diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/connode.cpp --- a/hotspot/src/share/vm/opto/connode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/connode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -45,17 +45,17 @@ //------------------------------make------------------------------------------- ConNode *ConNode::make( Compile* C, const Type *t ) { switch( t->basic_type() ) { - case T_INT: return new (C) ConINode( t->is_int() ); - case T_LONG: return new (C) ConLNode( t->is_long() ); - case T_FLOAT: return new (C) ConFNode( t->is_float_constant() ); - case T_DOUBLE: return new (C) ConDNode( t->is_double_constant() ); - case T_VOID: return new (C) ConNode ( Type::TOP ); - case T_OBJECT: return new (C) ConPNode( t->is_ptr() ); - case T_ARRAY: return new (C) ConPNode( t->is_aryptr() ); - case T_ADDRESS: return new (C) ConPNode( t->is_ptr() ); - case T_NARROWOOP: return new (C) ConNNode( t->is_narrowoop() ); - case T_NARROWKLASS: return new (C) ConNKlassNode( t->is_narrowklass() ); - case T_METADATA: return new (C) ConPNode( t->is_ptr() ); + case T_INT: return new ConINode( t->is_int() ); + case T_LONG: return new ConLNode( t->is_long() ); + case T_FLOAT: return new ConFNode( t->is_float_constant() ); + case T_DOUBLE: return new ConDNode( t->is_double_constant() ); + case T_VOID: return new ConNode ( Type::TOP ); + case T_OBJECT: return new ConPNode( t->is_ptr() ); + case T_ARRAY: return new ConPNode( t->is_aryptr() ); + case T_ADDRESS: return new ConPNode( t->is_ptr() ); + case T_NARROWOOP: return new ConNNode( t->is_narrowoop() ); + case T_NARROWKLASS: return new ConNKlassNode( t->is_narrowklass() ); + case T_METADATA: return new ConPNode( t->is_ptr() ); // Expected cases: TypePtr::NULL_PTR, any is_rawptr() // Also seen: AnyPtr(TopPTR *+top); from command line: // r -XX:+PrintOpto -XX:CIStart=285 -XX:+CompileTheWorld -XX:CompileTheWorldStartAt=660 diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/connode.hpp --- a/hotspot/src/share/vm/opto/connode.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/connode.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -58,7 +58,7 @@ // Factory method: static ConINode* make( Compile* C, int con ) { - return new (C) ConINode( TypeInt::make(con) ); + return new ConINode( TypeInt::make(con) ); } }; @@ -73,9 +73,9 @@ // Factory methods: static ConPNode* make( Compile *C ,address con ) { if (con == NULL) - return new (C) ConPNode( TypePtr::NULL_PTR ) ; + return new ConPNode( TypePtr::NULL_PTR ) ; else - return new (C) ConPNode( TypeRawPtr::make(con) ); + return new ConPNode( TypeRawPtr::make(con) ); } }; @@ -106,7 +106,7 @@ // Factory method: static ConLNode* make( Compile *C ,jlong con ) { - return new (C) ConLNode( TypeLong::make(con) ); + return new ConLNode( TypeLong::make(con) ); } }; @@ -120,7 +120,7 @@ // Factory method: static ConFNode* make( Compile *C, float con ) { - return new (C) ConFNode( TypeF::make(con) ); + return new ConFNode( TypeF::make(con) ); } }; @@ -134,7 +134,7 @@ // Factory method: static ConDNode* make( Compile *C, double con ) { - return new (C) ConDNode( TypeD::make(con) ); + return new ConDNode( TypeD::make(con) ); } }; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/convertnode.cpp --- a/hotspot/src/share/vm/opto/convertnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/convertnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -374,11 +374,11 @@ ryhi = -rylo0; } - Node* cx = phase->transform( new (phase->C) ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) ); - Node* cy = phase->transform( new (phase->C) ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) ); + Node* cx = phase->transform( new ConvI2LNode(x, TypeLong::make(rxlo, rxhi, widen)) ); + Node* cy = phase->transform( new ConvI2LNode(y, TypeLong::make(rylo, ryhi, widen)) ); switch (op) { - case Op_AddI: return new (phase->C) AddLNode(cx, cy); - case Op_SubI: return new (phase->C) SubLNode(cx, cy); + case Op_AddI: return new AddLNode(cx, cy); + case Op_SubI: return new SubLNode(cx, cy); default: ShouldNotReachHere(); } } @@ -452,9 +452,9 @@ assert( x != andl && y != andl, "dead loop in ConvL2INode::Ideal" ); if (phase->type(x) == Type::TOP) return NULL; if (phase->type(y) == Type::TOP) return NULL; - Node *add1 = phase->transform(new (phase->C) ConvL2INode(x)); - Node *add2 = phase->transform(new (phase->C) ConvL2INode(y)); - return new (phase->C) AddINode(add1,add2); + Node *add1 = phase->transform(new ConvL2INode(x)); + Node *add2 = phase->transform(new ConvL2INode(y)); + return new AddINode(add1,add2); } // Disable optimization: LoadL->ConvL2I ==> LoadI. diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/divnode.cpp --- a/hotspot/src/share/vm/opto/divnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/divnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -106,7 +106,7 @@ // division by +/- 1 if (!d_pos) { // Just negate the value - q = new (phase->C) SubINode(phase->intcon(0), dividend); + q = new SubINode(phase->intcon(0), dividend); } } else if ( is_power_of_2(d) ) { // division by +/- a power of 2 @@ -143,18 +143,18 @@ // (-2+3)>>2 becomes 0, etc. // Compute 0 or -1, based on sign bit - Node *sign = phase->transform(new (phase->C) RShiftINode(dividend, phase->intcon(N - 1))); + Node *sign = phase->transform(new RShiftINode(dividend, phase->intcon(N - 1))); // Mask sign bit to the low sign bits - Node *round = phase->transform(new (phase->C) URShiftINode(sign, phase->intcon(N - l))); + Node *round = phase->transform(new URShiftINode(sign, phase->intcon(N - l))); // Round up before shifting - dividend = phase->transform(new (phase->C) AddINode(dividend, round)); + dividend = phase->transform(new AddINode(dividend, round)); } // Shift for division - q = new (phase->C) RShiftINode(dividend, phase->intcon(l)); + q = new RShiftINode(dividend, phase->intcon(l)); if (!d_pos) { - q = new (phase->C) SubINode(phase->intcon(0), phase->transform(q)); + q = new SubINode(phase->intcon(0), phase->transform(q)); } } else { // Attempt the jint constant divide -> multiply transform found in @@ -166,33 +166,33 @@ jint shift_const; if (magic_int_divide_constants(d, magic_const, shift_const)) { Node *magic = phase->longcon(magic_const); - Node *dividend_long = phase->transform(new (phase->C) ConvI2LNode(dividend)); + Node *dividend_long = phase->transform(new ConvI2LNode(dividend)); // Compute the high half of the dividend x magic multiplication - Node *mul_hi = phase->transform(new (phase->C) MulLNode(dividend_long, magic)); + Node *mul_hi = phase->transform(new MulLNode(dividend_long, magic)); if (magic_const < 0) { - mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(N))); - mul_hi = phase->transform(new (phase->C) ConvL2INode(mul_hi)); + mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(N))); + mul_hi = phase->transform(new ConvL2INode(mul_hi)); // The magic multiplier is too large for a 32 bit constant. We've adjusted // it down by 2^32, but have to add 1 dividend back in after the multiplication. // This handles the "overflow" case described by Granlund and Montgomery. - mul_hi = phase->transform(new (phase->C) AddINode(dividend, mul_hi)); + mul_hi = phase->transform(new AddINode(dividend, mul_hi)); // Shift over the (adjusted) mulhi if (shift_const != 0) { - mul_hi = phase->transform(new (phase->C) RShiftINode(mul_hi, phase->intcon(shift_const))); + mul_hi = phase->transform(new RShiftINode(mul_hi, phase->intcon(shift_const))); } } else { // No add is required, we can merge the shifts together. - mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(N + shift_const))); - mul_hi = phase->transform(new (phase->C) ConvL2INode(mul_hi)); + mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(N + shift_const))); + mul_hi = phase->transform(new ConvL2INode(mul_hi)); } // Get a 0 or -1 from the sign of the dividend. Node *addend0 = mul_hi; - Node *addend1 = phase->transform(new (phase->C) RShiftINode(dividend, phase->intcon(N-1))); + Node *addend1 = phase->transform(new RShiftINode(dividend, phase->intcon(N-1))); // If the divisor is negative, swap the order of the input addends; // this has the effect of negating the quotient. @@ -202,7 +202,7 @@ // Adjust the final quotient by subtracting -1 (adding 1) // from the mul_hi. - q = new (phase->C) SubINode(addend0, addend1); + q = new SubINode(addend0, addend1); } } @@ -261,7 +261,7 @@ // no need to synthesize it in ideal nodes. if (Matcher::has_match_rule(Op_MulHiL)) { Node* v = phase->longcon(magic_const); - return new (phase->C) MulHiLNode(dividend, v); + return new MulHiLNode(dividend, v); } // Taken from Hacker's Delight, Fig. 8-2. Multiply high signed. @@ -287,11 +287,11 @@ const int N = 64; // Dummy node to keep intermediate nodes alive during construction - Node* hook = new (phase->C) Node(4); + Node* hook = new Node(4); // u0 = u & 0xFFFFFFFF; u1 = u >> 32; - Node* u0 = phase->transform(new (phase->C) AndLNode(dividend, phase->longcon(0xFFFFFFFF))); - Node* u1 = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N / 2))); + Node* u0 = phase->transform(new AndLNode(dividend, phase->longcon(0xFFFFFFFF))); + Node* u1 = phase->transform(new RShiftLNode(dividend, phase->intcon(N / 2))); hook->init_req(0, u0); hook->init_req(1, u1); @@ -300,29 +300,29 @@ Node* v1 = phase->longcon(magic_const >> (N / 2)); // w0 = u0*v0; - Node* w0 = phase->transform(new (phase->C) MulLNode(u0, v0)); + Node* w0 = phase->transform(new MulLNode(u0, v0)); // t = u1*v0 + (w0 >> 32); - Node* u1v0 = phase->transform(new (phase->C) MulLNode(u1, v0)); - Node* temp = phase->transform(new (phase->C) URShiftLNode(w0, phase->intcon(N / 2))); - Node* t = phase->transform(new (phase->C) AddLNode(u1v0, temp)); + Node* u1v0 = phase->transform(new MulLNode(u1, v0)); + Node* temp = phase->transform(new URShiftLNode(w0, phase->intcon(N / 2))); + Node* t = phase->transform(new AddLNode(u1v0, temp)); hook->init_req(2, t); // w1 = t & 0xFFFFFFFF; - Node* w1 = phase->transform(new (phase->C) AndLNode(t, phase->longcon(0xFFFFFFFF))); + Node* w1 = phase->transform(new AndLNode(t, phase->longcon(0xFFFFFFFF))); hook->init_req(3, w1); // w2 = t >> 32; - Node* w2 = phase->transform(new (phase->C) RShiftLNode(t, phase->intcon(N / 2))); + Node* w2 = phase->transform(new RShiftLNode(t, phase->intcon(N / 2))); // w1 = u0*v1 + w1; - Node* u0v1 = phase->transform(new (phase->C) MulLNode(u0, v1)); - w1 = phase->transform(new (phase->C) AddLNode(u0v1, w1)); + Node* u0v1 = phase->transform(new MulLNode(u0, v1)); + w1 = phase->transform(new AddLNode(u0v1, w1)); // return u1*v1 + w2 + (w1 >> 32); - Node* u1v1 = phase->transform(new (phase->C) MulLNode(u1, v1)); - Node* temp1 = phase->transform(new (phase->C) AddLNode(u1v1, w2)); - Node* temp2 = phase->transform(new (phase->C) RShiftLNode(w1, phase->intcon(N / 2))); + Node* u1v1 = phase->transform(new MulLNode(u1, v1)); + Node* temp1 = phase->transform(new AddLNode(u1v1, w2)); + Node* temp2 = phase->transform(new RShiftLNode(w1, phase->intcon(N / 2))); // Remove the bogus extra edges used to keep things alive PhaseIterGVN* igvn = phase->is_IterGVN(); @@ -334,7 +334,7 @@ } } - return new (phase->C) AddLNode(temp1, temp2); + return new AddLNode(temp1, temp2); } @@ -357,7 +357,7 @@ // division by +/- 1 if (!d_pos) { // Just negate the value - q = new (phase->C) SubLNode(phase->longcon(0), dividend); + q = new SubLNode(phase->longcon(0), dividend); } } else if ( is_power_of_2_long(d) ) { @@ -396,18 +396,18 @@ // (-2+3)>>2 becomes 0, etc. // Compute 0 or -1, based on sign bit - Node *sign = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N - 1))); + Node *sign = phase->transform(new RShiftLNode(dividend, phase->intcon(N - 1))); // Mask sign bit to the low sign bits - Node *round = phase->transform(new (phase->C) URShiftLNode(sign, phase->intcon(N - l))); + Node *round = phase->transform(new URShiftLNode(sign, phase->intcon(N - l))); // Round up before shifting - dividend = phase->transform(new (phase->C) AddLNode(dividend, round)); + dividend = phase->transform(new AddLNode(dividend, round)); } // Shift for division - q = new (phase->C) RShiftLNode(dividend, phase->intcon(l)); + q = new RShiftLNode(dividend, phase->intcon(l)); if (!d_pos) { - q = new (phase->C) SubLNode(phase->longcon(0), phase->transform(q)); + q = new SubLNode(phase->longcon(0), phase->transform(q)); } } else if ( !Matcher::use_asm_for_ldiv_by_con(d) ) { // Use hardware DIV instruction when // it is faster than code generated below. @@ -427,17 +427,17 @@ // The magic multiplier is too large for a 64 bit constant. We've adjusted // it down by 2^64, but have to add 1 dividend back in after the multiplication. // This handles the "overflow" case described by Granlund and Montgomery. - mul_hi = phase->transform(new (phase->C) AddLNode(dividend, mul_hi)); + mul_hi = phase->transform(new AddLNode(dividend, mul_hi)); } // Shift over the (adjusted) mulhi if (shift_const != 0) { - mul_hi = phase->transform(new (phase->C) RShiftLNode(mul_hi, phase->intcon(shift_const))); + mul_hi = phase->transform(new RShiftLNode(mul_hi, phase->intcon(shift_const))); } // Get a 0 or -1 from the sign of the dividend. Node *addend0 = mul_hi; - Node *addend1 = phase->transform(new (phase->C) RShiftLNode(dividend, phase->intcon(N-1))); + Node *addend1 = phase->transform(new RShiftLNode(dividend, phase->intcon(N-1))); // If the divisor is negative, swap the order of the input addends; // this has the effect of negating the quotient. @@ -447,7 +447,7 @@ // Adjust the final quotient by subtracting -1 (adding 1) // from the mul_hi. - q = new (phase->C) SubLNode(addend0, addend1); + q = new SubLNode(addend0, addend1); } } @@ -737,7 +737,7 @@ assert( frexp((double)reciprocal, &exp) == 0.5, "reciprocal should be power of 2" ); // return multiplication by the reciprocal - return (new (phase->C) MulFNode(in(1), phase->makecon(TypeF::make(reciprocal)))); + return (new MulFNode(in(1), phase->makecon(TypeF::make(reciprocal)))); } //============================================================================= @@ -831,7 +831,7 @@ assert( frexp(reciprocal, &exp) == 0.5, "reciprocal should be power of 2" ); // return multiplication by the reciprocal - return (new (phase->C) MulDNode(in(1), phase->makecon(TypeD::make(reciprocal)))); + return (new MulDNode(in(1), phase->makecon(TypeD::make(reciprocal)))); } //============================================================================= @@ -858,7 +858,7 @@ if( !ti->is_con() ) return NULL; jint con = ti->get_con(); - Node *hook = new (phase->C) Node(1); + Node *hook = new Node(1); // First, special check for modulo 2^k-1 if( con >= 0 && con < max_jint && is_power_of_2(con+1) ) { @@ -878,24 +878,24 @@ hook->init_req(0, x); // Add a use to x to prevent him from dying // Generate code to reduce X rapidly to nearly 2^k-1. for( int i = 0; i < trip_count; i++ ) { - Node *xl = phase->transform( new (phase->C) AndINode(x,divisor) ); - Node *xh = phase->transform( new (phase->C) RShiftINode(x,phase->intcon(k)) ); // Must be signed - x = phase->transform( new (phase->C) AddINode(xh,xl) ); + Node *xl = phase->transform( new AndINode(x,divisor) ); + Node *xh = phase->transform( new RShiftINode(x,phase->intcon(k)) ); // Must be signed + x = phase->transform( new AddINode(xh,xl) ); hook->set_req(0, x); } // Generate sign-fixup code. Was original value positive? // int hack_res = (i >= 0) ? divisor : 1; - Node *cmp1 = phase->transform( new (phase->C) CmpINode( in(1), phase->intcon(0) ) ); - Node *bol1 = phase->transform( new (phase->C) BoolNode( cmp1, BoolTest::ge ) ); - Node *cmov1= phase->transform( new (phase->C) CMoveINode(bol1, phase->intcon(1), divisor, TypeInt::POS) ); + Node *cmp1 = phase->transform( new CmpINode( in(1), phase->intcon(0) ) ); + Node *bol1 = phase->transform( new BoolNode( cmp1, BoolTest::ge ) ); + Node *cmov1= phase->transform( new CMoveINode(bol1, phase->intcon(1), divisor, TypeInt::POS) ); // if( x >= hack_res ) x -= divisor; - Node *sub = phase->transform( new (phase->C) SubINode( x, divisor ) ); - Node *cmp2 = phase->transform( new (phase->C) CmpINode( x, cmov1 ) ); - Node *bol2 = phase->transform( new (phase->C) BoolNode( cmp2, BoolTest::ge ) ); + Node *sub = phase->transform( new SubINode( x, divisor ) ); + Node *cmp2 = phase->transform( new CmpINode( x, cmov1 ) ); + Node *bol2 = phase->transform( new BoolNode( cmp2, BoolTest::ge ) ); // Convention is to not transform the return value of an Ideal // since Ideal is expected to return a modified 'this' or a new node. - Node *cmov2= new (phase->C) CMoveINode(bol2, x, sub, TypeInt::INT); + Node *cmov2= new CMoveINode(bol2, x, sub, TypeInt::INT); // cmov2 is now the mod // Now remove the bogus extra edges used to keep things alive @@ -918,7 +918,7 @@ jint pos_con = (con >= 0) ? con : -con; // integer Mod 1 is always 0 - if( pos_con == 1 ) return new (phase->C) ConINode(TypeInt::ZERO); + if( pos_con == 1 ) return new ConINode(TypeInt::ZERO); int log2_con = -1; @@ -931,7 +931,7 @@ // See if this can be masked, if the dividend is non-negative if( dti && dti->_lo >= 0 ) - return ( new (phase->C) AndINode( in(1), phase->intcon( pos_con-1 ) ) ); + return ( new AndINode( in(1), phase->intcon( pos_con-1 ) ) ); } // Save in(1) so that it cannot be changed or deleted @@ -946,12 +946,12 @@ Node *mult = NULL; if( log2_con >= 0 ) - mult = phase->transform( new (phase->C) LShiftINode( divide, phase->intcon( log2_con ) ) ); + mult = phase->transform( new LShiftINode( divide, phase->intcon( log2_con ) ) ); else - mult = phase->transform( new (phase->C) MulINode( divide, phase->intcon( pos_con ) ) ); + mult = phase->transform( new MulINode( divide, phase->intcon( pos_con ) ) ); // Finally, subtract the multiplied divided value from the original - result = new (phase->C) SubINode( in(1), mult ); + result = new SubINode( in(1), mult ); } // Now remove the bogus extra edges used to keep things alive @@ -1029,7 +1029,7 @@ if( !tl->is_con() ) return NULL; jlong con = tl->get_con(); - Node *hook = new (phase->C) Node(1); + Node *hook = new Node(1); // Expand mod if( con >= 0 && con < max_jlong && is_power_of_2_long(con+1) ) { @@ -1051,24 +1051,24 @@ hook->init_req(0, x); // Add a use to x to prevent him from dying // Generate code to reduce X rapidly to nearly 2^k-1. for( int i = 0; i < trip_count; i++ ) { - Node *xl = phase->transform( new (phase->C) AndLNode(x,divisor) ); - Node *xh = phase->transform( new (phase->C) RShiftLNode(x,phase->intcon(k)) ); // Must be signed - x = phase->transform( new (phase->C) AddLNode(xh,xl) ); + Node *xl = phase->transform( new AndLNode(x,divisor) ); + Node *xh = phase->transform( new RShiftLNode(x,phase->intcon(k)) ); // Must be signed + x = phase->transform( new AddLNode(xh,xl) ); hook->set_req(0, x); // Add a use to x to prevent him from dying } // Generate sign-fixup code. Was original value positive? // long hack_res = (i >= 0) ? divisor : CONST64(1); - Node *cmp1 = phase->transform( new (phase->C) CmpLNode( in(1), phase->longcon(0) ) ); - Node *bol1 = phase->transform( new (phase->C) BoolNode( cmp1, BoolTest::ge ) ); - Node *cmov1= phase->transform( new (phase->C) CMoveLNode(bol1, phase->longcon(1), divisor, TypeLong::LONG) ); + Node *cmp1 = phase->transform( new CmpLNode( in(1), phase->longcon(0) ) ); + Node *bol1 = phase->transform( new BoolNode( cmp1, BoolTest::ge ) ); + Node *cmov1= phase->transform( new CMoveLNode(bol1, phase->longcon(1), divisor, TypeLong::LONG) ); // if( x >= hack_res ) x -= divisor; - Node *sub = phase->transform( new (phase->C) SubLNode( x, divisor ) ); - Node *cmp2 = phase->transform( new (phase->C) CmpLNode( x, cmov1 ) ); - Node *bol2 = phase->transform( new (phase->C) BoolNode( cmp2, BoolTest::ge ) ); + Node *sub = phase->transform( new SubLNode( x, divisor ) ); + Node *cmp2 = phase->transform( new CmpLNode( x, cmov1 ) ); + Node *bol2 = phase->transform( new BoolNode( cmp2, BoolTest::ge ) ); // Convention is to not transform the return value of an Ideal // since Ideal is expected to return a modified 'this' or a new node. - Node *cmov2= new (phase->C) CMoveLNode(bol2, x, sub, TypeLong::LONG); + Node *cmov2= new CMoveLNode(bol2, x, sub, TypeLong::LONG); // cmov2 is now the mod // Now remove the bogus extra edges used to keep things alive @@ -1091,7 +1091,7 @@ jlong pos_con = (con >= 0) ? con : -con; // integer Mod 1 is always 0 - if( pos_con == 1 ) return new (phase->C) ConLNode(TypeLong::ZERO); + if( pos_con == 1 ) return new ConLNode(TypeLong::ZERO); int log2_con = -1; @@ -1104,7 +1104,7 @@ // See if this can be masked, if the dividend is non-negative if( dtl && dtl->_lo >= 0 ) - return ( new (phase->C) AndLNode( in(1), phase->longcon( pos_con-1 ) ) ); + return ( new AndLNode( in(1), phase->longcon( pos_con-1 ) ) ); } // Save in(1) so that it cannot be changed or deleted @@ -1119,12 +1119,12 @@ Node *mult = NULL; if( log2_con >= 0 ) - mult = phase->transform( new (phase->C) LShiftLNode( divide, phase->intcon( log2_con ) ) ); + mult = phase->transform( new LShiftLNode( divide, phase->intcon( log2_con ) ) ); else - mult = phase->transform( new (phase->C) MulLNode( divide, phase->longcon( pos_con ) ) ); + mult = phase->transform( new MulLNode( divide, phase->longcon( pos_con ) ) ); // Finally, subtract the multiplied divided value from the original - result = new (phase->C) SubLNode( in(1), mult ); + result = new SubLNode( in(1), mult ); } // Now remove the bogus extra edges used to keep things alive @@ -1279,9 +1279,9 @@ assert(n->Opcode() == Op_DivI || n->Opcode() == Op_ModI, "only div or mod input pattern accepted"); - DivModINode* divmod = new (C) DivModINode(n->in(0), n->in(1), n->in(2)); - Node* dproj = new (C) ProjNode(divmod, DivModNode::div_proj_num); - Node* mproj = new (C) ProjNode(divmod, DivModNode::mod_proj_num); + DivModINode* divmod = new DivModINode(n->in(0), n->in(1), n->in(2)); + Node* dproj = new ProjNode(divmod, DivModNode::div_proj_num); + Node* mproj = new ProjNode(divmod, DivModNode::mod_proj_num); return divmod; } @@ -1291,9 +1291,9 @@ assert(n->Opcode() == Op_DivL || n->Opcode() == Op_ModL, "only div or mod input pattern accepted"); - DivModLNode* divmod = new (C) DivModLNode(n->in(0), n->in(1), n->in(2)); - Node* dproj = new (C) ProjNode(divmod, DivModNode::div_proj_num); - Node* mproj = new (C) ProjNode(divmod, DivModNode::mod_proj_num); + DivModLNode* divmod = new DivModLNode(n->in(0), n->in(1), n->in(2)); + Node* dproj = new ProjNode(divmod, DivModNode::div_proj_num); + Node* mproj = new ProjNode(divmod, DivModNode::mod_proj_num); return divmod; } @@ -1308,7 +1308,7 @@ assert(proj->_con == mod_proj_num, "must be div or mod projection"); rm = match->modI_proj_mask(); } - return new (match->C)MachProjNode(this, proj->_con, rm, ideal_reg); + return new MachProjNode(this, proj->_con, rm, ideal_reg); } @@ -1323,5 +1323,5 @@ assert(proj->_con == mod_proj_num, "must be div or mod projection"); rm = match->modL_proj_mask(); } - return new (match->C)MachProjNode(this, proj->_con, rm, ideal_reg); + return new MachProjNode(this, proj->_con, rm, ideal_reg); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/doCall.cpp --- a/hotspot/src/share/vm/opto/doCall.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/doCall.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -119,12 +119,12 @@ if (allow_inline && allow_intrinsics) { CallGenerator* cg = find_intrinsic(callee, call_does_dispatch); if (cg != NULL) { - if (cg->is_predicted()) { + if (cg->is_predicated()) { // Code without intrinsic but, hopefully, inlined. CallGenerator* inline_cg = this->call_generator(callee, vtable_index, call_does_dispatch, jvms, allow_inline, prof_factor, speculative_receiver_type, false); if (inline_cg != NULL) { - cg = CallGenerator::for_predicted_intrinsic(cg, inline_cg); + cg = CallGenerator::for_predicated_intrinsic(cg, inline_cg); } } @@ -525,7 +525,7 @@ // because exceptions don't return to the call site.) profile_call(receiver); - JVMState* new_jvms = cg->generate(jvms, this); + JVMState* new_jvms = cg->generate(jvms); if (new_jvms == NULL) { // When inlining attempt fails (e.g., too many arguments), // it may contaminate the current compile state, making it @@ -539,7 +539,7 @@ // intrinsic was expecting to optimize. Should always be possible to // get a normal java call that may inline in that case cg = C->call_generator(cg->method(), vtable_index, call_does_dispatch, jvms, try_inline, prof_factor(), speculative_receiver_type, /* allow_intrinsics= */ false); - new_jvms = cg->generate(jvms, this); + new_jvms = cg->generate(jvms); if (new_jvms == NULL) { guarantee(failing(), "call failed to generate: calls should work"); return; @@ -596,7 +596,7 @@ const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass()); if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { Node* retnode = pop(); - Node* cast_obj = _gvn.transform(new (C) CheckCastPPNode(control(), retnode, sig_type)); + Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type)); push(cast_obj); } } @@ -689,7 +689,7 @@ } int len = bcis->length(); - CatchNode *cn = new (C) CatchNode(control(), i_o, len+1); + CatchNode *cn = new CatchNode(control(), i_o, len+1); Node *catch_ = _gvn.transform(cn); // now branch with the exception state to each of the (potential) @@ -700,14 +700,14 @@ // Locals are just copied from before the call. // Get control from the CatchNode. int handler_bci = bcis->at(i); - Node* ctrl = _gvn.transform( new (C) CatchProjNode(catch_, i+1,handler_bci)); + Node* ctrl = _gvn.transform( new CatchProjNode(catch_, i+1,handler_bci)); // This handler cannot happen? if (ctrl == top()) continue; set_control(ctrl); // Create exception oop const TypeInstPtr* extype = extypes->at(i)->is_instptr(); - Node *ex_oop = _gvn.transform(new (C) CreateExNode(extypes->at(i), ctrl, i_o)); + Node *ex_oop = _gvn.transform(new CreateExNode(extypes->at(i), ctrl, i_o)); // Handle unloaded exception classes. if (saw_unloaded->contains(handler_bci)) { @@ -746,7 +746,7 @@ // The first CatchProj is for the normal return. // (Note: If this is a call to rethrow_Java, this node goes dead.) - set_control(_gvn.transform( new (C) CatchProjNode(catch_, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci))); + set_control(_gvn.transform( new CatchProjNode(catch_, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci))); } @@ -797,7 +797,7 @@ // I'm loading the class from, I can replace the LoadKlass with the // klass constant for the exception oop. if( ex_node->is_Phi() ) { - ex_klass_node = new (C) PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT ); + ex_klass_node = new PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT ); for( uint i = 1; i < ex_node->req(); i++ ) { Node* p = basic_plus_adr( ex_node->in(i), ex_node->in(i), oopDesc::klass_offset_in_bytes() ); Node* k = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT) ); @@ -863,7 +863,7 @@ PreserveJVMState pjvms(this); const TypeInstPtr* tinst = TypeOopPtr::make_from_klass_unique(klass)->cast_to_ptr_type(TypePtr::NotNull)->is_instptr(); assert(klass->has_subklass() || tinst->klass_is_exact(), "lost exactness"); - Node* ex_oop = _gvn.transform(new (C) CheckCastPPNode(control(), ex_node, tinst)); + Node* ex_oop = _gvn.transform(new CheckCastPPNode(control(), ex_node, tinst)); push_ex_oop(ex_oop); // Push exception oop for handler #ifndef PRODUCT if (PrintOpto && WizardMode) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/escape.cpp --- a/hotspot/src/share/vm/opto/escape.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/escape.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -939,7 +939,13 @@ strcmp(call->as_CallLeaf()->_name, "aescrypt_encryptBlock") == 0 || strcmp(call->as_CallLeaf()->_name, "aescrypt_decryptBlock") == 0 || strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_encryptAESCrypt") == 0 || - strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0) + strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0 || + strcmp(call->as_CallLeaf()->_name, "sha1_implCompress") == 0 || + strcmp(call->as_CallLeaf()->_name, "sha1_implCompressMB") == 0 || + strcmp(call->as_CallLeaf()->_name, "sha256_implCompress") == 0 || + strcmp(call->as_CallLeaf()->_name, "sha256_implCompressMB") == 0 || + strcmp(call->as_CallLeaf()->_name, "sha512_implCompress") == 0 || + strcmp(call->as_CallLeaf()->_name, "sha512_implCompressMB") == 0) ))) { call->dump(); fatal(err_msg_res("EA unexpected CallLeaf %s", call->as_CallLeaf()->_name)); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/generateOptoStub.cpp --- a/hotspot/src/share/vm/opto/generateOptoStub.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/generateOptoStub.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -50,7 +50,7 @@ const TypeTuple *jrange = C->tf()->range(); // The procedure start - StartNode* start = new (C) StartNode(root(), jdomain); + StartNode* start = new StartNode(root(), jdomain); _gvn.set_type_bottom(start); // Make a map, with JVM state @@ -64,7 +64,7 @@ jvms->set_scloff(max_map); jvms->set_endoff(max_map); { - SafePointNode *map = new (C) SafePointNode( max_map, jvms ); + SafePointNode *map = new SafePointNode( max_map, jvms ); jvms->set_map(map); set_jvms(jvms); assert(map == this->map(), "kit.map is set"); @@ -73,7 +73,7 @@ // Make up the parameters uint i; for( i = 0; i < parm_cnt; i++ ) - map()->init_req(i, _gvn.transform(new (C) ParmNode(start, i))); + map()->init_req(i, _gvn.transform(new ParmNode(start, i))); for( ; ireq(); i++ ) map()->init_req(i, top()); // For nicer debugging @@ -81,7 +81,7 @@ set_all_memory(map()->memory()); // Get base of thread-local storage area - Node* thread = _gvn.transform( new (C) ThreadLocalNode() ); + Node* thread = _gvn.transform( new ThreadLocalNode() ); const int NoAlias = Compile::AliasIdxBot; @@ -166,8 +166,7 @@ //----------------------------- // Make the call node - CallRuntimeNode *call = new (C) - CallRuntimeNode(c_sig, C_function, name, TypePtr::BOTTOM); + CallRuntimeNode *call = new CallRuntimeNode(c_sig, C_function, name, TypePtr::BOTTOM); //----------------------------- // Fix-up the debug info for the call @@ -184,7 +183,7 @@ for (; i < parm_cnt; i++) { // Regular input arguments // Convert ints to longs if required. if (CCallingConventionRequiresIntsAsLongs && jdomain->field_at(i)->isa_int()) { - Node* int_as_long = _gvn.transform(new (C) ConvI2LNode(map()->in(i))); + Node* int_as_long = _gvn.transform(new ConvI2LNode(map()->in(i))); call->init_req(cnt++, int_as_long); // long call->init_req(cnt++, top()); // half } else { @@ -200,23 +199,23 @@ //----------------------------- // Now set up the return results - set_control( _gvn.transform( new (C) ProjNode(call,TypeFunc::Control)) ); - set_i_o( _gvn.transform( new (C) ProjNode(call,TypeFunc::I_O )) ); + set_control( _gvn.transform( new ProjNode(call,TypeFunc::Control)) ); + set_i_o( _gvn.transform( new ProjNode(call,TypeFunc::I_O )) ); set_all_memory_call(call); if (range->cnt() > TypeFunc::Parms) { - Node* retnode = _gvn.transform( new (C) ProjNode(call,TypeFunc::Parms) ); + Node* retnode = _gvn.transform( new ProjNode(call,TypeFunc::Parms) ); // C-land is allowed to return sub-word values. Convert to integer type. assert( retval != Type::TOP, "" ); if (retval == TypeInt::BOOL) { - retnode = _gvn.transform( new (C) AndINode(retnode, intcon(0xFF)) ); + retnode = _gvn.transform( new AndINode(retnode, intcon(0xFF)) ); } else if (retval == TypeInt::CHAR) { - retnode = _gvn.transform( new (C) AndINode(retnode, intcon(0xFFFF)) ); + retnode = _gvn.transform( new AndINode(retnode, intcon(0xFFFF)) ); } else if (retval == TypeInt::BYTE) { - retnode = _gvn.transform( new (C) LShiftINode(retnode, intcon(24)) ); - retnode = _gvn.transform( new (C) RShiftINode(retnode, intcon(24)) ); + retnode = _gvn.transform( new LShiftINode(retnode, intcon(24)) ); + retnode = _gvn.transform( new RShiftINode(retnode, intcon(24)) ); } else if (retval == TypeInt::SHORT) { - retnode = _gvn.transform( new (C) LShiftINode(retnode, intcon(16)) ); - retnode = _gvn.transform( new (C) RShiftINode(retnode, intcon(16)) ); + retnode = _gvn.transform( new LShiftINode(retnode, intcon(16)) ); + retnode = _gvn.transform( new RShiftINode(retnode, intcon(16)) ); } map()->set_req( TypeFunc::Parms, retnode ); } @@ -253,21 +252,21 @@ Node* exit_memory = reset_memory(); - Node* cmp = _gvn.transform( new (C) CmpPNode(pending, null()) ); - Node* bo = _gvn.transform( new (C) BoolNode(cmp, BoolTest::ne) ); + Node* cmp = _gvn.transform( new CmpPNode(pending, null()) ); + Node* bo = _gvn.transform( new BoolNode(cmp, BoolTest::ne) ); IfNode *iff = create_and_map_if(control(), bo, PROB_MIN, COUNT_UNKNOWN); - Node* if_null = _gvn.transform( new (C) IfFalseNode(iff) ); - Node* if_not_null = _gvn.transform( new (C) IfTrueNode(iff) ); + Node* if_null = _gvn.transform( new IfFalseNode(iff) ); + Node* if_not_null = _gvn.transform( new IfTrueNode(iff) ); assert (StubRoutines::forward_exception_entry() != NULL, "must be generated before"); Node *exc_target = makecon(TypeRawPtr::make( StubRoutines::forward_exception_entry() )); - Node *to_exc = new (C) TailCallNode(if_not_null, - i_o(), - exit_memory, - frameptr(), - returnadr(), - exc_target, null()); + Node *to_exc = new TailCallNode(if_not_null, + i_o(), + exit_memory, + frameptr(), + returnadr(), + exc_target, null()); root()->add_req(_gvn.transform(to_exc)); // bind to root to keep live C->init_start(start); @@ -277,27 +276,27 @@ switch( is_fancy_jump ) { case 0: // Make a return instruction // Return to caller, free any space for return address - ret = new (C) ReturnNode(TypeFunc::Parms, if_null, - i_o(), - exit_memory, - frameptr(), - returnadr()); + ret = new ReturnNode(TypeFunc::Parms, if_null, + i_o(), + exit_memory, + frameptr(), + returnadr()); if (C->tf()->range()->cnt() > TypeFunc::Parms) ret->add_req( map()->in(TypeFunc::Parms) ); break; case 1: // This is a fancy tail-call jump. Jump to computed address. // Jump to new callee; leave old return address alone. - ret = new (C) TailCallNode(if_null, - i_o(), - exit_memory, - frameptr(), - returnadr(), - target, map()->in(TypeFunc::Parms)); + ret = new TailCallNode(if_null, + i_o(), + exit_memory, + frameptr(), + returnadr(), + target, map()->in(TypeFunc::Parms)); break; case 2: // Pop return address & jump // Throw away old return address; jump to new computed address //assert(C_function == CAST_FROM_FN_PTR(address, OptoRuntime::rethrow_C), "fancy_jump==2 only for rethrow"); - ret = new (C) TailJumpNode(if_null, + ret = new TailJumpNode(if_null, i_o(), exit_memory, frameptr(), diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/graphKit.cpp --- a/hotspot/src/share/vm/opto/graphKit.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/graphKit.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -294,7 +294,7 @@ JVMState* jvms = new (C) JVMState(_method, NULL); jvms->set_bci(_bci); jvms->set_sp(_sp); - jvms->set_map(new (C) SafePointNode(TypeFunc::Parms, jvms)); + jvms->set_map(new SafePointNode(TypeFunc::Parms, jvms)); set_jvms(jvms); for (uint i = 0; i < map()->req(); i++) map()->init_req(i, top()); set_all_memory(top()); @@ -347,7 +347,7 @@ if (region->in(0) != hidden_merge_mark) { // The control input is not (yet) a specially-marked region in phi_map. // Make it so, and build some phis. - region = new (C) RegionNode(2); + region = new RegionNode(2); _gvn.set_type(region, Type::CONTROL); region->set_req(0, hidden_merge_mark); // marks an internal ex-state region->init_req(1, phi_map->control()); @@ -432,6 +432,7 @@ } } } + phi_map->merge_replaced_nodes_with(ex_map); } //--------------------------use_exception_state-------------------------------- @@ -496,13 +497,13 @@ // take the uncommon_trap in the BuildCutout below. // first must access the should_post_on_exceptions_flag in this thread's JavaThread - Node* jthread = _gvn.transform(new (C) ThreadLocalNode()); + Node* jthread = _gvn.transform(new ThreadLocalNode()); Node* adr = basic_plus_adr(top(), jthread, in_bytes(JavaThread::should_post_on_exceptions_flag_offset())); Node* should_post_flag = make_load(control(), adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw, MemNode::unordered); // Test the should_post_on_exceptions_flag vs. 0 - Node* chk = _gvn.transform( new (C) CmpINode(should_post_flag, intcon(0)) ); - Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) ); + Node* chk = _gvn.transform( new CmpINode(should_post_flag, intcon(0)) ); + Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) ); // Branch to slow_path if should_post_on_exceptions_flag was true { BuildCutout unless(this, tst, PROB_MAX); @@ -645,7 +646,6 @@ _map = kit->map(); // preserve the map _sp = kit->sp(); kit->set_map(clone_map ? kit->clone_map() : NULL); - Compile::current()->inc_preserve_jvm_state(); #ifdef ASSERT _bci = kit->bci(); Parse* parser = kit->is_Parse(); @@ -663,7 +663,6 @@ #endif kit->set_map(_map); kit->set_sp(_sp); - Compile::current()->dec_preserve_jvm_state(); } @@ -675,8 +674,8 @@ SafePointNode* outer_map = _map; // preserved map is caller's SafePointNode* inner_map = kit->map(); IfNode* iff = kit->create_and_map_if(outer_map->control(), p, prob, cnt); - outer_map->set_control(kit->gvn().transform( new (kit->C) IfTrueNode(iff) )); - inner_map->set_control(kit->gvn().transform( new (kit->C) IfFalseNode(iff) )); + outer_map->set_control(kit->gvn().transform( new IfTrueNode(iff) )); + inner_map->set_control(kit->gvn().transform( new IfFalseNode(iff) )); } BuildCutout::~BuildCutout() { GraphKit* kit = _kit; @@ -1118,7 +1117,7 @@ Node* GraphKit::basic_plus_adr(Node* base, Node* ptr, Node* offset) { // short-circuit a common case if (offset == intcon(0)) return ptr; - return _gvn.transform( new (C) AddPNode(base, ptr, offset) ); + return _gvn.transform( new AddPNode(base, ptr, offset) ); } Node* GraphKit::ConvI2L(Node* offset) { @@ -1127,7 +1126,7 @@ if (offset_con != Type::OffsetBot) { return longcon((jlong) offset_con); } - return _gvn.transform( new (C) ConvI2LNode(offset)); + return _gvn.transform( new ConvI2LNode(offset)); } Node* GraphKit::ConvI2UL(Node* offset) { @@ -1135,9 +1134,9 @@ if (offset_con != (juint) Type::OffsetBot) { return longcon((julong) offset_con); } - Node* conv = _gvn.transform( new (C) ConvI2LNode(offset)); + Node* conv = _gvn.transform( new ConvI2LNode(offset)); Node* mask = _gvn.transform( ConLNode::make(C, (julong) max_juint) ); - return _gvn.transform( new (C) AndLNode(conv, mask) ); + return _gvn.transform( new AndLNode(conv, mask) ); } Node* GraphKit::ConvL2I(Node* offset) { @@ -1146,7 +1145,7 @@ if (offset_con != (jlong)Type::OffsetBot) { return intcon((int) offset_con); } - return _gvn.transform( new (C) ConvL2INode(offset)); + return _gvn.transform( new ConvL2INode(offset)); } //-------------------------load_object_klass----------------------------------- @@ -1165,7 +1164,7 @@ Node *alen; if (alloc == NULL) { Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes()); - alen = _gvn.transform( new (C) LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS)); + alen = _gvn.transform( new LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS)); } else { alen = alloc->Ideal_length(); Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_oopptr(), &_gvn); @@ -1199,8 +1198,8 @@ // Construct NULL check Node *chk = NULL; switch(type) { - case T_LONG : chk = new (C) CmpLNode(value, _gvn.zerocon(T_LONG)); break; - case T_INT : chk = new (C) CmpINode(value, _gvn.intcon(0)); break; + case T_LONG : chk = new CmpLNode(value, _gvn.zerocon(T_LONG)); break; + case T_INT : chk = new CmpINode(value, _gvn.intcon(0)); break; case T_ARRAY : // fall through type = T_OBJECT; // simplify further tests case T_OBJECT : { @@ -1247,7 +1246,7 @@ return value; // Elided null check quickly! } } - chk = new (C) CmpPNode( value, null() ); + chk = new CmpPNode( value, null() ); break; } @@ -1258,7 +1257,7 @@ chk = _gvn.transform(chk); BoolTest::mask btest = assert_null ? BoolTest::eq : BoolTest::ne; - BoolNode *btst = new (C) BoolNode( chk, btest); + BoolNode *btst = new BoolNode( chk, btest); Node *tst = _gvn.transform( btst ); //----------- @@ -1325,8 +1324,8 @@ if (null_control != NULL) { IfNode* iff = create_and_map_if(control(), tst, ok_prob, COUNT_UNKNOWN); - Node* null_true = _gvn.transform( new (C) IfFalseNode(iff)); - set_control( _gvn.transform( new (C) IfTrueNode(iff))); + Node* null_true = _gvn.transform( new IfFalseNode(iff)); + set_control( _gvn.transform( new IfTrueNode(iff))); if (null_true == top()) explicit_null_checks_elided++; (*null_control) = null_true; @@ -1378,7 +1377,7 @@ // Object is already not-null? if( t == t_not_null ) return obj; - Node *cast = new (C) CastPPNode(obj,t_not_null); + Node *cast = new CastPPNode(obj,t_not_null); cast->init_req(0, control()); cast = _gvn.transform( cast ); @@ -1403,60 +1402,17 @@ // on the map. This includes locals, stack, and monitors // of the current (innermost) JVM state. - if (!ReplaceInParentMaps) { - return; - } - - // PreserveJVMState doesn't do a deep copy so we can't modify - // parents - if (Compile::current()->has_preserve_jvm_state()) { + // don't let inconsistent types from profiling escape this + // method + + const Type* told = _gvn.type(old); + const Type* tnew = _gvn.type(neww); + + if (!tnew->higher_equal(told)) { return; } - Parse* parser = is_Parse(); - bool progress = true; - Node* ctrl = map()->in(0); - // Follow the chain of parsers and see whether the update can be - // done in the map of callers. We can do the replace for a caller if - // the current control post dominates the control of a caller. - while (parser != NULL && parser->caller() != NULL && progress) { - progress = false; - Node* parent_map = parser->caller()->map(); - assert(parser->exits().map()->jvms()->depth() == parser->caller()->depth(), "map mismatch"); - - Node* parent_ctrl = parent_map->in(0); - - while (parent_ctrl->is_Region()) { - Node* n = parent_ctrl->as_Region()->is_copy(); - if (n == NULL) { - break; - } - parent_ctrl = n; - } - - for (;;) { - if (ctrl == parent_ctrl) { - // update the map of the exits which is the one that will be - // used when compilation resume after inlining - parser->exits().map()->replace_edge(old, neww); - progress = true; - break; - } - if (ctrl->is_Proj() && ctrl->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none)) { - ctrl = ctrl->in(0)->in(0); - } else if (ctrl->is_Region()) { - Node* n = ctrl->as_Region()->is_copy(); - if (n == NULL) { - break; - } - ctrl = n; - } else { - break; - } - } - - parser = parser->parent_parser(); - } + map()->record_replaced_node(old, neww); } @@ -1486,7 +1442,7 @@ //------------------------------set_all_memory_call---------------------------- void GraphKit::set_all_memory_call(Node* call, bool separate_io_proj) { - Node* newmem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory, separate_io_proj) ); + Node* newmem = _gvn.transform( new ProjNode(call, TypeFunc::Memory, separate_io_proj) ); set_all_memory(newmem); } @@ -1721,9 +1677,9 @@ int index_max = max_jint - 1; // array size is max_jint, index is one less if (sizetype != NULL) index_max = sizetype->_hi - 1; const TypeLong* lidxtype = TypeLong::make(CONST64(0), index_max, Type::WidenMax); - idx = _gvn.transform( new (C) ConvI2LNode(idx, lidxtype) ); + idx = _gvn.transform( new ConvI2LNode(idx, lidxtype) ); #endif - Node* scale = _gvn.transform( new (C) LShiftXNode(idx, intcon(shift)) ); + Node* scale = _gvn.transform( new LShiftXNode(idx, intcon(shift)) ); return basic_plus_adr(ary, base, scale); } @@ -1771,8 +1727,8 @@ // Re-use the current map to produce the result. - set_control(_gvn.transform(new (C) ProjNode(call, TypeFunc::Control))); - set_i_o( _gvn.transform(new (C) ProjNode(call, TypeFunc::I_O , separate_io_proj))); + set_control(_gvn.transform(new ProjNode(call, TypeFunc::Control))); + set_i_o( _gvn.transform(new ProjNode(call, TypeFunc::I_O , separate_io_proj))); set_all_memory_call(xcall, separate_io_proj); //return xcall; // no need, caller already has it @@ -1786,7 +1742,7 @@ if (call->method() == NULL || call->method()->return_type()->basic_type() == T_VOID) ret = top(); - else ret = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); + else ret = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); // Note: Since any out-of-line call can produce an exception, // we always insert an I_O projection from the call into the result. @@ -1797,8 +1753,8 @@ // The caller requested separate projections be used by the fall // through and exceptional paths, so replace the projections for // the fall through path. - set_i_o(_gvn.transform( new (C) ProjNode(call, TypeFunc::I_O) )); - set_all_memory(_gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) )); + set_i_o(_gvn.transform( new ProjNode(call, TypeFunc::I_O) )); + set_all_memory(_gvn.transform( new ProjNode(call, TypeFunc::Memory) )); } return ret; } @@ -1838,13 +1794,13 @@ Node* keep_mem, const TypePtr* hook_mem) { // no i/o - set_control(_gvn.transform( new (C) ProjNode(call,TypeFunc::Control) )); + set_control(_gvn.transform( new ProjNode(call,TypeFunc::Control) )); if (keep_mem) { // First clone the existing memory state set_all_memory(keep_mem); if (hook_mem != NULL) { // Make memory for the call - Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) ); + Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) ); // Set the RawPtr memory state only. This covers all the heap top/GC stuff // We also use hook_mem to extract specific effects from arraycopy stubs. set_memory(mem, hook_mem); @@ -1864,12 +1820,16 @@ // Replace the call with the current state of the kit. -void GraphKit::replace_call(CallNode* call, Node* result) { +void GraphKit::replace_call(CallNode* call, Node* result, bool do_replaced_nodes) { JVMState* ejvms = NULL; if (has_exceptions()) { ejvms = transfer_exceptions_into_jvms(); } + ReplacedNodes replaced_nodes = map()->replaced_nodes(); + ReplacedNodes replaced_nodes_exception; + Node* ex_ctl = top(); + SafePointNode* final_state = stop(); // Find all the needed outputs of this call @@ -1886,6 +1846,10 @@ C->gvn_replace_by(callprojs.fallthrough_catchproj, final_ctl); } if (callprojs.fallthrough_memproj != NULL) { + if (final_mem->is_MergeMem()) { + // Parser's exits MergeMem was not transformed but may be optimized + final_mem = _gvn.transform(final_mem); + } C->gvn_replace_by(callprojs.fallthrough_memproj, final_mem); } if (callprojs.fallthrough_ioproj != NULL) { @@ -1917,10 +1881,13 @@ // Load my combined exception state into the kit, with all phis transformed: SafePointNode* ex_map = ekit.combine_and_pop_all_exception_states(); + replaced_nodes_exception = ex_map->replaced_nodes(); Node* ex_oop = ekit.use_exception_state(ex_map); + if (callprojs.catchall_catchproj != NULL) { C->gvn_replace_by(callprojs.catchall_catchproj, ekit.control()); + ex_ctl = ekit.control(); } if (callprojs.catchall_memproj != NULL) { C->gvn_replace_by(callprojs.catchall_memproj, ekit.reset_memory()); @@ -1953,6 +1920,13 @@ _gvn.transform(wl.pop()); } } + + if (callprojs.fallthrough_catchproj != NULL && !final_ctl->is_top() && do_replaced_nodes) { + replaced_nodes.apply(C, final_ctl); + } + if (!ex_ctl->is_top() && do_replaced_nodes) { + replaced_nodes_exception.apply(C, ex_ctl); + } } @@ -1968,7 +1942,7 @@ int adr_type = Compile::AliasIdxRaw; Node* ctrl = control(); Node* cnt = make_load(ctrl, counter_addr, TypeInt::INT, T_INT, adr_type, MemNode::unordered); - Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1))); + Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(1))); store_to_memory(ctrl, counter_addr, incr, T_INT, adr_type, MemNode::unordered); } @@ -2087,7 +2061,7 @@ // The debug info is the only real input to this call. // Halt-and-catch fire here. The above call should never return! - HaltNode* halt = new(C) HaltNode(control(), frameptr()); + HaltNode* halt = new HaltNode(control(), frameptr()); _gvn.set_type_bottom(halt); root()->add_req(halt); @@ -2169,7 +2143,7 @@ // the new type. The new type depends on the control: what // profiling tells us is only valid from here as far as we can // tell. - Node* cast = new(C) CheckCastPPNode(control(), n, current_type->remove_speculative()->join_speculative(spec_type)); + Node* cast = new CheckCastPPNode(control(), n, current_type->remove_speculative()->join_speculative(spec_type)); cast = _gvn.transform(cast); replace_in_map(n, cast); n = cast; @@ -2287,7 +2261,7 @@ Node* GraphKit::precision_rounding(Node* n) { return UseStrictFP && _method->flags().is_strict() && UseSSE == 0 && Matcher::strict_fp_requires_explicit_rounding - ? _gvn.transform( new (C) RoundFloatNode(0, n) ) + ? _gvn.transform( new RoundFloatNode(0, n) ) : n; } @@ -2295,7 +2269,7 @@ Node* GraphKit::dprecision_rounding(Node *n) { return UseStrictFP && _method->flags().is_strict() && UseSSE <= 1 && Matcher::strict_fp_requires_explicit_rounding - ? _gvn.transform( new (C) RoundDoubleNode(0, n) ) + ? _gvn.transform( new RoundDoubleNode(0, n) ) : n; } @@ -2303,7 +2277,7 @@ Node* GraphKit::dstore_rounding(Node* n) { return Matcher::strict_fp_requires_explicit_rounding && UseSSE <= 1 - ? _gvn.transform( new (C) RoundDoubleNode(0, n) ) + ? _gvn.transform( new RoundDoubleNode(0, n) ) : n; } @@ -2382,11 +2356,11 @@ IfNode *opt_iff = _gvn.transform(iff)->as_If(); // Fast path taken; set region slot 2 - Node *fast_taken = _gvn.transform( new (C) IfFalseNode(opt_iff) ); + Node *fast_taken = _gvn.transform( new IfFalseNode(opt_iff) ); region->init_req(2,fast_taken); // Capture fast-control // Fast path not-taken, i.e. slow path - Node *slow_taken = _gvn.transform( new (C) IfTrueNode(opt_iff) ); + Node *slow_taken = _gvn.transform( new IfTrueNode(opt_iff) ); return slow_taken; } @@ -2410,12 +2384,12 @@ } CallNode* call; if (!is_leaf) { - call = new(C) CallStaticJavaNode(call_type, call_addr, call_name, + call = new CallStaticJavaNode(call_type, call_addr, call_name, bci(), adr_type); } else if (flags & RC_NO_FP) { - call = new(C) CallLeafNoFPNode(call_type, call_addr, call_name, adr_type); + call = new CallLeafNoFPNode(call_type, call_addr, call_name, adr_type); } else { - call = new(C) CallLeafNode(call_type, call_addr, call_name, adr_type); + call = new CallLeafNode(call_type, call_addr, call_name, adr_type); } // The following is similar to set_edges_for_java_call, @@ -2476,7 +2450,7 @@ } if (has_io) { - set_i_o(_gvn.transform(new (C) ProjNode(call, TypeFunc::I_O))); + set_i_o(_gvn.transform(new ProjNode(call, TypeFunc::I_O))); } return call; @@ -2490,48 +2464,55 @@ Node* new_slice = mms.memory2(); if (old_slice != new_slice) { PhiNode* phi; - if (new_slice->is_Phi() && new_slice->as_Phi()->region() == region) { - phi = new_slice->as_Phi(); - #ifdef ASSERT - if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region) - old_slice = old_slice->in(new_path); - // Caller is responsible for ensuring that any pre-existing - // phis are already aware of old memory. - int old_path = (new_path > 1) ? 1 : 2; // choose old_path != new_path - assert(phi->in(old_path) == old_slice, "pre-existing phis OK"); - #endif - mms.set_memory(phi); + if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region) { + if (mms.is_empty()) { + // clone base memory Phi's inputs for this memory slice + assert(old_slice == mms.base_memory(), "sanity"); + phi = PhiNode::make(region, NULL, Type::MEMORY, mms.adr_type(C)); + _gvn.set_type(phi, Type::MEMORY); + for (uint i = 1; i < phi->req(); i++) { + phi->init_req(i, old_slice->in(i)); + } + } else { + phi = old_slice->as_Phi(); // Phi was generated already + } } else { phi = PhiNode::make(region, old_slice, Type::MEMORY, mms.adr_type(C)); _gvn.set_type(phi, Type::MEMORY); - phi->set_req(new_path, new_slice); - mms.set_memory(_gvn.transform(phi)); // assume it is complete } + phi->set_req(new_path, new_slice); + mms.set_memory(phi); } } } //------------------------------make_slow_call_ex------------------------------ // Make the exception handler hookups for the slow call -void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj) { +void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj, bool deoptimize) { if (stopped()) return; // Make a catch node with just two handlers: fall-through and catch-all - Node* i_o = _gvn.transform( new (C) ProjNode(call, TypeFunc::I_O, separate_io_proj) ); - Node* catc = _gvn.transform( new (C) CatchNode(control(), i_o, 2) ); - Node* norm = _gvn.transform( new (C) CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) ); - Node* excp = _gvn.transform( new (C) CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) ); + Node* i_o = _gvn.transform( new ProjNode(call, TypeFunc::I_O, separate_io_proj) ); + Node* catc = _gvn.transform( new CatchNode(control(), i_o, 2) ); + Node* norm = _gvn.transform( new CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) ); + Node* excp = _gvn.transform( new CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) ); { PreserveJVMState pjvms(this); set_control(excp); set_i_o(i_o); if (excp != top()) { - // Create an exception state also. - // Use an exact type if the caller has specified a specific exception. - const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull); - Node* ex_oop = new (C) CreateExNode(ex_type, control(), i_o); - add_exception_state(make_exception_state(_gvn.transform(ex_oop))); + if (deoptimize) { + // Deoptimize if an exception is caught. Don't construct exception state in this case. + uncommon_trap(Deoptimization::Reason_unhandled, + Deoptimization::Action_none); + } else { + // Create an exception state also. + // Use an exact type if the caller has specified a specific exception. + const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull); + Node* ex_oop = new CreateExNode(ex_type, control(), i_o); + add_exception_state(make_exception_state(_gvn.transform(ex_oop))); + } } } @@ -2580,11 +2561,11 @@ case SSC_easy_test: { // Just do a direct pointer compare and be done. - Node* cmp = _gvn.transform( new(C) CmpPNode(subklass, superklass) ); - Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::eq) ); + Node* cmp = _gvn.transform( new CmpPNode(subklass, superklass) ); + Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) ); IfNode* iff = create_and_xform_if(control(), bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); - set_control( _gvn.transform( new(C) IfTrueNode (iff) ) ); - return _gvn.transform( new(C) IfFalseNode(iff) ); + set_control( _gvn.transform( new IfTrueNode (iff) ) ); + return _gvn.transform( new IfFalseNode(iff) ); } case SSC_full_test: break; @@ -2599,7 +2580,7 @@ // First load the super-klass's check-offset Node *p1 = basic_plus_adr( superklass, superklass, in_bytes(Klass::super_check_offset_offset()) ); - Node *chk_off = _gvn.transform(new (C) LoadINode(NULL, memory(p1), p1, _gvn.type(p1)->is_ptr(), + Node *chk_off = _gvn.transform(new LoadINode(NULL, memory(p1), p1, _gvn.type(p1)->is_ptr(), TypeInt::INT, MemNode::unordered)); int cacheoff_con = in_bytes(Klass::secondary_super_cache_offset()); bool might_be_cache = (find_int_con(chk_off, cacheoff_con) == cacheoff_con); @@ -2611,7 +2592,7 @@ // Worst-case type is a little odd: NULL is allowed as a result (usually // klass loads can never produce a NULL). Node *chk_off_X = ConvI2X(chk_off); - Node *p2 = _gvn.transform( new (C) AddPNode(subklass,subklass,chk_off_X) ); + Node *p2 = _gvn.transform( new AddPNode(subklass,subklass,chk_off_X) ); // For some types like interfaces the following loadKlass is from a 1-word // cache which is mutable so can't use immutable memory. Other // types load from the super-class display table which is immutable. @@ -2625,11 +2606,11 @@ // See if we get an immediate positive hit. Happens roughly 83% of the // time. Test to see if the value loaded just previously from the subklass // is exactly the superklass. - Node *cmp1 = _gvn.transform( new (C) CmpPNode( superklass, nkls ) ); - Node *bol1 = _gvn.transform( new (C) BoolNode( cmp1, BoolTest::eq ) ); + Node *cmp1 = _gvn.transform( new CmpPNode( superklass, nkls ) ); + Node *bol1 = _gvn.transform( new BoolNode( cmp1, BoolTest::eq ) ); IfNode *iff1 = create_and_xform_if( control(), bol1, PROB_LIKELY(0.83f), COUNT_UNKNOWN ); - Node *iftrue1 = _gvn.transform( new (C) IfTrueNode ( iff1 ) ); - set_control( _gvn.transform( new (C) IfFalseNode( iff1 ) ) ); + Node *iftrue1 = _gvn.transform( new IfTrueNode ( iff1 ) ); + set_control( _gvn.transform( new IfFalseNode( iff1 ) ) ); // Compile speed common case: Check for being deterministic right now. If // chk_off is a constant and not equal to cacheoff then we are NOT a @@ -2642,9 +2623,9 @@ } // Gather the various success & failures here - RegionNode *r_ok_subtype = new (C) RegionNode(4); + RegionNode *r_ok_subtype = new RegionNode(4); record_for_igvn(r_ok_subtype); - RegionNode *r_not_subtype = new (C) RegionNode(3); + RegionNode *r_not_subtype = new RegionNode(3); record_for_igvn(r_not_subtype); r_ok_subtype->init_req(1, iftrue1); @@ -2655,20 +2636,20 @@ // cache. If it points to the display (and NOT the cache) and the display // missed then it's not a subtype. Node *cacheoff = _gvn.intcon(cacheoff_con); - Node *cmp2 = _gvn.transform( new (C) CmpINode( chk_off, cacheoff ) ); - Node *bol2 = _gvn.transform( new (C) BoolNode( cmp2, BoolTest::ne ) ); + Node *cmp2 = _gvn.transform( new CmpINode( chk_off, cacheoff ) ); + Node *bol2 = _gvn.transform( new BoolNode( cmp2, BoolTest::ne ) ); IfNode *iff2 = create_and_xform_if( control(), bol2, PROB_LIKELY(0.63f), COUNT_UNKNOWN ); - r_not_subtype->init_req(1, _gvn.transform( new (C) IfTrueNode (iff2) ) ); - set_control( _gvn.transform( new (C) IfFalseNode(iff2) ) ); + r_not_subtype->init_req(1, _gvn.transform( new IfTrueNode (iff2) ) ); + set_control( _gvn.transform( new IfFalseNode(iff2) ) ); // Check for self. Very rare to get here, but it is taken 1/3 the time. // No performance impact (too rare) but allows sharing of secondary arrays // which has some footprint reduction. - Node *cmp3 = _gvn.transform( new (C) CmpPNode( subklass, superklass ) ); - Node *bol3 = _gvn.transform( new (C) BoolNode( cmp3, BoolTest::eq ) ); + Node *cmp3 = _gvn.transform( new CmpPNode( subklass, superklass ) ); + Node *bol3 = _gvn.transform( new BoolNode( cmp3, BoolTest::eq ) ); IfNode *iff3 = create_and_xform_if( control(), bol3, PROB_LIKELY(0.36f), COUNT_UNKNOWN ); - r_ok_subtype->init_req(2, _gvn.transform( new (C) IfTrueNode ( iff3 ) ) ); - set_control( _gvn.transform( new (C) IfFalseNode( iff3 ) ) ); + r_ok_subtype->init_req(2, _gvn.transform( new IfTrueNode ( iff3 ) ) ); + set_control( _gvn.transform( new IfFalseNode( iff3 ) ) ); // -- Roads not taken here: -- // We could also have chosen to perform the self-check at the beginning @@ -2692,13 +2673,13 @@ // The decision to inline or out-of-line this final check is platform // dependent, and is found in the AD file definition of PartialSubtypeCheck. Node* psc = _gvn.transform( - new (C) PartialSubtypeCheckNode(control(), subklass, superklass) ); - - Node *cmp4 = _gvn.transform( new (C) CmpPNode( psc, null() ) ); - Node *bol4 = _gvn.transform( new (C) BoolNode( cmp4, BoolTest::ne ) ); + new PartialSubtypeCheckNode(control(), subklass, superklass) ); + + Node *cmp4 = _gvn.transform( new CmpPNode( psc, null() ) ); + Node *bol4 = _gvn.transform( new BoolNode( cmp4, BoolTest::ne ) ); IfNode *iff4 = create_and_xform_if( control(), bol4, PROB_FAIR, COUNT_UNKNOWN ); - r_not_subtype->init_req(2, _gvn.transform( new (C) IfTrueNode (iff4) ) ); - r_ok_subtype ->init_req(3, _gvn.transform( new (C) IfFalseNode(iff4) ) ); + r_not_subtype->init_req(2, _gvn.transform( new IfTrueNode (iff4) ) ); + r_ok_subtype ->init_req(3, _gvn.transform( new IfFalseNode(iff4) ) ); // Return false path; set default control to true path. set_control( _gvn.transform(r_ok_subtype) ); @@ -2762,18 +2743,18 @@ const TypeKlassPtr* tklass = TypeKlassPtr::make(klass); Node* recv_klass = load_object_klass(receiver); Node* want_klass = makecon(tklass); - Node* cmp = _gvn.transform( new(C) CmpPNode(recv_klass, want_klass) ); - Node* bol = _gvn.transform( new(C) BoolNode(cmp, BoolTest::eq) ); + Node* cmp = _gvn.transform( new CmpPNode(recv_klass, want_klass) ); + Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) ); IfNode* iff = create_and_xform_if(control(), bol, prob, COUNT_UNKNOWN); - set_control( _gvn.transform( new(C) IfTrueNode (iff) )); - Node* fail = _gvn.transform( new(C) IfFalseNode(iff) ); + set_control( _gvn.transform( new IfTrueNode (iff) )); + Node* fail = _gvn.transform( new IfFalseNode(iff) ); const TypeOopPtr* recv_xtype = tklass->as_instance_type(); assert(recv_xtype->klass_is_exact(), ""); // Subsume downstream occurrences of receiver with a cast to // recv_xtype, since now we know what the type will be. - Node* cast = new(C) CheckCastPPNode(control(), receiver, recv_xtype); + Node* cast = new CheckCastPPNode(control(), receiver, recv_xtype); (*casted_receiver) = _gvn.transform(cast); // (User must make the replace_in_map call.) @@ -2920,8 +2901,8 @@ // Make the merge point enum { _obj_path = 1, _fail_path, _null_path, PATH_LIMIT }; - RegionNode* region = new(C) RegionNode(PATH_LIMIT); - Node* phi = new(C) PhiNode(region, TypeInt::BOOL); + RegionNode* region = new RegionNode(PATH_LIMIT); + Node* phi = new PhiNode(region, TypeInt::BOOL); C->set_has_split_ifs(true); // Has chance for split-if optimization ciProfileData* data = NULL; @@ -3052,8 +3033,8 @@ // Make the merge point enum { _obj_path = 1, _null_path, PATH_LIMIT }; - RegionNode* region = new (C) RegionNode(PATH_LIMIT); - Node* phi = new (C) PhiNode(region, toop); + RegionNode* region = new RegionNode(PATH_LIMIT); + Node* phi = new PhiNode(region, toop); C->set_has_split_ifs(true); // Has chance for split-if optimization // Use null-cast information if it is available @@ -3114,8 +3095,7 @@ Node* not_subtype_ctrl = gen_subtype_check( obj_klass, superklass ); // Plug in success path into the merge - cast_obj = _gvn.transform(new (C) CheckCastPPNode(control(), - not_null_obj, toop)); + cast_obj = _gvn.transform(new CheckCastPPNode(control(), not_null_obj, toop)); // Failure path ends in uncommon trap (or may be dead - failure impossible) if (failure_control == NULL) { if (not_subtype_ctrl != top()) { // If failure is possible @@ -3168,7 +3148,7 @@ mb->init_req(TypeFunc::Control, control()); mb->init_req(TypeFunc::Memory, reset_memory()); Node* membar = _gvn.transform(mb); - set_control(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Control))); + set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control))); set_all_memory_call(membar); return membar; } @@ -3197,11 +3177,11 @@ mb->set_req(TypeFunc::Memory, memory(alias_idx)); } Node* membar = _gvn.transform(mb); - set_control(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Control))); + set_control(_gvn.transform(new ProjNode(membar, TypeFunc::Control))); if (alias_idx == Compile::AliasIdxBot) { - merged_memory()->set_base_memory(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Memory))); + merged_memory()->set_base_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory))); } else { - set_memory(_gvn.transform(new (C) ProjNode(membar, TypeFunc::Memory)),alias_idx); + set_memory(_gvn.transform(new ProjNode(membar, TypeFunc::Memory)),alias_idx); } return membar; } @@ -3221,10 +3201,10 @@ assert(dead_locals_are_killed(), "should kill locals before sync. point"); // Box the stack location - Node* box = _gvn.transform(new (C) BoxLockNode(next_monitor())); + Node* box = _gvn.transform(new BoxLockNode(next_monitor())); Node* mem = reset_memory(); - FastLockNode * flock = _gvn.transform(new (C) FastLockNode(0, obj, box) )->as_FastLock(); + FastLockNode * flock = _gvn.transform(new FastLockNode(0, obj, box) )->as_FastLock(); if (UseBiasedLocking && PrintPreciseBiasedLockingStatistics) { // Create the counters for this fast lock. flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci @@ -3238,7 +3218,7 @@ map()->push_monitor( flock ); const TypeFunc *tf = LockNode::lock_type(); - LockNode *lock = new (C) LockNode(C, tf); + LockNode *lock = new LockNode(C, tf); lock->init_req( TypeFunc::Control, control() ); lock->init_req( TypeFunc::Memory , mem ); @@ -3292,7 +3272,7 @@ insert_mem_bar(Op_MemBarReleaseLock); const TypeFunc *tf = OptoRuntime::complete_monitor_exit_Type(); - UnlockNode *unlock = new (C) UnlockNode(C, tf); + UnlockNode *unlock = new UnlockNode(C, tf); uint raw_idx = Compile::AliasIdxRaw; unlock->init_req( TypeFunc::Control, control() ); unlock->init_req( TypeFunc::Memory , memory(raw_idx) ); @@ -3353,24 +3333,25 @@ //---------------------------set_output_for_allocation------------------------- Node* GraphKit::set_output_for_allocation(AllocateNode* alloc, - const TypeOopPtr* oop_type) { + const TypeOopPtr* oop_type, + bool deoptimize_on_exception) { int rawidx = Compile::AliasIdxRaw; alloc->set_req( TypeFunc::FramePtr, frameptr() ); add_safepoint_edges(alloc); Node* allocx = _gvn.transform(alloc); - set_control( _gvn.transform(new (C) ProjNode(allocx, TypeFunc::Control) ) ); + set_control( _gvn.transform(new ProjNode(allocx, TypeFunc::Control) ) ); // create memory projection for i_o - set_memory ( _gvn.transform( new (C) ProjNode(allocx, TypeFunc::Memory, true) ), rawidx ); - make_slow_call_ex(allocx, env()->Throwable_klass(), true); + set_memory ( _gvn.transform( new ProjNode(allocx, TypeFunc::Memory, true) ), rawidx ); + make_slow_call_ex(allocx, env()->Throwable_klass(), true, deoptimize_on_exception); // create a memory projection as for the normal control path - Node* malloc = _gvn.transform(new (C) ProjNode(allocx, TypeFunc::Memory)); + Node* malloc = _gvn.transform(new ProjNode(allocx, TypeFunc::Memory)); set_memory(malloc, rawidx); // a normal slow-call doesn't change i_o, but an allocation does // we create a separate i_o projection for the normal control path - set_i_o(_gvn.transform( new (C) ProjNode(allocx, TypeFunc::I_O, false) ) ); - Node* rawoop = _gvn.transform( new (C) ProjNode(allocx, TypeFunc::Parms) ); + set_i_o(_gvn.transform( new ProjNode(allocx, TypeFunc::I_O, false) ) ); + Node* rawoop = _gvn.transform( new ProjNode(allocx, TypeFunc::Parms) ); // put in an initialization barrier InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx, @@ -3406,7 +3387,7 @@ } // Cast raw oop to the real thing... - Node* javaoop = new (C) CheckCastPPNode(control(), rawoop, oop_type); + Node* javaoop = new CheckCastPPNode(control(), rawoop, oop_type); javaoop = _gvn.transform(javaoop); C->set_recent_alloc(control(), javaoop); assert(just_allocated_object(control()) == javaoop, "just allocated"); @@ -3439,9 +3420,11 @@ // The optional arguments are for specialized use by intrinsics: // - If 'extra_slow_test' if not null is an extra condition for the slow-path. // - If 'return_size_val', report the the total object size to the caller. +// - deoptimize_on_exception controls how Java exceptions are handled (rethrow vs deoptimize) Node* GraphKit::new_instance(Node* klass_node, Node* extra_slow_test, - Node* *return_size_val) { + Node* *return_size_val, + bool deoptimize_on_exception) { // Compute size in doublewords // The size is always an integral number of doublewords, represented // as a positive bytewise size stored in the klass's layout_helper. @@ -3465,9 +3448,9 @@ // (It may be stress-tested by specifying StressReflectiveCode.) // Basically, we want to get into the VM is there's an illegal argument. Node* bit = intcon(Klass::_lh_instance_slow_path_bit); - initial_slow_test = _gvn.transform( new (C) AndINode(layout_val, bit) ); + initial_slow_test = _gvn.transform( new AndINode(layout_val, bit) ); if (extra_slow_test != intcon(0)) { - initial_slow_test = _gvn.transform( new (C) OrINode(initial_slow_test, extra_slow_test) ); + initial_slow_test = _gvn.transform( new OrINode(initial_slow_test, extra_slow_test) ); } // (Macro-expander will further convert this to a Bool, if necessary.) } @@ -3484,7 +3467,7 @@ // Clear the low bits to extract layout_helper_size_in_bytes: assert((int)Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit"); Node* mask = MakeConX(~ (intptr_t)right_n_bits(LogBytesPerLong)); - size = _gvn.transform( new (C) AndXNode(size, mask) ); + size = _gvn.transform( new AndXNode(size, mask) ); } if (return_size_val != NULL) { (*return_size_val) = size; @@ -3504,13 +3487,12 @@ Node *mem = reset_memory(); set_all_memory(mem); // Create new memory state - AllocateNode* alloc - = new (C) AllocateNode(C, AllocateNode::alloc_type(Type::TOP), - control(), mem, i_o(), - size, klass_node, - initial_slow_test); - - return set_output_for_allocation(alloc, oop_type); + AllocateNode* alloc = new AllocateNode(C, AllocateNode::alloc_type(Type::TOP), + control(), mem, i_o(), + size, klass_node, + initial_slow_test); + + return set_output_for_allocation(alloc, oop_type, deoptimize_on_exception); } //-------------------------------new_array------------------------------------- @@ -3520,7 +3502,8 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable) Node* length, // number of array elements int nargs, // number of arguments to push back for uncommon trap - Node* *return_size_val) { + Node* *return_size_val, + bool deoptimize_on_exception) { jint layout_con = Klass::_lh_neutral_value; Node* layout_val = get_layout_helper(klass_node, layout_con); int layout_is_con = (layout_val == NULL); @@ -3531,8 +3514,8 @@ // Optimistically assume that it is a subtype of Object[], // so that we can fold up all the address arithmetic. layout_con = Klass::array_layout_helper(T_OBJECT); - Node* cmp_lh = _gvn.transform( new(C) CmpINode(layout_val, intcon(layout_con)) ); - Node* bol_lh = _gvn.transform( new(C) BoolNode(cmp_lh, BoolTest::eq) ); + Node* cmp_lh = _gvn.transform( new CmpINode(layout_val, intcon(layout_con)) ); + Node* bol_lh = _gvn.transform( new BoolNode(cmp_lh, BoolTest::eq) ); { BuildCutout unless(this, bol_lh, PROB_MAX); inc_sp(nargs); uncommon_trap(Deoptimization::Reason_class_check, @@ -3556,8 +3539,8 @@ fast_size_limit <<= (LogBytesPerLong - log2_esize); } - Node* initial_slow_cmp = _gvn.transform( new (C) CmpUNode( length, intcon( fast_size_limit ) ) ); - Node* initial_slow_test = _gvn.transform( new (C) BoolNode( initial_slow_cmp, BoolTest::gt ) ); + Node* initial_slow_cmp = _gvn.transform( new CmpUNode( length, intcon( fast_size_limit ) ) ); + Node* initial_slow_test = _gvn.transform( new BoolNode( initial_slow_cmp, BoolTest::gt ) ); if (initial_slow_test->is_Bool()) { // Hide it behind a CMoveI, or else PhaseIdealLoop::split_up will get sick. initial_slow_test = initial_slow_test->as_Bool()->as_int_value(&_gvn); @@ -3585,10 +3568,10 @@ } else { Node* hss = intcon(Klass::_lh_header_size_shift); Node* hsm = intcon(Klass::_lh_header_size_mask); - Node* hsize = _gvn.transform( new(C) URShiftINode(layout_val, hss) ); - hsize = _gvn.transform( new(C) AndINode(hsize, hsm) ); + Node* hsize = _gvn.transform( new URShiftINode(layout_val, hss) ); + hsize = _gvn.transform( new AndINode(hsize, hsm) ); Node* mask = intcon(round_mask); - header_size = _gvn.transform( new(C) AddINode(hsize, mask) ); + header_size = _gvn.transform( new AddINode(hsize, mask) ); } Node* elem_shift = NULL; @@ -3613,7 +3596,7 @@ jlong size_max = arrayOopDesc::max_array_length(T_BYTE); if (size_max > tllen->_hi) size_max = tllen->_hi; const TypeLong* tlcon = TypeLong::make(CONST64(0), size_max, Type::WidenMin); - lengthx = _gvn.transform( new (C) ConvI2LNode(length, tlcon)); + lengthx = _gvn.transform( new ConvI2LNode(length, tlcon)); } } #endif @@ -3624,11 +3607,11 @@ // after a successful allocation. Node* abody = lengthx; if (elem_shift != NULL) - abody = _gvn.transform( new(C) LShiftXNode(lengthx, elem_shift) ); - Node* size = _gvn.transform( new(C) AddXNode(headerx, abody) ); + abody = _gvn.transform( new LShiftXNode(lengthx, elem_shift) ); + Node* size = _gvn.transform( new AddXNode(headerx, abody) ); if (round_mask != 0) { Node* mask = MakeConX(~round_mask); - size = _gvn.transform( new(C) AndXNode(size, mask) ); + size = _gvn.transform( new AndXNode(size, mask) ); } // else if round_mask == 0, the size computation is self-rounding @@ -3646,11 +3629,11 @@ // Create the AllocateArrayNode and its result projections AllocateArrayNode* alloc - = new (C) AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT), - control(), mem, i_o(), - size, klass_node, - initial_slow_test, - length); + = new AllocateArrayNode(C, AllocateArrayNode::alloc_type(TypeInt::INT), + control(), mem, i_o(), + size, klass_node, + initial_slow_test, + length); // Cast to correct type. Note that the klass_node may be constant or not, // and in the latter case the actual array type will be inexact also. @@ -3663,7 +3646,7 @@ ary_type = ary_type->is_aryptr()->cast_to_size(length_type); } - Node* javaoop = set_output_for_allocation(alloc, ary_type); + Node* javaoop = set_output_for_allocation(alloc, ary_type, deoptimize_on_exception); // Cast length on remaining path to be as narrow as possible if (map()->find_edge(length) >= 0) { @@ -3760,10 +3743,10 @@ } Node *cont = _gvn.intcon(1); - Node* opq = _gvn.transform(new (C) Opaque1Node(C, cont)); - Node *bol = _gvn.transform(new (C) Conv2BNode(opq)); + Node* opq = _gvn.transform(new Opaque1Node(C, cont)); + Node *bol = _gvn.transform(new Conv2BNode(opq)); IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN); - Node* iffalse = _gvn.transform(new (C) IfFalseNode(iff)); + Node* iffalse = _gvn.transform(new IfFalseNode(iff)); C->add_predicate_opaq(opq); { PreserveJVMState pjvms(this); @@ -3771,7 +3754,7 @@ inc_sp(nargs); uncommon_trap(reason, Deoptimization::Action_maybe_recompile); } - Node* iftrue = _gvn.transform(new (C) IfTrueNode(iff)); + Node* iftrue = _gvn.transform(new IfTrueNode(iff)); set_control(iftrue); } @@ -3963,7 +3946,7 @@ __ if_then(index, BoolTest::ne, zeroX, likely); { // decrement the index - Node* next_index = _gvn.transform(new (C) SubXNode(index, __ ConX(sizeof(intptr_t)))); + Node* next_index = _gvn.transform(new SubXNode(index, __ ConX(sizeof(intptr_t)))); // Now get the buffer location we will log the previous value into and store it Node *log_addr = __ AddP(no_base, buffer, next_index); @@ -4006,7 +3989,7 @@ // Now do the queue work __ if_then(index, BoolTest::ne, zeroX); { - Node* next_index = _gvn.transform(new (C) SubXNode(index, __ ConX(sizeof(intptr_t)))); + Node* next_index = _gvn.transform(new SubXNode(index, __ ConX(sizeof(intptr_t)))); Node* log_addr = __ AddP(no_base, buffer, next_index); // Order, see storeCM. @@ -4213,5 +4196,5 @@ Node* GraphKit::cast_array_to_stable(Node* ary, const TypeAryPtr* ary_type) { // Reify the property as a CastPP node in Ideal graph to comply with monotonicity // assumption of CCP analysis. - return _gvn.transform(new(C) CastPPNode(ary, ary_type->cast_to_stable(true))); + return _gvn.transform(new CastPPNode(ary, ary_type->cast_to_stable(true))); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/graphKit.hpp --- a/hotspot/src/share/vm/opto/graphKit.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/graphKit.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -309,31 +309,31 @@ // Some convenient shortcuts for common nodes - Node* IfTrue(IfNode* iff) { return _gvn.transform(new (C) IfTrueNode(iff)); } - Node* IfFalse(IfNode* iff) { return _gvn.transform(new (C) IfFalseNode(iff)); } + Node* IfTrue(IfNode* iff) { return _gvn.transform(new IfTrueNode(iff)); } + Node* IfFalse(IfNode* iff) { return _gvn.transform(new IfFalseNode(iff)); } - Node* AddI(Node* l, Node* r) { return _gvn.transform(new (C) AddINode(l, r)); } - Node* SubI(Node* l, Node* r) { return _gvn.transform(new (C) SubINode(l, r)); } - Node* MulI(Node* l, Node* r) { return _gvn.transform(new (C) MulINode(l, r)); } - Node* DivI(Node* ctl, Node* l, Node* r) { return _gvn.transform(new (C) DivINode(ctl, l, r)); } + Node* AddI(Node* l, Node* r) { return _gvn.transform(new AddINode(l, r)); } + Node* SubI(Node* l, Node* r) { return _gvn.transform(new SubINode(l, r)); } + Node* MulI(Node* l, Node* r) { return _gvn.transform(new MulINode(l, r)); } + Node* DivI(Node* ctl, Node* l, Node* r) { return _gvn.transform(new DivINode(ctl, l, r)); } - Node* AndI(Node* l, Node* r) { return _gvn.transform(new (C) AndINode(l, r)); } - Node* OrI(Node* l, Node* r) { return _gvn.transform(new (C) OrINode(l, r)); } - Node* XorI(Node* l, Node* r) { return _gvn.transform(new (C) XorINode(l, r)); } + Node* AndI(Node* l, Node* r) { return _gvn.transform(new AndINode(l, r)); } + Node* OrI(Node* l, Node* r) { return _gvn.transform(new OrINode(l, r)); } + Node* XorI(Node* l, Node* r) { return _gvn.transform(new XorINode(l, r)); } - Node* MaxI(Node* l, Node* r) { return _gvn.transform(new (C) MaxINode(l, r)); } - Node* MinI(Node* l, Node* r) { return _gvn.transform(new (C) MinINode(l, r)); } + Node* MaxI(Node* l, Node* r) { return _gvn.transform(new MaxINode(l, r)); } + Node* MinI(Node* l, Node* r) { return _gvn.transform(new MinINode(l, r)); } - Node* LShiftI(Node* l, Node* r) { return _gvn.transform(new (C) LShiftINode(l, r)); } - Node* RShiftI(Node* l, Node* r) { return _gvn.transform(new (C) RShiftINode(l, r)); } - Node* URShiftI(Node* l, Node* r) { return _gvn.transform(new (C) URShiftINode(l, r)); } + Node* LShiftI(Node* l, Node* r) { return _gvn.transform(new LShiftINode(l, r)); } + Node* RShiftI(Node* l, Node* r) { return _gvn.transform(new RShiftINode(l, r)); } + Node* URShiftI(Node* l, Node* r) { return _gvn.transform(new URShiftINode(l, r)); } - Node* CmpI(Node* l, Node* r) { return _gvn.transform(new (C) CmpINode(l, r)); } - Node* CmpL(Node* l, Node* r) { return _gvn.transform(new (C) CmpLNode(l, r)); } - Node* CmpP(Node* l, Node* r) { return _gvn.transform(new (C) CmpPNode(l, r)); } - Node* Bool(Node* cmp, BoolTest::mask relop) { return _gvn.transform(new (C) BoolNode(cmp, relop)); } + Node* CmpI(Node* l, Node* r) { return _gvn.transform(new CmpINode(l, r)); } + Node* CmpL(Node* l, Node* r) { return _gvn.transform(new CmpLNode(l, r)); } + Node* CmpP(Node* l, Node* r) { return _gvn.transform(new CmpPNode(l, r)); } + Node* Bool(Node* cmp, BoolTest::mask relop) { return _gvn.transform(new BoolNode(cmp, relop)); } - Node* AddP(Node* b, Node* a, Node* o) { return _gvn.transform(new (C) AddPNode(b, a, o)); } + Node* AddP(Node* b, Node* a, Node* o) { return _gvn.transform(new AddPNode(b, a, o)); } // Convert between int and long, and size_t. // (See macros ConvI2X, etc., in type.hpp for ConvI2X, etc.) @@ -690,7 +690,7 @@ // Replace the call with the current state of the kit. Requires // that the call was generated with separate io_projs so that // exceptional control flow can be handled properly. - void replace_call(CallNode* call, Node* result); + void replace_call(CallNode* call, Node* result, bool do_replaced_nodes = false); // helper functions for statistics void increment_counter(address counter_addr); // increment a debug counter @@ -807,7 +807,7 @@ // merge in all memory slices from new_mem, along the given path void merge_memory(Node* new_mem, Node* region, int new_path); - void make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj); + void make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj, bool deoptimize = false); // Helper functions to build synchronizations int next_monitor(); @@ -849,13 +849,16 @@ // implementation of object creation Node* set_output_for_allocation(AllocateNode* alloc, - const TypeOopPtr* oop_type); + const TypeOopPtr* oop_type, + bool deoptimize_on_exception=false); Node* get_layout_helper(Node* klass_node, jint& constant_value); Node* new_instance(Node* klass_node, Node* slow_test = NULL, - Node* *return_size_val = NULL); + Node* *return_size_val = NULL, + bool deoptimize_on_exception = false); Node* new_array(Node* klass_node, Node* count_val, int nargs, - Node* *return_size_val = NULL); + Node* *return_size_val = NULL, + bool deoptimize_on_exception = false); // java.lang.String helpers Node* load_String_offset(Node* ctrl, Node* str); @@ -867,7 +870,7 @@ // Handy for making control flow IfNode* create_and_map_if(Node* ctrl, Node* tst, float prob, float cnt) { - IfNode* iff = new (C) IfNode(ctrl, tst, prob, cnt);// New IfNode's + IfNode* iff = new IfNode(ctrl, tst, prob, cnt);// New IfNode's _gvn.set_type(iff, iff->Value(&_gvn)); // Value may be known at parse-time // Place 'if' on worklist if it will be in graph if (!tst->is_Con()) record_for_igvn(iff); // Range-check and Null-check removal is later @@ -875,7 +878,7 @@ } IfNode* create_and_xform_if(Node* ctrl, Node* tst, float prob, float cnt) { - IfNode* iff = new (C) IfNode(ctrl, tst, prob, cnt);// New IfNode's + IfNode* iff = new IfNode(ctrl, tst, prob, cnt);// New IfNode's _gvn.transform(iff); // Value may be known at parse-time // Place 'if' on worklist if it will be in graph if (!tst->is_Con()) record_for_igvn(iff); // Range-check and Null-check removal is later diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/idealKit.cpp --- a/hotspot/src/share/vm/opto/idealKit.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/idealKit.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -86,7 +86,7 @@ } // Delay gvn.tranform on if-nodes until construction is finished // to prevent a constant bool input from discarding a control output. - IfNode* iff = delay_transform(new (C) IfNode(ctrl(), bol, prob, cnt))->as_If(); + IfNode* iff = delay_transform(new IfNode(ctrl(), bol, prob, cnt))->as_If(); Node* then = IfTrue(iff); Node* elsen = IfFalse(iff); Node* else_cvstate = copy_cvstate(); @@ -205,7 +205,7 @@ assert(_cvstate != NULL, "must declare variables before labels"); Node* lab = new_cvstate(); int sz = 1 + goto_ct + 1 /* fall thru */; - Node* reg = delay_transform(new (C) RegionNode(sz)); + Node* reg = delay_transform(new RegionNode(sz)); lab->init_req(TypeFunc::Control, reg); return lab; } @@ -312,7 +312,7 @@ //-----------------------------new_cvstate----------------------------------- Node* IdealKit::new_cvstate() { uint sz = _var_ct + first_var; - return new (C) Node(sz); + return new Node(sz); } //-----------------------------copy_cvstate----------------------------------- @@ -397,7 +397,7 @@ // Add required edge to oop_store, optimizer does not support precedence edges. // Convert required edge to precedence edge before allocation. - Node* st = new (C) StoreCMNode(ctl, mem, adr, adr_type, val, oop_store, oop_adr_idx); + Node* st = new StoreCMNode(ctl, mem, adr, adr_type, val, oop_store, oop_adr_idx); st = transform(st); set_memory(st, adr_idx); @@ -497,7 +497,7 @@ uint adr_idx = C->get_alias_index(adr_type); // Slow-path leaf call - CallNode *call = (CallNode*)new (C) CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type); + CallNode *call = (CallNode*)new CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type); // Set fixed predefined input arguments call->init_req( TypeFunc::Control, ctrl() ); @@ -518,10 +518,10 @@ // Slow leaf call has no side-effects, sets few values - set_ctrl(transform( new (C) ProjNode(call,TypeFunc::Control) )); + set_ctrl(transform( new ProjNode(call,TypeFunc::Control) )); // Make memory for the call - Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) ); + Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) ); // Set the RawPtr memory state only. set_memory(mem, adr_idx); @@ -544,7 +544,7 @@ uint adr_idx = C->get_alias_index(adr_type); // Slow-path leaf call - CallNode *call = (CallNode*)new (C) CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type); + CallNode *call = (CallNode*)new CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type); // Set fixed predefined input arguments call->init_req( TypeFunc::Control, ctrl() ); @@ -565,10 +565,10 @@ // Slow leaf call has no side-effects, sets few values - set_ctrl(transform( new (C) ProjNode(call,TypeFunc::Control) )); + set_ctrl(transform( new ProjNode(call,TypeFunc::Control) )); // Make memory for the call - Node* mem = _gvn.transform( new (C) ProjNode(call, TypeFunc::Memory) ); + Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) ); // Set the RawPtr memory state only. set_memory(mem, adr_idx); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/idealKit.hpp --- a/hotspot/src/share/vm/opto/idealKit.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/idealKit.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -173,43 +173,43 @@ void goto_(Node* lab, bool bind = false); void declarations_done(); - Node* IfTrue(IfNode* iff) { return transform(new (C) IfTrueNode(iff)); } - Node* IfFalse(IfNode* iff) { return transform(new (C) IfFalseNode(iff)); } + Node* IfTrue(IfNode* iff) { return transform(new IfTrueNode(iff)); } + Node* IfFalse(IfNode* iff) { return transform(new IfFalseNode(iff)); } // Data Node* ConI(jint k) { return (Node*)gvn().intcon(k); } Node* makecon(const Type *t) const { return _gvn.makecon(t); } - Node* AddI(Node* l, Node* r) { return transform(new (C) AddINode(l, r)); } - Node* SubI(Node* l, Node* r) { return transform(new (C) SubINode(l, r)); } - Node* AndI(Node* l, Node* r) { return transform(new (C) AndINode(l, r)); } - Node* MaxI(Node* l, Node* r) { return transform(new (C) MaxINode(l, r)); } - Node* LShiftI(Node* l, Node* r) { return transform(new (C) LShiftINode(l, r)); } - Node* CmpI(Node* l, Node* r) { return transform(new (C) CmpINode(l, r)); } - Node* Bool(Node* cmp, BoolTest::mask relop) { return transform(new (C) BoolNode(cmp, relop)); } + Node* AddI(Node* l, Node* r) { return transform(new AddINode(l, r)); } + Node* SubI(Node* l, Node* r) { return transform(new SubINode(l, r)); } + Node* AndI(Node* l, Node* r) { return transform(new AndINode(l, r)); } + Node* MaxI(Node* l, Node* r) { return transform(new MaxINode(l, r)); } + Node* LShiftI(Node* l, Node* r) { return transform(new LShiftINode(l, r)); } + Node* CmpI(Node* l, Node* r) { return transform(new CmpINode(l, r)); } + Node* Bool(Node* cmp, BoolTest::mask relop) { return transform(new BoolNode(cmp, relop)); } void increment(IdealVariable& v, Node* j) { set(v, AddI(value(v), j)); } void decrement(IdealVariable& v, Node* j) { set(v, SubI(value(v), j)); } - Node* CmpL(Node* l, Node* r) { return transform(new (C) CmpLNode(l, r)); } + Node* CmpL(Node* l, Node* r) { return transform(new CmpLNode(l, r)); } // TLS - Node* thread() { return gvn().transform(new (C) ThreadLocalNode()); } + Node* thread() { return gvn().transform(new ThreadLocalNode()); } // Pointers // Raw address should be transformed regardless 'delay_transform' flag // to produce canonical form CastX2P(offset). - Node* AddP(Node *base, Node *ptr, Node *off) { return _gvn.transform(new (C) AddPNode(base, ptr, off)); } + Node* AddP(Node *base, Node *ptr, Node *off) { return _gvn.transform(new AddPNode(base, ptr, off)); } - Node* CmpP(Node* l, Node* r) { return transform(new (C) CmpPNode(l, r)); } + Node* CmpP(Node* l, Node* r) { return transform(new CmpPNode(l, r)); } #ifdef _LP64 - Node* XorX(Node* l, Node* r) { return transform(new (C) XorLNode(l, r)); } + Node* XorX(Node* l, Node* r) { return transform(new XorLNode(l, r)); } #else // _LP64 - Node* XorX(Node* l, Node* r) { return transform(new (C) XorINode(l, r)); } + Node* XorX(Node* l, Node* r) { return transform(new XorINode(l, r)); } #endif // _LP64 - Node* URShiftX(Node* l, Node* r) { return transform(new (C) URShiftXNode(l, r)); } + Node* URShiftX(Node* l, Node* r) { return transform(new URShiftXNode(l, r)); } Node* ConX(jint k) { return (Node*)gvn().MakeConX(k); } - Node* CastPX(Node* ctl, Node* p) { return transform(new (C) CastP2XNode(ctl, p)); } + Node* CastPX(Node* ctl, Node* p) { return transform(new CastP2XNode(ctl, p)); } // Memory operations diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/ifnode.cpp --- a/hotspot/src/share/vm/opto/ifnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/ifnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -238,10 +238,10 @@ Node* predicate_x = NULL; bool counted_loop = r->is_CountedLoop(); - Node *region_c = new (igvn->C) RegionNode(req_c + 1); + Node *region_c = new RegionNode(req_c + 1); Node *phi_c = con1; uint len = r->req(); - Node *region_x = new (igvn->C) RegionNode(len - req_c); + Node *region_x = new RegionNode(len - req_c); Node *phi_x = PhiNode::make_blank(region_x, phi); for (uint i = 1, i_c = 1, i_x = 1; i < len; i++) { if (phi->in(i) == con1) { @@ -272,7 +272,7 @@ // Prevent the untimely death of phi_x. Currently he has no uses. He is // about to get one. If this only use goes away, then phi_x will look dead. // However, he will be picking up some more uses down below. - Node *hook = new (igvn->C) Node(4); + Node *hook = new Node(4); hook->init_req(0, phi_x); hook->init_req(1, phi_c); phi_x = phase->transform( phi_x ); @@ -284,30 +284,30 @@ cmp_x->set_req(2,con2); cmp_x = phase->transform(cmp_x); // Make the bool - Node *b_c = phase->transform(new (igvn->C) BoolNode(cmp_c,b->_test._test)); - Node *b_x = phase->transform(new (igvn->C) BoolNode(cmp_x,b->_test._test)); + Node *b_c = phase->transform(new BoolNode(cmp_c,b->_test._test)); + Node *b_x = phase->transform(new BoolNode(cmp_x,b->_test._test)); // Make the IfNode - IfNode *iff_c = new (igvn->C) IfNode(region_c,b_c,iff->_prob,iff->_fcnt); + IfNode *iff_c = new IfNode(region_c,b_c,iff->_prob,iff->_fcnt); igvn->set_type_bottom(iff_c); igvn->_worklist.push(iff_c); hook->init_req(2, iff_c); - IfNode *iff_x = new (igvn->C) IfNode(region_x,b_x,iff->_prob, iff->_fcnt); + IfNode *iff_x = new IfNode(region_x,b_x,iff->_prob, iff->_fcnt); igvn->set_type_bottom(iff_x); igvn->_worklist.push(iff_x); hook->init_req(3, iff_x); // Make the true/false arms - Node *iff_c_t = phase->transform(new (igvn->C) IfTrueNode (iff_c)); - Node *iff_c_f = phase->transform(new (igvn->C) IfFalseNode(iff_c)); + Node *iff_c_t = phase->transform(new IfTrueNode (iff_c)); + Node *iff_c_f = phase->transform(new IfFalseNode(iff_c)); if (predicate_c != NULL) { assert(predicate_x == NULL, "only one predicate entry expected"); // Clone loop predicates to each path iff_c_t = igvn->clone_loop_predicates(predicate_c, iff_c_t, !counted_loop); iff_c_f = igvn->clone_loop_predicates(predicate_c, iff_c_f, !counted_loop); } - Node *iff_x_t = phase->transform(new (igvn->C) IfTrueNode (iff_x)); - Node *iff_x_f = phase->transform(new (igvn->C) IfFalseNode(iff_x)); + Node *iff_x_t = phase->transform(new IfTrueNode (iff_x)); + Node *iff_x_f = phase->transform(new IfFalseNode(iff_x)); if (predicate_x != NULL) { assert(predicate_c == NULL, "only one predicate entry expected"); // Clone loop predicates to each path @@ -316,14 +316,14 @@ } // Merge the TRUE paths - Node *region_s = new (igvn->C) RegionNode(3); + Node *region_s = new RegionNode(3); igvn->_worklist.push(region_s); region_s->init_req(1, iff_c_t); region_s->init_req(2, iff_x_t); igvn->register_new_node_with_optimizer( region_s ); // Merge the FALSE paths - Node *region_f = new (igvn->C) RegionNode(3); + Node *region_f = new RegionNode(3); igvn->_worklist.push(region_f); region_f->init_req(1, iff_c_f); region_f->init_req(2, iff_x_f); @@ -438,7 +438,7 @@ // Must return either the original node (now dead) or a new node // (Do not return a top here, since that would break the uniqueness of top.) - return new (igvn->C) ConINode(TypeInt::ZERO); + return new ConINode(TypeInt::ZERO); } //------------------------------is_range_check--------------------------------- @@ -541,16 +541,16 @@ // Compute a new check Node *new_add = gvn->intcon(off_lo); if( index ) { - new_add = off_lo ? gvn->transform(new (gvn->C) AddINode( index, new_add )) : index; + new_add = off_lo ? gvn->transform(new AddINode( index, new_add )) : index; } Node *new_cmp = (flip == 1) - ? new (gvn->C) CmpUNode( new_add, range ) - : new (gvn->C) CmpUNode( range, new_add ); + ? new CmpUNode( new_add, range ) + : new CmpUNode( range, new_add ); new_cmp = gvn->transform(new_cmp); // See if no need to adjust the existing check if( new_cmp == cmp ) return; // Else, adjust existing check - Node *new_bol = gvn->transform( new (gvn->C) BoolNode( new_cmp, bol->as_Bool()->_test._test ) ); + Node *new_bol = gvn->transform( new BoolNode( new_cmp, bol->as_Bool()->_test._test ) ); igvn->rehash_node_delayed( iff ); iff->set_req_X( 1, new_bol, igvn ); } @@ -728,9 +728,9 @@ if (failtype->_hi != max_jint && failtype->_lo != min_jint && bound > 1) { // Merge the two compares into a single unsigned compare by building (CmpU (n - lo) hi) BoolTest::mask cond = fail->as_Proj()->_con ? BoolTest::lt : BoolTest::ge; - Node* adjusted = phase->transform(new (phase->C) SubINode(n, phase->intcon(failtype->_lo))); - Node* newcmp = phase->transform(new (phase->C) CmpUNode(adjusted, phase->intcon(bound))); - Node* newbool = phase->transform(new (phase->C) BoolNode(newcmp, cond)); + Node* adjusted = phase->transform(new SubINode(n, phase->intcon(failtype->_lo))); + Node* newcmp = phase->transform(new CmpUNode(adjusted, phase->intcon(bound))); + Node* newbool = phase->transform(new BoolNode(newcmp, cond)); phase->is_IterGVN()->replace_input_of(dom_iff, 1, phase->intcon(ctrl->as_Proj()->_con)); phase->hash_delete(this); set_req(1, newbool); @@ -1003,7 +1003,7 @@ // Must return either the original node (now dead) or a new node // (Do not return a top here, since that would break the uniqueness of top.) - return new (phase->C) ConINode(TypeInt::ZERO); + return new ConINode(TypeInt::ZERO); } //------------------------------dominated_by----------------------------------- @@ -1099,7 +1099,7 @@ // Flip test to be canonical. Requires flipping the IfFalse/IfTrue and // cloning the IfNode. - Node* new_b = phase->transform( new (phase->C) BoolNode(b->in(1), bt.negate()) ); + Node* new_b = phase->transform( new BoolNode(b->in(1), bt.negate()) ); if( !new_b->is_Bool() ) return NULL; b = new_b->as_Bool(); @@ -1107,7 +1107,7 @@ assert( igvn, "Test is not canonical in parser?" ); // The IF node never really changes, but it needs to be cloned - iff = new (phase->C) IfNode( iff->in(0), b, 1.0-iff->_prob, iff->_fcnt); + iff = new IfNode( iff->in(0), b, 1.0-iff->_prob, iff->_fcnt); Node *prior = igvn->hash_find_insert(iff); if( prior ) { @@ -1120,8 +1120,8 @@ igvn->_worklist.push(iff); // Now handle projections. Cloning not required. - Node* new_if_f = (Node*)(new (phase->C) IfFalseNode( iff )); - Node* new_if_t = (Node*)(new (phase->C) IfTrueNode ( iff )); + Node* new_if_f = (Node*)(new IfFalseNode( iff )); + Node* new_if_t = (Node*)(new IfTrueNode ( iff )); igvn->register_new_node_with_optimizer(new_if_f); igvn->register_new_node_with_optimizer(new_if_t); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/lcm.cpp --- a/hotspot/src/share/vm/opto/lcm.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/lcm.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -419,7 +419,7 @@ Node *tmp2 = block->get_node(block->end_idx()+2); block->map_node(tmp2, block->end_idx()+1); block->map_node(tmp1, block->end_idx()+2); - Node *tmp = new (C) Node(C->top()); // Use not NULL input + Node *tmp = new Node(C->top()); // Use not NULL input tmp1->replace_by(tmp); tmp2->replace_by(tmp1); tmp->replace_by(tmp2); @@ -430,7 +430,7 @@ // Since schedule-local needs precise def-use info, we need to correct // it as well. Node *old_tst = proj->in(0); - MachNode *nul_chk = new (C) MachNullCheckNode(old_tst->in(0),best,bidx); + MachNode *nul_chk = new MachNullCheckNode(old_tst->in(0),best,bidx); block->map_node(nul_chk, block->end_idx()); map_node_to_block(nul_chk, block); // Redirect users of old_test to nul_chk @@ -671,7 +671,7 @@ // Set all registers killed and not already defined by the call. uint r_cnt = mcall->tf()->range()->cnt(); int op = mcall->ideal_Opcode(); - MachProjNode *proj = new (C) MachProjNode( mcall, r_cnt+1, RegMask::Empty, MachProjNode::fat_proj ); + MachProjNode *proj = new MachProjNode( mcall, r_cnt+1, RegMask::Empty, MachProjNode::fat_proj ); map_node_to_block(proj, block); block->insert_node(proj, node_cnt++); @@ -900,7 +900,7 @@ regs.Insert(_matcher.c_frame_pointer()); regs.OR(n->out_RegMask()); - MachProjNode *proj = new (C) MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj ); + MachProjNode *proj = new MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj ); map_node_to_block(proj, block); block->insert_node(proj, phi_cnt++); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/library_call.cpp --- a/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -52,25 +52,28 @@ public: private: bool _is_virtual; - bool _is_predicted; bool _does_virtual_dispatch; + int8_t _predicates_count; // Intrinsic is predicated by several conditions + int8_t _last_predicate; // Last generated predicate vmIntrinsics::ID _intrinsic_id; public: - LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id) + LibraryIntrinsic(ciMethod* m, bool is_virtual, int predicates_count, bool does_virtual_dispatch, vmIntrinsics::ID id) : InlineCallGenerator(m), _is_virtual(is_virtual), - _is_predicted(is_predicted), _does_virtual_dispatch(does_virtual_dispatch), + _predicates_count((int8_t)predicates_count), + _last_predicate((int8_t)-1), _intrinsic_id(id) { } virtual bool is_intrinsic() const { return true; } virtual bool is_virtual() const { return _is_virtual; } - virtual bool is_predicted() const { return _is_predicted; } + virtual bool is_predicated() const { return _predicates_count > 0; } + virtual int predicates_count() const { return _predicates_count; } virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; } - virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); - virtual Node* generate_predicate(JVMState* jvms); + virtual JVMState* generate(JVMState* jvms); + virtual Node* generate_predicate(JVMState* jvms, int predicate); vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; } }; @@ -113,8 +116,8 @@ vmIntrinsics::ID intrinsic_id() const { return _intrinsic->intrinsic_id(); } ciMethod* callee() const { return _intrinsic->method(); } - bool try_to_inline(); - Node* try_to_predicate(); + bool try_to_inline(int predicate); + Node* try_to_predicate(int predicate); void push_result() { // Push the result onto the stack. @@ -313,6 +316,14 @@ Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object); + bool inline_sha_implCompress(vmIntrinsics::ID id); + bool inline_digestBase_implCompressMB(int predicate); + bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA, + bool long_state, address stubAddr, const char *stubName, + Node* src_start, Node* ofs, Node* limit); + Node* get_state_from_sha_object(Node *sha_object); + Node* get_state_from_sha5_object(Node *sha_object); + Node* inline_digestBase_implCompressMB_predicate(int predicate); bool inline_encodeISOArray(); bool inline_updateCRC32(); bool inline_updateBytesCRC32(); @@ -373,7 +384,7 @@ } } - bool is_predicted = false; + int predicates = 0; bool does_virtual_dispatch = false; switch (id) { @@ -513,7 +524,24 @@ case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: if (!UseAESIntrinsics) return NULL; // these two require the predicated logic - is_predicted = true; + predicates = 1; + break; + + case vmIntrinsics::_sha_implCompress: + if (!UseSHA1Intrinsics) return NULL; + break; + + case vmIntrinsics::_sha2_implCompress: + if (!UseSHA256Intrinsics) return NULL; + break; + + case vmIntrinsics::_sha5_implCompress: + if (!UseSHA512Intrinsics) return NULL; + break; + + case vmIntrinsics::_digestBase_implCompressMB: + if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return NULL; + predicates = 3; break; case vmIntrinsics::_updateCRC32: @@ -582,7 +610,7 @@ if (!InlineUnsafeOps) return NULL; } - return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id); + return new LibraryIntrinsic(m, is_virtual, predicates, does_virtual_dispatch, (vmIntrinsics::ID) id); } //----------------------register_library_intrinsics----------------------- @@ -591,7 +619,7 @@ // Nothing to do here. } -JVMState* LibraryIntrinsic::generate(JVMState* jvms, Parse* parent_parser) { +JVMState* LibraryIntrinsic::generate(JVMState* jvms) { LibraryCallKit kit(jvms, this); Compile* C = kit.C; int nodes = C->unique(); @@ -606,7 +634,7 @@ const int bci = kit.bci(); // Try to inline the intrinsic. - if (kit.try_to_inline()) { + if (kit.try_to_inline(_last_predicate)) { if (C->print_intrinsics() || C->print_inlining()) { C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); } @@ -641,12 +669,13 @@ return NULL; } -Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) { +Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) { LibraryCallKit kit(jvms, this); Compile* C = kit.C; int nodes = C->unique(); + _last_predicate = predicate; #ifndef PRODUCT - assert(is_predicted(), "sanity"); + assert(is_predicated() && predicate < predicates_count(), "sanity"); if ((C->print_intrinsics() || C->print_inlining()) && Verbose) { char buf[1000]; const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); @@ -656,10 +685,10 @@ ciMethod* callee = kit.callee(); const int bci = kit.bci(); - Node* slow_ctl = kit.try_to_predicate(); + Node* slow_ctl = kit.try_to_predicate(predicate); if (!kit.failing()) { if (C->print_intrinsics() || C->print_inlining()) { - C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); + C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual, predicate)" : "(intrinsic, predicate)"); } C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); if (C->log()) { @@ -688,7 +717,7 @@ return NULL; } -bool LibraryCallKit::try_to_inline() { +bool LibraryCallKit::try_to_inline(int predicate) { // Handle symbolic names for otherwise undistinguished boolean switches: const bool is_store = true; const bool is_native_ptr = true; @@ -882,6 +911,14 @@ case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: return inline_cipherBlockChaining_AESCrypt(intrinsic_id()); + case vmIntrinsics::_sha_implCompress: + case vmIntrinsics::_sha2_implCompress: + case vmIntrinsics::_sha5_implCompress: + return inline_sha_implCompress(intrinsic_id()); + + case vmIntrinsics::_digestBase_implCompressMB: + return inline_digestBase_implCompressMB(predicate); + case vmIntrinsics::_encodeISOArray: return inline_encodeISOArray(); @@ -905,7 +942,7 @@ } } -Node* LibraryCallKit::try_to_predicate() { +Node* LibraryCallKit::try_to_predicate(int predicate) { if (!jvms()->has_method()) { // Root JVMState has a null method. assert(map()->memory()->Opcode() == Op_Parm, ""); @@ -919,6 +956,8 @@ return inline_cipherBlockChaining_AESCrypt_predicate(false); case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: return inline_cipherBlockChaining_AESCrypt_predicate(true); + case vmIntrinsics::_digestBase_implCompressMB: + return inline_digestBase_implCompressMB_predicate(predicate); default: // If you get here, it may be that someone has added a new intrinsic @@ -969,7 +1008,7 @@ IfNode* iff = create_and_map_if(control(), test, true_prob, COUNT_UNKNOWN); - Node* if_slow = _gvn.transform(new (C) IfTrueNode(iff)); + Node* if_slow = _gvn.transform(new IfTrueNode(iff)); if (if_slow == top()) { // The slow branch is never taken. No need to build this guard. return NULL; @@ -978,7 +1017,7 @@ if (region != NULL) region->add_req(if_slow); - Node* if_fast = _gvn.transform(new (C) IfFalseNode(iff)); + Node* if_fast = _gvn.transform(new IfFalseNode(iff)); set_control(if_fast); return if_slow; @@ -997,12 +1036,12 @@ return NULL; // already stopped if (_gvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint] return NULL; // index is already adequately typed - Node* cmp_lt = _gvn.transform(new (C) CmpINode(index, intcon(0))); - Node* bol_lt = _gvn.transform(new (C) BoolNode(cmp_lt, BoolTest::lt)); + Node* cmp_lt = _gvn.transform(new CmpINode(index, intcon(0))); + Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt)); Node* is_neg = generate_guard(bol_lt, region, PROB_MIN); if (is_neg != NULL && pos_index != NULL) { // Emulate effect of Parse::adjust_map_after_if. - Node* ccast = new (C) CastIINode(index, TypeInt::POS); + Node* ccast = new CastIINode(index, TypeInt::POS); ccast->set_req(0, control()); (*pos_index) = _gvn.transform(ccast); } @@ -1015,13 +1054,13 @@ return NULL; // already stopped if (_gvn.type(index)->higher_equal(TypeInt::POS1)) // [1,maxint] return NULL; // index is already adequately typed - Node* cmp_le = _gvn.transform(new (C) CmpINode(index, intcon(0))); + Node* cmp_le = _gvn.transform(new CmpINode(index, intcon(0))); BoolTest::mask le_or_eq = (never_negative ? BoolTest::eq : BoolTest::le); - Node* bol_le = _gvn.transform(new (C) BoolNode(cmp_le, le_or_eq)); + Node* bol_le = _gvn.transform(new BoolNode(cmp_le, le_or_eq)); Node* is_notp = generate_guard(bol_le, NULL, PROB_MIN); if (is_notp != NULL && pos_index != NULL) { // Emulate effect of Parse::adjust_map_after_if. - Node* ccast = new (C) CastIINode(index, TypeInt::POS1); + Node* ccast = new CastIINode(index, TypeInt::POS1); ccast->set_req(0, control()); (*pos_index) = _gvn.transform(ccast); } @@ -1053,9 +1092,9 @@ return NULL; // common case of whole-array copy Node* last = subseq_length; if (!zero_offset) // last += offset - last = _gvn.transform(new (C) AddINode(last, offset)); - Node* cmp_lt = _gvn.transform(new (C) CmpUNode(array_length, last)); - Node* bol_lt = _gvn.transform(new (C) BoolNode(cmp_lt, BoolTest::lt)); + last = _gvn.transform(new AddINode(last, offset)); + Node* cmp_lt = _gvn.transform(new CmpUNode(array_length, last)); + Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt)); Node* is_over = generate_guard(bol_lt, region, PROB_MIN); return is_over; } @@ -1065,7 +1104,7 @@ Node* LibraryCallKit::generate_current_thread(Node* &tls_output) { ciKlass* thread_klass = env()->Thread_klass(); const Type* thread_type = TypeOopPtr::make_from_klass(thread_klass)->cast_to_ptr_type(TypePtr::NotNull); - Node* thread = _gvn.transform(new (C) ThreadLocalNode()); + Node* thread = _gvn.transform(new ThreadLocalNode()); Node* p = basic_plus_adr(top()/*!oop*/, thread, in_bytes(JavaThread::threadObj_offset())); Node* threadObj = make_load(NULL, p, thread_type, T_OBJECT, MemNode::unordered); tls_output = thread; @@ -1100,18 +1139,18 @@ // Get length of string 2 str2_len = load_String_length(no_ctrl, str2); - result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), - str1_start, str1_len, str2_start, str2_len); + result = new StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), + str1_start, str1_len, str2_start, str2_len); break; case Op_StrComp: // Get length of string 2 str2_len = load_String_length(no_ctrl, str2); - result = new (C) StrCompNode(control(), memory(TypeAryPtr::CHARS), - str1_start, str1_len, str2_start, str2_len); + result = new StrCompNode(control(), memory(TypeAryPtr::CHARS), + str1_start, str1_len, str2_start, str2_len); break; case Op_StrEquals: - result = new (C) StrEqualsNode(control(), memory(TypeAryPtr::CHARS), + result = new StrEqualsNode(control(), memory(TypeAryPtr::CHARS), str1_start, str2_start, str1_len); break; default: @@ -1133,16 +1172,16 @@ Node* result = NULL; switch (opcode) { case Op_StrIndexOf: - result = new (C) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), - str1_start, cnt1, str2_start, cnt2); + result = new StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), + str1_start, cnt1, str2_start, cnt2); break; case Op_StrComp: - result = new (C) StrCompNode(control(), memory(TypeAryPtr::CHARS), - str1_start, cnt1, str2_start, cnt2); + result = new StrCompNode(control(), memory(TypeAryPtr::CHARS), + str1_start, cnt1, str2_start, cnt2); break; case Op_StrEquals: - result = new (C) StrEqualsNode(control(), memory(TypeAryPtr::CHARS), - str1_start, str2_start, cnt1); + result = new StrEqualsNode(control(), memory(TypeAryPtr::CHARS), + str1_start, str2_start, cnt1); break; default: ShouldNotReachHere(); @@ -1178,12 +1217,12 @@ } // paths (plus control) merge - RegionNode* region = new (C) RegionNode(5); - Node* phi = new (C) PhiNode(region, TypeInt::BOOL); + RegionNode* region = new RegionNode(5); + Node* phi = new PhiNode(region, TypeInt::BOOL); // does source == target string? - Node* cmp = _gvn.transform(new (C) CmpPNode(receiver, argument)); - Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::eq)); + Node* cmp = _gvn.transform(new CmpPNode(receiver, argument)); + Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq)); Node* if_eq = generate_slow_guard(bol, NULL); if (if_eq != NULL) { @@ -1197,8 +1236,8 @@ if (!stopped()) { Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass))); - Node* cmp = _gvn.transform(new (C) CmpINode(inst, intcon(1))); - Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne)); + Node* cmp = _gvn.transform(new CmpINode(inst, intcon(1))); + Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne)); Node* inst_false = generate_guard(bol, NULL, PROB_MIN); //instanceOf == true, fallthrough @@ -1213,7 +1252,7 @@ const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); // Properly cast the argument to String - argument = _gvn.transform(new (C) CheckCastPPNode(control(), argument, string_type)); + argument = _gvn.transform(new CheckCastPPNode(control(), argument, string_type)); // This path is taken only when argument's type is String:NotNull. argument = cast_not_null(argument, false); @@ -1236,8 +1275,8 @@ Node* argument_cnt = load_String_length(no_ctrl, argument); // Check for receiver count != argument count - Node* cmp = _gvn.transform(new(C) CmpINode(receiver_cnt, argument_cnt)); - Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::ne)); + Node* cmp = _gvn.transform(new CmpINode(receiver_cnt, argument_cnt)); + Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne)); Node* if_ne = generate_slow_guard(bol, NULL); if (if_ne != NULL) { phi->init_req(4, intcon(0)); @@ -1265,7 +1304,7 @@ bool LibraryCallKit::inline_array_equals() { Node* arg1 = argument(0); Node* arg2 = argument(1); - set_result(_gvn.transform(new (C) AryEqNode(control(), memory(TypeAryPtr::CHARS), arg1, arg2))); + set_result(_gvn.transform(new AryEqNode(control(), memory(TypeAryPtr::CHARS), arg1, arg2))); return true; } @@ -1434,8 +1473,8 @@ const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(str_klass); // Make the merge point - RegionNode* result_rgn = new (C) RegionNode(4); - Node* result_phi = new (C) PhiNode(result_rgn, TypeInt::INT); + RegionNode* result_rgn = new RegionNode(4); + Node* result_phi = new PhiNode(result_rgn, TypeInt::INT); Node* no_ctrl = NULL; // Get start addr of source string @@ -1455,8 +1494,8 @@ Node* substr_cnt = load_String_length(no_ctrl, arg); // Check for substr count > string count - Node* cmp = _gvn.transform(new(C) CmpINode(substr_cnt, source_cnt)); - Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::gt)); + Node* cmp = _gvn.transform(new CmpINode(substr_cnt, source_cnt)); + Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::gt)); Node* if_gt = generate_slow_guard(bol, NULL); if (if_gt != NULL) { result_phi->init_req(2, intcon(-1)); @@ -1465,8 +1504,8 @@ if (!stopped()) { // Check for substr count == 0 - cmp = _gvn.transform(new(C) CmpINode(substr_cnt, intcon(0))); - bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::eq)); + cmp = _gvn.transform(new CmpINode(substr_cnt, intcon(0))); + bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq)); Node* if_zero = generate_slow_guard(bol, NULL); if (if_zero != NULL) { result_phi->init_req(3, intcon(0)); @@ -1558,7 +1597,7 @@ // Round a double node if necessary. Node* LibraryCallKit::round_double_node(Node* n) { if (Matcher::strict_fp_requires_explicit_rounding && UseSSE <= 1) - n = _gvn.transform(new (C) RoundDoubleNode(0, n)); + n = _gvn.transform(new RoundDoubleNode(0, n)); return n; } @@ -1571,10 +1610,10 @@ Node* arg = round_double_node(argument(0)); Node* n; switch (id) { - case vmIntrinsics::_dabs: n = new (C) AbsDNode( arg); break; - case vmIntrinsics::_dsqrt: n = new (C) SqrtDNode(C, control(), arg); break; - case vmIntrinsics::_dlog: n = new (C) LogDNode(C, control(), arg); break; - case vmIntrinsics::_dlog10: n = new (C) Log10DNode(C, control(), arg); break; + case vmIntrinsics::_dabs: n = new AbsDNode( arg); break; + case vmIntrinsics::_dsqrt: n = new SqrtDNode(C, control(), arg); break; + case vmIntrinsics::_dlog: n = new LogDNode(C, control(), arg); break; + case vmIntrinsics::_dlog10: n = new Log10DNode(C, control(), arg); break; default: fatal_unexpected_iid(id); break; } set_result(_gvn.transform(n)); @@ -1589,9 +1628,9 @@ Node* n = NULL; switch (id) { - case vmIntrinsics::_dsin: n = new (C) SinDNode(C, control(), arg); break; - case vmIntrinsics::_dcos: n = new (C) CosDNode(C, control(), arg); break; - case vmIntrinsics::_dtan: n = new (C) TanDNode(C, control(), arg); break; + case vmIntrinsics::_dsin: n = new SinDNode(C, control(), arg); break; + case vmIntrinsics::_dcos: n = new CosDNode(C, control(), arg); break; + case vmIntrinsics::_dtan: n = new TanDNode(C, control(), arg); break; default: fatal_unexpected_iid(id); break; } n = _gvn.transform(n); @@ -1632,17 +1671,17 @@ // probably do the math inside the SIN encoding. // Make the merge point - RegionNode* r = new (C) RegionNode(3); - Node* phi = new (C) PhiNode(r, Type::DOUBLE); + RegionNode* r = new RegionNode(3); + Node* phi = new PhiNode(r, Type::DOUBLE); // Flatten arg so we need only 1 test - Node *abs = _gvn.transform(new (C) AbsDNode(arg)); + Node *abs = _gvn.transform(new AbsDNode(arg)); // Node for PI/4 constant Node *pi4 = makecon(TypeD::make(pi_4)); // Check PI/4 : abs(arg) - Node *cmp = _gvn.transform(new (C) CmpDNode(pi4,abs)); + Node *cmp = _gvn.transform(new CmpDNode(pi4,abs)); // Check: If PI/4 < abs(arg) then go slow - Node *bol = _gvn.transform(new (C) BoolNode( cmp, BoolTest::lt )); + Node *bol = _gvn.transform(new BoolNode( cmp, BoolTest::lt )); // Branch either way IfNode *iff = create_and_xform_if(control(),bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); set_control(opt_iff(r,iff)); @@ -1670,7 +1709,7 @@ break; } assert(control()->in(0) == call, ""); - Node* slow_result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); + Node* slow_result = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); r->init_req(1, control()); phi->init_req(1, slow_result); @@ -1690,9 +1729,9 @@ //result=(result.isNaN())? funcAddr():result; // Check: If isNaN() by checking result!=result? then either trap // or go to runtime - Node* cmpisnan = _gvn.transform(new (C) CmpDNode(result, result)); + Node* cmpisnan = _gvn.transform(new CmpDNode(result, result)); // Build the boolean node - Node* bolisnum = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::eq)); + Node* bolisnum = _gvn.transform(new BoolNode(cmpisnan, BoolTest::eq)); if (!too_many_traps(Deoptimization::Reason_intrinsic)) { { BuildCutout unless(this, bolisnum, PROB_STATIC_FREQUENT); @@ -1707,12 +1746,12 @@ // to the runtime to properly handle corner cases IfNode* iff = create_and_xform_if(control(), bolisnum, PROB_STATIC_FREQUENT, COUNT_UNKNOWN); - Node* if_slow = _gvn.transform(new (C) IfFalseNode(iff)); - Node* if_fast = _gvn.transform(new (C) IfTrueNode(iff)); + Node* if_slow = _gvn.transform(new IfFalseNode(iff)); + Node* if_fast = _gvn.transform(new IfTrueNode(iff)); if (!if_slow->is_top()) { - RegionNode* result_region = new (C) RegionNode(3); - PhiNode* result_val = new (C) PhiNode(result_region, Type::DOUBLE); + RegionNode* result_region = new RegionNode(3); + PhiNode* result_val = new PhiNode(result_region, Type::DOUBLE); result_region->init_req(1, if_fast); result_val->init_req(1, result); @@ -1723,9 +1762,9 @@ Node* rt = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName, no_memory_effects, x, top(), y, y ? top() : NULL); - Node* value = _gvn.transform(new (C) ProjNode(rt, TypeFunc::Parms+0)); + Node* value = _gvn.transform(new ProjNode(rt, TypeFunc::Parms+0)); #ifdef ASSERT - Node* value_top = _gvn.transform(new (C) ProjNode(rt, TypeFunc::Parms+1)); + Node* value_top = _gvn.transform(new ProjNode(rt, TypeFunc::Parms+1)); assert(value_top == top(), "second value must be top"); #endif @@ -1744,7 +1783,7 @@ // really odd corner cases (+/- Infinity). Just uncommon-trap them. bool LibraryCallKit::inline_exp() { Node* arg = round_double_node(argument(0)); - Node* n = _gvn.transform(new (C) ExpDNode(C, control(), arg)); + Node* n = _gvn.transform(new ExpDNode(C, control(), arg)); n = finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); set_result(n); @@ -1783,76 +1822,76 @@ Node* result = NULL; Node* const_two_node = makecon(TypeD::make(2.0)); - Node* cmp_node = _gvn.transform(new (C) CmpDNode(y, const_two_node)); - Node* bool_node = _gvn.transform(new (C) BoolNode(cmp_node, BoolTest::eq)); + Node* cmp_node = _gvn.transform(new CmpDNode(y, const_two_node)); + Node* bool_node = _gvn.transform(new BoolNode(cmp_node, BoolTest::eq)); IfNode* if_node = create_and_xform_if(control(), bool_node, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN); - Node* if_true = _gvn.transform(new (C) IfTrueNode(if_node)); - Node* if_false = _gvn.transform(new (C) IfFalseNode(if_node)); - - RegionNode* region_node = new (C) RegionNode(3); + Node* if_true = _gvn.transform(new IfTrueNode(if_node)); + Node* if_false = _gvn.transform(new IfFalseNode(if_node)); + + RegionNode* region_node = new RegionNode(3); region_node->init_req(1, if_true); - Node* phi_node = new (C) PhiNode(region_node, Type::DOUBLE); + Node* phi_node = new PhiNode(region_node, Type::DOUBLE); // special case for x^y where y == 2, we can convert it to x * x - phi_node->init_req(1, _gvn.transform(new (C) MulDNode(x, x))); + phi_node->init_req(1, _gvn.transform(new MulDNode(x, x))); // set control to if_false since we will now process the false branch set_control(if_false); if (!too_many_traps(Deoptimization::Reason_intrinsic)) { // Short form: skip the fancy tests and just check for NaN result. - result = _gvn.transform(new (C) PowDNode(C, control(), x, y)); + result = _gvn.transform(new PowDNode(C, control(), x, y)); } else { // If this inlining ever returned NaN in the past, include all // checks + call to the runtime. // Set the merge point for If node with condition of (x <= 0.0) // There are four possible paths to region node and phi node - RegionNode *r = new (C) RegionNode(4); - Node *phi = new (C) PhiNode(r, Type::DOUBLE); + RegionNode *r = new RegionNode(4); + Node *phi = new PhiNode(r, Type::DOUBLE); // Build the first if node: if (x <= 0.0) // Node for 0 constant Node *zeronode = makecon(TypeD::ZERO); // Check x:0 - Node *cmp = _gvn.transform(new (C) CmpDNode(x, zeronode)); + Node *cmp = _gvn.transform(new CmpDNode(x, zeronode)); // Check: If (x<=0) then go complex path - Node *bol1 = _gvn.transform(new (C) BoolNode( cmp, BoolTest::le )); + Node *bol1 = _gvn.transform(new BoolNode( cmp, BoolTest::le )); // Branch either way IfNode *if1 = create_and_xform_if(control(),bol1, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN); // Fast path taken; set region slot 3 - Node *fast_taken = _gvn.transform(new (C) IfFalseNode(if1)); + Node *fast_taken = _gvn.transform(new IfFalseNode(if1)); r->init_req(3,fast_taken); // Capture fast-control // Fast path not-taken, i.e. slow path - Node *complex_path = _gvn.transform(new (C) IfTrueNode(if1)); + Node *complex_path = _gvn.transform(new IfTrueNode(if1)); // Set fast path result - Node *fast_result = _gvn.transform(new (C) PowDNode(C, control(), x, y)); + Node *fast_result = _gvn.transform(new PowDNode(C, control(), x, y)); phi->init_req(3, fast_result); // Complex path // Build the second if node (if y is long) // Node for (long)y - Node *longy = _gvn.transform(new (C) ConvD2LNode(y)); + Node *longy = _gvn.transform(new ConvD2LNode(y)); // Node for (double)((long) y) - Node *doublelongy= _gvn.transform(new (C) ConvL2DNode(longy)); + Node *doublelongy= _gvn.transform(new ConvL2DNode(longy)); // Check (double)((long) y) : y - Node *cmplongy= _gvn.transform(new (C) CmpDNode(doublelongy, y)); + Node *cmplongy= _gvn.transform(new CmpDNode(doublelongy, y)); // Check if (y isn't long) then go to slow path - Node *bol2 = _gvn.transform(new (C) BoolNode( cmplongy, BoolTest::ne )); + Node *bol2 = _gvn.transform(new BoolNode( cmplongy, BoolTest::ne )); // Branch either way IfNode *if2 = create_and_xform_if(complex_path,bol2, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN); - Node* ylong_path = _gvn.transform(new (C) IfFalseNode(if2)); - - Node *slow_path = _gvn.transform(new (C) IfTrueNode(if2)); + Node* ylong_path = _gvn.transform(new IfFalseNode(if2)); + + Node *slow_path = _gvn.transform(new IfTrueNode(if2)); // Calculate DPow(abs(x), y)*(1 & (long)y) // Node for constant 1 Node *conone = longcon(1); // 1& (long)y - Node *signnode= _gvn.transform(new (C) AndLNode(conone, longy)); + Node *signnode= _gvn.transform(new AndLNode(conone, longy)); // A huge number is always even. Detect a huge number by checking // if y + 1 == y and set integer to be tested for parity to 0. @@ -1860,18 +1899,18 @@ // (long)9.223372036854776E18 = max_jlong // (double)(long)9.223372036854776E18 = 9.223372036854776E18 // max_jlong is odd but 9.223372036854776E18 is even - Node* yplus1 = _gvn.transform(new (C) AddDNode(y, makecon(TypeD::make(1)))); - Node *cmpyplus1= _gvn.transform(new (C) CmpDNode(yplus1, y)); - Node *bolyplus1 = _gvn.transform(new (C) BoolNode( cmpyplus1, BoolTest::eq )); + Node* yplus1 = _gvn.transform(new AddDNode(y, makecon(TypeD::make(1)))); + Node *cmpyplus1= _gvn.transform(new CmpDNode(yplus1, y)); + Node *bolyplus1 = _gvn.transform(new BoolNode( cmpyplus1, BoolTest::eq )); Node* correctedsign = NULL; if (ConditionalMoveLimit != 0) { correctedsign = _gvn.transform( CMoveNode::make(C, NULL, bolyplus1, signnode, longcon(0), TypeLong::LONG)); } else { IfNode *ifyplus1 = create_and_xform_if(ylong_path,bolyplus1, PROB_FAIR, COUNT_UNKNOWN); - RegionNode *r = new (C) RegionNode(3); - Node *phi = new (C) PhiNode(r, TypeLong::LONG); - r->init_req(1, _gvn.transform(new (C) IfFalseNode(ifyplus1))); - r->init_req(2, _gvn.transform(new (C) IfTrueNode(ifyplus1))); + RegionNode *r = new RegionNode(3); + Node *phi = new PhiNode(r, TypeLong::LONG); + r->init_req(1, _gvn.transform(new IfFalseNode(ifyplus1))); + r->init_req(2, _gvn.transform(new IfTrueNode(ifyplus1))); phi->init_req(1, signnode); phi->init_req(2, longcon(0)); correctedsign = _gvn.transform(phi); @@ -1882,25 +1921,25 @@ // zero node Node *conzero = longcon(0); // Check (1&(long)y)==0? - Node *cmpeq1 = _gvn.transform(new (C) CmpLNode(correctedsign, conzero)); + Node *cmpeq1 = _gvn.transform(new CmpLNode(correctedsign, conzero)); // Check if (1&(long)y)!=0?, if so the result is negative - Node *bol3 = _gvn.transform(new (C) BoolNode( cmpeq1, BoolTest::ne )); + Node *bol3 = _gvn.transform(new BoolNode( cmpeq1, BoolTest::ne )); // abs(x) - Node *absx=_gvn.transform(new (C) AbsDNode(x)); + Node *absx=_gvn.transform(new AbsDNode(x)); // abs(x)^y - Node *absxpowy = _gvn.transform(new (C) PowDNode(C, control(), absx, y)); + Node *absxpowy = _gvn.transform(new PowDNode(C, control(), absx, y)); // -abs(x)^y - Node *negabsxpowy = _gvn.transform(new (C) NegDNode (absxpowy)); + Node *negabsxpowy = _gvn.transform(new NegDNode (absxpowy)); // (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y) Node *signresult = NULL; if (ConditionalMoveLimit != 0) { signresult = _gvn.transform( CMoveNode::make(C, NULL, bol3, absxpowy, negabsxpowy, Type::DOUBLE)); } else { IfNode *ifyeven = create_and_xform_if(ylong_path,bol3, PROB_FAIR, COUNT_UNKNOWN); - RegionNode *r = new (C) RegionNode(3); - Node *phi = new (C) PhiNode(r, Type::DOUBLE); - r->init_req(1, _gvn.transform(new (C) IfFalseNode(ifyeven))); - r->init_req(2, _gvn.transform(new (C) IfTrueNode(ifyeven))); + RegionNode *r = new RegionNode(3); + Node *phi = new PhiNode(r, Type::DOUBLE); + r->init_req(1, _gvn.transform(new IfFalseNode(ifyeven))); + r->init_req(2, _gvn.transform(new IfTrueNode(ifyeven))); phi->init_req(1, absxpowy); phi->init_req(2, negabsxpowy); signresult = _gvn.transform(phi); @@ -1949,9 +1988,9 @@ Node* trig = make_runtime_call(RC_LEAF, call_type, funcAddr, funcName, no_memory_effects, a, top(), b, b ? top() : NULL); - Node* value = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+0)); + Node* value = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+0)); #ifdef ASSERT - Node* value_top = _gvn.transform(new (C) ProjNode(trig, TypeFunc::Parms+1)); + Node* value_top = _gvn.transform(new ProjNode(trig, TypeFunc::Parms+1)); assert(value_top == top(), "second value must be top"); #endif @@ -2011,10 +2050,10 @@ } void LibraryCallKit::inline_math_mathExact(Node* math, Node *test) { - Node* bol = _gvn.transform( new (C) BoolNode(test, BoolTest::overflow) ); + Node* bol = _gvn.transform( new BoolNode(test, BoolTest::overflow) ); IfNode* check = create_and_map_if(control(), bol, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN); - Node* fast_path = _gvn.transform( new (C) IfFalseNode(check)); - Node* slow_path = _gvn.transform( new (C) IfTrueNode(check) ); + Node* fast_path = _gvn.transform( new IfFalseNode(check)); + Node* slow_path = _gvn.transform( new IfTrueNode(check) ); { PreserveJVMState pjvms(this); @@ -2036,9 +2075,9 @@ bool LibraryCallKit::inline_math_overflow(Node* arg1, Node* arg2) { typedef typename OverflowOp::MathOp MathOp; - MathOp* mathOp = new(C) MathOp(arg1, arg2); + MathOp* mathOp = new MathOp(arg1, arg2); Node* operation = _gvn.transform( mathOp ); - Node* ofcheck = _gvn.transform( new(C) OverflowOp(arg1, arg2) ); + Node* ofcheck = _gvn.transform( new OverflowOp(arg1, arg2) ); inline_math_mathExact(operation, ofcheck); return true; } @@ -2106,7 +2145,7 @@ int cmp_op = Op_CmpI; Node* xkey = xvalue; Node* ykey = yvalue; - Node* ideal_cmpxy = _gvn.transform(new(C) CmpINode(xkey, ykey)); + Node* ideal_cmpxy = _gvn.transform(new CmpINode(xkey, ykey)); if (ideal_cmpxy->is_Cmp()) { // E.g., if we have CmpI(length - offset, count), // it might idealize to CmpI(length, count + offset) @@ -2199,7 +2238,7 @@ default: if (cmpxy == NULL) cmpxy = ideal_cmpxy; - best_bol = _gvn.transform(new(C) BoolNode(cmpxy, BoolTest::lt)); + best_bol = _gvn.transform(new BoolNode(cmpxy, BoolTest::lt)); // and fall through: case BoolTest::lt: // x < y case BoolTest::le: // x <= y @@ -2259,7 +2298,7 @@ return Type::AnyPtr; } else if (base_type == TypePtr::NULL_PTR) { // Since this is a NULL+long form, we have to switch to a rawptr. - base = _gvn.transform(new (C) CastX2PNode(offset)); + base = _gvn.transform(new CastX2PNode(offset)); offset = MakeConX(0); return Type::RawPtr; } else if (base_type->base() == Type::RawPtr) { @@ -2312,16 +2351,16 @@ Node* arg = argument(0); Node* n; switch (id) { - case vmIntrinsics::_numberOfLeadingZeros_i: n = new (C) CountLeadingZerosINode( arg); break; - case vmIntrinsics::_numberOfLeadingZeros_l: n = new (C) CountLeadingZerosLNode( arg); break; - case vmIntrinsics::_numberOfTrailingZeros_i: n = new (C) CountTrailingZerosINode(arg); break; - case vmIntrinsics::_numberOfTrailingZeros_l: n = new (C) CountTrailingZerosLNode(arg); break; - case vmIntrinsics::_bitCount_i: n = new (C) PopCountINode( arg); break; - case vmIntrinsics::_bitCount_l: n = new (C) PopCountLNode( arg); break; - case vmIntrinsics::_reverseBytes_c: n = new (C) ReverseBytesUSNode(0, arg); break; - case vmIntrinsics::_reverseBytes_s: n = new (C) ReverseBytesSNode( 0, arg); break; - case vmIntrinsics::_reverseBytes_i: n = new (C) ReverseBytesINode( 0, arg); break; - case vmIntrinsics::_reverseBytes_l: n = new (C) ReverseBytesLNode( 0, arg); break; + case vmIntrinsics::_numberOfLeadingZeros_i: n = new CountLeadingZerosINode( arg); break; + case vmIntrinsics::_numberOfLeadingZeros_l: n = new CountLeadingZerosLNode( arg); break; + case vmIntrinsics::_numberOfTrailingZeros_i: n = new CountTrailingZerosINode(arg); break; + case vmIntrinsics::_numberOfTrailingZeros_l: n = new CountTrailingZerosLNode(arg); break; + case vmIntrinsics::_bitCount_i: n = new PopCountINode( arg); break; + case vmIntrinsics::_bitCount_l: n = new PopCountLNode( arg); break; + case vmIntrinsics::_reverseBytes_c: n = new ReverseBytesUSNode(0, arg); break; + case vmIntrinsics::_reverseBytes_s: n = new ReverseBytesSNode( 0, arg); break; + case vmIntrinsics::_reverseBytes_i: n = new ReverseBytesINode( 0, arg); break; + case vmIntrinsics::_reverseBytes_l: n = new ReverseBytesLNode( 0, arg); break; default: fatal_unexpected_iid(id); break; } set_result(_gvn.transform(n)); @@ -2637,7 +2676,7 @@ break; case T_ADDRESS: // Cast to an int type. - p = _gvn.transform(new (C) CastP2XNode(NULL, p)); + p = _gvn.transform(new CastP2XNode(NULL, p)); p = ConvX2UL(p); break; default: @@ -2658,7 +2697,7 @@ case T_ADDRESS: // Repackage the long as a pointer. val = ConvL2X(val); - val = _gvn.transform(new (C) CastX2PNode(val)); + val = _gvn.transform(new CastX2PNode(val)); break; } @@ -2766,9 +2805,9 @@ // Generate the read or write prefetch Node *prefetch; if (is_store) { - prefetch = new (C) PrefetchWriteNode(i_o(), adr); + prefetch = new PrefetchWriteNode(i_o(), adr); } else { - prefetch = new (C) PrefetchReadNode(i_o(), adr); + prefetch = new PrefetchReadNode(i_o(), adr); } prefetch->init_req(0, control()); set_i_o(_gvn.transform(prefetch)); @@ -2906,22 +2945,22 @@ switch(type) { case T_INT: if (kind == LS_xadd) { - load_store = _gvn.transform(new (C) GetAndAddINode(control(), mem, adr, newval, adr_type)); + load_store = _gvn.transform(new GetAndAddINode(control(), mem, adr, newval, adr_type)); } else if (kind == LS_xchg) { - load_store = _gvn.transform(new (C) GetAndSetINode(control(), mem, adr, newval, adr_type)); + load_store = _gvn.transform(new GetAndSetINode(control(), mem, adr, newval, adr_type)); } else if (kind == LS_cmpxchg) { - load_store = _gvn.transform(new (C) CompareAndSwapINode(control(), mem, adr, newval, oldval)); + load_store = _gvn.transform(new CompareAndSwapINode(control(), mem, adr, newval, oldval)); } else { ShouldNotReachHere(); } break; case T_LONG: if (kind == LS_xadd) { - load_store = _gvn.transform(new (C) GetAndAddLNode(control(), mem, adr, newval, adr_type)); + load_store = _gvn.transform(new GetAndAddLNode(control(), mem, adr, newval, adr_type)); } else if (kind == LS_xchg) { - load_store = _gvn.transform(new (C) GetAndSetLNode(control(), mem, adr, newval, adr_type)); + load_store = _gvn.transform(new GetAndSetLNode(control(), mem, adr, newval, adr_type)); } else if (kind == LS_cmpxchg) { - load_store = _gvn.transform(new (C) CompareAndSwapLNode(control(), mem, adr, newval, oldval)); + load_store = _gvn.transform(new CompareAndSwapLNode(control(), mem, adr, newval, oldval)); } else { ShouldNotReachHere(); } @@ -2958,24 +2997,24 @@ #ifdef _LP64 if (adr->bottom_type()->is_ptr_to_narrowoop()) { - Node *newval_enc = _gvn.transform(new (C) EncodePNode(newval, newval->bottom_type()->make_narrowoop())); + Node *newval_enc = _gvn.transform(new EncodePNode(newval, newval->bottom_type()->make_narrowoop())); if (kind == LS_xchg) { - load_store = _gvn.transform(new (C) GetAndSetNNode(control(), mem, adr, - newval_enc, adr_type, value_type->make_narrowoop())); + load_store = _gvn.transform(new GetAndSetNNode(control(), mem, adr, + newval_enc, adr_type, value_type->make_narrowoop())); } else { assert(kind == LS_cmpxchg, "wrong LoadStore operation"); - Node *oldval_enc = _gvn.transform(new (C) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop())); - load_store = _gvn.transform(new (C) CompareAndSwapNNode(control(), mem, adr, + Node *oldval_enc = _gvn.transform(new EncodePNode(oldval, oldval->bottom_type()->make_narrowoop())); + load_store = _gvn.transform(new CompareAndSwapNNode(control(), mem, adr, newval_enc, oldval_enc)); } } else #endif { if (kind == LS_xchg) { - load_store = _gvn.transform(new (C) GetAndSetPNode(control(), mem, adr, newval, adr_type, value_type->is_oopptr())); + load_store = _gvn.transform(new GetAndSetPNode(control(), mem, adr, newval, adr_type, value_type->is_oopptr())); } else { assert(kind == LS_cmpxchg, "wrong LoadStore operation"); - load_store = _gvn.transform(new (C) CompareAndSwapPNode(control(), mem, adr, newval, oldval)); + load_store = _gvn.transform(new CompareAndSwapPNode(control(), mem, adr, newval, oldval)); } } post_barrier(control(), load_store, base, adr, alias_idx, newval, T_OBJECT, true); @@ -2988,13 +3027,13 @@ // SCMemProjNodes represent the memory state of a LoadStore. Their // main role is to prevent LoadStore nodes from being optimized away // when their results aren't used. - Node* proj = _gvn.transform(new (C) SCMemProjNode(load_store)); + Node* proj = _gvn.transform(new SCMemProjNode(load_store)); set_memory(proj, alias_idx); if (type == T_OBJECT && kind == LS_xchg) { #ifdef _LP64 if (adr->bottom_type()->is_ptr_to_narrowoop()) { - load_store = _gvn.transform(new (C) DecodeNNode(load_store, load_store->get_ptr_type())); + load_store = _gvn.transform(new DecodeNNode(load_store, load_store->get_ptr_type())); } #endif if (can_move_pre_barrier()) { @@ -3136,7 +3175,7 @@ // can generate code to load it as unsigned byte. Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered); Node* bits = intcon(InstanceKlass::fully_initialized); - test = _gvn.transform(new (C) SubINode(inst, bits)); + test = _gvn.transform(new SubINode(inst, bits)); // The 'test' is non-zero if we need to take a slow path. } @@ -3160,9 +3199,9 @@ Node* insp = basic_plus_adr(kls, in_bytes(offset)); Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered); Node* bits = longcon(~0x03l); // ignore bit 0 & 1 - Node* andl = _gvn.transform(new (C) AndLNode(tvalue, bits)); + Node* andl = _gvn.transform(new AndLNode(tvalue, bits)); Node* clsused = longcon(0x01l); // set the class bit - Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused)); + Node* orl = _gvn.transform(new OrLNode(tvalue, clsused)); const TypePtr *adr_type = _gvn.type(insp)->isa_ptr(); store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered); @@ -3198,9 +3237,9 @@ const TypeFunc* tf = OptoRuntime::void_long_Type(); const TypePtr* no_memory_effects = NULL; Node* time = make_runtime_call(RC_LEAF, tf, funcAddr, funcName, no_memory_effects); - Node* value = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+0)); + Node* value = _gvn.transform(new ProjNode(time, TypeFunc::Parms+0)); #ifdef ASSERT - Node* value_top = _gvn.transform(new (C) ProjNode(time, TypeFunc::Parms+1)); + Node* value_top = _gvn.transform(new ProjNode(time, TypeFunc::Parms+1)); assert(value_top == top(), "second value must be top"); #endif set_result(value); @@ -3241,18 +3280,18 @@ // out of the function. insert_mem_bar(Op_MemBarCPUOrder); - RegionNode* result_rgn = new (C) RegionNode(PATH_LIMIT); - PhiNode* result_val = new (C) PhiNode(result_rgn, TypeInt::BOOL); - - RegionNode* slow_region = new (C) RegionNode(1); + RegionNode* result_rgn = new RegionNode(PATH_LIMIT); + PhiNode* result_val = new PhiNode(result_rgn, TypeInt::BOOL); + + RegionNode* slow_region = new RegionNode(1); record_for_igvn(slow_region); // (a) Receiving thread must be the current thread. Node* rec_thr = argument(0); Node* tls_ptr = NULL; Node* cur_thr = generate_current_thread(tls_ptr); - Node* cmp_thr = _gvn.transform(new (C) CmpPNode(cur_thr, rec_thr)); - Node* bol_thr = _gvn.transform(new (C) BoolNode(cmp_thr, BoolTest::ne)); + Node* cmp_thr = _gvn.transform(new CmpPNode(cur_thr, rec_thr)); + Node* bol_thr = _gvn.transform(new BoolNode(cmp_thr, BoolTest::ne)); generate_slow_guard(bol_thr, slow_region); @@ -3263,33 +3302,33 @@ // Set the control input on the field _interrupted read to prevent it floating up. Node* int_bit = make_load(control(), p, TypeInt::BOOL, T_INT, MemNode::unordered); - Node* cmp_bit = _gvn.transform(new (C) CmpINode(int_bit, intcon(0))); - Node* bol_bit = _gvn.transform(new (C) BoolNode(cmp_bit, BoolTest::ne)); + Node* cmp_bit = _gvn.transform(new CmpINode(int_bit, intcon(0))); + Node* bol_bit = _gvn.transform(new BoolNode(cmp_bit, BoolTest::ne)); IfNode* iff_bit = create_and_map_if(control(), bol_bit, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN); // First fast path: if (!TLS._interrupted) return false; - Node* false_bit = _gvn.transform(new (C) IfFalseNode(iff_bit)); + Node* false_bit = _gvn.transform(new IfFalseNode(iff_bit)); result_rgn->init_req(no_int_result_path, false_bit); result_val->init_req(no_int_result_path, intcon(0)); // drop through to next case - set_control( _gvn.transform(new (C) IfTrueNode(iff_bit))); + set_control( _gvn.transform(new IfTrueNode(iff_bit))); #ifndef TARGET_OS_FAMILY_windows // (c) Or, if interrupt bit is set and clear_int is false, use 2nd fast path. Node* clr_arg = argument(1); - Node* cmp_arg = _gvn.transform(new (C) CmpINode(clr_arg, intcon(0))); - Node* bol_arg = _gvn.transform(new (C) BoolNode(cmp_arg, BoolTest::ne)); + Node* cmp_arg = _gvn.transform(new CmpINode(clr_arg, intcon(0))); + Node* bol_arg = _gvn.transform(new BoolNode(cmp_arg, BoolTest::ne)); IfNode* iff_arg = create_and_map_if(control(), bol_arg, PROB_FAIR, COUNT_UNKNOWN); // Second fast path: ... else if (!clear_int) return true; - Node* false_arg = _gvn.transform(new (C) IfFalseNode(iff_arg)); + Node* false_arg = _gvn.transform(new IfFalseNode(iff_arg)); result_rgn->init_req(no_clear_result_path, false_arg); result_val->init_req(no_clear_result_path, intcon(1)); // drop through to next case - set_control( _gvn.transform(new (C) IfTrueNode(iff_arg))); + set_control( _gvn.transform(new IfTrueNode(iff_arg))); #else // To return true on Windows you must read the _interrupted field // and check the the event state i.e. take the slow path. @@ -3375,9 +3414,9 @@ Node* mods = make_load(NULL, modp, TypeInt::INT, T_INT, MemNode::unordered); Node* mask = intcon(modifier_mask); Node* bits = intcon(modifier_bits); - Node* mbit = _gvn.transform(new (C) AndINode(mods, mask)); - Node* cmp = _gvn.transform(new (C) CmpINode(mbit, bits)); - Node* bol = _gvn.transform(new (C) BoolNode(cmp, BoolTest::ne)); + Node* mbit = _gvn.transform(new AndINode(mods, mask)); + Node* cmp = _gvn.transform(new CmpINode(mbit, bits)); + Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne)); return generate_fair_guard(bol, region); } Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) { @@ -3450,9 +3489,9 @@ #endif // Null-check the mirror, and the mirror's klass ptr (in case it is a primitive). - RegionNode* region = new (C) RegionNode(PATH_LIMIT); + RegionNode* region = new RegionNode(PATH_LIMIT); record_for_igvn(region); - PhiNode* phi = new (C) PhiNode(region, return_type); + PhiNode* phi = new PhiNode(region, return_type); // The mirror will never be null of Reflection.getClassAccessFlags, however // it may be null for Class.isInstance or Class.getModifiers. Throw a NPE @@ -3594,8 +3633,8 @@ PATH_LIMIT }; - RegionNode* region = new (C) RegionNode(PATH_LIMIT); - Node* phi = new (C) PhiNode(region, TypeInt::BOOL); + RegionNode* region = new RegionNode(PATH_LIMIT); + Node* phi = new PhiNode(region, TypeInt::BOOL); record_for_igvn(region); const TypePtr* adr_type = TypeRawPtr::BOTTOM; // memory type of loads @@ -3642,8 +3681,8 @@ set_control(region->in(_prim_0_path)); // go back to first null check if (!stopped()) { // Since superc is primitive, make a guard for the superc==subc case. - Node* cmp_eq = _gvn.transform(new (C) CmpPNode(args[0], args[1])); - Node* bol_eq = _gvn.transform(new (C) BoolNode(cmp_eq, BoolTest::eq)); + Node* cmp_eq = _gvn.transform(new CmpPNode(args[0], args[1])); + Node* bol_eq = _gvn.transform(new BoolNode(cmp_eq, BoolTest::eq)); generate_guard(bol_eq, region, PROB_FAIR); if (region->req() == PATH_LIMIT+1) { // A guard was added. If the added guard is taken, superc==subc. @@ -3708,11 +3747,11 @@ ? ((jint)Klass::_lh_array_tag_type_value << Klass::_lh_array_tag_shift) : Klass::_lh_neutral_value); - Node* cmp = _gvn.transform(new(C) CmpINode(layout_val, intcon(nval))); + Node* cmp = _gvn.transform(new CmpINode(layout_val, intcon(nval))); BoolTest::mask btest = BoolTest::lt; // correct for testing is_[obj]array // invert the test if we are looking for a non-array if (not_array) btest = BoolTest(btest).negate(); - Node* bol = _gvn.transform(new(C) BoolNode(cmp, btest)); + Node* bol = _gvn.transform(new BoolNode(cmp, btest)); return generate_fair_guard(bol, region); } @@ -3728,12 +3767,10 @@ if (stopped()) return true; enum { _normal_path = 1, _slow_path = 2, PATH_LIMIT }; - RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT); - PhiNode* result_val = new(C) PhiNode(result_reg, - TypeInstPtr::NOTNULL); - PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO); - PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, - TypePtr::BOTTOM); + RegionNode* result_reg = new RegionNode(PATH_LIMIT); + PhiNode* result_val = new PhiNode(result_reg, TypeInstPtr::NOTNULL); + PhiNode* result_io = new PhiNode(result_reg, Type::ABIO); + PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM); bool never_see_null = !too_many_traps(Deoptimization::Reason_null_check); Node* klass_node = load_array_klass_from_mirror(mirror, never_see_null, @@ -3840,7 +3877,7 @@ Node* klass_node = load_klass_from_mirror(array_type_mirror, false, NULL, 0); klass_node = null_check(klass_node); - RegionNode* bailout = new (C) RegionNode(1); + RegionNode* bailout = new RegionNode(1); record_for_igvn(bailout); // Despite the generic type of Arrays.copyOf, the mirror might be int, int[], etc. @@ -3850,7 +3887,7 @@ // Improve the klass node's type from the new optimistic assumption: ciKlass* ak = ciArrayKlass::make(env()->Object_klass()); const Type* akls = TypeKlassPtr::make(TypePtr::NotNull, ak, 0/*offset*/); - Node* cast = new (C) CastPPNode(klass_node, akls); + Node* cast = new CastPPNode(klass_node, akls); cast->init_req(0, control()); klass_node = _gvn.transform(cast); } @@ -3861,7 +3898,7 @@ Node* length = end; if (_gvn.type(start) != TypeInt::ZERO) { - length = _gvn.transform(new (C) SubINode(end, start)); + length = _gvn.transform(new SubINode(end, start)); } // Bail out if length is negative. @@ -3880,7 +3917,7 @@ if (!stopped()) { // How many elements will we copy from the original? // The answer is MinI(orig_length - start, length). - Node* orig_tail = _gvn.transform(new (C) SubINode(orig_length, start)); + Node* orig_tail = _gvn.transform(new SubINode(orig_length, start)); Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length); newcopy = new_array(klass_node, length, 0); // no argments to push @@ -3927,8 +3964,8 @@ const TypePtr* native_call_addr = TypeMetadataPtr::make(method); Node* native_call = makecon(native_call_addr); - Node* chk_native = _gvn.transform(new(C) CmpPNode(target_call, native_call)); - Node* test_native = _gvn.transform(new(C) BoolNode(chk_native, BoolTest::ne)); + Node* chk_native = _gvn.transform(new CmpPNode(target_call, native_call)); + Node* test_native = _gvn.transform(new BoolNode(chk_native, BoolTest::ne)); return generate_slow_guard(test_native, slow_region); } @@ -3953,7 +3990,7 @@ CallJavaNode* slow_call; if (is_static) { assert(!is_virtual, ""); - slow_call = new(C) CallStaticJavaNode(C, tf, + slow_call = new CallStaticJavaNode(C, tf, SharedRuntime::get_resolve_static_call_stub(), method, bci()); } else if (is_virtual) { @@ -3969,12 +4006,12 @@ assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, err_msg_res("bad index %d", vtable_index)); } - slow_call = new(C) CallDynamicJavaNode(tf, + slow_call = new CallDynamicJavaNode(tf, SharedRuntime::get_resolve_virtual_call_stub(), method, vtable_index, bci()); } else { // neither virtual nor static: opt_virtual null_check_receiver(); - slow_call = new(C) CallStaticJavaNode(C, tf, + slow_call = new CallStaticJavaNode(C, tf, SharedRuntime::get_resolve_opt_virtual_call_stub(), method, bci()); slow_call->set_optimized_virtual(true); @@ -3985,20 +4022,21 @@ } -//------------------------------inline_native_hashcode-------------------- -// Build special case code for calls to hashCode on an object. +/** + * Build special case code for calls to hashCode on an object. This call may + * be virtual (invokevirtual) or bound (invokespecial). For each case we generate + * slightly different code. + */ bool LibraryCallKit::inline_native_hashcode(bool is_virtual, bool is_static) { assert(is_static == callee()->is_static(), "correct intrinsic selection"); assert(!(is_virtual && is_static), "either virtual, special, or static"); enum { _slow_path = 1, _fast_path, _null_path, PATH_LIMIT }; - RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT); - PhiNode* result_val = new(C) PhiNode(result_reg, - TypeInt::INT); - PhiNode* result_io = new(C) PhiNode(result_reg, Type::ABIO); - PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, - TypePtr::BOTTOM); + RegionNode* result_reg = new RegionNode(PATH_LIMIT); + PhiNode* result_val = new PhiNode(result_reg, TypeInt::INT); + PhiNode* result_io = new PhiNode(result_reg, Type::ABIO); + PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM); Node* obj = NULL; if (!is_static) { // Check for hashing null object @@ -4024,15 +4062,9 @@ return true; } - // After null check, get the object's klass. - Node* obj_klass = load_object_klass(obj); - - // This call may be virtual (invokevirtual) or bound (invokespecial). - // For each case we generate slightly different code. - // We only go to the fast case code if we pass a number of guards. The // paths which do not pass are accumulated in the slow_region. - RegionNode* slow_region = new (C) RegionNode(1); + RegionNode* slow_region = new RegionNode(1); record_for_igvn(slow_region); // If this is a virtual call, we generate a funny guard. We pull out @@ -4042,19 +4074,24 @@ // guard for non-virtual calls -- the caller is known to be the native // Object hashCode(). if (is_virtual) { + // After null check, get the object's klass. + Node* obj_klass = load_object_klass(obj); generate_virtual_guard(obj_klass, slow_region); } // Get the header out of the object, use LoadMarkNode when available Node* header_addr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes()); - Node* header = make_load(control(), header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered); + // The control of the load must be NULL. Otherwise, the load can move before + // the null check after castPP removal. + Node* no_ctrl = NULL; + Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered); // Test the header to see if it is unlocked. Node *lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place); - Node *lmasked_header = _gvn.transform(new (C) AndXNode(header, lock_mask)); + Node *lmasked_header = _gvn.transform(new AndXNode(header, lock_mask)); Node *unlocked_val = _gvn.MakeConX(markOopDesc::unlocked_value); - Node *chk_unlocked = _gvn.transform(new (C) CmpXNode( lmasked_header, unlocked_val)); - Node *test_unlocked = _gvn.transform(new (C) BoolNode( chk_unlocked, BoolTest::ne)); + Node *chk_unlocked = _gvn.transform(new CmpXNode( lmasked_header, unlocked_val)); + Node *test_unlocked = _gvn.transform(new BoolNode( chk_unlocked, BoolTest::ne)); generate_slow_guard(test_unlocked, slow_region); @@ -4064,17 +4101,17 @@ // vm: see markOop.hpp. Node *hash_mask = _gvn.intcon(markOopDesc::hash_mask); Node *hash_shift = _gvn.intcon(markOopDesc::hash_shift); - Node *hshifted_header= _gvn.transform(new (C) URShiftXNode(header, hash_shift)); + Node *hshifted_header= _gvn.transform(new URShiftXNode(header, hash_shift)); // This hack lets the hash bits live anywhere in the mark object now, as long // as the shift drops the relevant bits into the low 32 bits. Note that // Java spec says that HashCode is an int so there's no point in capturing // an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build). hshifted_header = ConvX2I(hshifted_header); - Node *hash_val = _gvn.transform(new (C) AndINode(hshifted_header, hash_mask)); + Node *hash_val = _gvn.transform(new AndINode(hshifted_header, hash_mask)); Node *no_hash_val = _gvn.intcon(markOopDesc::no_hash); - Node *chk_assigned = _gvn.transform(new (C) CmpINode( hash_val, no_hash_val)); - Node *test_assigned = _gvn.transform(new (C) BoolNode( chk_assigned, BoolTest::eq)); + Node *chk_assigned = _gvn.transform(new CmpINode( hash_val, no_hash_val)); + Node *test_assigned = _gvn.transform(new BoolNode( chk_assigned, BoolTest::eq)); generate_slow_guard(test_assigned, slow_region); @@ -4213,19 +4250,19 @@ Node* result; switch (id) { - case vmIntrinsics::_floatToRawIntBits: result = new (C) MoveF2INode(arg); break; - case vmIntrinsics::_intBitsToFloat: result = new (C) MoveI2FNode(arg); break; - case vmIntrinsics::_doubleToRawLongBits: result = new (C) MoveD2LNode(arg); break; - case vmIntrinsics::_longBitsToDouble: result = new (C) MoveL2DNode(arg); break; + case vmIntrinsics::_floatToRawIntBits: result = new MoveF2INode(arg); break; + case vmIntrinsics::_intBitsToFloat: result = new MoveI2FNode(arg); break; + case vmIntrinsics::_doubleToRawLongBits: result = new MoveD2LNode(arg); break; + case vmIntrinsics::_longBitsToDouble: result = new MoveL2DNode(arg); break; case vmIntrinsics::_doubleToLongBits: { // two paths (plus control) merge in a wood - RegionNode *r = new (C) RegionNode(3); - Node *phi = new (C) PhiNode(r, TypeLong::LONG); - - Node *cmpisnan = _gvn.transform(new (C) CmpDNode(arg, arg)); + RegionNode *r = new RegionNode(3); + Node *phi = new PhiNode(r, TypeLong::LONG); + + Node *cmpisnan = _gvn.transform(new CmpDNode(arg, arg)); // Build the boolean node - Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne)); + Node *bolisnan = _gvn.transform(new BoolNode(cmpisnan, BoolTest::ne)); // Branch either way. // NaN case is less traveled, which makes all the difference. @@ -4233,7 +4270,7 @@ Node *opt_isnan = _gvn.transform(ifisnan); assert( opt_isnan->is_If(), "Expect an IfNode"); IfNode *opt_ifisnan = (IfNode*)opt_isnan; - Node *iftrue = _gvn.transform(new (C) IfTrueNode(opt_ifisnan)); + Node *iftrue = _gvn.transform(new IfTrueNode(opt_ifisnan)); set_control(iftrue); @@ -4243,10 +4280,10 @@ r->init_req(1, iftrue); // Else fall through - Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan)); + Node *iffalse = _gvn.transform(new IfFalseNode(opt_ifisnan)); set_control(iffalse); - phi->init_req(2, _gvn.transform(new (C) MoveD2LNode(arg))); + phi->init_req(2, _gvn.transform(new MoveD2LNode(arg))); r->init_req(2, iffalse); // Post merge @@ -4261,12 +4298,12 @@ case vmIntrinsics::_floatToIntBits: { // two paths (plus control) merge in a wood - RegionNode *r = new (C) RegionNode(3); - Node *phi = new (C) PhiNode(r, TypeInt::INT); - - Node *cmpisnan = _gvn.transform(new (C) CmpFNode(arg, arg)); + RegionNode *r = new RegionNode(3); + Node *phi = new PhiNode(r, TypeInt::INT); + + Node *cmpisnan = _gvn.transform(new CmpFNode(arg, arg)); // Build the boolean node - Node *bolisnan = _gvn.transform(new (C) BoolNode(cmpisnan, BoolTest::ne)); + Node *bolisnan = _gvn.transform(new BoolNode(cmpisnan, BoolTest::ne)); // Branch either way. // NaN case is less traveled, which makes all the difference. @@ -4274,7 +4311,7 @@ Node *opt_isnan = _gvn.transform(ifisnan); assert( opt_isnan->is_If(), "Expect an IfNode"); IfNode *opt_ifisnan = (IfNode*)opt_isnan; - Node *iftrue = _gvn.transform(new (C) IfTrueNode(opt_ifisnan)); + Node *iftrue = _gvn.transform(new IfTrueNode(opt_ifisnan)); set_control(iftrue); @@ -4284,10 +4321,10 @@ r->init_req(1, iftrue); // Else fall through - Node *iffalse = _gvn.transform(new (C) IfFalseNode(opt_ifisnan)); + Node *iffalse = _gvn.transform(new IfFalseNode(opt_ifisnan)); set_control(iffalse); - phi->init_req(2, _gvn.transform(new (C) MoveF2INode(arg))); + phi->init_req(2, _gvn.transform(new MoveF2INode(arg))); r->init_req(2, iffalse); // Post merge @@ -4403,8 +4440,8 @@ // Compute the length also, if needed: Node* countx = size; - countx = _gvn.transform(new (C) SubXNode(countx, MakeConX(base_off))); - countx = _gvn.transform(new (C) URShiftXNode(countx, intcon(LogBytesPerLong) )); + countx = _gvn.transform(new SubXNode(countx, MakeConX(base_off))); + countx = _gvn.transform(new URShiftXNode(countx, intcon(LogBytesPerLong) )); const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM; bool disjoint_bases = true; @@ -4493,12 +4530,10 @@ _instance_path, // plain instance allocation, plus arrayof_long_arraycopy PATH_LIMIT }; - RegionNode* result_reg = new(C) RegionNode(PATH_LIMIT); - result_val = new(C) PhiNode(result_reg, - TypeInstPtr::NOTNULL); - PhiNode* result_i_o = new(C) PhiNode(result_reg, Type::ABIO); - PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, - TypePtr::BOTTOM); + RegionNode* result_reg = new RegionNode(PATH_LIMIT); + result_val = new PhiNode(result_reg, TypeInstPtr::NOTNULL); + PhiNode* result_i_o = new PhiNode(result_reg, Type::ABIO); + PhiNode* result_mem = new PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM); record_for_igvn(result_reg); const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM; @@ -4554,7 +4589,7 @@ // We only go to the instance fast case code if we pass a number of guards. // The paths which do not pass are accumulated in the slow_region. - RegionNode* slow_region = new (C) RegionNode(1); + RegionNode* slow_region = new RegionNode(1); record_for_igvn(slow_region); if (!stopped()) { // It's an instance (we did array above). Make the slow-path tests. @@ -4583,7 +4618,10 @@ // It's an instance, and it passed the slow-path tests. PreserveJVMState pjvms(this); Node* obj_size = NULL; - Node* alloc_obj = new_instance(obj_klass, NULL, &obj_size); + // Need to deoptimize on exception from allocation since Object.clone intrinsic + // is reexecuted if deoptimization occurs and there could be problems when merging + // exception state between multiple Object.clone versions (reexecute=true vs reexecute=false). + Node* alloc_obj = new_instance(obj_klass, NULL, &obj_size, /*deoptimize_on_exception=*/true); copy_to_clone(obj, alloc_obj, obj_size, false, !use_ReduceInitialCardMarks()); @@ -4811,7 +4849,7 @@ // (8) dest_offset + length must not exceed length of dest. // (9) each element of an oop array must be assignable - RegionNode* slow_region = new (C) RegionNode(1); + RegionNode* slow_region = new RegionNode(1); record_for_igvn(slow_region); // (3) operands must not be null @@ -4899,7 +4937,7 @@ RegionNode* slow_region) { if (slow_region == NULL) { - slow_region = new(C) RegionNode(1); + slow_region = new RegionNode(1); record_for_igvn(slow_region); } @@ -4947,9 +4985,9 @@ bcopy_path = 5, // copy primitive array by 64-bit blocks PATH_LIMIT = 6 }; - RegionNode* result_region = new(C) RegionNode(PATH_LIMIT); - PhiNode* result_i_o = new(C) PhiNode(result_region, Type::ABIO); - PhiNode* result_memory = new(C) PhiNode(result_region, Type::MEMORY, adr_type); + RegionNode* result_region = new RegionNode(PATH_LIMIT); + PhiNode* result_i_o = new PhiNode(result_region, Type::ABIO); + PhiNode* result_memory = new PhiNode(result_region, Type::MEMORY, adr_type); record_for_igvn(result_region); _gvn.set_type_bottom(result_i_o); _gvn.set_type_bottom(result_memory); @@ -5023,8 +5061,7 @@ // are dest_head = dest[0..off] and dest_tail = dest[off+len..dest.length]. Node* dest_size = alloc->in(AllocateNode::AllocSize); Node* dest_length = alloc->in(AllocateNode::ALength); - Node* dest_tail = _gvn.transform(new(C) AddINode(dest_offset, - copy_length)); + Node* dest_tail = _gvn.transform(new AddINode(dest_offset, copy_length)); // If there is a head section that needs zeroing, do it now. if (find_int_con(dest_offset, -1) != 0) { @@ -5040,8 +5077,8 @@ // the copy to a more hardware-friendly word size of 64 bits. Node* tail_ctl = NULL; if (!stopped() && !dest_tail->eqv_uncast(dest_length)) { - Node* cmp_lt = _gvn.transform(new(C) CmpINode(dest_tail, dest_length)); - Node* bol_lt = _gvn.transform(new(C) BoolNode(cmp_lt, BoolTest::lt)); + Node* cmp_lt = _gvn.transform(new CmpINode(dest_tail, dest_length)); + Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt)); tail_ctl = generate_slow_guard(bol_lt, NULL); assert(tail_ctl != NULL || !stopped(), "must be an outcome"); } @@ -5075,8 +5112,8 @@ dest_size); } else { // Make a local merge. - Node* done_ctl = new(C) RegionNode(3); - Node* done_mem = new(C) PhiNode(done_ctl, Type::MEMORY, adr_type); + Node* done_ctl = new RegionNode(3); + Node* done_mem = new PhiNode(done_ctl, Type::MEMORY, adr_type); done_ctl->init_req(1, notail_ctl); done_mem->init_req(1, memory(adr_type)); generate_clear_array(adr_type, dest, basic_elem_type, @@ -5171,21 +5208,21 @@ // Clean up after the checked call. // The returned value is either 0 or -1^K, // where K = number of partially transferred array elements. - Node* cmp = _gvn.transform(new(C) CmpINode(checked_value, intcon(0))); - Node* bol = _gvn.transform(new(C) BoolNode(cmp, BoolTest::eq)); + Node* cmp = _gvn.transform(new CmpINode(checked_value, intcon(0))); + Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq)); IfNode* iff = create_and_map_if(control(), bol, PROB_MAX, COUNT_UNKNOWN); // If it is 0, we are done, so transfer to the end. - Node* checks_done = _gvn.transform(new(C) IfTrueNode(iff)); + Node* checks_done = _gvn.transform(new IfTrueNode(iff)); result_region->init_req(checked_path, checks_done); result_i_o ->init_req(checked_path, checked_i_o); result_memory->init_req(checked_path, checked_mem); // If it is not zero, merge into the slow call. - set_control( _gvn.transform(new(C) IfFalseNode(iff) )); - RegionNode* slow_reg2 = new(C) RegionNode(3); - PhiNode* slow_i_o2 = new(C) PhiNode(slow_reg2, Type::ABIO); - PhiNode* slow_mem2 = new(C) PhiNode(slow_reg2, Type::MEMORY, adr_type); + set_control( _gvn.transform(new IfFalseNode(iff) )); + RegionNode* slow_reg2 = new RegionNode(3); + PhiNode* slow_i_o2 = new PhiNode(slow_reg2, Type::ABIO); + PhiNode* slow_mem2 = new PhiNode(slow_reg2, Type::MEMORY, adr_type); record_for_igvn(slow_reg2); slow_reg2 ->init_req(1, slow_control); slow_i_o2 ->init_req(1, slow_i_o); @@ -5205,16 +5242,16 @@ } else { // We must continue the copy exactly where it failed, or else // another thread might see the wrong number of writes to dest. - Node* checked_offset = _gvn.transform(new(C) XorINode(checked_value, intcon(-1))); - Node* slow_offset = new(C) PhiNode(slow_reg2, TypeInt::INT); + Node* checked_offset = _gvn.transform(new XorINode(checked_value, intcon(-1))); + Node* slow_offset = new PhiNode(slow_reg2, TypeInt::INT); slow_offset->init_req(1, intcon(0)); slow_offset->init_req(2, checked_offset); slow_offset = _gvn.transform(slow_offset); // Adjust the arguments by the conditionally incoming offset. - Node* src_off_plus = _gvn.transform(new(C) AddINode(src_offset, slow_offset)); - Node* dest_off_plus = _gvn.transform(new(C) AddINode(dest_offset, slow_offset)); - Node* length_minus = _gvn.transform(new(C) SubINode(copy_length, slow_offset)); + Node* src_off_plus = _gvn.transform(new AddINode(src_offset, slow_offset)); + Node* dest_off_plus = _gvn.transform(new AddINode(dest_offset, slow_offset)); + Node* length_minus = _gvn.transform(new SubINode(copy_length, slow_offset)); // Tweak the node variables to adjust the code produced below: src_offset = src_off_plus; @@ -5435,10 +5472,10 @@ int end_round = (-1 << scale) & (BytesPerLong - 1); Node* end = ConvI2X(slice_len); if (scale != 0) - end = _gvn.transform(new(C) LShiftXNode(end, intcon(scale) )); + end = _gvn.transform(new LShiftXNode(end, intcon(scale) )); end_base += end_round; - end = _gvn.transform(new(C) AddXNode(end, MakeConX(end_base))); - end = _gvn.transform(new(C) AndXNode(end, MakeConX(~end_round))); + end = _gvn.transform(new AddXNode(end, MakeConX(end_base))); + end = _gvn.transform(new AndXNode(end, MakeConX(~end_round))); mem = ClearArrayNode::clear_memory(control(), mem, dest, start_con, end, &_gvn); } else if (start_con < 0 && dest_size != top()) { @@ -5447,8 +5484,8 @@ Node* start = slice_idx; start = ConvI2X(start); if (scale != 0) - start = _gvn.transform(new(C) LShiftXNode( start, intcon(scale) )); - start = _gvn.transform(new(C) AddXNode(start, MakeConX(abase))); + start = _gvn.transform(new LShiftXNode( start, intcon(scale) )); + start = _gvn.transform(new AddXNode(start, MakeConX(abase))); if ((bump_bit | clear_low) != 0) { int to_clear = (bump_bit | clear_low); // Align up mod 8, then store a jint zero unconditionally @@ -5459,14 +5496,14 @@ assert((abase & to_clear) == 0, "array base must be long-aligned"); } else { // Bump 'start' up to (or past) the next jint boundary: - start = _gvn.transform(new(C) AddXNode(start, MakeConX(bump_bit))); + start = _gvn.transform(new AddXNode(start, MakeConX(bump_bit))); assert((abase & clear_low) == 0, "array base must be int-aligned"); } // Round bumped 'start' down to jlong boundary in body of array. - start = _gvn.transform(new(C) AndXNode(start, MakeConX(~to_clear))); + start = _gvn.transform(new AndXNode(start, MakeConX(~to_clear))); if (bump_bit != 0) { // Store a zero to the immediately preceding jint: - Node* x1 = _gvn.transform(new(C) AddXNode(start, MakeConX(-bump_bit))); + Node* x1 = _gvn.transform(new AddXNode(start, MakeConX(-bump_bit))); Node* p1 = basic_plus_adr(dest, x1); mem = StoreNode::make(_gvn, control(), mem, p1, adr_type, intcon(0), T_INT, MemNode::unordered); mem = _gvn.transform(mem); @@ -5533,8 +5570,8 @@ Node* sptr = basic_plus_adr(src, src_off); Node* dptr = basic_plus_adr(dest, dest_off); Node* countx = dest_size; - countx = _gvn.transform(new (C) SubXNode(countx, MakeConX(dest_off))); - countx = _gvn.transform(new (C) URShiftXNode(countx, intcon(LogBytesPerLong))); + countx = _gvn.transform(new SubXNode(countx, MakeConX(dest_off))); + countx = _gvn.transform(new URShiftXNode(countx, intcon(LogBytesPerLong))); bool disjoint_bases = true; // since alloc != NULL generate_unchecked_arraycopy(adr_type, T_LONG, disjoint_bases, @@ -5584,7 +5621,7 @@ // super_check_offset, for the desired klass. int sco_offset = in_bytes(Klass::super_check_offset_offset()); Node* p3 = basic_plus_adr(dest_elem_klass, sco_offset); - Node* n3 = new(C) LoadINode(NULL, memory(p3), p3, _gvn.type(p3)->is_ptr(), TypeInt::INT, MemNode::unordered); + Node* n3 = new LoadINode(NULL, memory(p3), p3, _gvn.type(p3)->is_ptr(), TypeInt::INT, MemNode::unordered); Node* check_offset = ConvI2X(_gvn.transform(n3)); Node* check_value = dest_elem_klass; @@ -5602,7 +5639,7 @@ check_offset XTOP, check_value); - return _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); + return _gvn.transform(new ProjNode(call, TypeFunc::Parms)); } @@ -5624,7 +5661,7 @@ copyfunc_addr, "generic_arraycopy", adr_type, src, src_offset, dest, dest_offset, copy_length); - return _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); + return _gvn.transform(new ProjNode(call, TypeFunc::Parms)); } // Helper function; generates the fast out-of-line call to an arraycopy stub. @@ -5691,9 +5728,9 @@ // 'dst_start' points to dst array + scaled offset const TypeAryPtr* mtype = TypeAryPtr::BYTES; - Node* enc = new (C) EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length); + Node* enc = new EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length); enc = _gvn.transform(enc); - Node* res_mem = _gvn.transform(new (C) SCMemProjNode(enc)); + Node* res_mem = _gvn.transform(new SCMemProjNode(enc)); set_memory(res_mem, mtype); set_result(enc); return true; @@ -5718,18 +5755,18 @@ */ Node* M1 = intcon(-1); - crc = _gvn.transform(new (C) XorINode(crc, M1)); - Node* result = _gvn.transform(new (C) XorINode(crc, b)); - result = _gvn.transform(new (C) AndINode(result, intcon(0xFF))); + crc = _gvn.transform(new XorINode(crc, M1)); + Node* result = _gvn.transform(new XorINode(crc, b)); + result = _gvn.transform(new AndINode(result, intcon(0xFF))); Node* base = makecon(TypeRawPtr::make(StubRoutines::crc_table_addr())); - Node* offset = _gvn.transform(new (C) LShiftINode(result, intcon(0x2))); + Node* offset = _gvn.transform(new LShiftINode(result, intcon(0x2))); Node* adr = basic_plus_adr(top(), base, ConvI2X(offset)); result = make_load(control(), adr, TypeInt::INT, T_INT, MemNode::unordered); - crc = _gvn.transform(new (C) URShiftINode(crc, intcon(8))); - result = _gvn.transform(new (C) XorINode(crc, result)); - result = _gvn.transform(new (C) XorINode(result, M1)); + crc = _gvn.transform(new URShiftINode(crc, intcon(8))); + result = _gvn.transform(new XorINode(crc, result)); + result = _gvn.transform(new XorINode(result, M1)); set_result(result); return true; } @@ -5773,7 +5810,7 @@ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), stubAddr, stubName, TypePtr::BOTTOM, crc, src_start, length); - Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); + Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); set_result(result); return true; } @@ -5792,7 +5829,7 @@ Node* length = argument(4); // type: int src = ConvL2X(src); // adjust Java long to machine word - Node* base = _gvn.transform(new (C) CastX2PNode(src)); + Node* base = _gvn.transform(new CastX2PNode(src)); offset = ConvI2X(offset); // 'src_start' points to src array + scaled offset @@ -5805,7 +5842,7 @@ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(), stubAddr, stubName, TypePtr::BOTTOM, crc, src_start, length); - Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); + Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); set_result(result); return true; } @@ -5870,7 +5907,12 @@ BasicType bt = field->layout_type(); // Build the resultant type of the load - const Type *type = TypeOopPtr::make_from_klass(field_klass->as_klass()); + const Type *type; + if (bt == T_OBJECT) { + type = TypeOopPtr::make_from_klass(field_klass->as_klass()); + } else { + type = Type::get_const_basic_type(bt); + } // Build the load. Node* loadedField = make_load(NULL, adr, type, bt, adr_type, MemNode::unordered, is_vol); @@ -6000,12 +6042,12 @@ assert(tinst != NULL, "CBC obj is null"); assert(tinst->klass()->is_loaded(), "CBC obj is not loaded"); ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); - if (!klass_AESCrypt->is_loaded()) return false; + assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded"); ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt); const TypeOopPtr* xtype = aklass->as_instance_type(); - Node* aescrypt_object = new(C) CheckCastPPNode(control(), embeddedCipherObj, xtype); + Node* aescrypt_object = new CheckCastPPNode(control(), embeddedCipherObj, xtype); aescrypt_object = _gvn.transform(aescrypt_object); // we need to get the start of the aescrypt_object's expanded key array @@ -6038,7 +6080,7 @@ } // return cipher length (int) - Node* retvalue = _gvn.transform(new (C) ProjNode(cbcCrypt, TypeFunc::Parms)); + Node* retvalue = _gvn.transform(new ProjNode(cbcCrypt, TypeFunc::Parms)); set_result(retvalue); return true; } @@ -6075,11 +6117,8 @@ // note cipher==plain is more conservative than the original java code but that's OK // Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) { - // First, check receiver for NULL since it is virtual method. + // The receiver was checked for NULL already. Node* objCBC = argument(0); - objCBC = null_check(objCBC); - - if (stopped()) return NULL; // Always NULL // Load embeddedCipher field of CipherBlockChaining object. Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false); @@ -6102,8 +6141,8 @@ ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); Node* instof = gen_instanceof(embeddedCipherObj, makecon(TypeKlassPtr::make(instklass_AESCrypt))); - Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1))); - Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne)); + Node* cmp_instof = _gvn.transform(new CmpINode(instof, intcon(1))); + Node* bool_instof = _gvn.transform(new BoolNode(cmp_instof, BoolTest::ne)); Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); @@ -6114,15 +6153,270 @@ // for decryption, we need to add a further check to avoid // taking the intrinsic path when cipher and plain are the same // see the original java code for why. - RegionNode* region = new(C) RegionNode(3); + RegionNode* region = new RegionNode(3); region->init_req(1, instof_false); Node* src = argument(1); Node* dest = argument(4); - Node* cmp_src_dest = _gvn.transform(new (C) CmpPNode(src, dest)); - Node* bool_src_dest = _gvn.transform(new (C) BoolNode(cmp_src_dest, BoolTest::eq)); + Node* cmp_src_dest = _gvn.transform(new CmpPNode(src, dest)); + Node* bool_src_dest = _gvn.transform(new BoolNode(cmp_src_dest, BoolTest::eq)); Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN); region->init_req(2, src_dest_conjoint); record_for_igvn(region); return _gvn.transform(region); } + +//------------------------------inline_sha_implCompress----------------------- +// +// Calculate SHA (i.e., SHA-1) for single-block byte[] array. +// void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs) +// +// Calculate SHA2 (i.e., SHA-244 or SHA-256) for single-block byte[] array. +// void com.sun.security.provider.SHA2.implCompress(byte[] buf, int ofs) +// +// Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array. +// void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs) +// +bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) { + assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters"); + + Node* sha_obj = argument(0); + Node* src = argument(1); // type oop + Node* ofs = argument(2); // type int + + const Type* src_type = src->Value(&_gvn); + const TypeAryPtr* top_src = src_type->isa_aryptr(); + if (top_src == NULL || top_src->klass() == NULL) { + // failed array check + return false; + } + // Figure out the size and type of the elements we will be copying. + BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); + if (src_elem != T_BYTE) { + return false; + } + // 'src_start' points to src array + offset + Node* src_start = array_element_address(src, ofs, src_elem); + Node* state = NULL; + address stubAddr; + const char *stubName; + + switch(id) { + case vmIntrinsics::_sha_implCompress: + assert(UseSHA1Intrinsics, "need SHA1 instruction support"); + state = get_state_from_sha_object(sha_obj); + stubAddr = StubRoutines::sha1_implCompress(); + stubName = "sha1_implCompress"; + break; + case vmIntrinsics::_sha2_implCompress: + assert(UseSHA256Intrinsics, "need SHA256 instruction support"); + state = get_state_from_sha_object(sha_obj); + stubAddr = StubRoutines::sha256_implCompress(); + stubName = "sha256_implCompress"; + break; + case vmIntrinsics::_sha5_implCompress: + assert(UseSHA512Intrinsics, "need SHA512 instruction support"); + state = get_state_from_sha5_object(sha_obj); + stubAddr = StubRoutines::sha512_implCompress(); + stubName = "sha512_implCompress"; + break; + default: + fatal_unexpected_iid(id); + return false; + } + if (state == NULL) return false; + + // Call the stub. + Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::sha_implCompress_Type(), + stubAddr, stubName, TypePtr::BOTTOM, + src_start, state); + + return true; +} + +//------------------------------inline_digestBase_implCompressMB----------------------- +// +// Calculate SHA/SHA2/SHA5 for multi-block byte[] array. +// int com.sun.security.provider.DigestBase.implCompressMultiBlock(byte[] b, int ofs, int limit) +// +bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) { + assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics, + "need SHA1/SHA256/SHA512 instruction support"); + assert((uint)predicate < 3, "sanity"); + assert(callee()->signature()->size() == 3, "digestBase_implCompressMB has 3 parameters"); + + Node* digestBase_obj = argument(0); // The receiver was checked for NULL already. + Node* src = argument(1); // byte[] array + Node* ofs = argument(2); // type int + Node* limit = argument(3); // type int + + const Type* src_type = src->Value(&_gvn); + const TypeAryPtr* top_src = src_type->isa_aryptr(); + if (top_src == NULL || top_src->klass() == NULL) { + // failed array check + return false; + } + // Figure out the size and type of the elements we will be copying. + BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); + if (src_elem != T_BYTE) { + return false; + } + // 'src_start' points to src array + offset + Node* src_start = array_element_address(src, ofs, src_elem); + + const char* klass_SHA_name = NULL; + const char* stub_name = NULL; + address stub_addr = NULL; + bool long_state = false; + + switch (predicate) { + case 0: + if (UseSHA1Intrinsics) { + klass_SHA_name = "sun/security/provider/SHA"; + stub_name = "sha1_implCompressMB"; + stub_addr = StubRoutines::sha1_implCompressMB(); + } + break; + case 1: + if (UseSHA256Intrinsics) { + klass_SHA_name = "sun/security/provider/SHA2"; + stub_name = "sha256_implCompressMB"; + stub_addr = StubRoutines::sha256_implCompressMB(); + } + break; + case 2: + if (UseSHA512Intrinsics) { + klass_SHA_name = "sun/security/provider/SHA5"; + stub_name = "sha512_implCompressMB"; + stub_addr = StubRoutines::sha512_implCompressMB(); + long_state = true; + } + break; + default: + fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate)); + } + if (klass_SHA_name != NULL) { + // get DigestBase klass to lookup for SHA klass + const TypeInstPtr* tinst = _gvn.type(digestBase_obj)->isa_instptr(); + assert(tinst != NULL, "digestBase_obj is not instance???"); + assert(tinst->klass()->is_loaded(), "DigestBase is not loaded"); + + ciKlass* klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name)); + assert(klass_SHA->is_loaded(), "predicate checks that this class is loaded"); + ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass(); + return inline_sha_implCompressMB(digestBase_obj, instklass_SHA, long_state, stub_addr, stub_name, src_start, ofs, limit); + } + return false; +} +//------------------------------inline_sha_implCompressMB----------------------- +bool LibraryCallKit::inline_sha_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_SHA, + bool long_state, address stubAddr, const char *stubName, + Node* src_start, Node* ofs, Node* limit) { + const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_SHA); + const TypeOopPtr* xtype = aklass->as_instance_type(); + Node* sha_obj = new CheckCastPPNode(control(), digestBase_obj, xtype); + sha_obj = _gvn.transform(sha_obj); + + Node* state; + if (long_state) { + state = get_state_from_sha5_object(sha_obj); + } else { + state = get_state_from_sha_object(sha_obj); + } + if (state == NULL) return false; + + // Call the stub. + Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, + OptoRuntime::digestBase_implCompressMB_Type(), + stubAddr, stubName, TypePtr::BOTTOM, + src_start, state, ofs, limit); + // return ofs (int) + Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); + set_result(result); + + return true; +} + +//------------------------------get_state_from_sha_object----------------------- +Node * LibraryCallKit::get_state_from_sha_object(Node *sha_object) { + Node* sha_state = load_field_from_object(sha_object, "state", "[I", /*is_exact*/ false); + assert (sha_state != NULL, "wrong version of sun.security.provider.SHA/SHA2"); + if (sha_state == NULL) return (Node *) NULL; + + // now have the array, need to get the start address of the state array + Node* state = array_element_address(sha_state, intcon(0), T_INT); + return state; +} + +//------------------------------get_state_from_sha5_object----------------------- +Node * LibraryCallKit::get_state_from_sha5_object(Node *sha_object) { + Node* sha_state = load_field_from_object(sha_object, "state", "[J", /*is_exact*/ false); + assert (sha_state != NULL, "wrong version of sun.security.provider.SHA5"); + if (sha_state == NULL) return (Node *) NULL; + + // now have the array, need to get the start address of the state array + Node* state = array_element_address(sha_state, intcon(0), T_LONG); + return state; +} + +//----------------------------inline_digestBase_implCompressMB_predicate---------------------------- +// Return node representing slow path of predicate check. +// the pseudo code we want to emulate with this predicate is: +// if (digestBaseObj instanceof SHA/SHA2/SHA5) do_intrinsic, else do_javapath +// +Node* LibraryCallKit::inline_digestBase_implCompressMB_predicate(int predicate) { + assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics, + "need SHA1/SHA256/SHA512 instruction support"); + assert((uint)predicate < 3, "sanity"); + + // The receiver was checked for NULL already. + Node* digestBaseObj = argument(0); + + // get DigestBase klass for instanceOf check + const TypeInstPtr* tinst = _gvn.type(digestBaseObj)->isa_instptr(); + assert(tinst != NULL, "digestBaseObj is null"); + assert(tinst->klass()->is_loaded(), "DigestBase is not loaded"); + + const char* klass_SHA_name = NULL; + switch (predicate) { + case 0: + if (UseSHA1Intrinsics) { + // we want to do an instanceof comparison against the SHA class + klass_SHA_name = "sun/security/provider/SHA"; + } + break; + case 1: + if (UseSHA256Intrinsics) { + // we want to do an instanceof comparison against the SHA2 class + klass_SHA_name = "sun/security/provider/SHA2"; + } + break; + case 2: + if (UseSHA512Intrinsics) { + // we want to do an instanceof comparison against the SHA5 class + klass_SHA_name = "sun/security/provider/SHA5"; + } + break; + default: + fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate)); + } + + ciKlass* klass_SHA = NULL; + if (klass_SHA_name != NULL) { + klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name)); + } + if ((klass_SHA == NULL) || !klass_SHA->is_loaded()) { + // if none of SHA/SHA2/SHA5 is loaded, we never take the intrinsic fast path + Node* ctrl = control(); + set_control(top()); // no intrinsic path + return ctrl; + } + ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass(); + + Node* instofSHA = gen_instanceof(digestBaseObj, makecon(TypeKlassPtr::make(instklass_SHA))); + Node* cmp_instof = _gvn.transform(new CmpINode(instofSHA, intcon(1))); + Node* bool_instof = _gvn.transform(new BoolNode(cmp_instof, BoolTest::ne)); + Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); + + return instof_false; // even if it is NULL +} diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/loopPredicate.cpp --- a/hotspot/src/share/vm/opto/loopPredicate.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/loopPredicate.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -104,7 +104,7 @@ assert(rgn->is_Call(), "must be call uct"); CallNode* call = rgn->as_Call(); IdealLoopTree* loop = get_loop(call); - rgn = new (C) RegionNode(1); + rgn = new RegionNode(1); rgn->add_req(uncommon_proj); register_control(rgn, loop, uncommon_proj); _igvn.hash_delete(call); @@ -130,8 +130,8 @@ IfNode *new_iff = iff->clone()->as_If(); new_iff->set_req(0, entry); register_control(new_iff, lp, entry); - Node *if_cont = new (C) IfTrueNode(new_iff); - Node *if_uct = new (C) IfFalseNode(new_iff); + Node *if_cont = new IfTrueNode(new_iff); + Node *if_uct = new IfFalseNode(new_iff); if (cont_proj->is_IfFalse()) { // Swap Node* tmp = if_uct; if_uct = if_cont; if_cont = tmp; @@ -191,7 +191,7 @@ if (!rgn->is_Region()) { // create a region to guard the call assert(rgn->is_Call(), "must be call uct"); CallNode* call = rgn->as_Call(); - rgn = new (C) RegionNode(1); + rgn = new RegionNode(1); register_new_node_with_optimizer(rgn); rgn->add_req(uncommon_proj); hash_delete(call); @@ -208,8 +208,8 @@ new_iff->set_req(0, new_entry); register_new_node_with_optimizer(new_iff); - Node *if_cont = new (C) IfTrueNode(new_iff); - Node *if_uct = new (C) IfFalseNode(new_iff); + Node *if_cont = new IfTrueNode(new_iff); + Node *if_uct = new IfFalseNode(new_iff); if (cont_proj->is_IfFalse()) { // Swap Node* tmp = if_uct; if_uct = if_cont; if_cont = tmp; @@ -254,10 +254,10 @@ // Match original condition since predicate's projections could be swapped. assert(predicate_proj->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be"); - Node* opq = new (igvn->C) Opaque1Node(igvn->C, predicate_proj->in(0)->in(1)->in(1)->in(1)); + Node* opq = new Opaque1Node(igvn->C, predicate_proj->in(0)->in(1)->in(1)->in(1)); igvn->C->add_predicate_opaq(opq); - Node* bol = new (igvn->C) Conv2BNode(opq); + Node* bol = new Conv2BNode(opq); if (loop_phase != NULL) { loop_phase->register_new_node(opq, ctrl); loop_phase->register_new_node(bol, ctrl); @@ -605,11 +605,11 @@ // Calculate exact limit here. // Note, counted loop's test is '<' or '>'. limit = exact_limit(loop); - max_idx_expr = new (C) SubINode(limit, stride); + max_idx_expr = new SubINode(limit, stride); register_new_node(max_idx_expr, ctrl); if (TraceLoopPredicate) predString->print("(limit - stride) "); } else { - max_idx_expr = new (C) SubINode(limit, stride); + max_idx_expr = new SubINode(limit, stride); register_new_node(max_idx_expr, ctrl); if (TraceLoopPredicate) predString->print("(limit - stride) "); } @@ -619,22 +619,22 @@ if (scale != 1) { ConNode* con_scale = _igvn.intcon(scale); - max_idx_expr = new (C) MulINode(max_idx_expr, con_scale); + max_idx_expr = new MulINode(max_idx_expr, con_scale); register_new_node(max_idx_expr, ctrl); if (TraceLoopPredicate) predString->print("* %d ", scale); } if (offset && (!offset->is_Con() || offset->get_int() != 0)){ - max_idx_expr = new (C) AddINode(max_idx_expr, offset); + max_idx_expr = new AddINode(max_idx_expr, offset); register_new_node(max_idx_expr, ctrl); if (TraceLoopPredicate) if (offset->is_Con()) predString->print("+ %d ", offset->get_int()); else predString->print("+ offset "); } - CmpUNode* cmp = new (C) CmpUNode(max_idx_expr, range); + CmpUNode* cmp = new CmpUNode(max_idx_expr, range); register_new_node(cmp, ctrl); - BoolNode* bol = new (C) BoolNode(cmp, BoolTest::lt); + BoolNode* bol = new BoolNode(cmp, BoolTest::lt); register_new_node(bol, ctrl); if (TraceLoopPredicate) { @@ -750,7 +750,7 @@ // Negate test if necessary bool negated = false; if (proj->_con != predicate_proj->_con) { - new_predicate_bol = new (C) BoolNode(new_predicate_bol->in(1), new_predicate_bol->_test.negate()); + new_predicate_bol = new BoolNode(new_predicate_bol->in(1), new_predicate_bol->_test.negate()); register_new_node(new_predicate_bol, ctrl); negated = true; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/loopTransform.cpp --- a/hotspot/src/share/vm/opto/loopTransform.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/loopTransform.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -227,24 +227,24 @@ if (neg_inv1) { Node *zero = phase->_igvn.intcon(0); phase->set_ctrl(zero, phase->C->root()); - n_inv1 = new (phase->C) SubINode(zero, inv1); + n_inv1 = new SubINode(zero, inv1); phase->register_new_node(n_inv1, inv1_c); } else { n_inv1 = inv1; } Node* inv; if (neg_inv2) { - inv = new (phase->C) SubINode(n_inv1, inv2); + inv = new SubINode(n_inv1, inv2); } else { - inv = new (phase->C) AddINode(n_inv1, inv2); + inv = new AddINode(n_inv1, inv2); } phase->register_new_node(inv, phase->get_early_ctrl(inv)); Node* addx; if (neg_x) { - addx = new (phase->C) SubINode(inv, x); + addx = new SubINode(inv, x); } else { - addx = new (phase->C) AddINode(x, inv); + addx = new AddINode(x, inv); } phase->register_new_node(addx, phase->get_ctrl(x)); phase->_igvn.replace_node(n1, addx); @@ -953,7 +953,7 @@ post_end->_prob = PROB_FAIR; // Build the main-loop normal exit. - IfFalseNode *new_main_exit = new (C) IfFalseNode(main_end); + IfFalseNode *new_main_exit = new IfFalseNode(main_end); _igvn.register_new_node_with_optimizer( new_main_exit ); set_idom(new_main_exit, main_end, dd_main_exit ); set_loop(new_main_exit, loop->_parent); @@ -963,15 +963,15 @@ // (the main-loop trip-counter exit value) because we will be changing // the exit value (via unrolling) so we cannot constant-fold away the zero // trip guard until all unrolling is done. - Node *zer_opaq = new (C) Opaque1Node(C, incr); - Node *zer_cmp = new (C) CmpINode( zer_opaq, limit ); - Node *zer_bol = new (C) BoolNode( zer_cmp, b_test ); + Node *zer_opaq = new Opaque1Node(C, incr); + Node *zer_cmp = new CmpINode( zer_opaq, limit ); + Node *zer_bol = new BoolNode( zer_cmp, b_test ); register_new_node( zer_opaq, new_main_exit ); register_new_node( zer_cmp , new_main_exit ); register_new_node( zer_bol , new_main_exit ); // Build the IfNode - IfNode *zer_iff = new (C) IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN ); + IfNode *zer_iff = new IfNode( new_main_exit, zer_bol, PROB_FAIR, COUNT_UNKNOWN ); _igvn.register_new_node_with_optimizer( zer_iff ); set_idom(zer_iff, new_main_exit, dd_main_exit); set_loop(zer_iff, loop->_parent); @@ -981,7 +981,7 @@ set_idom(main_exit, zer_iff, dd_main_exit); set_idom(main_exit->unique_out(), zer_iff, dd_main_exit); // Make the true-path, must enter the post loop - Node *zer_taken = new (C) IfTrueNode( zer_iff ); + Node *zer_taken = new IfTrueNode( zer_iff ); _igvn.register_new_node_with_optimizer( zer_taken ); set_idom(zer_taken, zer_iff, dd_main_exit); set_loop(zer_taken, loop->_parent); @@ -1029,7 +1029,7 @@ // Find the pre-loop normal exit. Node* pre_exit = pre_end->proj_out(false); assert( pre_exit->Opcode() == Op_IfFalse, "" ); - IfFalseNode *new_pre_exit = new (C) IfFalseNode(pre_end); + IfFalseNode *new_pre_exit = new IfFalseNode(pre_end); _igvn.register_new_node_with_optimizer( new_pre_exit ); set_idom(new_pre_exit, pre_end, dd_main_head); set_loop(new_pre_exit, loop->_parent); @@ -1038,15 +1038,15 @@ // pre-loop, the main-loop may not execute at all. Later in life this // zero-trip guard will become the minimum-trip guard when we unroll // the main-loop. - Node *min_opaq = new (C) Opaque1Node(C, limit); - Node *min_cmp = new (C) CmpINode( pre_incr, min_opaq ); - Node *min_bol = new (C) BoolNode( min_cmp, b_test ); + Node *min_opaq = new Opaque1Node(C, limit); + Node *min_cmp = new CmpINode( pre_incr, min_opaq ); + Node *min_bol = new BoolNode( min_cmp, b_test ); register_new_node( min_opaq, new_pre_exit ); register_new_node( min_cmp , new_pre_exit ); register_new_node( min_bol , new_pre_exit ); // Build the IfNode (assume the main-loop is executed always). - IfNode *min_iff = new (C) IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN ); + IfNode *min_iff = new IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN ); _igvn.register_new_node_with_optimizer( min_iff ); set_idom(min_iff, new_pre_exit, dd_main_head); set_loop(min_iff, loop->_parent); @@ -1057,7 +1057,7 @@ set_idom(pre_exit, min_iff, dd_main_head); set_idom(pre_exit->unique_out(), min_iff, dd_main_head); // Make the true-path, must enter the main loop - Node *min_taken = new (C) IfTrueNode( min_iff ); + Node *min_taken = new IfTrueNode( min_iff ); _igvn.register_new_node_with_optimizer( min_taken ); set_idom(min_taken, min_iff, dd_main_head); set_loop(min_taken, loop->_parent); @@ -1087,11 +1087,11 @@ // RCE and alignment may change this later. Node *cmp_end = pre_end->cmp_node(); assert( cmp_end->in(2) == limit, "" ); - Node *pre_limit = new (C) AddINode( init, stride ); + Node *pre_limit = new AddINode( init, stride ); // Save the original loop limit in this Opaque1 node for // use by range check elimination. - Node *pre_opaq = new (C) Opaque1Node(C, pre_limit, limit); + Node *pre_opaq = new Opaque1Node(C, pre_limit, limit); register_new_node( pre_limit, pre_head->in(0) ); register_new_node( pre_opaq , pre_head->in(0) ); @@ -1116,19 +1116,19 @@ BoolTest::mask new_test = (main_end->stride_con() > 0) ? BoolTest::lt : BoolTest::gt; // Modify pre loop end condition Node* pre_bol = pre_end->in(CountedLoopEndNode::TestValue)->as_Bool(); - BoolNode* new_bol0 = new (C) BoolNode(pre_bol->in(1), new_test); + BoolNode* new_bol0 = new BoolNode(pre_bol->in(1), new_test); register_new_node( new_bol0, pre_head->in(0) ); _igvn.hash_delete(pre_end); pre_end->set_req(CountedLoopEndNode::TestValue, new_bol0); // Modify main loop guard condition assert(min_iff->in(CountedLoopEndNode::TestValue) == min_bol, "guard okay"); - BoolNode* new_bol1 = new (C) BoolNode(min_bol->in(1), new_test); + BoolNode* new_bol1 = new BoolNode(min_bol->in(1), new_test); register_new_node( new_bol1, new_pre_exit ); _igvn.hash_delete(min_iff); min_iff->set_req(CountedLoopEndNode::TestValue, new_bol1); // Modify main loop end condition BoolNode* main_bol = main_end->in(CountedLoopEndNode::TestValue)->as_Bool(); - BoolNode* new_bol2 = new (C) BoolNode(main_bol->in(1), new_test); + BoolNode* new_bol2 = new BoolNode(main_bol->in(1), new_test); register_new_node( new_bol2, main_end->in(CountedLoopEndNode::TestControl) ); _igvn.hash_delete(main_end); main_end->set_req(CountedLoopEndNode::TestValue, new_bol2); @@ -1279,13 +1279,13 @@ // zero trip guard limit will be different from loop limit. assert(has_ctrl(opaq), "should have it"); Node* opaq_ctrl = get_ctrl(opaq); - limit = new (C) Opaque2Node( C, limit ); + limit = new Opaque2Node( C, limit ); register_new_node( limit, opaq_ctrl ); } if (stride_con > 0 && ((limit_type->_lo - stride_con) < limit_type->_lo) || stride_con < 0 && ((limit_type->_hi - stride_con) > limit_type->_hi)) { // No underflow. - new_limit = new (C) SubINode(limit, stride); + new_limit = new SubINode(limit, stride); } else { // (limit - stride) may underflow. // Clamp the adjustment value with MININT or MAXINT: @@ -1315,18 +1315,18 @@ old_limit = bol->in(1)->in(1); // Adjust previous adjusted limit. adj_limit = limit->in(CMoveNode::IfFalse); - adj_limit = new (C) SubINode(adj_limit, stride); + adj_limit = new SubINode(adj_limit, stride); } else { old_limit = limit; - adj_limit = new (C) SubINode(limit, stride); + adj_limit = new SubINode(limit, stride); } assert(old_limit != NULL && adj_limit != NULL, ""); register_new_node( adj_limit, ctrl ); // adjust amount - Node* adj_cmp = new (C) CmpINode(old_limit, adj_limit); + Node* adj_cmp = new CmpINode(old_limit, adj_limit); register_new_node( adj_cmp, ctrl ); - Node* adj_bool = new (C) BoolNode(adj_cmp, bt); + Node* adj_bool = new BoolNode(adj_cmp, bt); register_new_node( adj_bool, ctrl ); - new_limit = new (C) CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT); + new_limit = new CMoveINode(adj_bool, adj_limit, adj_max, TypeInt::INT); } register_new_node(new_limit, ctrl); } @@ -1388,24 +1388,24 @@ // CountedLoop this is exact (stride divides limit-init exactly). // We are going to double the loop body, so we want to knock off any // odd iteration: (trip_cnt & ~1). Then back compute a new limit. - Node *span = new (C) SubINode( limit, init ); + Node *span = new SubINode( limit, init ); register_new_node( span, ctrl ); - Node *trip = new (C) DivINode( 0, span, stride ); + Node *trip = new DivINode( 0, span, stride ); register_new_node( trip, ctrl ); Node *mtwo = _igvn.intcon(-2); set_ctrl(mtwo, C->root()); - Node *rond = new (C) AndINode( trip, mtwo ); + Node *rond = new AndINode( trip, mtwo ); register_new_node( rond, ctrl ); - Node *spn2 = new (C) MulINode( rond, stride ); + Node *spn2 = new MulINode( rond, stride ); register_new_node( spn2, ctrl ); - new_limit = new (C) AddINode( spn2, init ); + new_limit = new AddINode( spn2, init ); register_new_node( new_limit, ctrl ); // Hammer in the new limit Node *ctrl2 = loop_end->in(0); - Node *cmp2 = new (C) CmpINode( loop_head->incr(), new_limit ); + Node *cmp2 = new CmpINode( loop_head->incr(), new_limit ); register_new_node( cmp2, ctrl2 ); - Node *bol2 = new (C) BoolNode( cmp2, loop_end->test_trip() ); + Node *bol2 = new BoolNode( cmp2, loop_end->test_trip() ); register_new_node( bol2, ctrl2 ); _igvn.hash_delete(loop_end); loop_end->set_req(CountedLoopEndNode::TestValue, bol2); @@ -1511,15 +1511,15 @@ // Helper function for add_constraint(). Node* PhaseIdealLoop::adjust_limit(int stride_con, Node * scale, Node *offset, Node *rc_limit, Node *loop_limit, Node *pre_ctrl) { // Compute "I :: (limit-offset)/scale" - Node *con = new (C) SubINode(rc_limit, offset); + Node *con = new SubINode(rc_limit, offset); register_new_node(con, pre_ctrl); - Node *X = new (C) DivINode(0, con, scale); + Node *X = new DivINode(0, con, scale); register_new_node(X, pre_ctrl); // Adjust loop limit loop_limit = (stride_con > 0) - ? (Node*)(new (C) MinINode(loop_limit, X)) - : (Node*)(new (C) MaxINode(loop_limit, X)); + ? (Node*)(new MinINode(loop_limit, X)) + : (Node*)(new MaxINode(loop_limit, X)); register_new_node(loop_limit, pre_ctrl); return loop_limit; } @@ -1580,9 +1580,9 @@ // to avoid problem with scale == -1 (min_int/(-1) == min_int). Node* shift = _igvn.intcon(31); set_ctrl(shift, C->root()); - Node* sign = new (C) RShiftINode(offset, shift); + Node* sign = new RShiftINode(offset, shift); register_new_node(sign, pre_ctrl); - offset = new (C) AndINode(offset, sign); + offset = new AndINode(offset, sign); register_new_node(offset, pre_ctrl); } else { assert(low_limit->get_int() == 0, "wrong low limit for range check"); @@ -1615,7 +1615,7 @@ Node *one = _igvn.intcon(1); set_ctrl(one, C->root()); - Node *plus_one = new (C) AddINode(offset, one); + Node *plus_one = new AddINode(offset, one); register_new_node( plus_one, pre_ctrl ); // Pass (-stride) to indicate pre_loop_cond = NOT(main_loop_cond); *pre_limit = adjust_limit((-stride_con), scale, plus_one, upper_limit, *pre_limit, pre_ctrl); @@ -1633,9 +1633,9 @@ // to avoid problem with scale == -1 (min_int/(-1) == min_int). Node* shift = _igvn.intcon(31); set_ctrl(shift, C->root()); - Node* sign = new (C) RShiftINode(plus_one, shift); + Node* sign = new RShiftINode(plus_one, shift); register_new_node(sign, pre_ctrl); - plus_one = new (C) AndINode(plus_one, sign); + plus_one = new AndINode(plus_one, sign); register_new_node(plus_one, pre_ctrl); } else { assert(low_limit->get_int() == 0, "wrong low limit for range check"); @@ -1718,7 +1718,7 @@ p_offset != NULL ? &offset2 : NULL, depth+1)) { if (p_offset != NULL) { Node *ctrl_off2 = get_ctrl(offset2); - Node* offset = new (C) AddINode(offset2, exp->in(2)); + Node* offset = new AddINode(offset2, exp->in(2)); register_new_node(offset, ctrl_off2); *p_offset = offset; } @@ -1731,7 +1731,7 @@ Node *zero = _igvn.intcon(0); set_ctrl(zero, C->root()); Node *ctrl_off = get_ctrl(exp->in(2)); - Node* offset = new (C) SubINode(zero, exp->in(2)); + Node* offset = new SubINode(zero, exp->in(2)); register_new_node(offset, ctrl_off); *p_offset = offset; } @@ -1934,15 +1934,15 @@ case BoolTest::ge: // Convert (I*scale+offset) >= Limit to (I*(-scale)+(-offset)) <= -Limit scale_con = -scale_con; - offset = new (C) SubINode( zero, offset ); + offset = new SubINode( zero, offset ); register_new_node( offset, pre_ctrl ); - limit = new (C) SubINode( zero, limit ); + limit = new SubINode( zero, limit ); register_new_node( limit, pre_ctrl ); // Fall into LE case case BoolTest::le: if (b_test._test != BoolTest::gt) { // Convert X <= Y to X < Y+1 - limit = new (C) AddINode( limit, one ); + limit = new AddINode( limit, one ); register_new_node( limit, pre_ctrl ); } // Fall into LT case @@ -1993,8 +1993,8 @@ // Update loop limits if (conditional_rc) { - pre_limit = (stride_con > 0) ? (Node*)new (C) MinINode(pre_limit, orig_limit) - : (Node*)new (C) MaxINode(pre_limit, orig_limit); + pre_limit = (stride_con > 0) ? (Node*)new MinINode(pre_limit, orig_limit) + : (Node*)new MaxINode(pre_limit, orig_limit); register_new_node(pre_limit, pre_ctrl); } _igvn.hash_delete(pre_opaq); @@ -2009,16 +2009,16 @@ Node *ctrl = get_ctrl(main_limit); Node *stride = cl->stride(); Node *init = cl->init_trip(); - Node *span = new (C) SubINode(main_limit,init); + Node *span = new SubINode(main_limit,init); register_new_node(span,ctrl); Node *rndup = _igvn.intcon(stride_con + ((stride_con>0)?-1:1)); - Node *add = new (C) AddINode(span,rndup); + Node *add = new AddINode(span,rndup); register_new_node(add,ctrl); - Node *div = new (C) DivINode(0,add,stride); + Node *div = new DivINode(0,add,stride); register_new_node(div,ctrl); - Node *mul = new (C) MulINode(div,stride); + Node *mul = new MulINode(div,stride); register_new_node(mul,ctrl); - Node *newlim = new (C) AddINode(mul,init); + Node *newlim = new AddINode(mul,init); register_new_node(newlim,ctrl); main_limit = newlim; } @@ -2189,7 +2189,7 @@ } // Note: the final value after increment should not overflow since // counted loop has limit check predicate. - Node *final = new (phase->C) SubINode( exact_limit, cl->stride() ); + Node *final = new SubINode( exact_limit, cl->stride() ); phase->register_new_node(final,cl->in(LoopNode::EntryControl)); phase->_igvn.replace_node(phi,final); phase->C->set_major_progress(); @@ -2676,20 +2676,20 @@ // Build an expression for the beginning of the copy region Node* index = head->init_trip(); #ifdef _LP64 - index = new (C) ConvI2LNode(index); + index = new ConvI2LNode(index); _igvn.register_new_node_with_optimizer(index); #endif if (shift != NULL) { // byte arrays don't require a shift but others do. - index = new (C) LShiftXNode(index, shift->in(2)); + index = new LShiftXNode(index, shift->in(2)); _igvn.register_new_node_with_optimizer(index); } - index = new (C) AddPNode(base, base, index); + index = new AddPNode(base, base, index); _igvn.register_new_node_with_optimizer(index); - Node* from = new (C) AddPNode(base, index, offset); + Node* from = new AddPNode(base, index, offset); _igvn.register_new_node_with_optimizer(from); // Compute the number of elements to copy - Node* len = new (C) SubINode(head->limit(), head->init_trip()); + Node* len = new SubINode(head->limit(), head->init_trip()); _igvn.register_new_node_with_optimizer(len); BasicType t = store->as_Mem()->memory_type(); @@ -2706,17 +2706,17 @@ // Convert float/double to int/long for fill routines if (t == T_FLOAT) { - store_value = new (C) MoveF2INode(store_value); + store_value = new MoveF2INode(store_value); _igvn.register_new_node_with_optimizer(store_value); } else if (t == T_DOUBLE) { - store_value = new (C) MoveD2LNode(store_value); + store_value = new MoveD2LNode(store_value); _igvn.register_new_node_with_optimizer(store_value); } if (CCallingConventionRequiresIntsAsLongs && // See StubRoutines::select_fill_function for types. FLOAT has been converted to INT. (t == T_FLOAT || t == T_INT || is_subword_type(t))) { - store_value = new (C) ConvI2LNode(store_value); + store_value = new ConvI2LNode(store_value); _igvn.register_new_node_with_optimizer(store_value); } @@ -2724,8 +2724,8 @@ Node* result_ctrl; Node* result_mem; const TypeFunc* call_type = OptoRuntime::array_fill_Type(); - CallLeafNode *call = new (C) CallLeafNoFPNode(call_type, fill, - fill_name, TypeAryPtr::get_array_body_type(t)); + CallLeafNode *call = new CallLeafNoFPNode(call_type, fill, + fill_name, TypeAryPtr::get_array_body_type(t)); uint cnt = 0; call->init_req(TypeFunc::Parms + cnt++, from); call->init_req(TypeFunc::Parms + cnt++, store_value); @@ -2733,7 +2733,7 @@ call->init_req(TypeFunc::Parms + cnt++, C->top()); } #ifdef _LP64 - len = new (C) ConvI2LNode(len); + len = new ConvI2LNode(len); _igvn.register_new_node_with_optimizer(len); #endif call->init_req(TypeFunc::Parms + cnt++, len); @@ -2746,9 +2746,9 @@ call->init_req(TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr)); call->init_req(TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr)); _igvn.register_new_node_with_optimizer(call); - result_ctrl = new (C) ProjNode(call,TypeFunc::Control); + result_ctrl = new ProjNode(call,TypeFunc::Control); _igvn.register_new_node_with_optimizer(result_ctrl); - result_mem = new (C) ProjNode(call,TypeFunc::Memory); + result_mem = new ProjNode(call,TypeFunc::Memory); _igvn.register_new_node_with_optimizer(result_mem); /* Disable following optimization until proper fix (add missing checks). diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/loopUnswitch.cpp --- a/hotspot/src/share/vm/opto/loopUnswitch.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -225,15 +225,15 @@ Node *cont = _igvn.intcon(1); set_ctrl(cont, C->root()); - Node* opq = new (C) Opaque1Node(C, cont); + Node* opq = new Opaque1Node(C, cont); register_node(opq, outer_loop, entry, dom_depth(entry)); - Node *bol = new (C) Conv2BNode(opq); + Node *bol = new Conv2BNode(opq); register_node(bol, outer_loop, entry, dom_depth(entry)); - IfNode* iff = new (C) IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN); + IfNode* iff = new IfNode(entry, bol, PROB_MAX, COUNT_UNKNOWN); register_node(iff, outer_loop, entry, dom_depth(entry)); - ProjNode* iffast = new (C) IfTrueNode(iff); + ProjNode* iffast = new IfTrueNode(iff); register_node(iffast, outer_loop, iff, dom_depth(iff)); - ProjNode* ifslow = new (C) IfFalseNode(iff); + ProjNode* ifslow = new IfFalseNode(iff); register_node(ifslow, outer_loop, iff, dom_depth(iff)); // Clone the loop body. The clone becomes the fast loop. The diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/loopnode.cpp --- a/hotspot/src/share/vm/opto/loopnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/loopnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -443,7 +443,7 @@ assert(x->Opcode() == Op_Loop, "regular loops only"); C->print_method(PHASE_BEFORE_CLOOPS, 3); - Node *hook = new (C) Node(6); + Node *hook = new Node(6); if (LoopLimitCheck) { @@ -506,11 +506,11 @@ Node* bol; if (stride_con > 0) { - cmp_limit = new (C) CmpINode(limit, _igvn.intcon(max_jint - stride_m)); - bol = new (C) BoolNode(cmp_limit, BoolTest::le); + cmp_limit = new CmpINode(limit, _igvn.intcon(max_jint - stride_m)); + bol = new BoolNode(cmp_limit, BoolTest::le); } else { - cmp_limit = new (C) CmpINode(limit, _igvn.intcon(min_jint - stride_m)); - bol = new (C) BoolNode(cmp_limit, BoolTest::ge); + cmp_limit = new CmpINode(limit, _igvn.intcon(min_jint - stride_m)); + bol = new BoolNode(cmp_limit, BoolTest::ge); } cmp_limit = _igvn.register_new_node_with_optimizer(cmp_limit); bol = _igvn.register_new_node_with_optimizer(bol); @@ -547,7 +547,7 @@ // is converted to // i = init; do {} while(++i < limit+1); // - limit = gvn->transform(new (C) AddINode(limit, stride)); + limit = gvn->transform(new AddINode(limit, stride)); } // Now we need to canonicalize loop condition. @@ -566,7 +566,7 @@ // we can convert 'i <= limit' to 'i < limit+1' since stride != 0. // Node* one = (stride_con > 0) ? gvn->intcon( 1) : gvn->intcon(-1); - limit = gvn->transform(new (C) AddINode(limit, one)); + limit = gvn->transform(new AddINode(limit, one)); if (bt == BoolTest::le) bt = BoolTest::lt; else if (bt == BoolTest::ge) @@ -582,7 +582,7 @@ // can directly point to the phi; in this case adjust the compare so that // it points to the incr by adjusting the limit. if (cmp->in(1) == phi || cmp->in(2) == phi) - limit = gvn->transform(new (C) AddINode(limit,stride)); + limit = gvn->transform(new AddINode(limit,stride)); // trip-count for +-tive stride should be: (limit - init_trip + stride - 1)/stride. // Final value for iterator should be: trip_count * stride + init_trip. @@ -595,16 +595,16 @@ ShouldNotReachHere(); case BoolTest::ne: // Ahh, the case we desire if (stride_con == 1) - trip_count = gvn->transform(new (C) SubINode(limit,init_trip)); + trip_count = gvn->transform(new SubINode(limit,init_trip)); else if (stride_con == -1) - trip_count = gvn->transform(new (C) SubINode(init_trip,limit)); + trip_count = gvn->transform(new SubINode(init_trip,limit)); else ShouldNotReachHere(); set_subtree_ctrl(trip_count); //_loop.map(trip_count->_idx,loop(limit)); break; case BoolTest::le: // Maybe convert to '<' case - limit = gvn->transform(new (C) AddINode(limit,one_p)); + limit = gvn->transform(new AddINode(limit,one_p)); set_subtree_ctrl( limit ); hook->init_req(4, limit); @@ -615,26 +615,26 @@ case BoolTest::lt: { // Maybe convert to '!=' case if (stride_con < 0) // Count down loop rolls through MAXINT ShouldNotReachHere(); - Node *range = gvn->transform(new (C) SubINode(limit,init_trip)); + Node *range = gvn->transform(new SubINode(limit,init_trip)); set_subtree_ctrl( range ); hook->init_req(0, range); - Node *bias = gvn->transform(new (C) AddINode(range,stride)); + Node *bias = gvn->transform(new AddINode(range,stride)); set_subtree_ctrl( bias ); hook->init_req(1, bias); - Node *bias1 = gvn->transform(new (C) AddINode(bias,one_m)); + Node *bias1 = gvn->transform(new AddINode(bias,one_m)); set_subtree_ctrl( bias1 ); hook->init_req(2, bias1); - trip_count = gvn->transform(new (C) DivINode(0,bias1,stride)); + trip_count = gvn->transform(new DivINode(0,bias1,stride)); set_subtree_ctrl( trip_count ); hook->init_req(3, trip_count); break; } case BoolTest::ge: // Maybe convert to '>' case - limit = gvn->transform(new (C) AddINode(limit,one_m)); + limit = gvn->transform(new AddINode(limit,one_m)); set_subtree_ctrl( limit ); hook->init_req(4 ,limit); @@ -645,30 +645,30 @@ case BoolTest::gt: { // Maybe convert to '!=' case if (stride_con > 0) // count up loop rolls through MININT ShouldNotReachHere(); - Node *range = gvn->transform(new (C) SubINode(limit,init_trip)); + Node *range = gvn->transform(new SubINode(limit,init_trip)); set_subtree_ctrl( range ); hook->init_req(0, range); - Node *bias = gvn->transform(new (C) AddINode(range,stride)); + Node *bias = gvn->transform(new AddINode(range,stride)); set_subtree_ctrl( bias ); hook->init_req(1, bias); - Node *bias1 = gvn->transform(new (C) AddINode(bias,one_p)); + Node *bias1 = gvn->transform(new AddINode(bias,one_p)); set_subtree_ctrl( bias1 ); hook->init_req(2, bias1); - trip_count = gvn->transform(new (C) DivINode(0,bias1,stride)); + trip_count = gvn->transform(new DivINode(0,bias1,stride)); set_subtree_ctrl( trip_count ); hook->init_req(3, trip_count); break; } } // switch( bt ) - Node *span = gvn->transform(new (C) MulINode(trip_count,stride)); + Node *span = gvn->transform(new MulINode(trip_count,stride)); set_subtree_ctrl( span ); hook->init_req(5, span); - limit = gvn->transform(new (C) AddINode(span,init_trip)); + limit = gvn->transform(new AddINode(span,init_trip)); set_subtree_ctrl( limit ); } // LoopLimitCheck @@ -717,7 +717,7 @@ set_ctrl(test, iff->in(0)); // Replace the old IfNode with a new LoopEndNode - Node *lex = _igvn.register_new_node_with_optimizer(new (C) CountedLoopEndNode( iff->in(0), test, cl_prob, iff->as_If()->_fcnt )); + Node *lex = _igvn.register_new_node_with_optimizer(new CountedLoopEndNode( iff->in(0), test, cl_prob, iff->as_If()->_fcnt )); IfNode *le = lex->as_If(); uint dd = dom_depth(iff); set_idom(le, le->in(0), dd); // Update dominance for loop exit @@ -728,8 +728,8 @@ // Need to swap loop-exit and loop-back control? if (iftrue_op == Op_IfFalse) { - Node *ift2=_igvn.register_new_node_with_optimizer(new (C) IfTrueNode (le)); - Node *iff2=_igvn.register_new_node_with_optimizer(new (C) IfFalseNode(le)); + Node *ift2=_igvn.register_new_node_with_optimizer(new IfTrueNode (le)); + Node *iff2=_igvn.register_new_node_with_optimizer(new IfFalseNode(le)); loop->_tail = back_control = ift2; set_loop(ift2, loop); @@ -755,7 +755,7 @@ lazy_replace( iff, le ); // fix 'get_ctrl' // Now setup a new CountedLoopNode to replace the existing LoopNode - CountedLoopNode *l = new (C) CountedLoopNode(init_control, back_control); + CountedLoopNode *l = new CountedLoopNode(init_control, back_control); l->set_unswitch_count(x->as_Loop()->unswitch_count()); // Preserve // The following assert is approximately true, and defines the intention // of can_be_counted_loop. It fails, however, because phase->type @@ -829,7 +829,7 @@ limit = _igvn.intcon(final_int); } else { // Create new LoopLimit node to get exact limit (final iv value). - limit = new (C) LoopLimitNode(C, cl->init_trip(), cl->limit(), cl->stride()); + limit = new LoopLimitNode(C, cl->init_trip(), cl->limit(), cl->stride()); register_new_node(limit, cl->in(LoopNode::EntryControl)); } assert(limit != NULL, "sanity"); @@ -946,11 +946,11 @@ if (range <= max) { // Convert to integer expression if it is not overflow. Node* stride_m = phase->intcon(stride_con - (stride_con > 0 ? 1 : -1)); - Node *range = phase->transform(new (phase->C) SubINode(in(Limit), in(Init))); - Node *bias = phase->transform(new (phase->C) AddINode(range, stride_m)); - Node *trip = phase->transform(new (phase->C) DivINode(0, bias, in(Stride))); - Node *span = phase->transform(new (phase->C) MulINode(trip, in(Stride))); - return new (phase->C) AddINode(span, in(Init)); // exact limit + Node *range = phase->transform(new SubINode(in(Limit), in(Init))); + Node *bias = phase->transform(new AddINode(range, stride_m)); + Node *trip = phase->transform(new DivINode(0, bias, in(Stride))); + Node *span = phase->transform(new MulINode(trip, in(Stride))); + return new AddINode(span, in(Init)); // exact limit } if (is_power_of_2(stride_p) || // divisor is 2^n @@ -958,13 +958,13 @@ // Convert to long expression to avoid integer overflow // and let igvn optimizer convert this division. // - Node* init = phase->transform( new (phase->C) ConvI2LNode(in(Init))); - Node* limit = phase->transform( new (phase->C) ConvI2LNode(in(Limit))); + Node* init = phase->transform( new ConvI2LNode(in(Init))); + Node* limit = phase->transform( new ConvI2LNode(in(Limit))); Node* stride = phase->longcon(stride_con); Node* stride_m = phase->longcon(stride_con - (stride_con > 0 ? 1 : -1)); - Node *range = phase->transform(new (phase->C) SubLNode(limit, init)); - Node *bias = phase->transform(new (phase->C) AddLNode(range, stride_m)); + Node *range = phase->transform(new SubLNode(limit, init)); + Node *bias = phase->transform(new AddLNode(range, stride_m)); Node *span; if (stride_con > 0 && is_power_of_2(stride_p)) { // bias >= 0 if stride >0, so if stride is 2^n we can use &(-stride) @@ -975,14 +975,14 @@ // only RCE predicate where exact limit is used and the predicate // will simply fail forcing recompilation. Node* neg_stride = phase->longcon(-stride_con); - span = phase->transform(new (phase->C) AndLNode(bias, neg_stride)); + span = phase->transform(new AndLNode(bias, neg_stride)); } else { - Node *trip = phase->transform(new (phase->C) DivLNode(0, bias, stride)); - span = phase->transform(new (phase->C) MulLNode(trip, stride)); + Node *trip = phase->transform(new DivLNode(0, bias, stride)); + span = phase->transform(new MulLNode(trip, stride)); } // Convert back to int - Node *span_int = phase->transform(new (phase->C) ConvL2INode(span)); - return new (phase->C) AddINode(span_int, in(Init)); // exact limit + Node *span_int = phase->transform(new ConvL2INode(span)); + return new AddINode(span_int, in(Init)); // exact limit } return NULL; // No progress @@ -1188,7 +1188,7 @@ uint i; // Make a new RegionNode to be the landing pad. - Node *landing_pad = new (phase->C) RegionNode( fall_in_cnt+1 ); + Node *landing_pad = new RegionNode( fall_in_cnt+1 ); phase->set_loop(landing_pad,_parent); // Gather all the fall-in control paths into the landing pad uint icnt = fall_in_cnt; @@ -1274,7 +1274,7 @@ // Make a LoopNode for the outermost loop. Node *ctl = _head->in(LoopNode::EntryControl); - Node *outer = new (phase->C) LoopNode( ctl, _head->in(outer_idx) ); + Node *outer = new LoopNode( ctl, _head->in(outer_idx) ); outer = igvn.register_new_node_with_optimizer(outer, _head); phase->set_created_loop_node(); @@ -1388,7 +1388,7 @@ Node *hot_tail = NULL; // Make a Region for the merge point - Node *r = new (phase->C) RegionNode(1); + Node *r = new RegionNode(1); for( i = 2; i < _head->req(); i++ ) { if( i != hot_idx ) r->add_req( _head->in(i) ); @@ -1407,7 +1407,7 @@ PhiNode* n = out->as_Phi(); igvn.hash_delete(n); // Delete from hash before hacking edges Node *hot_phi = NULL; - Node *phi = new (phase->C) PhiNode(r, n->type(), n->adr_type()); + Node *phi = new PhiNode(r, n->type(), n->adr_type()); // Check all inputs for the ones to peel out uint j = 1; for( uint i = 2; i < n->req(); i++ ) { @@ -1529,7 +1529,7 @@ } else if (!_head->is_Loop() && !_irreducible) { // Make a new LoopNode to replace the old loop head - Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) ); + Node *l = new LoopNode( _head->in(1), _head->in(2) ); l = igvn.register_new_node_with_optimizer(l, _head); phase->set_created_loop_node(); // Go ahead and replace _head @@ -1771,16 +1771,16 @@ // It is scaled by the 'ratio_con'. Node* ratio = _igvn.intcon(ratio_con); set_ctrl(ratio, C->root()); - Node* ratio_init = new (C) MulINode(init, ratio); + Node* ratio_init = new MulINode(init, ratio); _igvn.register_new_node_with_optimizer(ratio_init, init); set_early_ctrl(ratio_init); - Node* diff = new (C) SubINode(init2, ratio_init); + Node* diff = new SubINode(init2, ratio_init); _igvn.register_new_node_with_optimizer(diff, init2); set_early_ctrl(diff); - Node* ratio_idx = new (C) MulINode(phi, ratio); + Node* ratio_idx = new MulINode(phi, ratio); _igvn.register_new_node_with_optimizer(ratio_idx, phi); set_ctrl(ratio_idx, cl); - Node* add = new (C) AddINode(ratio_idx, diff); + Node* add = new AddINode(ratio_idx, diff); _igvn.register_new_node_with_optimizer(add); set_ctrl(add, cl); _igvn.replace_node( phi2, add ); @@ -2888,10 +2888,10 @@ if (!_verify_only) { // Insert the NeverBranch between 'm' and it's control user. - NeverBranchNode *iff = new (C) NeverBranchNode( m ); + NeverBranchNode *iff = new NeverBranchNode( m ); _igvn.register_new_node_with_optimizer(iff); set_loop(iff, l); - Node *if_t = new (C) CProjNode( iff, 0 ); + Node *if_t = new CProjNode( iff, 0 ); _igvn.register_new_node_with_optimizer(if_t); set_loop(if_t, l); @@ -2907,16 +2907,16 @@ cfg->set_req( k, if_t ); // Now point to NeverBranch // Now create the never-taken loop exit - Node *if_f = new (C) CProjNode( iff, 1 ); + Node *if_f = new CProjNode( iff, 1 ); _igvn.register_new_node_with_optimizer(if_f); set_loop(if_f, l); // Find frame ptr for Halt. Relies on the optimizer // V-N'ing. Easier and quicker than searching through // the program structure. - Node *frame = new (C) ParmNode( C->start(), TypeFunc::FramePtr ); + Node *frame = new ParmNode( C->start(), TypeFunc::FramePtr ); _igvn.register_new_node_with_optimizer(frame); // Halt & Catch Fire - Node *halt = new (C) HaltNode( if_f, frame ); + Node *halt = new HaltNode( if_f, frame ); _igvn.register_new_node_with_optimizer(halt); set_loop(halt, l); C->root()->add_req(halt); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/loopopts.cpp --- a/hotspot/src/share/vm/opto/loopopts.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/loopopts.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -56,7 +56,7 @@ int iid = t_oop->instance_id(); int index = C->get_alias_index(t_oop); int offset = t_oop->offset(); - phi = new (C) PhiNode(region, type, NULL, iid, index, offset); + phi = new PhiNode(region, type, NULL, iid, index, offset); } else { phi = PhiNode::make_blank(region, n); } @@ -363,9 +363,9 @@ _igvn.type( add->in(1) ) != TypeInt::ZERO ) { Node *zero = _igvn.intcon(0); set_ctrl(zero, C->root()); - Node *neg = new (C) SubINode( _igvn.intcon(0), add->in(2) ); + Node *neg = new SubINode( _igvn.intcon(0), add->in(2) ); register_new_node( neg, get_ctrl(add->in(2) ) ); - add = new (C) AddINode( add->in(1), neg ); + add = new AddINode( add->in(1), neg ); register_new_node( add, add_ctrl ); } if( add->Opcode() != Op_AddI ) return NULL; @@ -391,14 +391,14 @@ return NULL; // No invariant part of the add? // Yes! Reshape address expression! - Node *inv_scale = new (C) LShiftINode( add_invar, scale ); + Node *inv_scale = new LShiftINode( add_invar, scale ); Node *inv_scale_ctrl = dom_depth(add_invar_ctrl) > dom_depth(scale_ctrl) ? add_invar_ctrl : scale_ctrl; register_new_node( inv_scale, inv_scale_ctrl ); - Node *var_scale = new (C) LShiftINode( add_var, scale ); + Node *var_scale = new LShiftINode( add_var, scale ); register_new_node( var_scale, n_ctrl ); - Node *var_add = new (C) AddINode( var_scale, inv_scale ); + Node *var_add = new AddINode( var_scale, inv_scale ); register_new_node( var_add, n_ctrl ); _igvn.replace_node( n, var_add ); return var_add; @@ -430,10 +430,10 @@ IdealLoopTree *n23_loop = get_loop( n23_ctrl ); if( n22loop != n_loop && n22loop->is_member(n_loop) && n23_loop == n_loop ) { - Node *add1 = new (C) AddPNode( n->in(1), n->in(2)->in(2), n->in(3) ); + Node *add1 = new AddPNode( n->in(1), n->in(2)->in(2), n->in(3) ); // Stuff new AddP in the loop preheader register_new_node( add1, n_loop->_head->in(LoopNode::EntryControl) ); - Node *add2 = new (C) AddPNode( n->in(1), add1, n->in(2)->in(3) ); + Node *add2 = new AddPNode( n->in(1), add1, n->in(2)->in(3) ); register_new_node( add2, n_ctrl ); _igvn.replace_node( n, add2 ); return add2; @@ -451,10 +451,10 @@ Node *tmp = V; V = I; I = tmp; } if( !is_member(n_loop,get_ctrl(I)) ) { - Node *add1 = new (C) AddPNode( n->in(1), n->in(2), I ); + Node *add1 = new AddPNode( n->in(1), n->in(2), I ); // Stuff new AddP in the loop preheader register_new_node( add1, n_loop->_head->in(LoopNode::EntryControl) ); - Node *add2 = new (C) AddPNode( n->in(1), add1, V ); + Node *add2 = new AddPNode( n->in(1), add1, V ); register_new_node( add2, n_ctrl ); _igvn.replace_node( n, add2 ); return add2; @@ -1104,8 +1104,8 @@ Node *sample_cmp = sample_bool->in(1); // Make Phis to merge the Cmp's inputs. - PhiNode *phi1 = new (C) PhiNode( phi->in(0), Type::TOP ); - PhiNode *phi2 = new (C) PhiNode( phi->in(0), Type::TOP ); + PhiNode *phi1 = new PhiNode( phi->in(0), Type::TOP ); + PhiNode *phi2 = new PhiNode( phi->in(0), Type::TOP ); for( i = 1; i < phi->req(); i++ ) { Node *n1 = phi->in(i)->in(1)->in(1); Node *n2 = phi->in(i)->in(1)->in(2); @@ -1172,8 +1172,8 @@ Node *sample_cmp = phi->in(1); // Make Phis to merge the Cmp's inputs. - PhiNode *phi1 = new (C) PhiNode( phi->in(0), Type::TOP ); - PhiNode *phi2 = new (C) PhiNode( phi->in(0), Type::TOP ); + PhiNode *phi1 = new PhiNode( phi->in(0), Type::TOP ); + PhiNode *phi2 = new PhiNode( phi->in(0), Type::TOP ); for( uint j = 1; j < phi->req(); j++ ) { Node *cmp_top = phi->in(j); // Inputs are all Cmp or TOP Node *n1, *n2; @@ -1337,7 +1337,7 @@ // We need a Region to merge the exit from the peeled body and the // exit from the old loop body. - RegionNode *r = new (C) RegionNode(3); + RegionNode *r = new RegionNode(3); // Map the old use to the new merge point old_new.map( use->_idx, r ); uint dd_r = MIN2(dom_depth(newuse),dom_depth(use)); @@ -1403,7 +1403,8 @@ // loop. Happens if people set a loop-exit flag; then test the flag // in the loop to break the loop, then test is again outside of the // loop to determine which way the loop exited. - if( use->is_If() || use->is_CMove() ) { + // Loop predicate If node connects to Bool node through Opaque1 node. + if (use->is_If() || use->is_CMove() || C->is_predicate_opaq(use)) { // Since this code is highly unlikely, we lazily build the worklist // of such Nodes to go split. if( !split_if_set ) @@ -1684,13 +1685,13 @@ ProjNode* proj2 = proj_clone(proj, iff); register_node(proj2, loop, iff, ddepth); - Node* cmp = Signed ? (Node*) new (C)CmpINode(left, right) : (Node*) new (C)CmpUNode(left, right); + Node* cmp = Signed ? (Node*) new CmpINode(left, right) : (Node*) new CmpUNode(left, right); register_node(cmp, loop, proj2, ddepth); - BoolNode* bol = new (C)BoolNode(cmp, relop); + BoolNode* bol = new BoolNode(cmp, relop); register_node(bol, loop, proj2, ddepth); - IfNode* new_if = new (C)IfNode(proj2, bol, iff->_prob, iff->_fcnt); + IfNode* new_if = new IfNode(proj2, bol, iff->_prob, iff->_fcnt); register_node(new_if, loop, proj2, ddepth); proj->set_req(0, new_if); // reattach @@ -1742,11 +1743,11 @@ ProjNode* proj2 = proj_clone(proj, iff); register_node(proj2, loop, iff, ddepth); - RegionNode* reg = new (C)RegionNode(2); + RegionNode* reg = new RegionNode(2); reg->set_req(1, proj2); register_node(reg, loop, iff, ddepth); - IfNode* dum_if = new (C)IfNode(reg, short_circuit_if(NULL, proj), iff->_prob, iff->_fcnt); + IfNode* dum_if = new IfNode(reg, short_circuit_if(NULL, proj), iff->_prob, iff->_fcnt); register_node(dum_if, loop, reg, ddepth); proj->set_req(0, dum_if); // reattach @@ -2569,7 +2570,7 @@ // Create new loop head for new phis and to hang // the nodes being moved (sinked) from the peel region. - LoopNode* new_head = new (C) LoopNode(last_peel, last_peel); + LoopNode* new_head = new LoopNode(last_peel, last_peel); new_head->set_unswitch_count(head->unswitch_count()); // Preserve _igvn.register_new_node_with_optimizer(new_head); assert(first_not_peeled->in(0) == last_peel, "last_peel <- first_not_peeled"); @@ -2769,12 +2770,12 @@ if (dom_lca(exit, u_ctrl) != exit) continue; // Hit! Refactor use to use the post-incremented tripcounter. // Compute a post-increment tripcounter. - Node *opaq = new (C) Opaque2Node( C, cle->incr() ); - register_new_node( opaq, u_ctrl ); + Node *opaq = new Opaque2Node( C, cle->incr() ); + register_new_node(opaq, exit); Node *neg_stride = _igvn.intcon(-cle->stride_con()); set_ctrl(neg_stride, C->root()); - Node *post = new (C) AddINode( opaq, neg_stride); - register_new_node( post, u_ctrl ); + Node *post = new AddINode( opaq, neg_stride); + register_new_node(post, exit); _igvn.rehash_node_delayed(use); for (uint j = 1; j < use->req(); j++) { if (use->in(j) == phi) diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/machnode.hpp --- a/hotspot/src/share/vm/opto/machnode.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/machnode.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -60,7 +60,10 @@ class MachOper : public ResourceObj { public: // Allocate right next to the MachNodes in the same arena - void *operator new( size_t x, Compile* C ) throw() { return C->node_arena()->Amalloc_D(x); } + void *operator new(size_t x) throw() { + Compile* C = Compile::current(); + return C->node_arena()->Amalloc_D(x); + } // Opcode virtual uint opcode() const = 0; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/macro.cpp --- a/hotspot/src/share/vm/opto/macro.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/macro.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -108,20 +108,20 @@ Node* PhaseMacroExpand::opt_bits_test(Node* ctrl, Node* region, int edge, Node* word, int mask, int bits, bool return_fast_path) { Node* cmp; if (mask != 0) { - Node* and_node = transform_later(new (C) AndXNode(word, MakeConX(mask))); - cmp = transform_later(new (C) CmpXNode(and_node, MakeConX(bits))); + Node* and_node = transform_later(new AndXNode(word, MakeConX(mask))); + cmp = transform_later(new CmpXNode(and_node, MakeConX(bits))); } else { cmp = word; } - Node* bol = transform_later(new (C) BoolNode(cmp, BoolTest::ne)); - IfNode* iff = new (C) IfNode( ctrl, bol, PROB_MIN, COUNT_UNKNOWN ); + Node* bol = transform_later(new BoolNode(cmp, BoolTest::ne)); + IfNode* iff = new IfNode( ctrl, bol, PROB_MIN, COUNT_UNKNOWN ); transform_later(iff); // Fast path taken. - Node *fast_taken = transform_later( new (C) IfFalseNode(iff) ); + Node *fast_taken = transform_later(new IfFalseNode(iff)); // Fast path not-taken, i.e. slow path - Node *slow_taken = transform_later( new (C) IfTrueNode(iff) ); + Node *slow_taken = transform_later(new IfTrueNode(iff)); if (return_fast_path) { region->init_req(edge, slow_taken); // Capture slow-control @@ -147,8 +147,8 @@ // Slow-path call CallNode *call = leaf_name - ? (CallNode*)new (C) CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM ) - : (CallNode*)new (C) CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM ); + ? (CallNode*)new CallLeafNode ( slow_call_type, slow_call, leaf_name, TypeRawPtr::BOTTOM ) + : (CallNode*)new CallStaticJavaNode( slow_call_type, slow_call, OptoRuntime::stub_name(slow_call), oldcall->jvms()->bci(), TypeRawPtr::BOTTOM ); // Slow path call has no side-effects, uses few values copy_predefined_input_for_runtime_call(slow_path, oldcall, call ); @@ -423,7 +423,7 @@ GrowableArray values(length, length, NULL, false); // create a new Phi for the value - PhiNode *phi = new (C) PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset); + PhiNode *phi = new PhiNode(mem->in(0), phi_type, NULL, instance_id, alias_idx, offset); transform_later(phi); value_phis->push(phi, mem->_idx); @@ -735,7 +735,7 @@ // of regular debuginfo at the last (youngest) JVMS. // Record relative start index. uint first_ind = (sfpt->req() - sfpt->jvms()->scloff()); - SafePointScalarObjectNode* sobj = new (C) SafePointScalarObjectNode(res_type, + SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(res_type, #ifdef ASSERT alloc, #endif @@ -843,7 +843,7 @@ if (field_val->is_EncodeP()) { field_val = field_val->in(1); } else { - field_val = transform_later(new (C) DecodeNNode(field_val, field_val->get_ptr_type())); + field_val = transform_later(new DecodeNNode(field_val, field_val->get_ptr_type())); } } sfpt->add_req(field_val); @@ -1069,7 +1069,7 @@ //---------------------------set_eden_pointers------------------------- void PhaseMacroExpand::set_eden_pointers(Node* &eden_top_adr, Node* &eden_end_adr) { if (UseTLAB) { // Private allocation: load from TLS - Node* thread = transform_later(new (C) ThreadLocalNode()); + Node* thread = transform_later(new ThreadLocalNode()); int tlab_top_offset = in_bytes(JavaThread::tlab_top_offset()); int tlab_end_offset = in_bytes(JavaThread::tlab_end_offset()); eden_top_adr = basic_plus_adr(top()/*not oop*/, thread, tlab_top_offset); @@ -1205,18 +1205,18 @@ assert (initial_slow_test == NULL || !always_slow, "arguments must be consistent"); // generate the initial test if necessary if (initial_slow_test != NULL ) { - slow_region = new (C) RegionNode(3); + slow_region = new RegionNode(3); // Now make the initial failure test. Usually a too-big test but // might be a TRUE for finalizers or a fancy class check for // newInstance0. - IfNode *toobig_iff = new (C) IfNode(ctrl, initial_slow_test, PROB_MIN, COUNT_UNKNOWN); + IfNode *toobig_iff = new IfNode(ctrl, initial_slow_test, PROB_MIN, COUNT_UNKNOWN); transform_later(toobig_iff); // Plug the failing-too-big test into the slow-path region - Node *toobig_true = new (C) IfTrueNode( toobig_iff ); + Node *toobig_true = new IfTrueNode( toobig_iff ); transform_later(toobig_true); slow_region ->init_req( too_big_or_final_path, toobig_true ); - toobig_false = new (C) IfFalseNode( toobig_iff ); + toobig_false = new IfFalseNode( toobig_iff ); transform_later(toobig_false); } else { // No initial test, just fall into next case toobig_false = ctrl; @@ -1249,10 +1249,10 @@ Node *eden_end = make_load(ctrl, mem, eden_end_adr, 0, TypeRawPtr::BOTTOM, T_ADDRESS); // allocate the Region and Phi nodes for the result - result_region = new (C) RegionNode(3); - result_phi_rawmem = new (C) PhiNode(result_region, Type::MEMORY, TypeRawPtr::BOTTOM); - result_phi_rawoop = new (C) PhiNode(result_region, TypeRawPtr::BOTTOM); - result_phi_i_o = new (C) PhiNode(result_region, Type::ABIO); // I/O is used for Prefetch + result_region = new RegionNode(3); + result_phi_rawmem = new PhiNode(result_region, Type::MEMORY, TypeRawPtr::BOTTOM); + result_phi_rawoop = new PhiNode(result_region, TypeRawPtr::BOTTOM); + result_phi_i_o = new PhiNode(result_region, Type::ABIO); // I/O is used for Prefetch // We need a Region for the loop-back contended case. enum { fall_in_path = 1, contended_loopback_path = 2 }; @@ -1262,8 +1262,8 @@ contended_region = toobig_false; contended_phi_rawmem = mem; } else { - contended_region = new (C) RegionNode(3); - contended_phi_rawmem = new (C) PhiNode(contended_region, Type::MEMORY, TypeRawPtr::BOTTOM); + contended_region = new RegionNode(3); + contended_phi_rawmem = new PhiNode(contended_region, Type::MEMORY, TypeRawPtr::BOTTOM); // Now handle the passing-too-big test. We fall into the contended // loop-back merge point. contended_region ->init_req(fall_in_path, toobig_false); @@ -1275,23 +1275,23 @@ // Load(-locked) the heap top. // See note above concerning the control input when using a TLAB Node *old_eden_top = UseTLAB - ? new (C) LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered) - : new (C) LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire); + ? new LoadPNode (ctrl, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered) + : new LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr, MemNode::acquire); transform_later(old_eden_top); // Add to heap top to get a new heap top - Node *new_eden_top = new (C) AddPNode(top(), old_eden_top, size_in_bytes); + Node *new_eden_top = new AddPNode(top(), old_eden_top, size_in_bytes); transform_later(new_eden_top); // Check for needing a GC; compare against heap end - Node *needgc_cmp = new (C) CmpPNode(new_eden_top, eden_end); + Node *needgc_cmp = new CmpPNode(new_eden_top, eden_end); transform_later(needgc_cmp); - Node *needgc_bol = new (C) BoolNode(needgc_cmp, BoolTest::ge); + Node *needgc_bol = new BoolNode(needgc_cmp, BoolTest::ge); transform_later(needgc_bol); - IfNode *needgc_iff = new (C) IfNode(contended_region, needgc_bol, PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN); + IfNode *needgc_iff = new IfNode(contended_region, needgc_bol, PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN); transform_later(needgc_iff); // Plug the failing-heap-space-need-gc test into the slow-path region - Node *needgc_true = new (C) IfTrueNode(needgc_iff); + Node *needgc_true = new IfTrueNode(needgc_iff); transform_later(needgc_true); if (initial_slow_test) { slow_region->init_req(need_gc_path, needgc_true); @@ -1302,7 +1302,7 @@ slow_region = needgc_true; } // No need for a GC. Setup for the Store-Conditional - Node *needgc_false = new (C) IfFalseNode(needgc_iff); + Node *needgc_false = new IfFalseNode(needgc_iff); transform_later(needgc_false); // Grab regular I/O before optional prefetch may change it. @@ -1322,37 +1322,37 @@ // memory state. if (UseTLAB) { Node* store_eden_top = - new (C) StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr, + new StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr, TypeRawPtr::BOTTOM, new_eden_top, MemNode::unordered); transform_later(store_eden_top); fast_oop_ctrl = needgc_false; // No contention, so this is the fast path fast_oop_rawmem = store_eden_top; } else { Node* store_eden_top = - new (C) StorePConditionalNode(needgc_false, contended_phi_rawmem, eden_top_adr, + new StorePConditionalNode(needgc_false, contended_phi_rawmem, eden_top_adr, new_eden_top, fast_oop/*old_eden_top*/); transform_later(store_eden_top); - Node *contention_check = new (C) BoolNode(store_eden_top, BoolTest::ne); + Node *contention_check = new BoolNode(store_eden_top, BoolTest::ne); transform_later(contention_check); - store_eden_top = new (C) SCMemProjNode(store_eden_top); + store_eden_top = new SCMemProjNode(store_eden_top); transform_later(store_eden_top); // If not using TLABs, check to see if there was contention. - IfNode *contention_iff = new (C) IfNode (needgc_false, contention_check, PROB_MIN, COUNT_UNKNOWN); + IfNode *contention_iff = new IfNode (needgc_false, contention_check, PROB_MIN, COUNT_UNKNOWN); transform_later(contention_iff); - Node *contention_true = new (C) IfTrueNode(contention_iff); + Node *contention_true = new IfTrueNode(contention_iff); transform_later(contention_true); // If contention, loopback and try again. contended_region->init_req(contended_loopback_path, contention_true); contended_phi_rawmem->init_req(contended_loopback_path, store_eden_top); // Fast-path succeeded with no contention! - Node *contention_false = new (C) IfFalseNode(contention_iff); + Node *contention_false = new IfFalseNode(contention_iff); transform_later(contention_false); fast_oop_ctrl = contention_false; // Bump total allocated bytes for this thread - Node* thread = new (C) ThreadLocalNode(); + Node* thread = new ThreadLocalNode(); transform_later(thread); Node* alloc_bytes_adr = basic_plus_adr(top()/*not oop*/, thread, in_bytes(JavaThread::allocated_bytes_offset())); @@ -1361,10 +1361,10 @@ #ifdef _LP64 Node* alloc_size = size_in_bytes; #else - Node* alloc_size = new (C) ConvI2LNode(size_in_bytes); + Node* alloc_size = new ConvI2LNode(size_in_bytes); transform_later(alloc_size); #endif - Node* new_alloc_bytes = new (C) AddLNode(alloc_bytes, alloc_size); + Node* new_alloc_bytes = new AddLNode(alloc_bytes, alloc_size); transform_later(new_alloc_bytes); fast_oop_rawmem = make_store(fast_oop_ctrl, store_eden_top, alloc_bytes_adr, 0, new_alloc_bytes, T_LONG); @@ -1391,9 +1391,9 @@ mb->init_req(TypeFunc::Memory, fast_oop_rawmem); mb->init_req(TypeFunc::Control, fast_oop_ctrl); - fast_oop_ctrl = new (C) ProjNode(mb,TypeFunc::Control); + fast_oop_ctrl = new ProjNode(mb,TypeFunc::Control); transform_later(fast_oop_ctrl); - fast_oop_rawmem = new (C) ProjNode(mb,TypeFunc::Memory); + fast_oop_rawmem = new ProjNode(mb,TypeFunc::Memory); transform_later(fast_oop_rawmem); } else { // Add the MemBarStoreStore after the InitializeNode so that @@ -1407,9 +1407,9 @@ MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot); transform_later(mb); - Node* ctrl = new (C) ProjNode(init,TypeFunc::Control); + Node* ctrl = new ProjNode(init,TypeFunc::Control); transform_later(ctrl); - Node* mem = new (C) ProjNode(init,TypeFunc::Memory); + Node* mem = new ProjNode(init,TypeFunc::Memory); transform_later(mem); // The MemBarStoreStore depends on control and memory coming @@ -1417,9 +1417,9 @@ mb->init_req(TypeFunc::Memory, mem); mb->init_req(TypeFunc::Control, ctrl); - ctrl = new (C) ProjNode(mb,TypeFunc::Control); + ctrl = new ProjNode(mb,TypeFunc::Control); transform_later(ctrl); - mem = new (C) ProjNode(mb,TypeFunc::Memory); + mem = new ProjNode(mb,TypeFunc::Memory); transform_later(mem); // All nodes that depended on the InitializeNode for control @@ -1433,13 +1433,13 @@ if (C->env()->dtrace_extended_probes()) { // Slow-path call int size = TypeFunc::Parms + 2; - CallLeafNode *call = new (C) CallLeafNode(OptoRuntime::dtrace_object_alloc_Type(), - CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc_base), - "dtrace_object_alloc", - TypeRawPtr::BOTTOM); + CallLeafNode *call = new CallLeafNode(OptoRuntime::dtrace_object_alloc_Type(), + CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc_base), + "dtrace_object_alloc", + TypeRawPtr::BOTTOM); // Get base of thread-local storage area - Node* thread = new (C) ThreadLocalNode(); + Node* thread = new ThreadLocalNode(); transform_later(thread); call->init_req(TypeFunc::Parms+0, thread); @@ -1450,9 +1450,9 @@ call->init_req(TypeFunc::ReturnAdr, alloc->in(TypeFunc::ReturnAdr)); call->init_req(TypeFunc::FramePtr, alloc->in(TypeFunc::FramePtr)); transform_later(call); - fast_oop_ctrl = new (C) ProjNode(call,TypeFunc::Control); + fast_oop_ctrl = new ProjNode(call,TypeFunc::Control); transform_later(fast_oop_ctrl); - fast_oop_rawmem = new (C) ProjNode(call,TypeFunc::Memory); + fast_oop_rawmem = new ProjNode(call,TypeFunc::Memory); transform_later(fast_oop_rawmem); } @@ -1467,7 +1467,7 @@ } // Generate slow-path call - CallNode *call = new (C) CallStaticJavaNode(slow_call_type, slow_call_address, + CallNode *call = new CallStaticJavaNode(slow_call_type, slow_call_address, OptoRuntime::stub_name(slow_call_address), alloc->jvms()->bci(), TypePtr::BOTTOM); @@ -1524,7 +1524,7 @@ // _memproj_catchall so we end up with a call that has only 1 memory projection. if (_memproj_catchall != NULL ) { if (_memproj_fallthrough == NULL) { - _memproj_fallthrough = new (C) ProjNode(call, TypeFunc::Memory); + _memproj_fallthrough = new ProjNode(call, TypeFunc::Memory); transform_later(_memproj_fallthrough); } for (DUIterator_Fast imax, i = _memproj_catchall->fast_outs(imax); i < imax; i++) { @@ -1556,7 +1556,7 @@ // _ioproj_catchall so we end up with a call that has only 1 i_o projection. if (_ioproj_catchall != NULL ) { if (_ioproj_fallthrough == NULL) { - _ioproj_fallthrough = new (C) ProjNode(call, TypeFunc::I_O); + _ioproj_fallthrough = new ProjNode(call, TypeFunc::I_O); transform_later(_ioproj_fallthrough); } for (DUIterator_Fast imax, i = _ioproj_catchall->fast_outs(imax); i < imax; i++) { @@ -1690,47 +1690,47 @@ // As an allocation hits the watermark, we will prefetch starting // at a "distance" away from watermark. - Node *pf_region = new (C) RegionNode(3); - Node *pf_phi_rawmem = new (C) PhiNode( pf_region, Type::MEMORY, + Node *pf_region = new RegionNode(3); + Node *pf_phi_rawmem = new PhiNode( pf_region, Type::MEMORY, TypeRawPtr::BOTTOM ); // I/O is used for Prefetch - Node *pf_phi_abio = new (C) PhiNode( pf_region, Type::ABIO ); + Node *pf_phi_abio = new PhiNode( pf_region, Type::ABIO ); - Node *thread = new (C) ThreadLocalNode(); + Node *thread = new ThreadLocalNode(); transform_later(thread); - Node *eden_pf_adr = new (C) AddPNode( top()/*not oop*/, thread, + Node *eden_pf_adr = new AddPNode( top()/*not oop*/, thread, _igvn.MakeConX(in_bytes(JavaThread::tlab_pf_top_offset())) ); transform_later(eden_pf_adr); - Node *old_pf_wm = new (C) LoadPNode(needgc_false, + Node *old_pf_wm = new LoadPNode(needgc_false, contended_phi_rawmem, eden_pf_adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered); transform_later(old_pf_wm); // check against new_eden_top - Node *need_pf_cmp = new (C) CmpPNode( new_eden_top, old_pf_wm ); + Node *need_pf_cmp = new CmpPNode( new_eden_top, old_pf_wm ); transform_later(need_pf_cmp); - Node *need_pf_bol = new (C) BoolNode( need_pf_cmp, BoolTest::ge ); + Node *need_pf_bol = new BoolNode( need_pf_cmp, BoolTest::ge ); transform_later(need_pf_bol); - IfNode *need_pf_iff = new (C) IfNode( needgc_false, need_pf_bol, + IfNode *need_pf_iff = new IfNode( needgc_false, need_pf_bol, PROB_UNLIKELY_MAG(4), COUNT_UNKNOWN ); transform_later(need_pf_iff); // true node, add prefetchdistance - Node *need_pf_true = new (C) IfTrueNode( need_pf_iff ); + Node *need_pf_true = new IfTrueNode( need_pf_iff ); transform_later(need_pf_true); - Node *need_pf_false = new (C) IfFalseNode( need_pf_iff ); + Node *need_pf_false = new IfFalseNode( need_pf_iff ); transform_later(need_pf_false); - Node *new_pf_wmt = new (C) AddPNode( top(), old_pf_wm, + Node *new_pf_wmt = new AddPNode( top(), old_pf_wm, _igvn.MakeConX(AllocatePrefetchDistance) ); transform_later(new_pf_wmt ); new_pf_wmt->set_req(0, need_pf_true); - Node *store_new_wmt = new (C) StorePNode(need_pf_true, + Node *store_new_wmt = new StorePNode(need_pf_true, contended_phi_rawmem, eden_pf_adr, TypeRawPtr::BOTTOM, new_pf_wmt, MemNode::unordered); @@ -1746,10 +1746,10 @@ uint distance = 0; for ( uint i = 0; i < lines; i++ ) { - prefetch_adr = new (C) AddPNode( old_pf_wm, new_pf_wmt, + prefetch_adr = new AddPNode( old_pf_wm, new_pf_wmt, _igvn.MakeConX(distance) ); transform_later(prefetch_adr); - prefetch = new (C) PrefetchAllocationNode( i_o, prefetch_adr ); + prefetch = new PrefetchAllocationNode( i_o, prefetch_adr ); transform_later(prefetch); distance += step_size; i_o = prefetch; @@ -1772,8 +1772,8 @@ } else if( UseTLAB && AllocatePrefetchStyle == 3 ) { // Insert a prefetch for each allocation. // This code is used for Sparc with BIS. - Node *pf_region = new (C) RegionNode(3); - Node *pf_phi_rawmem = new (C) PhiNode( pf_region, Type::MEMORY, + Node *pf_region = new RegionNode(3); + Node *pf_phi_rawmem = new PhiNode( pf_region, Type::MEMORY, TypeRawPtr::BOTTOM ); // Generate several prefetch instructions. @@ -1782,29 +1782,29 @@ uint distance = AllocatePrefetchDistance; // Next cache address. - Node *cache_adr = new (C) AddPNode(old_eden_top, old_eden_top, + Node *cache_adr = new AddPNode(old_eden_top, old_eden_top, _igvn.MakeConX(distance)); transform_later(cache_adr); - cache_adr = new (C) CastP2XNode(needgc_false, cache_adr); + cache_adr = new CastP2XNode(needgc_false, cache_adr); transform_later(cache_adr); Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1)); - cache_adr = new (C) AndXNode(cache_adr, mask); + cache_adr = new AndXNode(cache_adr, mask); transform_later(cache_adr); - cache_adr = new (C) CastX2PNode(cache_adr); + cache_adr = new CastX2PNode(cache_adr); transform_later(cache_adr); // Prefetch - Node *prefetch = new (C) PrefetchAllocationNode( contended_phi_rawmem, cache_adr ); + Node *prefetch = new PrefetchAllocationNode( contended_phi_rawmem, cache_adr ); prefetch->set_req(0, needgc_false); transform_later(prefetch); contended_phi_rawmem = prefetch; Node *prefetch_adr; distance = step_size; for ( uint i = 1; i < lines; i++ ) { - prefetch_adr = new (C) AddPNode( cache_adr, cache_adr, + prefetch_adr = new AddPNode( cache_adr, cache_adr, _igvn.MakeConX(distance) ); transform_later(prefetch_adr); - prefetch = new (C) PrefetchAllocationNode( contended_phi_rawmem, prefetch_adr ); + prefetch = new PrefetchAllocationNode( contended_phi_rawmem, prefetch_adr ); transform_later(prefetch); distance += step_size; contended_phi_rawmem = prefetch; @@ -1818,10 +1818,10 @@ uint step_size = AllocatePrefetchStepSize; uint distance = AllocatePrefetchDistance; for ( uint i = 0; i < lines; i++ ) { - prefetch_adr = new (C) AddPNode( old_eden_top, new_eden_top, + prefetch_adr = new AddPNode( old_eden_top, new_eden_top, _igvn.MakeConX(distance) ); transform_later(prefetch_adr); - prefetch = new (C) PrefetchAllocationNode( i_o, prefetch_adr ); + prefetch = new PrefetchAllocationNode( i_o, prefetch_adr ); // Do not let it float too high, since if eden_top == eden_end, // both might be null. if( i == 0 ) { // Set control for first prefetch, next follows it @@ -2170,12 +2170,12 @@ * } */ - region = new (C) RegionNode(5); + region = new RegionNode(5); // create a Phi for the memory state - mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); + mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); - Node* fast_lock_region = new (C) RegionNode(3); - Node* fast_lock_mem_phi = new (C) PhiNode( fast_lock_region, Type::MEMORY, TypeRawPtr::BOTTOM); + Node* fast_lock_region = new RegionNode(3); + Node* fast_lock_mem_phi = new PhiNode( fast_lock_region, Type::MEMORY, TypeRawPtr::BOTTOM); // First, check mark word for the biased lock pattern. Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type()); @@ -2205,10 +2205,10 @@ } Node *proto_node = make_load(ctrl, mem, klass_node, in_bytes(Klass::prototype_header_offset()), TypeX_X, TypeX_X->basic_type()); - Node* thread = transform_later(new (C) ThreadLocalNode()); - Node* cast_thread = transform_later(new (C) CastP2XNode(ctrl, thread)); - Node* o_node = transform_later(new (C) OrXNode(cast_thread, proto_node)); - Node* x_node = transform_later(new (C) XorXNode(o_node, mark_node)); + Node* thread = transform_later(new ThreadLocalNode()); + Node* cast_thread = transform_later(new CastP2XNode(ctrl, thread)); + Node* o_node = transform_later(new OrXNode(cast_thread, proto_node)); + Node* x_node = transform_later(new XorXNode(o_node, mark_node)); // Get slow path - mark word does NOT match the value. Node* not_biased_ctrl = opt_bits_test(ctrl, region, 3, x_node, @@ -2231,17 +2231,17 @@ // We are going to try to reset the mark of this object to the prototype // value and fall through to the CAS-based locking scheme. Node* adr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes()); - Node* cas = new (C) StoreXConditionalNode(not_biased_ctrl, mem, adr, - proto_node, mark_node); + Node* cas = new StoreXConditionalNode(not_biased_ctrl, mem, adr, + proto_node, mark_node); transform_later(cas); - Node* proj = transform_later( new (C) SCMemProjNode(cas)); + Node* proj = transform_later(new SCMemProjNode(cas)); fast_lock_mem_phi->init_req(2, proj); // Second, check epoch bits. - Node* rebiased_region = new (C) RegionNode(3); - Node* old_phi = new (C) PhiNode( rebiased_region, TypeX_X); - Node* new_phi = new (C) PhiNode( rebiased_region, TypeX_X); + Node* rebiased_region = new RegionNode(3); + Node* old_phi = new PhiNode( rebiased_region, TypeX_X); + Node* new_phi = new PhiNode( rebiased_region, TypeX_X); // Get slow path - mark word does NOT match epoch bits. Node* epoch_ctrl = opt_bits_test(ctrl, rebiased_region, 1, x_node, @@ -2258,9 +2258,9 @@ Node* cmask = MakeConX(markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place); - Node* old = transform_later(new (C) AndXNode(mark_node, cmask)); - cast_thread = transform_later(new (C) CastP2XNode(ctrl, thread)); - Node* new_mark = transform_later(new (C) OrXNode(cast_thread, old)); + Node* old = transform_later(new AndXNode(mark_node, cmask)); + cast_thread = transform_later(new CastP2XNode(ctrl, thread)); + Node* new_mark = transform_later(new OrXNode(cast_thread, old)); old_phi->init_req(1, old); new_phi->init_req(1, new_mark); @@ -2270,10 +2270,9 @@ // Try to acquire the bias of the object using an atomic operation. // If this fails we will go in to the runtime to revoke the object's bias. - cas = new (C) StoreXConditionalNode(rebiased_region, mem, adr, - new_phi, old_phi); + cas = new StoreXConditionalNode(rebiased_region, mem, adr, new_phi, old_phi); transform_later(cas); - proj = transform_later( new (C) SCMemProjNode(cas)); + proj = transform_later(new SCMemProjNode(cas)); // Get slow path - Failed to CAS. not_biased_ctrl = opt_bits_test(rebiased_region, region, 4, cas, 0, 0); @@ -2281,8 +2280,8 @@ // region->in(4) is set to fast path - the object is rebiased to the current thread. // Failed to CAS. - slow_path = new (C) RegionNode(3); - Node *slow_mem = new (C) PhiNode( slow_path, Type::MEMORY, TypeRawPtr::BOTTOM); + slow_path = new RegionNode(3); + Node *slow_mem = new PhiNode( slow_path, Type::MEMORY, TypeRawPtr::BOTTOM); slow_path->init_req(1, not_biased_ctrl); // Capture slow-control slow_mem->init_req(1, proj); @@ -2306,9 +2305,9 @@ lock->set_req(TypeFunc::Memory, slow_mem); } else { - region = new (C) RegionNode(3); + region = new RegionNode(3); // create a Phi for the memory state - mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); + mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); // Optimize test; set region slot 2 slow_path = opt_bits_test(ctrl, region, 2, flock, 0, 0); @@ -2339,7 +2338,7 @@ transform_later(region); _igvn.replace_node(_fallthroughproj, region); - Node *memproj = transform_later( new(C) ProjNode(call, TypeFunc::Memory) ); + Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory)); mem_phi->init_req(1, memproj ); transform_later(mem_phi); _igvn.replace_node(_memproj_fallthrough, mem_phi); @@ -2364,9 +2363,9 @@ if (UseOptoBiasInlining) { // Check for biased locking unlock case, which is a no-op. // See the full description in MacroAssembler::biased_locking_exit(). - region = new (C) RegionNode(4); + region = new RegionNode(4); // create a Phi for the memory state - mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); + mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); mem_phi->init_req(3, mem); Node* mark_node = make_load(ctrl, mem, obj, oopDesc::mark_offset_in_bytes(), TypeX_X, TypeX_X->basic_type()); @@ -2374,12 +2373,12 @@ markOopDesc::biased_lock_mask_in_place, markOopDesc::biased_lock_pattern); } else { - region = new (C) RegionNode(3); + region = new RegionNode(3); // create a Phi for the memory state - mem_phi = new (C) PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); + mem_phi = new PhiNode( region, Type::MEMORY, TypeRawPtr::BOTTOM); } - FastUnlockNode *funlock = new (C) FastUnlockNode( ctrl, obj, box ); + FastUnlockNode *funlock = new FastUnlockNode( ctrl, obj, box ); funlock = transform_later( funlock )->as_FastUnlock(); // Optimize test; set region slot 2 Node *slow_path = opt_bits_test(ctrl, region, 2, funlock, 0, 0); @@ -2404,7 +2403,7 @@ transform_later(region); _igvn.replace_node(_fallthroughproj, region); - Node *memproj = transform_later( new(C) ProjNode(call, TypeFunc::Memory) ); + Node *memproj = transform_later(new ProjNode(call, TypeFunc::Memory) ); mem_phi->init_req(1, memproj ); mem_phi->init_req(2, mem); transform_later(mem_phi); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/macro.hpp --- a/hotspot/src/share/vm/opto/macro.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/macro.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -52,7 +52,7 @@ return basic_plus_adr(base, base, offset); } Node* basic_plus_adr(Node* base, Node* ptr, Node* offset) { - Node* adr = new (C) AddPNode(base, ptr, offset); + Node* adr = new AddPNode(base, ptr, offset); return transform_later(adr); } Node* transform_later(Node* n) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/matcher.cpp --- a/hotspot/src/share/vm/opto/matcher.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/matcher.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -751,7 +751,7 @@ tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1)); tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1)); halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1)); - mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD ); + mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD ); proj_cnt += 2; // Skip 2 for doubles } else if( (i&1) == 1 && // Else check for high half of double @@ -777,7 +777,7 @@ tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1)); tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1)); halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1)); - mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL ); + mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL ); proj_cnt += 2; // Skip 2 for longs } else if( (i&1) == 1 && // Else check for high half of long @@ -792,7 +792,7 @@ mproj = C->top(); } else { // Make a projection for it off the Start - mproj = new (C) MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] ); + mproj = new MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] ); } ret_edge_cnt ++; @@ -845,13 +845,13 @@ // Compute generic short-offset Loads #ifdef _LP64 - MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered)); + MachNode *spillCP = match_tree(new LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered)); #endif - MachNode *spillI = match_tree(new (C) LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered)); - MachNode *spillL = match_tree(new (C) LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false)); - MachNode *spillF = match_tree(new (C) LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered)); - MachNode *spillD = match_tree(new (C) LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered)); - MachNode *spillP = match_tree(new (C) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered)); + MachNode *spillI = match_tree(new LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered)); + MachNode *spillL = match_tree(new LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false)); + MachNode *spillF = match_tree(new LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered)); + MachNode *spillD = match_tree(new LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered)); + MachNode *spillP = match_tree(new LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered)); assert(spillI != NULL && spillL != NULL && spillF != NULL && spillD != NULL && spillP != NULL, ""); // Get the ADLC notion of the right regmask, for each basic type. @@ -867,19 +867,19 @@ // Vector regmasks. if (Matcher::vector_size_supported(T_BYTE,4)) { TypeVect::VECTS = TypeVect::make(T_BYTE, 4); - MachNode *spillVectS = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS)); + MachNode *spillVectS = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS)); idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask(); } if (Matcher::vector_size_supported(T_FLOAT,2)) { - MachNode *spillVectD = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD)); + MachNode *spillVectD = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD)); idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask(); } if (Matcher::vector_size_supported(T_FLOAT,4)) { - MachNode *spillVectX = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX)); + MachNode *spillVectX = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX)); idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask(); } if (Matcher::vector_size_supported(T_FLOAT,8)) { - MachNode *spillVectY = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY)); + MachNode *spillVectY = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY)); idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask(); } } @@ -1319,7 +1319,7 @@ // is excluded on the max-per-method basis, debug info cannot land in // this killed area. uint r_cnt = mcall->tf()->range()->cnt(); - MachProjNode *proj = new (C) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj ); + MachProjNode *proj = new MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj ); if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) { C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence"); } else { @@ -2274,7 +2274,7 @@ case Op_CompareAndSwapN: { // Convert trinary to binary-tree Node *newval = n->in(MemNode::ValueIn ); Node *oldval = n->in(LoadStoreConditionalNode::ExpectedIn); - Node *pair = new (C) BinaryNode( oldval, newval ); + Node *pair = new BinaryNode( oldval, newval ); n->set_req(MemNode::ValueIn,pair); n->del_req(LoadStoreConditionalNode::ExpectedIn); break; @@ -2289,22 +2289,22 @@ // we could move this code up next to the graph reshaping for IfNodes // or vice-versa, but I do not want to debug this for Ladybird. // 10/2/2000 CNC. - Node *pair1 = new (C) BinaryNode(n->in(1),n->in(1)->in(1)); + Node *pair1 = new BinaryNode(n->in(1),n->in(1)->in(1)); n->set_req(1,pair1); - Node *pair2 = new (C) BinaryNode(n->in(2),n->in(3)); + Node *pair2 = new BinaryNode(n->in(2),n->in(3)); n->set_req(2,pair2); n->del_req(3); break; } case Op_LoopLimit: { - Node *pair1 = new (C) BinaryNode(n->in(1),n->in(2)); + Node *pair1 = new BinaryNode(n->in(1),n->in(2)); n->set_req(1,pair1); n->set_req(2,n->in(3)); n->del_req(3); break; } case Op_StrEquals: { - Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3)); + Node *pair1 = new BinaryNode(n->in(2),n->in(3)); n->set_req(2,pair1); n->set_req(3,n->in(4)); n->del_req(4); @@ -2312,9 +2312,9 @@ } case Op_StrComp: case Op_StrIndexOf: { - Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3)); + Node *pair1 = new BinaryNode(n->in(2),n->in(3)); n->set_req(2,pair1); - Node *pair2 = new (C) BinaryNode(n->in(4),n->in(5)); + Node *pair2 = new BinaryNode(n->in(4),n->in(5)); n->set_req(3,pair2); n->del_req(5); n->del_req(4); @@ -2322,7 +2322,7 @@ } case Op_EncodeISOArray: { // Restructure into a binary tree for Matching. - Node* pair = new (C) BinaryNode(n->in(3), n->in(4)); + Node* pair = new BinaryNode(n->in(3), n->in(4)); n->set_req(3, pair); n->del_req(4); break; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/memnode.cpp --- a/hotspot/src/share/vm/opto/memnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/memnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -908,25 +908,25 @@ rt->isa_oopptr() || is_immutable_value(adr), "raw memory operations should have control edge"); switch (bt) { - case T_BOOLEAN: return new (C) LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo); - case T_BYTE: return new (C) LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo); - case T_INT: return new (C) LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo); - case T_CHAR: return new (C) LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo); - case T_SHORT: return new (C) LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo); - case T_LONG: return new (C) LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo); - case T_FLOAT: return new (C) LoadFNode (ctl, mem, adr, adr_type, rt, mo); - case T_DOUBLE: return new (C) LoadDNode (ctl, mem, adr, adr_type, rt, mo); - case T_ADDRESS: return new (C) LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo); + case T_BOOLEAN: return new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo); + case T_BYTE: return new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo); + case T_INT: return new LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo); + case T_CHAR: return new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo); + case T_SHORT: return new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo); + case T_LONG: return new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo); + case T_FLOAT: return new LoadFNode (ctl, mem, adr, adr_type, rt, mo); + case T_DOUBLE: return new LoadDNode (ctl, mem, adr, adr_type, rt, mo); + case T_ADDRESS: return new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo); case T_OBJECT: #ifdef _LP64 if (adr->bottom_type()->is_ptr_to_narrowoop()) { - Node* load = gvn.transform(new (C) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo)); - return new (C) DecodeNNode(load, load->bottom_type()->make_ptr()); + Node* load = gvn.transform(new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo)); + return new DecodeNNode(load, load->bottom_type()->make_ptr()); } else #endif { assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop"); - return new (C) LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo); + return new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo); } } ShouldNotReachHere(); @@ -935,12 +935,12 @@ LoadLNode* LoadLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) { bool require_atomic = true; - return new (C) LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic); + return new LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic); } LoadDNode* LoadDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) { bool require_atomic = true; - return new (C) LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic); + return new LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic); } @@ -1228,33 +1228,33 @@ // Add up all the offsets making of the address of the load Node* result = elements[0]; for (int i = 1; i < count; i++) { - result = phase->transform(new (phase->C) AddXNode(result, elements[i])); + result = phase->transform(new AddXNode(result, elements[i])); } // Remove the constant offset from the address and then - result = phase->transform(new (phase->C) AddXNode(result, phase->MakeConX(-(int)offset))); + result = phase->transform(new AddXNode(result, phase->MakeConX(-(int)offset))); // remove the scaling of the offset to recover the original index. if (result->Opcode() == Op_LShiftX && result->in(2) == phase->intcon(shift)) { // Peel the shift off directly but wrap it in a dummy node // since Ideal can't return existing nodes - result = new (phase->C) RShiftXNode(result->in(1), phase->intcon(0)); + result = new RShiftXNode(result->in(1), phase->intcon(0)); } else if (result->is_Add() && result->in(2)->is_Con() && result->in(1)->Opcode() == Op_LShiftX && result->in(1)->in(2) == phase->intcon(shift)) { // We can't do general optimization: ((X<> Z ==> X + (Y>>Z) // but for boxing cache access we know that X<C) RShiftXNode(result->in(2), phase->intcon(shift)); - result = new (phase->C) AddXNode(result->in(1)->in(1), phase->transform(add_con)); + Node* add_con = new RShiftXNode(result->in(2), phase->intcon(shift)); + result = new AddXNode(result->in(1)->in(1), phase->transform(add_con)); } else { - result = new (phase->C) RShiftXNode(result, phase->intcon(shift)); + result = new RShiftXNode(result, phase->intcon(shift)); } #ifdef _LP64 if (bt != T_LONG) { - result = new (phase->C) ConvL2INode(phase->transform(result)); + result = new ConvL2INode(phase->transform(result)); } #else if (bt == T_LONG) { - result = new (phase->C) ConvI2LNode(phase->transform(result)); + result = new ConvI2LNode(phase->transform(result)); } #endif return result; @@ -1385,7 +1385,7 @@ this_iid = base->_idx; } PhaseIterGVN* igvn = phase->is_IterGVN(); - Node* phi = new (C) PhiNode(region, this_type, NULL, this_iid, this_index, this_offset); + Node* phi = new PhiNode(region, this_type, NULL, this_iid, this_index, this_offset); for (uint i = 1; i < region->req(); i++) { Node* x; Node* the_clone = NULL; @@ -1408,7 +1408,7 @@ } if (base_is_phi && (base->in(0) == region)) { Node* base_x = base->in(i); // Clone address for loads from boxed objects. - Node* adr_x = phase->transform(new (C) AddPNode(base_x,base_x,address->in(AddPNode::Offset))); + Node* adr_x = phase->transform(new AddPNode(base_x,base_x,address->in(AddPNode::Offset))); x->set_req(Address, adr_x); } } @@ -1897,8 +1897,8 @@ Node* mem = in(MemNode::Memory); Node* value = can_see_stored_value(mem,phase); if( value && !phase->type(value)->higher_equal( _type ) ) { - Node *result = phase->transform( new (phase->C) LShiftINode(value, phase->intcon(24)) ); - return new (phase->C) RShiftINode(result, phase->intcon(24)); + Node *result = phase->transform( new LShiftINode(value, phase->intcon(24)) ); + return new RShiftINode(result, phase->intcon(24)); } // Identity call will handle the case where truncation is not needed. return LoadNode::Ideal(phase, can_reshape); @@ -1929,7 +1929,7 @@ Node* mem = in(MemNode::Memory); Node* value = can_see_stored_value(mem, phase); if (value && !phase->type(value)->higher_equal(_type)) - return new (phase->C) AndINode(value, phase->intcon(0xFF)); + return new AndINode(value, phase->intcon(0xFF)); // Identity call will handle the case where truncation is not needed. return LoadNode::Ideal(phase, can_reshape); } @@ -1959,7 +1959,7 @@ Node* mem = in(MemNode::Memory); Node* value = can_see_stored_value(mem,phase); if( value && !phase->type(value)->higher_equal( _type ) ) - return new (phase->C) AndINode(value,phase->intcon(0xFFFF)); + return new AndINode(value,phase->intcon(0xFFFF)); // Identity call will handle the case where truncation is not needed. return LoadNode::Ideal(phase, can_reshape); } @@ -1989,8 +1989,8 @@ Node* mem = in(MemNode::Memory); Node* value = can_see_stored_value(mem,phase); if( value && !phase->type(value)->higher_equal( _type ) ) { - Node *result = phase->transform( new (phase->C) LShiftINode(value, phase->intcon(16)) ); - return new (phase->C) RShiftINode(result, phase->intcon(16)); + Node *result = phase->transform( new LShiftINode(value, phase->intcon(16)) ); + return new RShiftINode(result, phase->intcon(16)); } // Identity call will handle the case where truncation is not needed. return LoadNode::Ideal(phase, can_reshape); @@ -2022,12 +2022,12 @@ #ifdef _LP64 if (adr_type->is_ptr_to_narrowklass()) { assert(UseCompressedClassPointers, "no compressed klasses"); - Node* load_klass = gvn.transform(new (C) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered)); - return new (C) DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr()); + Node* load_klass = gvn.transform(new LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass(), MemNode::unordered)); + return new DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr()); } #endif assert(!adr_type->is_ptr_to_narrowklass() && !adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop"); - return new (C) LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered); + return new LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered); } //------------------------------Value------------------------------------------ @@ -2255,7 +2255,7 @@ if( t->isa_narrowklass()) return x; assert (!t->isa_narrowoop(), "no narrow oop here"); - return phase->transform(new (phase->C) EncodePKlassNode(x, t->make_narrowklass())); + return phase->transform(new EncodePKlassNode(x, t->make_narrowklass())); } //------------------------------Value----------------------------------------- @@ -2350,29 +2350,29 @@ switch (bt) { case T_BOOLEAN: - case T_BYTE: return new (C) StoreBNode(ctl, mem, adr, adr_type, val, mo); - case T_INT: return new (C) StoreINode(ctl, mem, adr, adr_type, val, mo); + case T_BYTE: return new StoreBNode(ctl, mem, adr, adr_type, val, mo); + case T_INT: return new StoreINode(ctl, mem, adr, adr_type, val, mo); case T_CHAR: - case T_SHORT: return new (C) StoreCNode(ctl, mem, adr, adr_type, val, mo); - case T_LONG: return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo); - case T_FLOAT: return new (C) StoreFNode(ctl, mem, adr, adr_type, val, mo); - case T_DOUBLE: return new (C) StoreDNode(ctl, mem, adr, adr_type, val, mo); + case T_SHORT: return new StoreCNode(ctl, mem, adr, adr_type, val, mo); + case T_LONG: return new StoreLNode(ctl, mem, adr, adr_type, val, mo); + case T_FLOAT: return new StoreFNode(ctl, mem, adr, adr_type, val, mo); + case T_DOUBLE: return new StoreDNode(ctl, mem, adr, adr_type, val, mo); case T_METADATA: case T_ADDRESS: case T_OBJECT: #ifdef _LP64 if (adr->bottom_type()->is_ptr_to_narrowoop()) { - val = gvn.transform(new (C) EncodePNode(val, val->bottom_type()->make_narrowoop())); - return new (C) StoreNNode(ctl, mem, adr, adr_type, val, mo); + val = gvn.transform(new EncodePNode(val, val->bottom_type()->make_narrowoop())); + return new StoreNNode(ctl, mem, adr, adr_type, val, mo); } else if (adr->bottom_type()->is_ptr_to_narrowklass() || (UseCompressedClassPointers && val->bottom_type()->isa_klassptr() && adr->bottom_type()->isa_rawptr())) { - val = gvn.transform(new (C) EncodePKlassNode(val, val->bottom_type()->make_narrowklass())); - return new (C) StoreNKlassNode(ctl, mem, adr, adr_type, val, mo); + val = gvn.transform(new EncodePKlassNode(val, val->bottom_type()->make_narrowklass())); + return new StoreNKlassNode(ctl, mem, adr, adr_type, val, mo); } #endif { - return new (C) StorePNode(ctl, mem, adr, adr_type, val, mo); + return new StorePNode(ctl, mem, adr, adr_type, val, mo); } } ShouldNotReachHere(); @@ -2381,12 +2381,12 @@ StoreLNode* StoreLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo) { bool require_atomic = true; - return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic); + return new StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic); } StoreDNode* StoreDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo) { bool require_atomic = true; - return new (C) StoreDNode(ctl, mem, adr, adr_type, val, mo, require_atomic); + return new StoreDNode(ctl, mem, adr, adr_type, val, mo, require_atomic); } @@ -2779,12 +2779,12 @@ Node *zero = phase->makecon(TypeLong::ZERO); Node *off = phase->MakeConX(BytesPerLong); - mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false); + mem = new StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false); count--; while( count-- ) { mem = phase->transform(mem); - adr = phase->transform(new (phase->C) AddPNode(base,adr,off)); - mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false); + adr = phase->transform(new AddPNode(base,adr,off)); + mem = new StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false); } return mem; } @@ -2825,7 +2825,7 @@ int unit = BytesPerLong; if ((offset % unit) != 0) { - Node* adr = new (C) AddPNode(dest, dest, phase->MakeConX(offset)); + Node* adr = new AddPNode(dest, dest, phase->MakeConX(offset)); adr = phase->transform(adr); const TypePtr* atp = TypeRawPtr::BOTTOM; mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered); @@ -2855,14 +2855,14 @@ // Scale to the unit required by the CPU: if (!Matcher::init_array_count_is_in_bytes) { Node* shift = phase->intcon(exact_log2(unit)); - zbase = phase->transform( new(C) URShiftXNode(zbase, shift) ); - zend = phase->transform( new(C) URShiftXNode(zend, shift) ); + zbase = phase->transform(new URShiftXNode(zbase, shift) ); + zend = phase->transform(new URShiftXNode(zend, shift) ); } // Bulk clear double-words - Node* zsize = phase->transform( new(C) SubXNode(zend, zbase) ); - Node* adr = phase->transform( new(C) AddPNode(dest, dest, start_offset) ); - mem = new (C) ClearArrayNode(ctl, mem, zsize, adr); + Node* zsize = phase->transform(new SubXNode(zend, zbase) ); + Node* adr = phase->transform(new AddPNode(dest, dest, start_offset) ); + mem = new ClearArrayNode(ctl, mem, zsize, adr); return phase->transform(mem); } @@ -2886,7 +2886,7 @@ start_offset, phase->MakeConX(done_offset), phase); } if (done_offset < end_offset) { // emit the final 32-bit store - Node* adr = new (C) AddPNode(dest, dest, phase->MakeConX(done_offset)); + Node* adr = new AddPNode(dest, dest, phase->MakeConX(done_offset)); adr = phase->transform(adr); const TypePtr* atp = TypeRawPtr::BOTTOM; mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered); @@ -2920,16 +2920,16 @@ //------------------------------make------------------------------------------- MemBarNode* MemBarNode::make(Compile* C, int opcode, int atp, Node* pn) { switch (opcode) { - case Op_MemBarAcquire: return new(C) MemBarAcquireNode(C, atp, pn); - case Op_LoadFence: return new(C) LoadFenceNode(C, atp, pn); - case Op_MemBarRelease: return new(C) MemBarReleaseNode(C, atp, pn); - case Op_StoreFence: return new(C) StoreFenceNode(C, atp, pn); - case Op_MemBarAcquireLock: return new(C) MemBarAcquireLockNode(C, atp, pn); - case Op_MemBarReleaseLock: return new(C) MemBarReleaseLockNode(C, atp, pn); - case Op_MemBarVolatile: return new(C) MemBarVolatileNode(C, atp, pn); - case Op_MemBarCPUOrder: return new(C) MemBarCPUOrderNode(C, atp, pn); - case Op_Initialize: return new(C) InitializeNode(C, atp, pn); - case Op_MemBarStoreStore: return new(C) MemBarStoreStoreNode(C, atp, pn); + case Op_MemBarAcquire: return new MemBarAcquireNode(C, atp, pn); + case Op_LoadFence: return new LoadFenceNode(C, atp, pn); + case Op_MemBarRelease: return new MemBarReleaseNode(C, atp, pn); + case Op_StoreFence: return new StoreFenceNode(C, atp, pn); + case Op_MemBarAcquireLock: return new MemBarAcquireLockNode(C, atp, pn); + case Op_MemBarReleaseLock: return new MemBarReleaseLockNode(C, atp, pn); + case Op_MemBarVolatile: return new MemBarVolatileNode(C, atp, pn); + case Op_MemBarCPUOrder: return new MemBarCPUOrderNode(C, atp, pn); + case Op_Initialize: return new InitializeNode(C, atp, pn); + case Op_MemBarStoreStore: return new MemBarStoreStoreNode(C, atp, pn); default: ShouldNotReachHere(); return NULL; } } @@ -2992,7 +2992,7 @@ igvn->replace_node(proj_out(TypeFunc::Control), in(TypeFunc::Control)); // Must return either the original node (now dead) or a new node // (Do not return a top here, since that would break the uniqueness of top.) - return new (phase->C) ConINode(TypeInt::ZERO); + return new ConINode(TypeInt::ZERO); } } return NULL; @@ -3012,7 +3012,7 @@ switch (proj->_con) { case TypeFunc::Control: case TypeFunc::Memory: - return new (m->C) MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); + return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); } ShouldNotReachHere(); return NULL; @@ -3438,7 +3438,7 @@ Node* addr = in(RawAddress); if (offset != 0) { Compile* C = phase->C; - addr = phase->transform( new (C) AddPNode(C->top(), addr, + addr = phase->transform( new AddPNode(C->top(), addr, phase->MakeConX(offset)) ); } return addr; @@ -4127,7 +4127,7 @@ // Make a new, untransformed MergeMem with the same base as 'mem'. // If mem is itself a MergeMem, populate the result with the same edges. MergeMemNode* MergeMemNode::make(Compile* C, Node* mem) { - return new(C) MergeMemNode(mem); + return new MergeMemNode(mem); } //------------------------------cmp-------------------------------------------- diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/movenode.cpp --- a/hotspot/src/share/vm/opto/movenode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/movenode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -160,13 +160,13 @@ // from the inputs we do not need to specify it here. CMoveNode *CMoveNode::make( Compile *C, Node *c, Node *bol, Node *left, Node *right, const Type *t ) { switch( t->basic_type() ) { - case T_INT: return new (C) CMoveINode( bol, left, right, t->is_int() ); - case T_FLOAT: return new (C) CMoveFNode( bol, left, right, t ); - case T_DOUBLE: return new (C) CMoveDNode( bol, left, right, t ); - case T_LONG: return new (C) CMoveLNode( bol, left, right, t->is_long() ); - case T_OBJECT: return new (C) CMovePNode( c, bol, left, right, t->is_oopptr() ); - case T_ADDRESS: return new (C) CMovePNode( c, bol, left, right, t->is_ptr() ); - case T_NARROWOOP: return new (C) CMoveNNode( c, bol, left, right, t ); + case T_INT: return new CMoveINode( bol, left, right, t->is_int() ); + case T_FLOAT: return new CMoveFNode( bol, left, right, t ); + case T_DOUBLE: return new CMoveDNode( bol, left, right, t ); + case T_LONG: return new CMoveLNode( bol, left, right, t->is_long() ); + case T_OBJECT: return new CMovePNode( c, bol, left, right, t->is_oopptr() ); + case T_ADDRESS: return new CMovePNode( c, bol, left, right, t->is_ptr() ); + case T_NARROWOOP: return new CMoveNNode( c, bol, left, right, t ); default: ShouldNotReachHere(); return NULL; @@ -233,9 +233,9 @@ #ifndef PRODUCT if( PrintOpto ) tty->print_cr("CMOV to I2B"); #endif - Node *n = new (phase->C) Conv2BNode( cmp->in(1) ); + Node *n = new Conv2BNode( cmp->in(1) ); if( flip ) - n = new (phase->C) XorINode( phase->transform(n), phase->intcon(1) ); + n = new XorINode( phase->transform(n), phase->intcon(1) ); return n; } @@ -289,9 +289,9 @@ sub->in(2) != X || phase->type(sub->in(1)) != TypeF::ZERO ) return NULL; - Node *abs = new (phase->C) AbsFNode( X ); + Node *abs = new AbsFNode( X ); if( flip ) - abs = new (phase->C) SubFNode(sub->in(1), phase->transform(abs)); + abs = new SubFNode(sub->in(1), phase->transform(abs)); return abs; } @@ -345,9 +345,9 @@ sub->in(2) != X || phase->type(sub->in(1)) != TypeD::ZERO ) return NULL; - Node *abs = new (phase->C) AbsDNode( X ); + Node *abs = new AbsDNode( X ); if( flip ) - abs = new (phase->C) SubDNode(sub->in(1), phase->transform(abs)); + abs = new SubDNode(sub->in(1), phase->transform(abs)); return abs; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/mulnode.cpp --- a/hotspot/src/share/vm/opto/mulnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/mulnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -199,22 +199,22 @@ Node *res = NULL; jint bit1 = con & -con; // Extract low bit if( bit1 == con ) { // Found a power of 2? - res = new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ); + res = new LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ); } else { // Check for constant with 2 bits set jint bit2 = con-bit1; bit2 = bit2 & -bit2; // Extract 2nd bit if( bit2 + bit1 == con ) { // Found all bits in con? - Node *n1 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ) ); - Node *n2 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(bit2)) ) ); - res = new (phase->C) AddINode( n2, n1 ); + Node *n1 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(bit1)) ) ); + Node *n2 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(bit2)) ) ); + res = new AddINode( n2, n1 ); } else if (is_power_of_2(con+1)) { // Sleezy: power-of-2 -1. Next time be generic. jint temp = (jint) (con + 1); - Node *n1 = phase->transform( new (phase->C) LShiftINode( in(1), phase->intcon(log2_intptr(temp)) ) ); - res = new (phase->C) SubINode( n1, in(1) ); + Node *n1 = phase->transform( new LShiftINode( in(1), phase->intcon(log2_intptr(temp)) ) ); + res = new SubINode( n1, in(1) ); } else { return MulNode::Ideal(phase, can_reshape); } @@ -222,7 +222,7 @@ if( sign_flip ) { // Need to negate result? res = phase->transform(res);// Transform, before making the zero con - res = new (phase->C) SubINode(phase->intcon(0),res); + res = new SubINode(phase->intcon(0),res); } return res; // Return final result @@ -295,22 +295,22 @@ Node *res = NULL; jlong bit1 = con & -con; // Extract low bit if( bit1 == con ) { // Found a power of 2? - res = new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ); + res = new LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ); } else { // Check for constant with 2 bits set jlong bit2 = con-bit1; bit2 = bit2 & -bit2; // Extract 2nd bit if( bit2 + bit1 == con ) { // Found all bits in con? - Node *n1 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ) ); - Node *n2 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(bit2)) ) ); - res = new (phase->C) AddLNode( n2, n1 ); + Node *n1 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(bit1)) ) ); + Node *n2 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(bit2)) ) ); + res = new AddLNode( n2, n1 ); } else if (is_power_of_2_long(con+1)) { // Sleezy: power-of-2 -1. Next time be generic. jlong temp = (jlong) (con + 1); - Node *n1 = phase->transform( new (phase->C) LShiftLNode( in(1), phase->intcon(log2_long(temp)) ) ); - res = new (phase->C) SubLNode( n1, in(1) ); + Node *n1 = phase->transform( new LShiftLNode( in(1), phase->intcon(log2_long(temp)) ) ); + res = new SubLNode( n1, in(1) ); } else { return MulNode::Ideal(phase, can_reshape); } @@ -318,7 +318,7 @@ if( sign_flip ) { // Need to negate result? res = phase->transform(res);// Transform, before making the zero con - res = new (phase->C) SubLNode(phase->longcon(0),res); + res = new SubLNode(phase->longcon(0),res); } return res; // Return final result @@ -477,31 +477,31 @@ // Masking bits off of a Character? Hi bits are already zero. if( lop == Op_LoadUS && (mask & 0xFFFF0000) ) // Can we make a smaller mask? - return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF)); + return new AndINode(load,phase->intcon(mask&0xFFFF)); // Masking bits off of a Short? Loading a Character does some masking if (can_reshape && load->outcnt() == 1 && load->unique_out() == this) { if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { - Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), - load->in(MemNode::Memory), - load->in(MemNode::Address), - load->adr_type(), - TypeInt::CHAR, MemNode::unordered); + Node *ldus = new LoadUSNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type(), + TypeInt::CHAR, MemNode::unordered); ldus = phase->transform(ldus); - return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); + return new AndINode(ldus, phase->intcon(mask & 0xFFFF)); } // Masking sign bits off of a Byte? Do an unsigned byte load plus // an and. if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { - Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), - load->in(MemNode::Memory), - load->in(MemNode::Address), - load->adr_type(), - TypeInt::UBYTE, MemNode::unordered); + Node* ldub = new LoadUBNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type(), + TypeInt::UBYTE, MemNode::unordered); ldub = phase->transform(ldub); - return new (phase->C) AndINode(ldub, phase->intcon(mask)); + return new AndINode(ldub, phase->intcon(mask)); } } @@ -516,8 +516,8 @@ // bits survive. NO sign-extension bits survive the maskings. if( (sign_bits_mask & mask) == 0 ) { // Use zero-fill shift instead - Node *zshift = phase->transform(new (phase->C) URShiftINode(load->in(1),load->in(2))); - return new (phase->C) AndINode( zshift, in(2) ); + Node *zshift = phase->transform(new URShiftINode(load->in(1),load->in(2))); + return new AndINode( zshift, in(2) ); } } } @@ -527,7 +527,7 @@ // plus 1) and the mask is of the low order bit. Skip the negate. if( lop == Op_SubI && mask == 1 && load->in(1) && phase->type(load->in(1)) == TypeInt::ZERO ) - return new (phase->C) AndINode( load->in(2), in(2) ); + return new AndINode( load->in(2), in(2) ); return MulNode::Ideal(phase, can_reshape); } @@ -611,9 +611,9 @@ // value. This check includes UI2L masks (0x00000000FFFFFFFF) which // would be optimized away later in Identity. if (op == Op_ConvI2L && (mask & CONST64(0xFFFFFFFF80000000)) == 0) { - Node* andi = new (phase->C) AndINode(in1->in(1), phase->intcon(mask)); + Node* andi = new AndINode(in1->in(1), phase->intcon(mask)); andi = phase->transform(andi); - return new (phase->C) ConvI2LNode(andi); + return new ConvI2LNode(andi); } // Masking off sign bits? Dont make them! @@ -627,8 +627,8 @@ // bits survive. NO sign-extension bits survive the maskings. if( (sign_bits_mask & mask) == 0 ) { // Use zero-fill shift instead - Node *zshift = phase->transform(new (phase->C) URShiftLNode(in1->in(1), in1->in(2))); - return new (phase->C) AndLNode(zshift, in(2)); + Node *zshift = phase->transform(new URShiftLNode(in1->in(1), in1->in(2))); + return new AndLNode(zshift, in(2)); } } } @@ -666,9 +666,9 @@ // and 'i2b' patterns which typically fold into 'StoreC/StoreB'. if( con < 16 ) { // Compute X << con0 - Node *lsh = phase->transform( new (phase->C) LShiftINode( add1->in(1), in(2) ) ); + Node *lsh = phase->transform( new LShiftINode( add1->in(1), in(2) ) ); // Compute X<C) AddINode( lsh, phase->intcon(t12->get_con() << con)); + return new AddINode( lsh, phase->intcon(t12->get_con() << con)); } } } @@ -677,7 +677,7 @@ if( (add1_op == Op_RShiftI || add1_op == Op_URShiftI ) && add1->in(2) == in(2) ) // Convert to "(x & -(1<C) AndINode(add1->in(1),phase->intcon( -(1<in(1),phase->intcon( -(1<>c0) & Y)<in(2) == in(2) ) { // Convert to "(x & (Y<transform( new (phase->C) LShiftINode( add1->in(2), in(2) ) ); - return new (phase->C) AndINode( add2->in(1), y_sh ); + Node *y_sh = phase->transform( new LShiftINode( add1->in(2), in(2) ) ); + return new AndINode( add2->in(1), y_sh ); } } @@ -696,7 +696,7 @@ const jint bits_mask = right_n_bits(BitsPerJavaInteger-con); if( add1_op == Op_AndI && phase->type(add1->in(2)) == TypeInt::make( bits_mask ) ) - return new (phase->C) LShiftINode( add1->in(1), in(2) ); + return new LShiftINode( add1->in(1), in(2) ); return NULL; } @@ -776,9 +776,9 @@ const TypeLong *t12 = phase->type(add1->in(2))->isa_long(); if( t12 && t12->is_con() ){ // Left input is an add of a con? // Compute X << con0 - Node *lsh = phase->transform( new (phase->C) LShiftLNode( add1->in(1), in(2) ) ); + Node *lsh = phase->transform( new LShiftLNode( add1->in(1), in(2) ) ); // Compute X<C) AddLNode( lsh, phase->longcon(t12->get_con() << con)); + return new AddLNode( lsh, phase->longcon(t12->get_con() << con)); } } @@ -786,7 +786,7 @@ if( (add1_op == Op_RShiftL || add1_op == Op_URShiftL ) && add1->in(2) == in(2) ) // Convert to "(x & -(1<C) AndLNode(add1->in(1),phase->longcon( -(CONST64(1)<in(1),phase->longcon( -(CONST64(1)<>c0) & Y)<in(2) == in(2) ) { // Convert to "(x & (Y<transform( new (phase->C) LShiftLNode( add1->in(2), in(2) ) ); - return new (phase->C) AndLNode( add2->in(1), y_sh ); + Node *y_sh = phase->transform( new LShiftLNode( add1->in(2), in(2) ) ); + return new AndLNode( add2->in(1), y_sh ); } } @@ -805,7 +805,7 @@ const jlong bits_mask = ((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - con)) - CONST64(1); if( add1_op == Op_AndL && phase->type(add1->in(2)) == TypeLong::make( bits_mask ) ) - return new (phase->C) LShiftLNode( add1->in(1), in(2) ); + return new LShiftLNode( add1->in(1), in(2) ); return NULL; } @@ -907,8 +907,8 @@ Node *x = mask->in(1); jint maskbits = t3->get_con(); // Convert to "(x >> shift) & (mask >> shift)" - Node *shr_nomask = phase->transform( new (phase->C) RShiftINode(mask->in(1), in(2)) ); - return new (phase->C) AndINode(shr_nomask, phase->intcon( maskbits >> shift)); + Node *shr_nomask = phase->transform( new RShiftINode(mask->in(1), in(2)) ); + return new AndINode(shr_nomask, phase->intcon( maskbits >> shift)); } // Check for "(short[i] <<16)>>16" which simply sign-extends @@ -933,11 +933,11 @@ ld->Opcode() == Op_LoadUS && ld->outcnt() == 1 && ld->unique_out() == shl) // Replace zero-extension-load with sign-extension-load - return new (phase->C) LoadSNode( ld->in(MemNode::Control), - ld->in(MemNode::Memory), - ld->in(MemNode::Address), - ld->adr_type(), TypeInt::SHORT, - MemNode::unordered); + return new LoadSNode( ld->in(MemNode::Control), + ld->in(MemNode::Memory), + ld->in(MemNode::Address), + ld->adr_type(), TypeInt::SHORT, + MemNode::unordered); } // Check for "(byte[i] <<24)>>24" which simply sign-extends @@ -1119,7 +1119,7 @@ const int con2 = t12->get_con() & 31; // Shift count is always masked const int con3 = con+con2; if( con3 < 32 ) // Only merge shifts if total is < 32 - return new (phase->C) URShiftINode( in(1)->in(1), phase->intcon(con3) ); + return new URShiftINode( in(1)->in(1), phase->intcon(con3) ); } } @@ -1132,9 +1132,9 @@ Node *lshl = add->in(1); if( lshl->Opcode() == Op_LShiftI && phase->type(lshl->in(2)) == t2 ) { - Node *y_z = phase->transform( new (phase->C) URShiftINode(add->in(2),in(2)) ); - Node *sum = phase->transform( new (phase->C) AddINode( lshl->in(1), y_z ) ); - return new (phase->C) AndINode( sum, phase->intcon(mask) ); + Node *y_z = phase->transform( new URShiftINode(add->in(2),in(2)) ); + Node *sum = phase->transform( new AddINode( lshl->in(1), y_z ) ); + return new AndINode( sum, phase->intcon(mask) ); } } @@ -1147,8 +1147,8 @@ if( t3 && t3->is_con() ) { // Right input is a constant jint mask2 = t3->get_con(); mask2 >>= con; // *signed* shift downward (high-order zeroes do not help) - Node *newshr = phase->transform( new (phase->C) URShiftINode(andi->in(1), in(2)) ); - return new (phase->C) AndINode(newshr, phase->intcon(mask2)); + Node *newshr = phase->transform( new URShiftINode(andi->in(1), in(2)) ); + return new AndINode(newshr, phase->intcon(mask2)); // The negative values are easier to materialize than positive ones. // A typical case from address arithmetic is ((x & ~15) >> 4). // It's better to change that to ((x >> 4) & ~0) versus @@ -1160,7 +1160,7 @@ Node *shl = in(1); if( in1_op == Op_LShiftI && phase->type(shl->in(2)) == t2 ) - return new (phase->C) AndINode( shl->in(1), phase->intcon(mask) ); + return new AndINode( shl->in(1), phase->intcon(mask) ); return NULL; } @@ -1265,9 +1265,9 @@ Node *lshl = add->in(1); if( lshl->Opcode() == Op_LShiftL && phase->type(lshl->in(2)) == t2 ) { - Node *y_z = phase->transform( new (phase->C) URShiftLNode(add->in(2),in(2)) ); - Node *sum = phase->transform( new (phase->C) AddLNode( lshl->in(1), y_z ) ); - return new (phase->C) AndLNode( sum, phase->longcon(mask) ); + Node *y_z = phase->transform( new URShiftLNode(add->in(2),in(2)) ); + Node *sum = phase->transform( new AddLNode( lshl->in(1), y_z ) ); + return new AndLNode( sum, phase->longcon(mask) ); } } @@ -1280,8 +1280,8 @@ if( t3 && t3->is_con() ) { // Right input is a constant jlong mask2 = t3->get_con(); mask2 >>= con; // *signed* shift downward (high-order zeroes do not help) - Node *newshr = phase->transform( new (phase->C) URShiftLNode(andi->in(1), in(2)) ); - return new (phase->C) AndLNode(newshr, phase->longcon(mask2)); + Node *newshr = phase->transform( new URShiftLNode(andi->in(1), in(2)) ); + return new AndLNode(newshr, phase->longcon(mask2)); } } @@ -1289,7 +1289,7 @@ Node *shl = in(1); if( shl->Opcode() == Op_LShiftL && phase->type(shl->in(2)) == t2 ) - return new (phase->C) AndLNode( shl->in(1), phase->longcon(mask) ); + return new AndLNode( shl->in(1), phase->longcon(mask) ); return NULL; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/node.cpp --- a/hotspot/src/share/vm/opto/node.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/node.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -274,23 +274,6 @@ // The value NULL is reserved for the top node only. #define NO_OUT_ARRAY ((Node**)-1) -// This funny expression handshakes with Node::operator new -// to pull Compile::current out of the new node's _out field, -// and then calls a subroutine which manages most field -// initializations. The only one which is tricky is the -// _idx field, which is const, and so must be initialized -// by a return value, not an assignment. -// -// (Aren't you thankful that Java finals don't require so many tricks?) -#define IDX_INIT(req) this->Init((req), (Compile*) this->_out) -#ifdef _MSC_VER // the IDX_INIT hack falls foul of warning C4355 -#pragma warning( disable:4355 ) // 'this' : used in base member initializer list -#endif -#ifdef __clang__ -#pragma clang diagnostic push -#pragma GCC diagnostic ignored "-Wuninitialized" -#endif - // Out-of-line code from node constructors. // Executed only when extra debug info. is being passed around. static void init_node_notes(Compile* C, int idx, Node_Notes* nn) { @@ -298,8 +281,8 @@ } // Shared initialization code. -inline int Node::Init(int req, Compile* C) { - assert(Compile::current() == C, "must use operator new(Compile*)"); +inline int Node::Init(int req) { + Compile* C = Compile::current(); int idx = C->next_unique(); // Allocate memory for the necessary number of edges. @@ -328,7 +311,7 @@ //------------------------------Node------------------------------------------- // Create a Node, with a given number of required edges. Node::Node(uint req) - : _idx(IDX_INIT(req)) + : _idx(Init(req)) { assert( req < (uint)(MaxNodeLimit - NodeLimitFudgeFactor), "Input limit exceeded" ); debug_only( verify_construction() ); @@ -347,7 +330,7 @@ //------------------------------Node------------------------------------------- Node::Node(Node *n0) - : _idx(IDX_INIT(1)) + : _idx(Init(1)) { debug_only( verify_construction() ); NOT_PRODUCT(nodes_created++); @@ -359,7 +342,7 @@ //------------------------------Node------------------------------------------- Node::Node(Node *n0, Node *n1) - : _idx(IDX_INIT(2)) + : _idx(Init(2)) { debug_only( verify_construction() ); NOT_PRODUCT(nodes_created++); @@ -373,7 +356,7 @@ //------------------------------Node------------------------------------------- Node::Node(Node *n0, Node *n1, Node *n2) - : _idx(IDX_INIT(3)) + : _idx(Init(3)) { debug_only( verify_construction() ); NOT_PRODUCT(nodes_created++); @@ -389,7 +372,7 @@ //------------------------------Node------------------------------------------- Node::Node(Node *n0, Node *n1, Node *n2, Node *n3) - : _idx(IDX_INIT(4)) + : _idx(Init(4)) { debug_only( verify_construction() ); NOT_PRODUCT(nodes_created++); @@ -407,7 +390,7 @@ //------------------------------Node------------------------------------------- Node::Node(Node *n0, Node *n1, Node *n2, Node *n3, Node *n4) - : _idx(IDX_INIT(5)) + : _idx(Init(5)) { debug_only( verify_construction() ); NOT_PRODUCT(nodes_created++); @@ -428,7 +411,7 @@ //------------------------------Node------------------------------------------- Node::Node(Node *n0, Node *n1, Node *n2, Node *n3, Node *n4, Node *n5) - : _idx(IDX_INIT(6)) + : _idx(Init(6)) { debug_only( verify_construction() ); NOT_PRODUCT(nodes_created++); @@ -451,7 +434,7 @@ //------------------------------Node------------------------------------------- Node::Node(Node *n0, Node *n1, Node *n2, Node *n3, Node *n4, Node *n5, Node *n6) - : _idx(IDX_INIT(7)) + : _idx(Init(7)) { debug_only( verify_construction() ); NOT_PRODUCT(nodes_created++); @@ -473,10 +456,6 @@ _in[6] = n6; if (n6 != NULL) n6->add_out((Node *)this); } -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - //------------------------------clone------------------------------------------ // Clone a Node. @@ -535,6 +514,9 @@ if (n->is_Call()) { n->as_Call()->clone_jvms(C); } + if (n->is_SafePoint()) { + n->as_SafePoint()->clone_replaced_nodes(); + } return n; // Return the clone } @@ -630,6 +612,9 @@ if (is_expensive()) { compile->remove_expensive_node(this); } + if (is_SafePoint()) { + as_SafePoint()->delete_replaced_nodes(); + } #ifdef ASSERT // We will not actually delete the storage, but we'll make the node unusable. *(address*)this = badAddress; // smash the C++ vtbl, probably @@ -1066,15 +1051,15 @@ // set_req(2, phase->intcon(7)); // return this; // Example: reshape "X*4" into "X<<2" -// return new (C) LShiftINode(in(1), phase->intcon(2)); +// return new LShiftINode(in(1), phase->intcon(2)); // // You must call 'phase->transform(X)' on any new Nodes X you make, except // for the returned root node. Example: reshape "X*31" with "(X<<5)-X". -// Node *shift=phase->transform(new(C)LShiftINode(in(1),phase->intcon(5))); -// return new (C) AddINode(shift, in(1)); +// Node *shift=phase->transform(new LShiftINode(in(1),phase->intcon(5))); +// return new AddINode(shift, in(1)); // // When making a Node for a constant use 'phase->makecon' or 'phase->intcon'. -// These forms are faster than 'phase->transform(new (C) ConNode())' and Do +// These forms are faster than 'phase->transform(new ConNode())' and Do // The Right Thing with def-use info. // // You cannot bury the 'this' Node inside of a graph reshape. If the reshaped diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/node.hpp --- a/hotspot/src/share/vm/opto/node.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/node.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -208,14 +208,12 @@ // field is a local cache of a value defined in some "program fragment" for // which these Nodes are just a part of. - // New Operator that takes a Compile pointer, this will eventually - // be the "new" New operator. - inline void* operator new( size_t x, Compile* C) throw() { + inline void* operator new(size_t x) throw() { + Compile* C = Compile::current(); Node* n = (Node*)C->node_arena()->Amalloc_D(x); #ifdef ASSERT n->_in = (Node**)n; // magic cookie for assertion check #endif - n->_out = (Node**)C; return (void*)n; } @@ -259,7 +257,7 @@ // Puts initial values in all Node fields except _idx. // Returns the initial value for _idx, which cannot // be initialized by assignment. - inline int Init(int req, Compile* C); + inline int Init(int req); //----------------- input edge handling protected: diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/output.cpp --- a/hotspot/src/share/vm/opto/output.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/output.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -67,7 +67,7 @@ const StartNode *start = entry->head()->as_Start(); // Replace StartNode with prolog - MachPrologNode *prolog = new (this) MachPrologNode(); + MachPrologNode *prolog = new MachPrologNode(); entry->map_node(prolog, 0); _cfg->map_node_to_block(prolog, entry); _cfg->unmap_node_from_block(start); // start is no longer in any block @@ -77,12 +77,12 @@ if( is_osr_compilation() ) { if( PoisonOSREntry ) { // TODO: Should use a ShouldNotReachHereNode... - _cfg->insert( broot, 0, new (this) MachBreakpointNode() ); + _cfg->insert( broot, 0, new MachBreakpointNode() ); } } else { if( _method && !_method->flags().is_static() ) { // Insert unvalidated entry point - _cfg->insert( broot, 0, new (this) MachUEPNode() ); + _cfg->insert( broot, 0, new MachUEPNode() ); } } @@ -98,7 +98,7 @@ ) { // checking for _method means that OptoBreakpoint does not apply to // runtime stubs or frame converters - _cfg->insert( entry, 1, new (this) MachBreakpointNode() ); + _cfg->insert( entry, 1, new MachBreakpointNode() ); } // Insert epilogs before every return @@ -107,7 +107,7 @@ if (!block->is_connector() && block->non_connector_successor(0) == _cfg->get_root_block()) { // Found a program exit point? Node* m = block->end(); if (m->is_Mach() && m->as_Mach()->ideal_Opcode() != Op_Halt) { - MachEpilogNode* epilog = new (this) MachEpilogNode(m->as_Mach()->ideal_Opcode() == Op_Return); + MachEpilogNode* epilog = new MachEpilogNode(m->as_Mach()->ideal_Opcode() == Op_Return); block->add_inst(epilog); _cfg->map_node_to_block(epilog, block); } @@ -268,7 +268,7 @@ Node* Compile::call_zap_node(MachSafePointNode* node_to_check, int block_no) { const TypeFunc *tf = OptoRuntime::zap_dead_locals_Type(); CallStaticJavaNode* ideal_node = - new (this) CallStaticJavaNode( tf, + new CallStaticJavaNode( tf, OptoRuntime::zap_dead_locals_stub(_method->flags().is_native()), "call zap dead locals stub", 0, TypePtr::BOTTOM); // We need to copy the OopMap from the site we're zapping at. @@ -368,7 +368,7 @@ // Step one, perform a pessimistic sizing pass. uint last_call_adr = max_juint; uint last_avoid_back_to_back_adr = max_juint; - uint nop_size = (new (this) MachNopNode())->size(_regalloc); + uint nop_size = (new MachNopNode())->size(_regalloc); for (uint i = 0; i < nblocks; i++) { // For all blocks Block* block = _cfg->get_block(i); @@ -1201,7 +1201,7 @@ uint *call_returns = NEW_RESOURCE_ARRAY(uint, nblocks+1); uint return_offset = 0; - int nop_size = (new (this) MachNopNode())->size(_regalloc); + int nop_size = (new MachNopNode())->size(_regalloc); int previous_offset = 0; int current_offset = 0; @@ -1327,7 +1327,7 @@ if(padding > 0) { assert((padding % nop_size) == 0, "padding is not a multiple of NOP size"); int nops_cnt = padding / nop_size; - MachNode *nop = new (this) MachNopNode(nops_cnt); + MachNode *nop = new MachNopNode(nops_cnt); block->insert_node(nop, j++); last_inst++; _cfg->map_node_to_block(nop, block); @@ -1413,7 +1413,7 @@ assert((br_size - new_size) >= (int)nop_size, "short_branch size should be smaller"); // Insert padding between avoid_back_to_back branches. if (needs_padding && replacement->avoid_back_to_back(MachNode::AVOID_BEFORE)) { - MachNode *nop = new (this) MachNopNode(); + MachNode *nop = new MachNopNode(); block->insert_node(nop, j++); _cfg->map_node_to_block(nop, block); last_inst++; @@ -1573,7 +1573,7 @@ Block *nb = _cfg->get_block(i + 1); int padding = nb->alignment_padding(current_offset); if( padding > 0 ) { - MachNode *nop = new (this) MachNopNode(padding / nop_size); + MachNode *nop = new MachNopNode(padding / nop_size); block->insert_node(nop, block->number_of_nodes()); _cfg->map_node_to_block(nop, block); nop->emit(*cb, _regalloc); @@ -1786,7 +1786,7 @@ #endif { // Create a MachNopNode - _nop = new (&compile) MachNopNode(); + _nop = new MachNopNode(); // Now that the nops are in the array, save the count // (but allow entries for the nops) @@ -2688,7 +2688,7 @@ if ( _pinch_free_list.size() > 0) { pinch = _pinch_free_list.pop(); } else { - pinch = new (_cfg->C) Node(1); // Pinch point to-be + pinch = new Node(1); // Pinch point to-be } if (pinch->_idx >= _regalloc->node_regs_max_index()) { _cfg->C->record_method_not_compilable("too many D-U pinch points"); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/parse.hpp --- a/hotspot/src/share/vm/opto/parse.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/parse.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -359,12 +359,13 @@ int _est_switch_depth; // Debugging SwitchRanges. #endif - // parser for the caller of the method of this object - Parse* const _parent; + bool _first_return; // true if return is the first to be parsed + bool _replaced_nodes_for_exceptions; // needs processing of replaced nodes in exception paths? + uint _new_idx; // any node with _idx above were new during this parsing. Used to trim the replaced nodes list. public: // Constructor - Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Parse* parent); + Parse(JVMState* caller, ciMethod* parse_method, float expected_uses); virtual Parse* is_Parse() const { return (Parse*)this; } @@ -425,8 +426,6 @@ return block()->successor_for_bci(bci); } - Parse* parent_parser() const { return _parent; } - private: // Create a JVMS & map for the initial state of this method. SafePointNode* create_entry_map(); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/parse1.cpp --- a/hotspot/src/share/vm/opto/parse1.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/parse1.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -109,10 +109,10 @@ // doubles on Sparc. Intel can handle them just fine directly. Node *l; switch (bt) { // Signature is flattened - case T_INT: l = new (C) LoadINode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInt::INT, MemNode::unordered); break; - case T_FLOAT: l = new (C) LoadFNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::FLOAT, MemNode::unordered); break; - case T_ADDRESS: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered); break; - case T_OBJECT: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM, MemNode::unordered); break; + case T_INT: l = new LoadINode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInt::INT, MemNode::unordered); break; + case T_FLOAT: l = new LoadFNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::FLOAT, MemNode::unordered); break; + case T_ADDRESS: l = new LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, MemNode::unordered); break; + case T_OBJECT: l = new LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM, MemNode::unordered); break; case T_LONG: case T_DOUBLE: { // Since arguments are in reverse order, the argument address 'adr' @@ -120,12 +120,12 @@ adr = basic_plus_adr(local_addrs_base, local_addrs, -(index+1)*wordSize); if (Matcher::misaligned_doubles_ok) { l = (bt == T_DOUBLE) - ? (Node*)new (C) LoadDNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::DOUBLE, MemNode::unordered) - : (Node*)new (C) LoadLNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeLong::LONG, MemNode::unordered); + ? (Node*)new LoadDNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::DOUBLE, MemNode::unordered) + : (Node*)new LoadLNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeLong::LONG, MemNode::unordered); } else { l = (bt == T_DOUBLE) - ? (Node*)new (C) LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered) - : (Node*)new (C) LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered); + ? (Node*)new LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered) + : (Node*)new LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered); } break; } @@ -149,11 +149,11 @@ if (type == TypePtr::NULL_PTR || (tp != NULL && !tp->klass()->is_loaded())) { // Value must be null, not a real oop. - Node* chk = _gvn.transform( new (C) CmpPNode(l, null()) ); - Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) ); + Node* chk = _gvn.transform( new CmpPNode(l, null()) ); + Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) ); IfNode* iff = create_and_map_if(control(), tst, PROB_MAX, COUNT_UNKNOWN); - set_control(_gvn.transform( new (C) IfTrueNode(iff) )); - Node* bad_type = _gvn.transform( new (C) IfFalseNode(iff) ); + set_control(_gvn.transform( new IfTrueNode(iff) )); + Node* bad_type = _gvn.transform( new IfFalseNode(iff) ); bad_type_exit->control()->add_req(bad_type); l = null(); } @@ -220,7 +220,7 @@ Node *monitors_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals+mcnt*2-1)*wordSize); for (index = 0; index < mcnt; index++) { // Make a BoxLockNode for the monitor. - Node *box = _gvn.transform(new (C) BoxLockNode(next_monitor())); + Node *box = _gvn.transform(new BoxLockNode(next_monitor())); // Displaced headers and locked objects are interleaved in the @@ -235,7 +235,7 @@ // Build a bogus FastLockNode (no code will be generated) and push the // monitor into our debug info. - const FastLockNode *flock = _gvn.transform(new (C) FastLockNode( 0, lock_object, box ))->as_FastLock(); + const FastLockNode *flock = _gvn.transform(new FastLockNode( 0, lock_object, box ))->as_FastLock(); map()->push_monitor(flock); // If the lock is our method synchronization lock, tuck it away in @@ -325,7 +325,7 @@ // Now that the interpreter state is loaded, make sure it will match // at execution time what the compiler is expecting now: SafePointNode* bad_type_exit = clone_map(); - bad_type_exit->set_control(new (C) RegionNode(1)); + bad_type_exit->set_control(new RegionNode(1)); assert(osr_block->flow()->jsrs()->size() == 0, "should be no jsrs live at osr point"); for (index = 0; index < max_locals; index++) { @@ -383,8 +383,8 @@ //------------------------------Parse------------------------------------------ // Main parser constructor. -Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Parse* parent) - : _exits(caller), _parent(parent) +Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses) + : _exits(caller) { // Init some variables _caller = caller; @@ -399,6 +399,9 @@ _entry_bci = InvocationEntryBci; _tf = NULL; _block = NULL; + _first_return = true; + _replaced_nodes_for_exceptions = false; + _new_idx = C->unique(); debug_only(_block_count = -1); debug_only(_blocks = (Block*)-1); #ifndef PRODUCT @@ -661,7 +664,7 @@ add_predicate(); // Add new region for back branches. int edges = block->pred_count() - block->preds_parsed() + 1; // +1 for original region - RegionNode *r = new (C) RegionNode(edges+1); + RegionNode *r = new RegionNode(edges+1); _gvn.set_type(r, Type::CONTROL); record_for_igvn(r); r->init_req(edges, control()); @@ -728,14 +731,14 @@ _exits.clean_stack(_exits.sp()); _exits.sync_jvms(); - RegionNode* region = new (C) RegionNode(1); + RegionNode* region = new RegionNode(1); record_for_igvn(region); gvn().set_type_bottom(region); _exits.set_control(region); // Note: iophi and memphi are not transformed until do_exits. - Node* iophi = new (C) PhiNode(region, Type::ABIO); - Node* memphi = new (C) PhiNode(region, Type::MEMORY, TypePtr::BOTTOM); + Node* iophi = new PhiNode(region, Type::ABIO); + Node* memphi = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM); gvn().set_type_bottom(iophi); gvn().set_type_bottom(memphi); _exits.set_i_o(iophi); @@ -752,7 +755,7 @@ ret_type = TypeOopPtr::BOTTOM; } int ret_size = type2size[ret_type->basic_type()]; - Node* ret_phi = new (C) PhiNode(region, ret_type); + Node* ret_phi = new PhiNode(region, ret_type); gvn().set_type_bottom(ret_phi); _exits.ensure_stack(ret_size); assert((int)(tf()->range()->cnt() - TypeFunc::Parms) == ret_size, "good tf range"); @@ -770,7 +773,7 @@ int arg_size = tf->domain()->cnt(); int max_size = MAX2(arg_size, (int)tf->range()->cnt()); JVMState* jvms = new (this) JVMState(max_size - TypeFunc::Parms); - SafePointNode* map = new (this) SafePointNode(max_size, NULL); + SafePointNode* map = new SafePointNode(max_size, NULL); record_for_igvn(map); assert(arg_size == TypeFunc::Parms + (is_osr_compilation() ? 1 : method()->arg_size()), "correct arg_size"); Node_Notes* old_nn = default_node_notes(); @@ -784,7 +787,7 @@ } uint i; for (i = 0; i < (uint)arg_size; i++) { - Node* parm = initial_gvn()->transform(new (this) ParmNode(start, i)); + Node* parm = initial_gvn()->transform(new ParmNode(start, i)); map->init_req(i, parm); // Record all these guys for later GVN. record_for_igvn(parm); @@ -815,7 +818,7 @@ //--------------------------return_values-------------------------------------- void Compile::return_values(JVMState* jvms) { GraphKit kit(jvms); - Node* ret = new (this) ReturnNode(TypeFunc::Parms, + Node* ret = new ReturnNode(TypeFunc::Parms, kit.control(), kit.i_o(), kit.reset_memory(), @@ -843,7 +846,7 @@ // Load my combined exception state into the kit, with all phis transformed: SafePointNode* ex_map = kit.combine_and_pop_all_exception_states(); Node* ex_oop = kit.use_exception_state(ex_map); - RethrowNode* exit = new (this) RethrowNode(kit.control(), + RethrowNode* exit = new RethrowNode(kit.control(), kit.i_o(), kit.reset_memory(), kit.frameptr(), kit.returnadr(), // like a return but with exception input @@ -901,6 +904,10 @@ for (uint i = 0; i < TypeFunc::Parms; i++) { caller.map()->set_req(i, ex_map->in(i)); } + if (ex_map->has_replaced_nodes()) { + _replaced_nodes_for_exceptions = true; + } + caller.map()->transfer_replaced_nodes_from(ex_map, _new_idx); // ...and the exception: Node* ex_oop = saved_ex_oop(ex_map); SafePointNode* caller_ex_map = caller.make_exception_state(ex_oop); @@ -991,7 +998,7 @@ bool do_synch = method()->is_synchronized() && GenerateSynchronizationCode; // record exit from a method if compiled while Dtrace is turned on. - if (do_synch || C->env()->dtrace_method_probes()) { + if (do_synch || C->env()->dtrace_method_probes() || _replaced_nodes_for_exceptions) { // First move the exception list out of _exits: GraphKit kit(_exits.transfer_exceptions_into_jvms()); SafePointNode* normal_map = kit.map(); // keep this guy safe @@ -1016,6 +1023,9 @@ if (C->env()->dtrace_method_probes()) { kit.make_dtrace_method_exit(method()); } + if (_replaced_nodes_for_exceptions) { + kit.map()->apply_replaced_nodes(); + } // Done with exception-path processing. ex_map = kit.make_exception_state(ex_oop); assert(ex_jvms->same_calls_as(ex_map->jvms()), "sanity"); @@ -1035,6 +1045,7 @@ _exits.add_exception_state(ex_map); } } + _exits.map()->apply_replaced_nodes(); } //-----------------------------create_entry_map------------------------------- @@ -1049,6 +1060,9 @@ return NULL; } + // clear current replaced nodes that are of no use from here on (map was cloned in build_exits). + _caller->map()->delete_replaced_nodes(); + // If this is an inlined method, we may have to do a receiver null check. if (_caller->has_method() && is_normal_parse() && !method()->is_static()) { GraphKit kit(_caller); @@ -1065,13 +1079,15 @@ // Create an initial safepoint to hold JVM state during parsing JVMState* jvms = new (C) JVMState(method(), _caller->has_method() ? _caller : NULL); - set_map(new (C) SafePointNode(len, jvms)); + set_map(new SafePointNode(len, jvms)); jvms->set_map(map()); record_for_igvn(map()); assert(jvms->endoff() == len, "correct jvms sizing"); SafePointNode* inmap = _caller->map(); assert(inmap != NULL, "must have inmap"); + // In case of null check on receiver above + map()->transfer_replaced_nodes_from(inmap, _new_idx); uint i; @@ -1578,7 +1594,7 @@ // later lazily. int edges = target->pred_count(); if (edges < pnum) edges = pnum; // might be a new path! - RegionNode *r = new (C) RegionNode(edges+1); + RegionNode *r = new RegionNode(edges+1); gvn().set_type(r, Type::CONTROL); record_for_igvn(r); // zap all inputs to NULL for debugging (done in Node(uint) constructor) @@ -1701,6 +1717,8 @@ set_control(r->nonnull_req()); } + map()->merge_replaced_nodes_with(newin); + // newin has been subsumed into the lazy merge, and is now dead. set_block(save_block); @@ -1973,19 +1991,19 @@ Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::access_flags_offset())); Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT, MemNode::unordered); - Node* mask = _gvn.transform(new (C) AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER))); - Node* check = _gvn.transform(new (C) CmpINode(mask, intcon(0))); - Node* test = _gvn.transform(new (C) BoolNode(check, BoolTest::ne)); + Node* mask = _gvn.transform(new AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER))); + Node* check = _gvn.transform(new CmpINode(mask, intcon(0))); + Node* test = _gvn.transform(new BoolNode(check, BoolTest::ne)); IfNode* iff = create_and_map_if(control(), test, PROB_MAX, COUNT_UNKNOWN); - RegionNode* result_rgn = new (C) RegionNode(3); + RegionNode* result_rgn = new RegionNode(3); record_for_igvn(result_rgn); - Node *skip_register = _gvn.transform(new (C) IfFalseNode(iff)); + Node *skip_register = _gvn.transform(new IfFalseNode(iff)); result_rgn->init_req(1, skip_register); - Node *needs_register = _gvn.transform(new (C) IfTrueNode(iff)); + Node *needs_register = _gvn.transform(new IfTrueNode(iff)); set_control(needs_register); if (stopped()) { // There is no slow path. @@ -2039,9 +2057,9 @@ // or with ProfileRTM (cmp->in(2)) otherwise so that // the check will fold. Node* profile_state = makecon(TypeInt::make(ProfileRTM)); - Node* opq = _gvn.transform( new (C) Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) ); - Node* chk = _gvn.transform( new (C) CmpINode(opq, profile_state) ); - Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) ); + Node* opq = _gvn.transform( new Opaque3Node(C, rtm_state, Opaque3Node::RTM_OPT) ); + Node* chk = _gvn.transform( new CmpINode(opq, profile_state) ); + Node* tst = _gvn.transform( new BoolNode(chk, BoolTest::eq) ); // Branch to failure if state was changed { BuildCutout unless(this, tst, PROB_ALWAYS); uncommon_trap(Deoptimization::Reason_rtm_state_change, @@ -2066,10 +2084,10 @@ Node* mc_adr = makecon(adr_type); Node* cnt_adr = basic_plus_adr(mc_adr, mc_adr, in_bytes(MethodCounters::nmethod_age_offset())); Node* cnt = make_load(control(), cnt_adr, TypeInt::INT, T_INT, adr_type, MemNode::unordered); - Node* decr = _gvn.transform(new (C) SubINode(cnt, makecon(TypeInt::ONE))); + Node* decr = _gvn.transform(new SubINode(cnt, makecon(TypeInt::ONE))); store_to_memory(control(), cnt_adr, decr, T_INT, adr_type, MemNode::unordered); - Node *chk = _gvn.transform(new (C) CmpINode(decr, makecon(TypeInt::ZERO))); - Node* tst = _gvn.transform(new (C) BoolNode(chk, BoolTest::gt)); + Node *chk = _gvn.transform(new CmpINode(decr, makecon(TypeInt::ZERO))); + Node* tst = _gvn.transform(new BoolNode(chk, BoolTest::gt)); { BuildCutout unless(this, tst, PROB_ALWAYS); uncommon_trap(Deoptimization::Reason_tenured, Deoptimization::Action_make_not_entrant); @@ -2124,12 +2142,19 @@ // sharpen the type eagerly; this eases certain assert checking if (tp->higher_equal(TypeInstPtr::NOTNULL)) tr = tr->join_speculative(TypeInstPtr::NOTNULL)->is_instptr(); - value = _gvn.transform(new (C) CheckCastPPNode(0,value,tr)); + value = _gvn.transform(new CheckCastPPNode(0,value,tr)); } } phi->add_req(value); } + if (_first_return) { + _exits.map()->transfer_replaced_nodes_from(map(), _new_idx); + _first_return = false; + } else { + _exits.map()->merge_replaced_nodes_with(map()); + } + stop_and_kill_map(); // This CFG path dies here } @@ -2159,7 +2184,7 @@ kill_dead_locals(); // Clone the JVM State - SafePointNode *sfpnt = new (C) SafePointNode(parms, NULL); + SafePointNode *sfpnt = new SafePointNode(parms, NULL); // Capture memory state BEFORE a SafePoint. Since we can block at a // SafePoint we need our GC state to be safe; i.e. we need all our current diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/parse2.cpp --- a/hotspot/src/share/vm/opto/parse2.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/parse2.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -130,9 +130,9 @@ Node* len = load_array_length(ary); // Test length vs index (standard trick using unsigned compare) - Node* chk = _gvn.transform( new (C) CmpUNode(idx, len) ); + Node* chk = _gvn.transform( new CmpUNode(idx, len) ); BoolTest::mask btest = BoolTest::lt; - tst = _gvn.transform( new (C) BoolNode(chk, btest) ); + tst = _gvn.transform( new BoolNode(chk, btest) ); } // Branch to failure if out of bounds { BuildCutout unless(this, tst, PROB_MAX); @@ -168,15 +168,15 @@ // returns IfNode IfNode* Parse::jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask) { - Node *cmp = _gvn.transform( new (C) CmpINode( a, b)); // two cases: shiftcount > 32 and shiftcount <= 32 - Node *tst = _gvn.transform( new (C) BoolNode( cmp, mask)); + Node *cmp = _gvn.transform( new CmpINode( a, b)); // two cases: shiftcount > 32 and shiftcount <= 32 + Node *tst = _gvn.transform( new BoolNode( cmp, mask)); IfNode *iff = create_and_map_if( control(), tst, ((mask == BoolTest::eq) ? PROB_STATIC_INFREQUENT : PROB_FAIR), COUNT_UNKNOWN ); return iff; } // return Region node Node* Parse::jump_if_join(Node* iffalse, Node* iftrue) { - Node *region = new (C) RegionNode(3); // 2 results + Node *region = new RegionNode(3); // 2 results record_for_igvn(region); region->init_req(1, iffalse); region->init_req(2, iftrue ); @@ -191,28 +191,28 @@ void Parse::jump_if_true_fork(IfNode *iff, int dest_bci_if_true, int prof_table_index) { // True branch, use existing map info { PreserveJVMState pjvms(this); - Node *iftrue = _gvn.transform( new (C) IfTrueNode (iff) ); + Node *iftrue = _gvn.transform( new IfTrueNode (iff) ); set_control( iftrue ); profile_switch_case(prof_table_index); merge_new_path(dest_bci_if_true); } // False branch - Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff) ); + Node *iffalse = _gvn.transform( new IfFalseNode(iff) ); set_control( iffalse ); } void Parse::jump_if_false_fork(IfNode *iff, int dest_bci_if_true, int prof_table_index) { // True branch, use existing map info { PreserveJVMState pjvms(this); - Node *iffalse = _gvn.transform( new (C) IfFalseNode (iff) ); + Node *iffalse = _gvn.transform( new IfFalseNode (iff) ); set_control( iffalse ); profile_switch_case(prof_table_index); merge_new_path(dest_bci_if_true); } // False branch - Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff) ); + Node *iftrue = _gvn.transform( new IfTrueNode(iff) ); set_control( iftrue ); } @@ -440,14 +440,14 @@ // Normalize table lookups to zero int lowval = lo->lo(); - key_val = _gvn.transform( new (C) SubINode(key_val, _gvn.intcon(lowval)) ); + key_val = _gvn.transform( new SubINode(key_val, _gvn.intcon(lowval)) ); // Generate a guard to protect against input keyvals that aren't // in the switch domain. if (needs_guard) { Node* size = _gvn.intcon(num_cases); - Node* cmp = _gvn.transform( new (C) CmpUNode(key_val, size) ); - Node* tst = _gvn.transform( new (C) BoolNode(cmp, BoolTest::ge) ); + Node* cmp = _gvn.transform( new CmpUNode(key_val, size) ); + Node* tst = _gvn.transform( new BoolNode(cmp, BoolTest::ge) ); IfNode* iff = create_and_map_if( control(), tst, PROB_FAIR, COUNT_UNKNOWN); jump_if_true_fork(iff, default_dest, NullTableIndex); } @@ -460,21 +460,21 @@ // Clean the 32-bit int into a real 64-bit offset. // Otherwise, the jint value 0 might turn into an offset of 0x0800000000. const TypeLong* lkeytype = TypeLong::make(CONST64(0), num_cases-1, Type::WidenMin); - key_val = _gvn.transform( new (C) ConvI2LNode(key_val, lkeytype) ); + key_val = _gvn.transform( new ConvI2LNode(key_val, lkeytype) ); #endif // Shift the value by wordsize so we have an index into the table, rather // than a switch value Node *shiftWord = _gvn.MakeConX(wordSize); - key_val = _gvn.transform( new (C) MulXNode( key_val, shiftWord)); + key_val = _gvn.transform( new MulXNode( key_val, shiftWord)); // Create the JumpNode - Node* jtn = _gvn.transform( new (C) JumpNode(control(), key_val, num_cases) ); + Node* jtn = _gvn.transform( new JumpNode(control(), key_val, num_cases) ); // These are the switch destinations hanging off the jumpnode int i = 0; for (SwitchRange* r = lo; r <= hi; r++) { for (int64_t j = r->lo(); j <= r->hi(); j++, i++) { - Node* input = _gvn.transform(new (C) JumpProjNode(jtn, i, r->dest(), (int)(j - lowval))); + Node* input = _gvn.transform(new JumpProjNode(jtn, i, r->dest(), (int)(j - lowval))); { PreserveJVMState pjvms(this); set_control(input); @@ -575,8 +575,8 @@ // two comparisons of same values--should enable 1 test for 2 branches // Use BoolTest::le instead of BoolTest::gt IfNode *iff_le = jump_if_fork_int(key_val, test_val, BoolTest::le); - Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff_le) ); - Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff_le) ); + Node *iftrue = _gvn.transform( new IfTrueNode(iff_le) ); + Node *iffalse = _gvn.transform( new IfFalseNode(iff_le) ); { PreserveJVMState pjvms(this); set_control(iffalse); jump_switch_ranges(key_val, mid+1, hi, switch_depth+1); @@ -592,8 +592,8 @@ if (mid == hi) { jump_if_true_fork(iff_ge, mid->dest(), mid->table_index()); } else { - Node *iftrue = _gvn.transform( new (C) IfTrueNode(iff_ge) ); - Node *iffalse = _gvn.transform( new (C) IfFalseNode(iff_ge) ); + Node *iftrue = _gvn.transform( new IfTrueNode(iff_ge) ); + Node *iffalse = _gvn.transform( new IfFalseNode(iff_ge) ); { PreserveJVMState pjvms(this); set_control(iftrue); jump_switch_ranges(key_val, mid, hi, switch_depth+1); @@ -648,7 +648,7 @@ CAST_FROM_FN_PTR(address, SharedRuntime::frem), "frem", NULL, //no memory effects f1, f2); - Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0)); + Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0)); push(res); } @@ -660,10 +660,10 @@ CAST_FROM_FN_PTR(address, SharedRuntime::drem), "drem", NULL, //no memory effects d1, top(), d2, top()); - Node* res_d = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0)); + Node* res_d = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0)); #ifdef ASSERT - Node* res_top = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 1)); + Node* res_top = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 1)); assert(res_top == top(), "second value must be top"); #endif @@ -677,7 +677,7 @@ CAST_FROM_FN_PTR(address, SharedRuntime::l2f), "l2f", NULL, //no memory effects f1, f2); - Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms + 0)); + Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms + 0)); push(res); } @@ -704,17 +704,17 @@ // Sigh, must handle negative dividends Node *zero = _gvn.intcon(0); IfNode *ifff = jump_if_fork_int(a, zero, BoolTest::lt); - Node *iff = _gvn.transform( new (C) IfFalseNode(ifff) ); - Node *ift = _gvn.transform( new (C) IfTrueNode (ifff) ); + Node *iff = _gvn.transform( new IfFalseNode(ifff) ); + Node *ift = _gvn.transform( new IfTrueNode (ifff) ); Node *reg = jump_if_join(ift, iff); Node *phi = PhiNode::make(reg, NULL, TypeInt::INT); // Negative path; negate/and/negate - Node *neg = _gvn.transform( new (C) SubINode(zero, a) ); - Node *andn= _gvn.transform( new (C) AndINode(neg, mask) ); - Node *negn= _gvn.transform( new (C) SubINode(zero, andn) ); + Node *neg = _gvn.transform( new SubINode(zero, a) ); + Node *andn= _gvn.transform( new AndINode(neg, mask) ); + Node *negn= _gvn.transform( new SubINode(zero, andn) ); phi->init_req(1, negn); // Fast positive case - Node *andx = _gvn.transform( new (C) AndINode(a, mask) ); + Node *andx = _gvn.transform( new AndINode(a, mask) ); phi->init_req(2, andx); // Push the merge push( _gvn.transform(phi) ); @@ -723,7 +723,7 @@ } } // Default case - push( _gvn.transform( new (C) ModINode(control(),a,b) ) ); + push( _gvn.transform( new ModINode(control(),a,b) ) ); } // Handle jsr and jsr_w bytecode @@ -897,53 +897,12 @@ // if a path is never taken, its controlling comparison is // already acting in a stable fashion. If the comparison // seems stable, we will put an expensive uncommon trap -// on the untaken path. To be conservative, and to allow -// partially executed counted loops to be compiled fully, -// we will plant uncommon traps only after pointer comparisons. +// on the untaken path. bool Parse::seems_stable_comparison(BoolTest::mask btest, Node* cmp) { - for (int depth = 4; depth > 0; depth--) { - // The following switch can find CmpP here over half the time for - // dynamic language code rich with type tests. - // Code using counted loops or array manipulations (typical - // of benchmarks) will have many (>80%) CmpI instructions. - switch (cmp->Opcode()) { - case Op_CmpP: - // A never-taken null check looks like CmpP/BoolTest::eq. - // These certainly should be closed off as uncommon traps. - if (btest == BoolTest::eq) - return true; - // A never-failed type check looks like CmpP/BoolTest::ne. - // Let's put traps on those, too, so that we don't have to compile - // unused paths with indeterminate dynamic type information. - if (ProfileDynamicTypes) - return true; - return false; - - case Op_CmpI: - // A small minority (< 10%) of CmpP are masked as CmpI, - // as if by boolean conversion ((p == q? 1: 0) != 0). - // Detect that here, even if it hasn't optimized away yet. - // Specifically, this covers the 'instanceof' operator. - if (btest == BoolTest::ne || btest == BoolTest::eq) { - if (_gvn.type(cmp->in(2))->singleton() && - cmp->in(1)->is_Phi()) { - PhiNode* phi = cmp->in(1)->as_Phi(); - int true_path = phi->is_diamond_phi(); - if (true_path > 0 && - _gvn.type(phi->in(1))->singleton() && - _gvn.type(phi->in(2))->singleton()) { - // phi->region->if_proj->ifnode->bool->cmp - BoolNode* bol = phi->in(0)->in(1)->in(0)->in(1)->as_Bool(); - btest = bol->_test._test; - cmp = bol->in(1); - continue; - } - } - } - return false; - } + if (C->too_many_traps(method(), bci(), Deoptimization::Reason_unstable_if)) { + return false; } - return false; + return true; } //-------------------------------repush_if_args-------------------------------- @@ -1000,7 +959,7 @@ explicit_null_checks_inserted++; // Generate real control flow - Node *tst = _gvn.transform( new (C) BoolNode( c, btest ) ); + Node *tst = _gvn.transform( new BoolNode( c, btest ) ); // Sanity check the probability value assert(prob > 0.0f,"Bad probability in Parser"); @@ -1009,7 +968,7 @@ assert(iff->_prob > 0.0f,"Optimizer made bad probability in parser"); // True branch { PreserveJVMState pjvms(this); - Node* iftrue = _gvn.transform( new (C) IfTrueNode (iff) ); + Node* iftrue = _gvn.transform( new IfTrueNode (iff) ); set_control(iftrue); if (stopped()) { // Path is dead? @@ -1029,7 +988,7 @@ } // False branch - Node* iffalse = _gvn.transform( new (C) IfFalseNode(iff) ); + Node* iffalse = _gvn.transform( new IfFalseNode(iff) ); set_control(iffalse); if (stopped()) { // Path is dead? @@ -1092,7 +1051,7 @@ } assert(btest != BoolTest::eq, "!= is the only canonical exact test"); - Node* tst0 = new (C) BoolNode(c, btest); + Node* tst0 = new BoolNode(c, btest); Node* tst = _gvn.transform(tst0); BoolTest::mask taken_btest = BoolTest::illegal; BoolTest::mask untaken_btest = BoolTest::illegal; @@ -1123,8 +1082,8 @@ float true_prob = (taken_if_true ? prob : untaken_prob); IfNode* iff = create_and_map_if(control(), tst, true_prob, cnt); assert(iff->_prob > 0.0f,"Optimizer made bad probability in parser"); - Node* taken_branch = new (C) IfTrueNode(iff); - Node* untaken_branch = new (C) IfFalseNode(iff); + Node* taken_branch = new IfTrueNode(iff); + Node* untaken_branch = new IfFalseNode(iff); if (!taken_if_true) { // Finish conversion to canonical form Node* tmp = taken_branch; taken_branch = untaken_branch; @@ -1182,32 +1141,8 @@ bool is_fallthrough = (path == successor_for_bci(iter().next_bci())); if (seems_never_taken(prob) && seems_stable_comparison(btest, c)) { - // If this might possibly turn into an implicit null check, - // and the null has never yet been seen, we need to generate - // an uncommon trap, so as to recompile instead of suffering - // with very slow branches. (We'll get the slow branches if - // the program ever changes phase and starts seeing nulls here.) - // - // We do not inspect for a null constant, since a node may - // optimize to 'null' later on. - // - // Null checks, and other tests which expect inequality, - // show btest == BoolTest::eq along the non-taken branch. - // On the other hand, type tests, must-be-null tests, - // and other tests which expect pointer equality, - // show btest == BoolTest::ne along the non-taken branch. - // We prune both types of branches if they look unused. repush_if_args(); - // We need to mark this branch as taken so that if we recompile we will - // see that it is possible. In the tiered system the interpreter doesn't - // do profiling and by the time we get to the lower tier from the interpreter - // the path may be cold again. Make sure it doesn't look untaken - if (is_fallthrough) { - profile_not_taken_branch(!ProfileInterpreter); - } else { - profile_taken_branch(iter().get_dest(), !ProfileInterpreter); - } - uncommon_trap(Deoptimization::Reason_unreached, + uncommon_trap(Deoptimization::Reason_unstable_if, Deoptimization::Action_reinterpret, NULL, (is_fallthrough ? "taken always" : "taken never")); @@ -1288,7 +1223,7 @@ JVMState* jvms = this->jvms(); if (obj_in_map >= 0 && (jvms->is_loc(obj_in_map) || jvms->is_stk(obj_in_map))) { - TypeNode* ccast = new (C) CheckCastPPNode(control(), obj, tboth); + TypeNode* ccast = new CheckCastPPNode(control(), obj, tboth); const Type* tcc = ccast->as_Type()->type(); assert(tcc != obj_type && tcc->higher_equal(obj_type), "must improve"); // Delay transform() call to allow recovery of pre-cast value @@ -1323,10 +1258,10 @@ const Type* tboth = tcon->join_speculative(tval); if (tboth == tval) break; // Nothing to gain. if (tcon->isa_int()) { - ccast = new (C) CastIINode(val, tboth); + ccast = new CastIINode(val, tboth); } else if (tcon == TypePtr::NULL_PTR) { // Cast to null, but keep the pointer identity temporarily live. - ccast = new (C) CastPPNode(val, tboth); + ccast = new CastPPNode(val, tboth); } else { const TypeF* tf = tcon->isa_float_constant(); const TypeD* td = tcon->isa_double_constant(); @@ -1792,59 +1727,59 @@ if (stopped()) return; b = pop(); a = pop(); - push( _gvn.transform( new (C) DivINode(control(),a,b) ) ); + push( _gvn.transform( new DivINode(control(),a,b) ) ); break; case Bytecodes::_imul: b = pop(); a = pop(); - push( _gvn.transform( new (C) MulINode(a,b) ) ); + push( _gvn.transform( new MulINode(a,b) ) ); break; case Bytecodes::_iadd: b = pop(); a = pop(); - push( _gvn.transform( new (C) AddINode(a,b) ) ); + push( _gvn.transform( new AddINode(a,b) ) ); break; case Bytecodes::_ineg: a = pop(); - push( _gvn.transform( new (C) SubINode(_gvn.intcon(0),a)) ); + push( _gvn.transform( new SubINode(_gvn.intcon(0),a)) ); break; case Bytecodes::_isub: b = pop(); a = pop(); - push( _gvn.transform( new (C) SubINode(a,b) ) ); + push( _gvn.transform( new SubINode(a,b) ) ); break; case Bytecodes::_iand: b = pop(); a = pop(); - push( _gvn.transform( new (C) AndINode(a,b) ) ); + push( _gvn.transform( new AndINode(a,b) ) ); break; case Bytecodes::_ior: b = pop(); a = pop(); - push( _gvn.transform( new (C) OrINode(a,b) ) ); + push( _gvn.transform( new OrINode(a,b) ) ); break; case Bytecodes::_ixor: b = pop(); a = pop(); - push( _gvn.transform( new (C) XorINode(a,b) ) ); + push( _gvn.transform( new XorINode(a,b) ) ); break; case Bytecodes::_ishl: b = pop(); a = pop(); - push( _gvn.transform( new (C) LShiftINode(a,b) ) ); + push( _gvn.transform( new LShiftINode(a,b) ) ); break; case Bytecodes::_ishr: b = pop(); a = pop(); - push( _gvn.transform( new (C) RShiftINode(a,b) ) ); + push( _gvn.transform( new RShiftINode(a,b) ) ); break; case Bytecodes::_iushr: b = pop(); a = pop(); - push( _gvn.transform( new (C) URShiftINode(a,b) ) ); + push( _gvn.transform( new URShiftINode(a,b) ) ); break; case Bytecodes::_fneg: a = pop(); - b = _gvn.transform(new (C) NegFNode (a)); + b = _gvn.transform(new NegFNode (a)); push(b); break; case Bytecodes::_fsub: b = pop(); a = pop(); - c = _gvn.transform( new (C) SubFNode(a,b) ); + c = _gvn.transform( new SubFNode(a,b) ); d = precision_rounding(c); push( d ); break; @@ -1852,7 +1787,7 @@ case Bytecodes::_fadd: b = pop(); a = pop(); - c = _gvn.transform( new (C) AddFNode(a,b) ); + c = _gvn.transform( new AddFNode(a,b) ); d = precision_rounding(c); push( d ); break; @@ -1860,7 +1795,7 @@ case Bytecodes::_fmul: b = pop(); a = pop(); - c = _gvn.transform( new (C) MulFNode(a,b) ); + c = _gvn.transform( new MulFNode(a,b) ); d = precision_rounding(c); push( d ); break; @@ -1868,7 +1803,7 @@ case Bytecodes::_fdiv: b = pop(); a = pop(); - c = _gvn.transform( new (C) DivFNode(0,a,b) ); + c = _gvn.transform( new DivFNode(0,a,b) ); d = precision_rounding(c); push( d ); break; @@ -1878,7 +1813,7 @@ // Generate a ModF node. b = pop(); a = pop(); - c = _gvn.transform( new (C) ModFNode(0,a,b) ); + c = _gvn.transform( new ModFNode(0,a,b) ); d = precision_rounding(c); push( d ); } @@ -1891,7 +1826,7 @@ case Bytecodes::_fcmpl: b = pop(); a = pop(); - c = _gvn.transform( new (C) CmpF3Node( a, b)); + c = _gvn.transform( new CmpF3Node( a, b)); push(c); break; case Bytecodes::_fcmpg: @@ -1903,40 +1838,40 @@ // as well by using CmpF3 which implements unordered-lesser instead of // unordered-greater semantics. Finally, commute the result bits. Result // is same as using a CmpF3Greater except we did it with CmpF3 alone. - c = _gvn.transform( new (C) CmpF3Node( b, a)); - c = _gvn.transform( new (C) SubINode(_gvn.intcon(0),c) ); + c = _gvn.transform( new CmpF3Node( b, a)); + c = _gvn.transform( new SubINode(_gvn.intcon(0),c) ); push(c); break; case Bytecodes::_f2i: a = pop(); - push(_gvn.transform(new (C) ConvF2INode(a))); + push(_gvn.transform(new ConvF2INode(a))); break; case Bytecodes::_d2i: a = pop_pair(); - b = _gvn.transform(new (C) ConvD2INode(a)); + b = _gvn.transform(new ConvD2INode(a)); push( b ); break; case Bytecodes::_f2d: a = pop(); - b = _gvn.transform( new (C) ConvF2DNode(a)); + b = _gvn.transform( new ConvF2DNode(a)); push_pair( b ); break; case Bytecodes::_d2f: a = pop_pair(); - b = _gvn.transform( new (C) ConvD2FNode(a)); + b = _gvn.transform( new ConvD2FNode(a)); // This breaks _227_mtrt (speed & correctness) and _222_mpegaudio (speed) - //b = _gvn.transform(new (C) RoundFloatNode(0, b) ); + //b = _gvn.transform(new RoundFloatNode(0, b) ); push( b ); break; case Bytecodes::_l2f: if (Matcher::convL2FSupported()) { a = pop_pair(); - b = _gvn.transform( new (C) ConvL2FNode(a)); + b = _gvn.transform( new ConvL2FNode(a)); // For i486.ad, FILD doesn't restrict precision to 24 or 53 bits. // Rather than storing the result into an FP register then pushing // out to memory to round, the machine instruction that implements @@ -1951,7 +1886,7 @@ case Bytecodes::_l2d: a = pop_pair(); - b = _gvn.transform( new (C) ConvL2DNode(a)); + b = _gvn.transform( new ConvL2DNode(a)); // For i486.ad, rounding is always necessary (see _l2f above). // c = dprecision_rounding(b); c = _gvn.transform(b); @@ -1960,20 +1895,20 @@ case Bytecodes::_f2l: a = pop(); - b = _gvn.transform( new (C) ConvF2LNode(a)); + b = _gvn.transform( new ConvF2LNode(a)); push_pair(b); break; case Bytecodes::_d2l: a = pop_pair(); - b = _gvn.transform( new (C) ConvD2LNode(a)); + b = _gvn.transform( new ConvD2LNode(a)); push_pair(b); break; case Bytecodes::_dsub: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) SubDNode(a,b) ); + c = _gvn.transform( new SubDNode(a,b) ); d = dprecision_rounding(c); push_pair( d ); break; @@ -1981,7 +1916,7 @@ case Bytecodes::_dadd: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) AddDNode(a,b) ); + c = _gvn.transform( new AddDNode(a,b) ); d = dprecision_rounding(c); push_pair( d ); break; @@ -1989,7 +1924,7 @@ case Bytecodes::_dmul: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) MulDNode(a,b) ); + c = _gvn.transform( new MulDNode(a,b) ); d = dprecision_rounding(c); push_pair( d ); break; @@ -1997,14 +1932,14 @@ case Bytecodes::_ddiv: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) DivDNode(0,a,b) ); + c = _gvn.transform( new DivDNode(0,a,b) ); d = dprecision_rounding(c); push_pair( d ); break; case Bytecodes::_dneg: a = pop_pair(); - b = _gvn.transform(new (C) NegDNode (a)); + b = _gvn.transform(new NegDNode (a)); push_pair(b); break; @@ -2015,7 +1950,7 @@ a = pop_pair(); // a % b - c = _gvn.transform( new (C) ModDNode(0,a,b) ); + c = _gvn.transform( new ModDNode(0,a,b) ); d = dprecision_rounding(c); push_pair( d ); } @@ -2028,7 +1963,7 @@ case Bytecodes::_dcmpl: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) CmpD3Node( a, b)); + c = _gvn.transform( new CmpD3Node( a, b)); push(c); break; @@ -2041,8 +1976,8 @@ // unordered-lesser instead of unordered-greater semantics. // Finally, negate the result bits. Result is same as using a // CmpD3Greater except we did it with CmpD3 alone. - c = _gvn.transform( new (C) CmpD3Node( b, a)); - c = _gvn.transform( new (C) SubINode(_gvn.intcon(0),c) ); + c = _gvn.transform( new CmpD3Node( b, a)); + c = _gvn.transform( new SubINode(_gvn.intcon(0),c) ); push(c); break; @@ -2051,44 +1986,44 @@ case Bytecodes::_land: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) AndLNode(a,b) ); + c = _gvn.transform( new AndLNode(a,b) ); push_pair(c); break; case Bytecodes::_lor: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) OrLNode(a,b) ); + c = _gvn.transform( new OrLNode(a,b) ); push_pair(c); break; case Bytecodes::_lxor: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) XorLNode(a,b) ); + c = _gvn.transform( new XorLNode(a,b) ); push_pair(c); break; case Bytecodes::_lshl: b = pop(); // the shift count a = pop_pair(); // value to be shifted - c = _gvn.transform( new (C) LShiftLNode(a,b) ); + c = _gvn.transform( new LShiftLNode(a,b) ); push_pair(c); break; case Bytecodes::_lshr: b = pop(); // the shift count a = pop_pair(); // value to be shifted - c = _gvn.transform( new (C) RShiftLNode(a,b) ); + c = _gvn.transform( new RShiftLNode(a,b) ); push_pair(c); break; case Bytecodes::_lushr: b = pop(); // the shift count a = pop_pair(); // value to be shifted - c = _gvn.transform( new (C) URShiftLNode(a,b) ); + c = _gvn.transform( new URShiftLNode(a,b) ); push_pair(c); break; case Bytecodes::_lmul: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) MulLNode(a,b) ); + c = _gvn.transform( new MulLNode(a,b) ); push_pair(c); break; @@ -2100,7 +2035,7 @@ if (stopped()) return; b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) ModLNode(control(),a,b) ); + c = _gvn.transform( new ModLNode(control(),a,b) ); push_pair(c); break; @@ -2112,20 +2047,20 @@ if (stopped()) return; b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) DivLNode(control(),a,b) ); + c = _gvn.transform( new DivLNode(control(),a,b) ); push_pair(c); break; case Bytecodes::_ladd: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) AddLNode(a,b) ); + c = _gvn.transform( new AddLNode(a,b) ); push_pair(c); break; case Bytecodes::_lsub: b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) SubLNode(a,b) ); + c = _gvn.transform( new SubLNode(a,b) ); push_pair(c); break; case Bytecodes::_lcmp: @@ -2156,58 +2091,58 @@ } b = pop_pair(); a = pop_pair(); - c = _gvn.transform( new (C) CmpL3Node( a, b )); + c = _gvn.transform( new CmpL3Node( a, b )); push(c); break; case Bytecodes::_lneg: a = pop_pair(); - b = _gvn.transform( new (C) SubLNode(longcon(0),a)); + b = _gvn.transform( new SubLNode(longcon(0),a)); push_pair(b); break; case Bytecodes::_l2i: a = pop_pair(); - push( _gvn.transform( new (C) ConvL2INode(a))); + push( _gvn.transform( new ConvL2INode(a))); break; case Bytecodes::_i2l: a = pop(); - b = _gvn.transform( new (C) ConvI2LNode(a)); + b = _gvn.transform( new ConvI2LNode(a)); push_pair(b); break; case Bytecodes::_i2b: // Sign extend a = pop(); - a = _gvn.transform( new (C) LShiftINode(a,_gvn.intcon(24)) ); - a = _gvn.transform( new (C) RShiftINode(a,_gvn.intcon(24)) ); + a = _gvn.transform( new LShiftINode(a,_gvn.intcon(24)) ); + a = _gvn.transform( new RShiftINode(a,_gvn.intcon(24)) ); push( a ); break; case Bytecodes::_i2s: a = pop(); - a = _gvn.transform( new (C) LShiftINode(a,_gvn.intcon(16)) ); - a = _gvn.transform( new (C) RShiftINode(a,_gvn.intcon(16)) ); + a = _gvn.transform( new LShiftINode(a,_gvn.intcon(16)) ); + a = _gvn.transform( new RShiftINode(a,_gvn.intcon(16)) ); push( a ); break; case Bytecodes::_i2c: a = pop(); - push( _gvn.transform( new (C) AndINode(a,_gvn.intcon(0xFFFF)) ) ); + push( _gvn.transform( new AndINode(a,_gvn.intcon(0xFFFF)) ) ); break; case Bytecodes::_i2f: a = pop(); - b = _gvn.transform( new (C) ConvI2FNode(a) ) ; + b = _gvn.transform( new ConvI2FNode(a) ) ; c = precision_rounding(b); push (b); break; case Bytecodes::_i2d: a = pop(); - b = _gvn.transform( new (C) ConvI2DNode(a)); + b = _gvn.transform( new ConvI2DNode(a)); push_pair(b); break; case Bytecodes::_iinc: // Increment local i = iter().get_index(); // Get local index - set_local( i, _gvn.transform( new (C) AddINode( _gvn.intcon(iter().get_iinc_con()), local(i) ) ) ); + set_local( i, _gvn.transform( new AddINode( _gvn.intcon(iter().get_iinc_con()), local(i) ) ) ); break; // Exit points of synchronized methods must have an unlock node @@ -2287,7 +2222,7 @@ assert(null_ctl->is_top(), "no null control here"); dec_sp(1); } - c = _gvn.transform( new (C) CmpPNode(b, a) ); + c = _gvn.transform( new CmpPNode(b, a) ); do_ifnull(btest, c); break; @@ -2298,7 +2233,7 @@ maybe_add_safepoint(iter().get_dest()); a = pop(); b = pop(); - c = _gvn.transform( new (C) CmpPNode(b, a) ); + c = _gvn.transform( new CmpPNode(b, a) ); c = optimize_cmp_with_klass(c); do_if(btest, c); break; @@ -2314,7 +2249,7 @@ maybe_add_safepoint(iter().get_dest()); a = _gvn.intcon(0); b = pop(); - c = _gvn.transform( new (C) CmpINode(b, a) ); + c = _gvn.transform( new CmpINode(b, a) ); do_if(btest, c); break; @@ -2329,7 +2264,7 @@ maybe_add_safepoint(iter().get_dest()); a = pop(); b = pop(); - c = _gvn.transform( new (C) CmpINode( b, a ) ); + c = _gvn.transform( new CmpINode( b, a ) ); do_if(btest, c); break; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/parse3.cpp --- a/hotspot/src/share/vm/opto/parse3.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/parse3.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -552,7 +552,7 @@ } make_slow_call_ex(c, env()->Throwable_klass(), false); - Node* res = _gvn.transform(new (C) ProjNode(c, TypeFunc::Parms)); + Node* res = _gvn.transform(new ProjNode(c, TypeFunc::Parms)); const Type* type = TypeOopPtr::make_from_klass_raw(array_klass); @@ -566,7 +566,7 @@ // We cannot sharpen the nested sub-arrays, since the top level is mutable. - Node* cast = _gvn.transform( new (C) CheckCastPPNode(control(), res, type) ); + Node* cast = _gvn.transform( new CheckCastPPNode(control(), res, type) ); push(cast); // Possible improvements: diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/parseHelper.cpp --- a/hotspot/src/share/vm/opto/parseHelper.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/parseHelper.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -43,7 +43,7 @@ const char *call_name = is_entry ? "dtrace_method_entry" : "dtrace_method_exit"; // Get base of thread-local storage area - Node* thread = _gvn.transform( new (C) ThreadLocalNode() ); + Node* thread = _gvn.transform( new ThreadLocalNode() ); // Get method const TypePtr* method_type = TypeMetadataPtr::make(method); @@ -175,8 +175,8 @@ // Make a constant out of the inexact array klass const TypeKlassPtr *extak = tak->cast_to_exactness(true)->is_klassptr(); Node* con = makecon(extak); - Node* cmp = _gvn.transform(new (C) CmpPNode( array_klass, con )); - Node* bol = _gvn.transform(new (C) BoolNode( cmp, BoolTest::eq )); + Node* cmp = _gvn.transform(new CmpPNode( array_klass, con )); + Node* bol = _gvn.transform(new BoolNode( cmp, BoolTest::eq )); Node* ctrl= control(); { BuildCutout unless(this, bol, PROB_MAX); uncommon_trap(Deoptimization::Reason_array_check, @@ -215,8 +215,8 @@ // if (klass->_init_thread != current_thread || // klass->_init_state != being_initialized) // uncommon_trap - Node* cur_thread = _gvn.transform( new (C) ThreadLocalNode() ); - Node* merge = new (C) RegionNode(3); + Node* cur_thread = _gvn.transform( new ThreadLocalNode() ); + Node* merge = new RegionNode(3); _gvn.set_type(merge, Type::CONTROL); Node* kls = makecon(TypeKlassPtr::make(klass)); @@ -327,9 +327,9 @@ // Test invocation count vs threshold Node *threshold = makecon(TypeInt::make(limit)); - Node *chk = _gvn.transform( new (C) CmpUNode( cnt, threshold) ); + Node *chk = _gvn.transform( new CmpUNode( cnt, threshold) ); BoolTest::mask btest = BoolTest::lt; - Node *tst = _gvn.transform( new (C) BoolNode( chk, btest) ); + Node *tst = _gvn.transform( new BoolNode( chk, btest) ); // Branch to failure if threshold exceeded { BuildCutout unless(this, tst, PROB_ALWAYS); uncommon_trap(Deoptimization::Reason_age, @@ -359,7 +359,7 @@ test_counter_against_threshold(cnt, limit); // Add one to the counter and store - Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1))); + Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(1))); store_to_memory(ctrl, adr_iic_node, incr, T_INT, adr_type, MemNode::unordered); } @@ -380,8 +380,8 @@ if (stride != 0) { Node* str = _gvn.MakeConX(stride); - Node* scale = _gvn.transform( new (C) MulXNode( idx, str ) ); - ptr = _gvn.transform( new (C) AddPNode( mdo, ptr, scale ) ); + Node* scale = _gvn.transform( new MulXNode( idx, str ) ); + ptr = _gvn.transform( new AddPNode( mdo, ptr, scale ) ); } return ptr; @@ -393,7 +393,7 @@ const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr(); Node* cnt = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered); - Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(DataLayout::counter_increment))); + Node* incr = _gvn.transform(new AddINode(cnt, _gvn.intcon(DataLayout::counter_increment))); store_to_memory(NULL, adr_node, incr, T_INT, adr_type, MemNode::unordered); } @@ -413,7 +413,7 @@ const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr(); Node* flags = make_load(NULL, adr_node, TypeInt::BYTE, T_BYTE, adr_type, MemNode::unordered); - Node* incr = _gvn.transform(new (C) OrINode(flags, _gvn.intcon(flag_constant))); + Node* incr = _gvn.transform(new OrINode(flags, _gvn.intcon(flag_constant))); store_to_memory(NULL, adr_node, incr, T_BYTE, adr_type, MemNode::unordered); } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/phaseX.cpp --- a/hotspot/src/share/vm/opto/phaseX.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/phaseX.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -47,7 +47,7 @@ _total_insert_probes(0), _total_inserts(0), _insert_probes(0), _grows(0) { // _sentinel must be in the current node space - _sentinel = new (Compile::current()) ProjNode(NULL, TypeFunc::Control); + _sentinel = new ProjNode(NULL, TypeFunc::Control); memset(_table,0,sizeof(Node*)*_max); } @@ -62,7 +62,7 @@ _total_insert_probes(0), _total_inserts(0), _insert_probes(0), _grows(0) { // _sentinel must be in the current node space - _sentinel = new (Compile::current()) ProjNode(NULL, TypeFunc::Control); + _sentinel = new ProjNode(NULL, TypeFunc::Control); memset(_table,0,sizeof(Node*)*_max); } @@ -1309,7 +1309,7 @@ } // Smash all inputs to 'old', isolating him completely - Node *temp = new (C) Node(1); + Node *temp = new Node(1); temp->init_req(0,nn); // Add a use to nn to prevent him from dying remove_dead_node( old ); temp->del_req(0); // Yank bogus edge diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/reg_split.cpp --- a/hotspot/src/share/vm/opto/reg_split.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/reg_split.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -93,7 +93,7 @@ // Here we assume a trip through memory is required. w_i_mask = &C->FIRST_STACK_mask(); } - return new (C) MachSpillCopyNode(spill_type, def, *w_i_mask, *w_o_mask ); + return new MachSpillCopyNode(spill_type, def, *w_i_mask, *w_o_mask ); } //------------------------------insert_proj------------------------------------ @@ -663,7 +663,7 @@ // create a new phi node and insert it into the block // type is taken from left over pointer to a predecessor assert(n3,"No non-NULL reaching DEF for a Phi"); - phi = new (C) PhiNode(b->head(), n3->bottom_type()); + phi = new PhiNode(b->head(), n3->bottom_type()); // initialize the Reaches entry for this LRG Reachblock[slidx] = phi; @@ -1075,7 +1075,7 @@ // First Split-UP to move value into Register uint def_ideal = def->ideal_reg(); const RegMask* tmp_rm = Matcher::idealreg2regmask[def_ideal]; - Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::MemToReg, def, dmask, *tmp_rm); + Node *spill = new MachSpillCopyNode(MachSpillCopyNode::MemToReg, def, dmask, *tmp_rm); insert_proj( b, insidx, spill, maxlrg ); // Then Split-DOWN as if previous Split was DEF maxlrg = split_USE(MachSpillCopyNode::RegToMem, spill,b,n,inpidx,maxlrg,false,false, splits,slidx); @@ -1229,7 +1229,7 @@ if (C->check_node_count(NodeLimitFudgeFactor, out_of_nodes)) { // Check when generating nodes return 0; } - Node *spill = new (C) MachSpillCopyNode(MachSpillCopyNode::MemToReg, use,use_rm,def_rm); + Node *spill = new MachSpillCopyNode(MachSpillCopyNode::MemToReg, use,use_rm,def_rm); n->set_req(copyidx,spill); n->as_MachSpillCopy()->set_in_RegMask(def_rm); // Put the spill just before the copy diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/replacednodes.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/src/share/vm/opto/replacednodes.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + * + */ + +#include "precompiled.hpp" +#include "opto/cfgnode.hpp" +#include "opto/phaseX.hpp" +#include "opto/replacednodes.hpp" + +void ReplacedNodes::allocate_if_necessary() { + if (_replaced_nodes == NULL) { + _replaced_nodes = new GrowableArray(); + } +} + +bool ReplacedNodes::is_empty() const { + return _replaced_nodes == NULL || _replaced_nodes->length() == 0; +} + +bool ReplacedNodes::has_node(const ReplacedNode& r) const { + return _replaced_nodes->find(r) != -1; +} + +bool ReplacedNodes::has_target_node(Node* n) const { + for (int i = 0; i < _replaced_nodes->length(); i++) { + if (_replaced_nodes->at(i).improved() == n) { + return true; + } + } + return false; +} + +// Record replaced node if not seen before +void ReplacedNodes::record(Node* initial, Node* improved) { + allocate_if_necessary(); + ReplacedNode r(initial, improved); + if (!has_node(r)) { + _replaced_nodes->push(r); + } +} + +// Copy replaced nodes from one map to another. idx is used to +// identify nodes that are too new to be of interest in the target +// node list. +void ReplacedNodes::transfer_from(const ReplacedNodes& other, uint idx) { + if (other.is_empty()) { + return; + } + allocate_if_necessary(); + for (int i = 0; i < other._replaced_nodes->length(); i++) { + ReplacedNode replaced = other._replaced_nodes->at(i); + // Only transfer the nodes that can actually be useful + if (!has_node(replaced) && (replaced.initial()->_idx < idx || has_target_node(replaced.initial()))) { + _replaced_nodes->push(replaced); + } + } +} + +void ReplacedNodes::clone() { + if (_replaced_nodes != NULL) { + GrowableArray* replaced_nodes_clone = new GrowableArray(); + replaced_nodes_clone->appendAll(_replaced_nodes); + _replaced_nodes = replaced_nodes_clone; + } +} + +void ReplacedNodes::reset() { + if (_replaced_nodes != NULL) { + _replaced_nodes->clear(); + } +} + +// Perfom node replacement (used when returning to caller) +void ReplacedNodes::apply(Node* n) { + if (is_empty()) { + return; + } + for (int i = 0; i < _replaced_nodes->length(); i++) { + ReplacedNode replaced = _replaced_nodes->at(i); + n->replace_edge(replaced.initial(), replaced.improved()); + } +} + +static void enqueue_use(Node* n, Node* use, Unique_Node_List& work) { + if (use->is_Phi()) { + Node* r = use->in(0); + assert(r->is_Region(), "Phi should have Region"); + for (uint i = 1; i < use->req(); i++) { + if (use->in(i) == n) { + work.push(r->in(i)); + } + } + } else { + work.push(use); + } +} + +// Perfom node replacement following late inlining +void ReplacedNodes::apply(Compile* C, Node* ctl) { + // ctl is the control on exit of the method that was late inlined + if (is_empty()) { + return; + } + for (int i = 0; i < _replaced_nodes->length(); i++) { + ReplacedNode replaced = _replaced_nodes->at(i); + Node* initial = replaced.initial(); + Node* improved = replaced.improved(); + assert (ctl != NULL && !ctl->is_top(), "replaced node should have actual control"); + + ResourceMark rm; + Unique_Node_List work; + // Go over all the uses of the node that is considered for replacement... + for (DUIterator j = initial->outs(); initial->has_out(j); j++) { + Node* use = initial->out(j); + + if (use == improved || use->outcnt() == 0) { + continue; + } + work.clear(); + enqueue_use(initial, use, work); + bool replace = true; + // Check that this use is dominated by ctl. Go ahead with the + // replacement if it is. + while (work.size() != 0 && replace) { + Node* n = work.pop(); + if (use->outcnt() == 0) { + continue; + } + if (n->is_CFG() || (n->in(0) != NULL && !n->in(0)->is_top())) { + int depth = 0; + Node *m = n; + if (!n->is_CFG()) { + n = n->in(0); + } + assert(n->is_CFG(), "should be CFG now"); + while(n != ctl) { + n = IfNode::up_one_dom(n); + depth++; + // limit search depth + if (depth >= 100 || n == NULL) { + replace = false; + break; + } + } + } else { + for (DUIterator k = n->outs(); n->has_out(k); k++) { + enqueue_use(n, n->out(k), work); + } + } + } + if (replace) { + bool is_in_table = C->initial_gvn()->hash_delete(use); + int replaced = use->replace_edge(initial, improved); + if (is_in_table) { + C->initial_gvn()->hash_find_insert(use); + } + C->record_for_igvn(use); + + assert(replaced > 0, "inconsistent"); + --j; + } + } + } +} + +void ReplacedNodes::dump(outputStream *st) const { + if (!is_empty()) { + tty->print("replaced nodes: "); + for (int i = 0; i < _replaced_nodes->length(); i++) { + tty->print("%d->%d", _replaced_nodes->at(i).initial()->_idx, _replaced_nodes->at(i).improved()->_idx); + if (i < _replaced_nodes->length()-1) { + tty->print(","); + } + } + } +} + +// Merge 2 list of replaced node at a point where control flow paths merge +void ReplacedNodes::merge_with(const ReplacedNodes& other) { + if (is_empty()) { + return; + } + if (other.is_empty()) { + reset(); + return; + } + int shift = 0; + int len = _replaced_nodes->length(); + for (int i = 0; i < len; i++) { + if (!other.has_node(_replaced_nodes->at(i))) { + shift++; + } else if (shift > 0) { + _replaced_nodes->at_put(i-shift, _replaced_nodes->at(i)); + } + } + if (shift > 0) { + _replaced_nodes->trunc_to(len - shift); + } +} diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/replacednodes.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/src/share/vm/opto/replacednodes.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + * + */ + +#ifndef SHARE_VM_OPTO_REPLACEDNODES_HPP +#define SHARE_VM_OPTO_REPLACEDNODES_HPP + +#include "opto/connode.hpp" + +// During parsing, when a node is "improved", +// GraphKit::replace_in_map() is called to update the current map so +// that the improved node is used from that point +// on. GraphKit::replace_in_map() doesn't operate on the callers maps +// and so some optimization opportunities may be lost. The +// ReplacedNodes class addresses that problem. +// +// A ReplacedNodes object is a list of pair of nodes. Every +// SafePointNode carries a ReplacedNodes object. Every time +// GraphKit::replace_in_map() is called, a new pair of nodes is pushed +// on the list of replaced nodes. When control flow paths merge, their +// replaced nodes are also merged. When parsing exits a method to +// return to a caller, the replaced nodes on the exit path are used to +// update the caller's map. +class ReplacedNodes VALUE_OBJ_CLASS_SPEC { + private: + class ReplacedNode VALUE_OBJ_CLASS_SPEC { + private: + Node* _initial; + Node* _improved; + public: + ReplacedNode() : _initial(NULL), _improved(NULL) {} + ReplacedNode(Node* initial, Node* improved) : _initial(initial), _improved(improved) {} + Node* initial() const { return _initial; } + Node* improved() const { return _improved; } + + bool operator==(const ReplacedNode& other) { + return _initial == other._initial && _improved == other._improved; + } + }; + GrowableArray* _replaced_nodes; + + void allocate_if_necessary(); + bool has_node(const ReplacedNode& r) const; + bool has_target_node(Node* n) const; + + public: + ReplacedNodes() + : _replaced_nodes(NULL) {} + + void clone(); + void record(Node* initial, Node* improved); + void transfer_from(const ReplacedNodes& other, uint idx); + void reset(); + void apply(Node* n); + void merge_with(const ReplacedNodes& other); + bool is_empty() const; + void dump(outputStream *st) const; + void apply(Compile* C, Node* ctl); +}; + +#endif // SHARE_VM_OPTO_REPLACEDNODES_HPP diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/runtime.cpp --- a/hotspot/src/share/vm/opto/runtime.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/runtime.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -896,6 +896,50 @@ return TypeFunc::make(domain, range); } +/* + * void implCompress(byte[] buf, int ofs) + */ +const TypeFunc* OptoRuntime::sha_implCompress_Type() { + // create input type (domain) + int num_args = 2; + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; + fields[argp++] = TypePtr::NOTNULL; // buf + fields[argp++] = TypePtr::NOTNULL; // state + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + + // no result type needed + fields = TypeTuple::fields(1); + fields[TypeFunc::Parms+0] = NULL; // void + const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); + return TypeFunc::make(domain, range); +} + +/* + * int implCompressMultiBlock(byte[] b, int ofs, int limit) + */ +const TypeFunc* OptoRuntime::digestBase_implCompressMB_Type() { + // create input type (domain) + int num_args = 4; + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; + fields[argp++] = TypePtr::NOTNULL; // buf + fields[argp++] = TypePtr::NOTNULL; // state + fields[argp++] = TypeInt::INT; // ofs + fields[argp++] = TypeInt::INT; // limit + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + + // returning ofs (int) + fields = TypeTuple::fields(1); + fields[TypeFunc::Parms+0] = TypeInt::INT; // ofs + const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields); + return TypeFunc::make(domain, range); +} + //------------- Interpreter state access for on stack replacement const TypeFunc* OptoRuntime::osr_end_Type() { // create input type (domain) diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/runtime.hpp --- a/hotspot/src/share/vm/opto/runtime.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/runtime.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, 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 @@ -300,6 +300,9 @@ static const TypeFunc* aescrypt_block_Type(); static const TypeFunc* cipherBlockChaining_aescrypt_Type(); + static const TypeFunc* sha_implCompress_Type(); + static const TypeFunc* digestBase_implCompressMB_Type(); + static const TypeFunc* updateBytesCRC32_Type(); // leaf on stack replacement interpreter accessor types diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/split_if.cpp --- a/hotspot/src/share/vm/opto/split_if.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/split_if.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -35,7 +35,7 @@ uint wins = 0; assert( n->is_CFG(), "" ); assert( region->is_Region(), "" ); - Node *r = new (C) RegionNode( region->req() ); + Node *r = new RegionNode( region->req() ); IdealLoopTree *loop = get_loop( n ); for( uint i = 1; i < region->req(); i++ ) { Node *x = n->clone(); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/stringopts.cpp --- a/hotspot/src/share/vm/opto/stringopts.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/stringopts.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -70,7 +70,7 @@ _multiple(false), _string_alloc(NULL), _stringopts(stringopts) { - _arguments = new (_stringopts->C) Node(1); + _arguments = new Node(1); _arguments->del_req(0); } @@ -228,8 +228,8 @@ const TypeFunc* call_type = OptoRuntime::uncommon_trap_Type(); const TypePtr* no_memory_effects = NULL; Compile* C = _stringopts->C; - CallStaticJavaNode* call = new (C) CallStaticJavaNode(call_type, call_addr, "uncommon_trap", - jvms->bci(), no_memory_effects); + CallStaticJavaNode* call = new CallStaticJavaNode(call_type, call_addr, "uncommon_trap", + jvms->bci(), no_memory_effects); for (int e = 0; e < TypeFunc::Parms; e++) { call->init_req(e, uct->in(e)); } @@ -1127,9 +1127,9 @@ } Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) { - RegionNode *final_merge = new (C) RegionNode(3); + RegionNode *final_merge = new RegionNode(3); kit.gvn().set_type(final_merge, Type::CONTROL); - Node* final_size = new (C) PhiNode(final_merge, TypeInt::INT); + Node* final_size = new PhiNode(final_merge, TypeInt::INT); kit.gvn().set_type(final_size, TypeInt::INT); IfNode* iff = kit.create_and_map_if(kit.control(), @@ -1146,11 +1146,11 @@ } else { // int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i); - RegionNode *r = new (C) RegionNode(3); + RegionNode *r = new RegionNode(3); kit.gvn().set_type(r, Type::CONTROL); - Node *phi = new (C) PhiNode(r, TypeInt::INT); + Node *phi = new PhiNode(r, TypeInt::INT); kit.gvn().set_type(phi, TypeInt::INT); - Node *size = new (C) PhiNode(r, TypeInt::INT); + Node *size = new PhiNode(r, TypeInt::INT); kit.gvn().set_type(size, TypeInt::INT); Node* chk = __ CmpI(arg, __ intcon(0)); Node* p = __ Bool(chk, BoolTest::lt); @@ -1175,11 +1175,11 @@ // Add loop predicate first. kit.add_predicate(); - RegionNode *loop = new (C) RegionNode(3); + RegionNode *loop = new RegionNode(3); loop->init_req(1, kit.control()); kit.gvn().set_type(loop, Type::CONTROL); - Node *index = new (C) PhiNode(loop, TypeInt::INT); + Node *index = new PhiNode(loop, TypeInt::INT); index->init_req(1, __ intcon(0)); kit.gvn().set_type(index, TypeInt::INT); kit.set_control(loop); @@ -1212,7 +1212,7 @@ } void PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* char_array, Node* start, Node* end) { - RegionNode *final_merge = new (C) RegionNode(4); + RegionNode *final_merge = new RegionNode(4); kit.gvn().set_type(final_merge, Type::CONTROL); Node *final_mem = PhiNode::make(final_merge, kit.memory(char_adr_idx), Type::MEMORY, TypeAryPtr::CHARS); kit.gvn().set_type(final_mem, Type::MEMORY); @@ -1262,11 +1262,11 @@ __ Bool(__ CmpI(arg, __ intcon(0)), BoolTest::lt), PROB_FAIR, COUNT_UNKNOWN); - RegionNode *merge = new (C) RegionNode(3); + RegionNode *merge = new RegionNode(3); kit.gvn().set_type(merge, Type::CONTROL); - i = new (C) PhiNode(merge, TypeInt::INT); + i = new PhiNode(merge, TypeInt::INT); kit.gvn().set_type(i, TypeInt::INT); - sign = new (C) PhiNode(merge, TypeInt::INT); + sign = new PhiNode(merge, TypeInt::INT); kit.gvn().set_type(sign, TypeInt::INT); merge->init_req(1, __ IfTrue(iff)); @@ -1295,10 +1295,10 @@ // Add loop predicate first. kit.add_predicate(); - RegionNode *head = new (C) RegionNode(3); + RegionNode *head = new RegionNode(3); head->init_req(1, kit.control()); kit.gvn().set_type(head, Type::CONTROL); - Node *i_phi = new (C) PhiNode(head, TypeInt::INT); + Node *i_phi = new PhiNode(head, TypeInt::INT); i_phi->init_req(1, i); kit.gvn().set_type(i_phi, TypeInt::INT); charPos = PhiNode::make(head, charPos); @@ -1420,7 +1420,7 @@ // as a shim for the insertion of the new code. JVMState* jvms = sc->begin()->jvms()->clone_shallow(C); uint size = sc->begin()->req(); - SafePointNode* map = new (C) SafePointNode(size, jvms); + SafePointNode* map = new SafePointNode(size, jvms); // copy the control and memory state from the final call into our // new starting state. This allows any preceeding tests to feed @@ -1465,12 +1465,12 @@ // Create a region for the overflow checks to merge into. int args = MAX2(sc->num_arguments(), 1); - RegionNode* overflow = new (C) RegionNode(args); + RegionNode* overflow = new RegionNode(args); kit.gvn().set_type(overflow, Type::CONTROL); // Create a hook node to hold onto the individual sizes since they // are need for the copying phase. - Node* string_sizes = new (C) Node(args); + Node* string_sizes = new Node(args); Node* length = __ intcon(0); for (int argi = 0; argi < sc->num_arguments(); argi++) { @@ -1514,9 +1514,9 @@ } else if (!type->higher_equal(TypeInstPtr::NOTNULL)) { // s = s != null ? s : "null"; // length = length + (s.count - s.offset); - RegionNode *r = new (C) RegionNode(3); + RegionNode *r = new RegionNode(3); kit.gvn().set_type(r, Type::CONTROL); - Node *phi = new (C) PhiNode(r, type); + Node *phi = new PhiNode(r, type); kit.gvn().set_type(phi, phi->bottom_type()); Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne); IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/subnode.cpp --- a/hotspot/src/share/vm/opto/subnode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/subnode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -159,7 +159,7 @@ if( t2->base() == Type::Int ){ // Might be bottom or top... const TypeInt *i = t2->is_int(); if( i->is_con() ) - return new (phase->C) AddINode(in1, phase->intcon(-i->get_con())); + return new AddINode(in1, phase->intcon(-i->get_con())); } // Convert "(x+c0) - y" into (x-y) + c0" @@ -168,8 +168,8 @@ if( op1 == Op_AddI && ok_to_convert(in1, in2) ) { const Type *tadd = phase->type( in1->in(2) ); if( tadd->singleton() && tadd != Type::TOP ) { - Node *sub2 = phase->transform( new (phase->C) SubINode( in1->in(1), in2 )); - return new (phase->C) AddINode( sub2, in1->in(2) ); + Node *sub2 = phase->transform( new SubINode( in1->in(1), in2 )); + return new AddINode( sub2, in1->in(2) ); } } @@ -181,9 +181,9 @@ Node* in22 = in2->in(2); const TypeInt* tcon = phase->type(in22)->isa_int(); if (tcon != NULL && tcon->is_con()) { - Node* sub2 = phase->transform( new (phase->C) SubINode(in1, in21) ); + Node* sub2 = phase->transform( new SubINode(in1, in21) ); Node* neg_c0 = phase->intcon(- tcon->get_con()); - return new (phase->C) AddINode(sub2, neg_c0); + return new AddINode(sub2, neg_c0); } } @@ -201,47 +201,47 @@ // Convert "x - (x+y)" into "-y" if( op2 == Op_AddI && phase->eqv( in1, in2->in(1) ) ) - return new (phase->C) SubINode( phase->intcon(0),in2->in(2)); + return new SubINode( phase->intcon(0),in2->in(2)); // Convert "(x-y) - x" into "-y" if( op1 == Op_SubI && phase->eqv( in1->in(1), in2 ) ) - return new (phase->C) SubINode( phase->intcon(0),in1->in(2)); + return new SubINode( phase->intcon(0),in1->in(2)); // Convert "x - (y+x)" into "-y" if( op2 == Op_AddI && phase->eqv( in1, in2->in(2) ) ) - return new (phase->C) SubINode( phase->intcon(0),in2->in(1)); + return new SubINode( phase->intcon(0),in2->in(1)); // Convert "0 - (x-y)" into "y-x" if( t1 == TypeInt::ZERO && op2 == Op_SubI ) - return new (phase->C) SubINode( in2->in(2), in2->in(1) ); + return new SubINode( in2->in(2), in2->in(1) ); // Convert "0 - (x+con)" into "-con-x" jint con; if( t1 == TypeInt::ZERO && op2 == Op_AddI && (con = in2->in(2)->find_int_con(0)) != 0 ) - return new (phase->C) SubINode( phase->intcon(-con), in2->in(1) ); + return new SubINode( phase->intcon(-con), in2->in(1) ); // Convert "(X+A) - (X+B)" into "A - B" if( op1 == Op_AddI && op2 == Op_AddI && in1->in(1) == in2->in(1) ) - return new (phase->C) SubINode( in1->in(2), in2->in(2) ); + return new SubINode( in1->in(2), in2->in(2) ); // Convert "(A+X) - (B+X)" into "A - B" if( op1 == Op_AddI && op2 == Op_AddI && in1->in(2) == in2->in(2) ) - return new (phase->C) SubINode( in1->in(1), in2->in(1) ); + return new SubINode( in1->in(1), in2->in(1) ); // Convert "(A+X) - (X+B)" into "A - B" if( op1 == Op_AddI && op2 == Op_AddI && in1->in(2) == in2->in(1) ) - return new (phase->C) SubINode( in1->in(1), in2->in(2) ); + return new SubINode( in1->in(1), in2->in(2) ); // Convert "(X+A) - (B+X)" into "A - B" if( op1 == Op_AddI && op2 == Op_AddI && in1->in(1) == in2->in(2) ) - return new (phase->C) SubINode( in1->in(2), in2->in(1) ); + return new SubINode( in1->in(2), in2->in(1) ); // Convert "A-(B-C)" into (A+C)-B", since add is commutative and generally // nicer to optimize than subtract. if( op2 == Op_SubI && in2->outcnt() == 1) { - Node *add1 = phase->transform( new (phase->C) AddINode( in1, in2->in(2) ) ); - return new (phase->C) SubINode( add1, in2->in(1) ); + Node *add1 = phase->transform( new AddINode( in1, in2->in(2) ) ); + return new SubINode( add1, in2->in(1) ); } return NULL; @@ -288,7 +288,7 @@ // Convert "x-c0" into "x+ -c0". if( i && // Might be bottom or top... i->is_con() ) - return new (phase->C) AddLNode(in1, phase->longcon(-i->get_con())); + return new AddLNode(in1, phase->longcon(-i->get_con())); // Convert "(x+c0) - y" into (x-y) + c0" // Do not collapse (x+c0)-y if "+" is a loop increment or @@ -297,8 +297,8 @@ Node *in11 = in1->in(1); const Type *tadd = phase->type( in1->in(2) ); if( tadd->singleton() && tadd != Type::TOP ) { - Node *sub2 = phase->transform( new (phase->C) SubLNode( in11, in2 )); - return new (phase->C) AddLNode( sub2, in1->in(2) ); + Node *sub2 = phase->transform( new SubLNode( in11, in2 )); + return new AddLNode( sub2, in1->in(2) ); } } @@ -309,9 +309,9 @@ Node* in22 = in2->in(2); const TypeLong* tcon = phase->type(in22)->isa_long(); if (tcon != NULL && tcon->is_con()) { - Node* sub2 = phase->transform( new (phase->C) SubLNode(in1, in21) ); + Node* sub2 = phase->transform( new SubLNode(in1, in21) ); Node* neg_c0 = phase->longcon(- tcon->get_con()); - return new (phase->C) AddLNode(sub2, neg_c0); + return new AddLNode(sub2, neg_c0); } } @@ -329,28 +329,28 @@ // Convert "x - (x+y)" into "-y" if( op2 == Op_AddL && phase->eqv( in1, in2->in(1) ) ) - return new (phase->C) SubLNode( phase->makecon(TypeLong::ZERO), in2->in(2)); + return new SubLNode( phase->makecon(TypeLong::ZERO), in2->in(2)); // Convert "x - (y+x)" into "-y" if( op2 == Op_AddL && phase->eqv( in1, in2->in(2) ) ) - return new (phase->C) SubLNode( phase->makecon(TypeLong::ZERO),in2->in(1)); + return new SubLNode( phase->makecon(TypeLong::ZERO),in2->in(1)); // Convert "0 - (x-y)" into "y-x" if( phase->type( in1 ) == TypeLong::ZERO && op2 == Op_SubL ) - return new (phase->C) SubLNode( in2->in(2), in2->in(1) ); + return new SubLNode( in2->in(2), in2->in(1) ); // Convert "(X+A) - (X+B)" into "A - B" if( op1 == Op_AddL && op2 == Op_AddL && in1->in(1) == in2->in(1) ) - return new (phase->C) SubLNode( in1->in(2), in2->in(2) ); + return new SubLNode( in1->in(2), in2->in(2) ); // Convert "(A+X) - (B+X)" into "A - B" if( op1 == Op_AddL && op2 == Op_AddL && in1->in(2) == in2->in(2) ) - return new (phase->C) SubLNode( in1->in(1), in2->in(1) ); + return new SubLNode( in1->in(1), in2->in(1) ); // Convert "A-(B-C)" into (A+C)-B" if( op2 == Op_SubL && in2->outcnt() == 1) { - Node *add1 = phase->transform( new (phase->C) AddLNode( in1, in2->in(2) ) ); - return new (phase->C) SubLNode( add1, in2->in(1) ); + Node *add1 = phase->transform( new AddLNode( in1, in2->in(2) ) ); + return new SubLNode( add1, in2->in(1) ); } return NULL; @@ -417,7 +417,7 @@ // Convert "x - (x+y)" into "-y" if( in(2)->is_Add() && phase->eqv(in(1),in(2)->in(1) ) ) - return new (phase->C) SubFNode( phase->makecon(TypeF::ZERO),in(2)->in(2)); + return new SubFNode( phase->makecon(TypeF::ZERO),in(2)->in(2)); } // Cannot replace 0.0-X with -X because a 'fsub' bytecode computes @@ -460,7 +460,7 @@ // Convert "x - (x+y)" into "-y" if( in(2)->is_Add() && phase->eqv(in(1),in(2)->in(1) ) ) - return new (phase->C) SubDNode( phase->makecon(TypeD::ZERO),in(2)->in(2)); + return new SubDNode( phase->makecon(TypeD::ZERO),in(2)->in(2)); } // Cannot replace 0.0-X with -X because a 'dsub' bytecode computes @@ -666,11 +666,11 @@ if (phase->type(in(2))->higher_equal(TypeInt::ZERO)) { switch (in(1)->Opcode()) { case Op_CmpL3: // Collapse a CmpL3/CmpI into a CmpL - return new (phase->C) CmpLNode(in(1)->in(1),in(1)->in(2)); + return new CmpLNode(in(1)->in(1),in(1)->in(2)); case Op_CmpF3: // Collapse a CmpF3/CmpI into a CmpF - return new (phase->C) CmpFNode(in(1)->in(1),in(1)->in(2)); + return new CmpFNode(in(1)->in(1),in(1)->in(2)); case Op_CmpD3: // Collapse a CmpD3/CmpI into a CmpD - return new (phase->C) CmpDNode(in(1)->in(1),in(1)->in(2)); + return new CmpDNode(in(1)->in(1),in(1)->in(2)); //case Op_SubI: // If (x - y) cannot overflow, then ((x - y) 0) // can be turned into (x y). @@ -1109,8 +1109,8 @@ new_in2 = tmp; } CmpFNode *new_cmp = (Opcode() == Op_CmpD3) - ? new (phase->C) CmpF3Node( new_in1, new_in2 ) - : new (phase->C) CmpFNode ( new_in1, new_in2 ) ; + ? new CmpF3Node( new_in1, new_in2 ) + : new CmpFNode ( new_in1, new_in2 ) ; return new_cmp; // Changed to CmpFNode } // Testing value required the precision of a double @@ -1182,9 +1182,9 @@ // Else fall through. The CMove gets in the way of the test. // It should be the case that make_predicate(bol->as_int_value()) == bol. } - Node* cmp = new (C) CmpINode(test_value, phase->intcon(0)); + Node* cmp = new CmpINode(test_value, phase->intcon(0)); cmp = phase->transform(cmp); - Node* bol = new (C) BoolNode(cmp, BoolTest::ne); + Node* bol = new BoolNode(cmp, BoolTest::ne); return phase->transform(bol); } @@ -1200,7 +1200,7 @@ //----------------------------------negate------------------------------------- BoolNode* BoolNode::negate(PhaseGVN* phase) { Compile* C = phase->C; - return new (C) BoolNode(in(1), _test.negate()); + return new BoolNode(in(1), _test.negate()); } @@ -1238,7 +1238,7 @@ // Swap inputs to the clone cmp->swap_edges(1, 2); cmp = phase->transform( cmp ); - return new (phase->C) BoolNode( cmp, _test.commute() ); + return new BoolNode( cmp, _test.commute() ); } // Change "bool eq/ne (cmp (xor X 1) 0)" into "bool ne/eq (cmp X 0)". @@ -1255,8 +1255,8 @@ phase->type( j_xor->in(2) ) == TypeInt::ONE && (_test._test == BoolTest::eq || _test._test == BoolTest::ne) ) { - Node *ncmp = phase->transform(new (phase->C) CmpINode(j_xor->in(1),cmp2)); - return new (phase->C) BoolNode( ncmp, _test.negate() ); + Node *ncmp = phase->transform(new CmpINode(j_xor->in(1),cmp2)); + return new BoolNode( ncmp, _test.negate() ); } // Change "bool eq/ne (cmp (Conv2B X) 0)" into "bool eq/ne (cmp X 0)". @@ -1267,10 +1267,10 @@ (_test._test == BoolTest::eq || _test._test == BoolTest::ne) ) { Node *ncmp = phase->transform(phase->type(c2b->in(1))->isa_int() - ? (Node*)new (phase->C) CmpINode(c2b->in(1),cmp2) - : (Node*)new (phase->C) CmpPNode(c2b->in(1),phase->makecon(TypePtr::NULL_PTR)) + ? (Node*)new CmpINode(c2b->in(1),cmp2) + : (Node*)new CmpPNode(c2b->in(1),phase->makecon(TypePtr::NULL_PTR)) ); - return new (phase->C) BoolNode( ncmp, _test._test ); + return new BoolNode( ncmp, _test._test ); } // Comparing a SubI against a zero is equal to comparing the SubI @@ -1280,8 +1280,8 @@ (cop == Op_CmpI) && (cmp1->Opcode() == Op_SubI) && ( cmp2_type == TypeInt::ZERO ) ) { - Node *ncmp = phase->transform( new (phase->C) CmpINode(cmp1->in(1),cmp1->in(2))); - return new (phase->C) BoolNode( ncmp, _test._test ); + Node *ncmp = phase->transform( new CmpINode(cmp1->in(1),cmp1->in(2))); + return new BoolNode( ncmp, _test._test ); } // Change (-A vs 0) into (A vs 0) by commuting the test. Disallow in the @@ -1292,8 +1292,8 @@ cmp2_type == TypeInt::ZERO && phase->type( cmp1->in(1) ) == TypeInt::ZERO && phase->type( cmp1->in(2) )->higher_equal(TypeInt::SYMINT) ) { - Node *ncmp = phase->transform( new (phase->C) CmpINode(cmp1->in(2),cmp2)); - return new (phase->C) BoolNode( ncmp, _test.commute() ); + Node *ncmp = phase->transform( new CmpINode(cmp1->in(2),cmp2)); + return new BoolNode( ncmp, _test.commute() ); } // The transformation below is not valid for either signed or unsigned diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/superword.cpp --- a/hotspot/src/share/vm/opto/superword.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/superword.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1456,7 +1456,7 @@ if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) { cnt = ConNode::make(C, TypeInt::make(mask)); _igvn.register_new_node_with_optimizer(cnt); - cnt = new (C) AndINode(opd, cnt); + cnt = new AndINode(opd, cnt); _igvn.register_new_node_with_optimizer(cnt); _phase->set_ctrl(cnt, _phase->get_ctrl(opd)); } @@ -2067,42 +2067,42 @@ if (align_to_ref_p.invar() != NULL) { // incorporate any extra invariant piece producing (offset +/- invar) >>> log2(elt) Node* log2_elt = _igvn.intcon(exact_log2(elt_size)); - Node* aref = new (_phase->C) URShiftINode(align_to_ref_p.invar(), log2_elt); + Node* aref = new URShiftINode(align_to_ref_p.invar(), log2_elt); _igvn.register_new_node_with_optimizer(aref); _phase->set_ctrl(aref, pre_ctrl); if (align_to_ref_p.negate_invar()) { - e = new (_phase->C) SubINode(e, aref); + e = new SubINode(e, aref); } else { - e = new (_phase->C) AddINode(e, aref); + e = new AddINode(e, aref); } _igvn.register_new_node_with_optimizer(e); _phase->set_ctrl(e, pre_ctrl); } if (vw > ObjectAlignmentInBytes) { // incorporate base e +/- base && Mask >>> log2(elt) - Node* xbase = new(_phase->C) CastP2XNode(NULL, align_to_ref_p.base()); + Node* xbase = new CastP2XNode(NULL, align_to_ref_p.base()); _igvn.register_new_node_with_optimizer(xbase); #ifdef _LP64 - xbase = new (_phase->C) ConvL2INode(xbase); + xbase = new ConvL2INode(xbase); _igvn.register_new_node_with_optimizer(xbase); #endif Node* mask = _igvn.intcon(vw-1); - Node* masked_xbase = new (_phase->C) AndINode(xbase, mask); + Node* masked_xbase = new AndINode(xbase, mask); _igvn.register_new_node_with_optimizer(masked_xbase); Node* log2_elt = _igvn.intcon(exact_log2(elt_size)); - Node* bref = new (_phase->C) URShiftINode(masked_xbase, log2_elt); + Node* bref = new URShiftINode(masked_xbase, log2_elt); _igvn.register_new_node_with_optimizer(bref); _phase->set_ctrl(bref, pre_ctrl); - e = new (_phase->C) AddINode(e, bref); + e = new AddINode(e, bref); _igvn.register_new_node_with_optimizer(e); _phase->set_ctrl(e, pre_ctrl); } // compute e +/- lim0 if (scale < 0) { - e = new (_phase->C) SubINode(e, lim0); + e = new SubINode(e, lim0); } else { - e = new (_phase->C) AddINode(e, lim0); + e = new AddINode(e, lim0); } _igvn.register_new_node_with_optimizer(e); _phase->set_ctrl(e, pre_ctrl); @@ -2110,13 +2110,13 @@ if (stride * scale > 0) { // compute V - (e +/- lim0) Node* va = _igvn.intcon(v_align); - e = new (_phase->C) SubINode(va, e); + e = new SubINode(va, e); _igvn.register_new_node_with_optimizer(e); _phase->set_ctrl(e, pre_ctrl); } // compute N = (exp) % V Node* va_msk = _igvn.intcon(v_align - 1); - Node* N = new (_phase->C) AndINode(e, va_msk); + Node* N = new AndINode(e, va_msk); _igvn.register_new_node_with_optimizer(N); _phase->set_ctrl(N, pre_ctrl); @@ -2124,15 +2124,15 @@ // lim = lim0 + N Node* lim; if (stride < 0) { - lim = new (_phase->C) SubINode(lim0, N); + lim = new SubINode(lim0, N); } else { - lim = new (_phase->C) AddINode(lim0, N); + lim = new AddINode(lim0, N); } _igvn.register_new_node_with_optimizer(lim); _phase->set_ctrl(lim, pre_ctrl); Node* constrained = - (stride > 0) ? (Node*) new (_phase->C) MinINode(lim, orig_limit) - : (Node*) new (_phase->C) MaxINode(lim, orig_limit); + (stride > 0) ? (Node*) new MinINode(lim, orig_limit) + : (Node*) new MaxINode(lim, orig_limit); _igvn.register_new_node_with_optimizer(constrained); _phase->set_ctrl(constrained, pre_ctrl); _igvn.hash_delete(pre_opaq); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/opto/vectornode.cpp --- a/hotspot/src/share/vm/opto/vectornode.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/opto/vectornode.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -252,46 +252,46 @@ guarantee(vopc > 0, err_msg_res("Vector for '%s' is not implemented", NodeClassNames[opc])); switch (vopc) { - case Op_AddVB: return new (C) AddVBNode(n1, n2, vt); - case Op_AddVS: return new (C) AddVSNode(n1, n2, vt); - case Op_AddVI: return new (C) AddVINode(n1, n2, vt); - case Op_AddVL: return new (C) AddVLNode(n1, n2, vt); - case Op_AddVF: return new (C) AddVFNode(n1, n2, vt); - case Op_AddVD: return new (C) AddVDNode(n1, n2, vt); + case Op_AddVB: return new AddVBNode(n1, n2, vt); + case Op_AddVS: return new AddVSNode(n1, n2, vt); + case Op_AddVI: return new AddVINode(n1, n2, vt); + case Op_AddVL: return new AddVLNode(n1, n2, vt); + case Op_AddVF: return new AddVFNode(n1, n2, vt); + case Op_AddVD: return new AddVDNode(n1, n2, vt); - case Op_SubVB: return new (C) SubVBNode(n1, n2, vt); - case Op_SubVS: return new (C) SubVSNode(n1, n2, vt); - case Op_SubVI: return new (C) SubVINode(n1, n2, vt); - case Op_SubVL: return new (C) SubVLNode(n1, n2, vt); - case Op_SubVF: return new (C) SubVFNode(n1, n2, vt); - case Op_SubVD: return new (C) SubVDNode(n1, n2, vt); + case Op_SubVB: return new SubVBNode(n1, n2, vt); + case Op_SubVS: return new SubVSNode(n1, n2, vt); + case Op_SubVI: return new SubVINode(n1, n2, vt); + case Op_SubVL: return new SubVLNode(n1, n2, vt); + case Op_SubVF: return new SubVFNode(n1, n2, vt); + case Op_SubVD: return new SubVDNode(n1, n2, vt); - case Op_MulVS: return new (C) MulVSNode(n1, n2, vt); - case Op_MulVI: return new (C) MulVINode(n1, n2, vt); - case Op_MulVF: return new (C) MulVFNode(n1, n2, vt); - case Op_MulVD: return new (C) MulVDNode(n1, n2, vt); + case Op_MulVS: return new MulVSNode(n1, n2, vt); + case Op_MulVI: return new MulVINode(n1, n2, vt); + case Op_MulVF: return new MulVFNode(n1, n2, vt); + case Op_MulVD: return new MulVDNode(n1, n2, vt); - case Op_DivVF: return new (C) DivVFNode(n1, n2, vt); - case Op_DivVD: return new (C) DivVDNode(n1, n2, vt); + case Op_DivVF: return new DivVFNode(n1, n2, vt); + case Op_DivVD: return new DivVDNode(n1, n2, vt); - case Op_LShiftVB: return new (C) LShiftVBNode(n1, n2, vt); - case Op_LShiftVS: return new (C) LShiftVSNode(n1, n2, vt); - case Op_LShiftVI: return new (C) LShiftVINode(n1, n2, vt); - case Op_LShiftVL: return new (C) LShiftVLNode(n1, n2, vt); + case Op_LShiftVB: return new LShiftVBNode(n1, n2, vt); + case Op_LShiftVS: return new LShiftVSNode(n1, n2, vt); + case Op_LShiftVI: return new LShiftVINode(n1, n2, vt); + case Op_LShiftVL: return new LShiftVLNode(n1, n2, vt); - case Op_RShiftVB: return new (C) RShiftVBNode(n1, n2, vt); - case Op_RShiftVS: return new (C) RShiftVSNode(n1, n2, vt); - case Op_RShiftVI: return new (C) RShiftVINode(n1, n2, vt); - case Op_RShiftVL: return new (C) RShiftVLNode(n1, n2, vt); + case Op_RShiftVB: return new RShiftVBNode(n1, n2, vt); + case Op_RShiftVS: return new RShiftVSNode(n1, n2, vt); + case Op_RShiftVI: return new RShiftVINode(n1, n2, vt); + case Op_RShiftVL: return new RShiftVLNode(n1, n2, vt); - case Op_URShiftVB: return new (C) URShiftVBNode(n1, n2, vt); - case Op_URShiftVS: return new (C) URShiftVSNode(n1, n2, vt); - case Op_URShiftVI: return new (C) URShiftVINode(n1, n2, vt); - case Op_URShiftVL: return new (C) URShiftVLNode(n1, n2, vt); + case Op_URShiftVB: return new URShiftVBNode(n1, n2, vt); + case Op_URShiftVS: return new URShiftVSNode(n1, n2, vt); + case Op_URShiftVI: return new URShiftVINode(n1, n2, vt); + case Op_URShiftVL: return new URShiftVLNode(n1, n2, vt); - case Op_AndV: return new (C) AndVNode(n1, n2, vt); - case Op_OrV: return new (C) OrVNode (n1, n2, vt); - case Op_XorV: return new (C) XorVNode(n1, n2, vt); + case Op_AndV: return new AndVNode(n1, n2, vt); + case Op_OrV: return new OrVNode (n1, n2, vt); + case Op_XorV: return new XorVNode(n1, n2, vt); } fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[vopc])); return NULL; @@ -306,18 +306,18 @@ switch (bt) { case T_BOOLEAN: case T_BYTE: - return new (C) ReplicateBNode(s, vt); + return new ReplicateBNode(s, vt); case T_CHAR: case T_SHORT: - return new (C) ReplicateSNode(s, vt); + return new ReplicateSNode(s, vt); case T_INT: - return new (C) ReplicateINode(s, vt); + return new ReplicateINode(s, vt); case T_LONG: - return new (C) ReplicateLNode(s, vt); + return new ReplicateLNode(s, vt); case T_FLOAT: - return new (C) ReplicateFNode(s, vt); + return new ReplicateFNode(s, vt); case T_DOUBLE: - return new (C) ReplicateDNode(s, vt); + return new ReplicateDNode(s, vt); } fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); return NULL; @@ -330,12 +330,12 @@ switch (shift->Opcode()) { case Op_LShiftI: case Op_LShiftL: - return new (C) LShiftCntVNode(cnt, vt); + return new LShiftCntVNode(cnt, vt); case Op_RShiftI: case Op_RShiftL: case Op_URShiftI: case Op_URShiftL: - return new (C) RShiftCntVNode(cnt, vt); + return new RShiftCntVNode(cnt, vt); } fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[shift->Opcode()])); return NULL; @@ -347,18 +347,18 @@ switch (bt) { case T_BOOLEAN: case T_BYTE: - return new (C) PackBNode(s, vt); + return new PackBNode(s, vt); case T_CHAR: case T_SHORT: - return new (C) PackSNode(s, vt); + return new PackSNode(s, vt); case T_INT: - return new (C) PackINode(s, vt); + return new PackINode(s, vt); case T_LONG: - return new (C) PackLNode(s, vt); + return new PackLNode(s, vt); case T_FLOAT: - return new (C) PackFNode(s, vt); + return new PackFNode(s, vt); case T_DOUBLE: - return new (C) PackDNode(s, vt); + return new PackDNode(s, vt); } fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); return NULL; @@ -383,18 +383,18 @@ switch (bt) { case T_BOOLEAN: case T_BYTE: - return new (C) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2)); + return new PackSNode(n1, n2, TypeVect::make(T_SHORT, 2)); case T_CHAR: case T_SHORT: - return new (C) PackINode(n1, n2, TypeVect::make(T_INT, 2)); + return new PackINode(n1, n2, TypeVect::make(T_INT, 2)); case T_INT: - return new (C) PackLNode(n1, n2, TypeVect::make(T_LONG, 2)); + return new PackLNode(n1, n2, TypeVect::make(T_LONG, 2)); case T_LONG: - return new (C) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2)); + return new Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2)); case T_FLOAT: - return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); + return new PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); case T_DOUBLE: - return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); + return new Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); } fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); } @@ -405,14 +405,14 @@ LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) { const TypeVect* vt = TypeVect::make(bt, vlen); - return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt); + return new LoadVectorNode(ctl, mem, adr, atyp, vt); } // Return the vector version of a scalar store node. StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, Node* adr, const TypePtr* atyp, Node* val, uint vlen) { - return new (C) StoreVectorNode(ctl, mem, adr, atyp, val); + return new StoreVectorNode(ctl, mem, adr, atyp, val); } // Extract a scalar element of vector. @@ -421,21 +421,21 @@ ConINode* pos = ConINode::make(C, (int)position); switch (bt) { case T_BOOLEAN: - return new (C) ExtractUBNode(v, pos); + return new ExtractUBNode(v, pos); case T_BYTE: - return new (C) ExtractBNode(v, pos); + return new ExtractBNode(v, pos); case T_CHAR: - return new (C) ExtractCNode(v, pos); + return new ExtractCNode(v, pos); case T_SHORT: - return new (C) ExtractSNode(v, pos); + return new ExtractSNode(v, pos); case T_INT: - return new (C) ExtractINode(v, pos); + return new ExtractINode(v, pos); case T_LONG: - return new (C) ExtractLNode(v, pos); + return new ExtractLNode(v, pos); case T_FLOAT: - return new (C) ExtractFNode(v, pos); + return new ExtractFNode(v, pos); case T_DOUBLE: - return new (C) ExtractDNode(v, pos); + return new ExtractDNode(v, pos); } fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); return NULL; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/prims/whitebox.cpp --- a/hotspot/src/share/vm/prims/whitebox.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/prims/whitebox.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -503,6 +503,159 @@ } WB_END +template +static bool GetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAt)(const char*, T*)) { + if (name == NULL) { + return false; + } + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + const char* flag_name = env->GetStringUTFChars(name, NULL); + bool result = (*TAt)(flag_name, value); + env->ReleaseStringUTFChars(name, flag_name); + return result; +} + +template +static bool SetVMFlag(JavaThread* thread, JNIEnv* env, jstring name, T* value, bool (*TAtPut)(const char*, T*, Flag::Flags)) { + if (name == NULL) { + return false; + } + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + const char* flag_name = env->GetStringUTFChars(name, NULL); + bool result = (*TAtPut)(flag_name, value, Flag::INTERNAL); + env->ReleaseStringUTFChars(name, flag_name); + return result; +} + +template +static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name, Symbol* sig, T value) { + ResourceMark rm(thread); + jclass clazz = env->FindClass(name->as_C_string()); + CHECK_JNI_EXCEPTION_(env, NULL); + jmethodID methodID = env->GetStaticMethodID(clazz, + vmSymbols::valueOf_name()->as_C_string(), + sig->as_C_string()); + CHECK_JNI_EXCEPTION_(env, NULL); + jobject result = env->CallStaticObjectMethod(clazz, methodID, value); + CHECK_JNI_EXCEPTION_(env, NULL); + return result; +} + +static jobject booleanBox(JavaThread* thread, JNIEnv* env, jboolean value) { + return box(thread, env, vmSymbols::java_lang_Boolean(), vmSymbols::Boolean_valueOf_signature(), value); +} +static jobject integerBox(JavaThread* thread, JNIEnv* env, jint value) { + return box(thread, env, vmSymbols::java_lang_Integer(), vmSymbols::Integer_valueOf_signature(), value); +} +static jobject longBox(JavaThread* thread, JNIEnv* env, jlong value) { + return box(thread, env, vmSymbols::java_lang_Long(), vmSymbols::Long_valueOf_signature(), value); +} +/* static jobject floatBox(JavaThread* thread, JNIEnv* env, jfloat value) { + return box(thread, env, vmSymbols::java_lang_Float(), vmSymbols::Float_valueOf_signature(), value); +}*/ +static jobject doubleBox(JavaThread* thread, JNIEnv* env, jdouble value) { + return box(thread, env, vmSymbols::java_lang_Double(), vmSymbols::Double_valueOf_signature(), value); +} + +WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring name)) + bool result; + if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::boolAt)) { + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + return booleanBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetIntxVMFlag(JNIEnv* env, jobject o, jstring name)) + intx result; + if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::intxAt)) { + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + return longBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetUintxVMFlag(JNIEnv* env, jobject o, jstring name)) + uintx result; + if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::uintxAt)) { + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + return longBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetUint64VMFlag(JNIEnv* env, jobject o, jstring name)) + uint64_t result; + if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::uint64_tAt)) { + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + return longBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jobject, WB_GetDoubleVMFlag(JNIEnv* env, jobject o, jstring name)) + double result; + if (GetVMFlag (thread, env, name, &result, &CommandLineFlags::doubleAt)) { + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + return doubleBox(thread, env, result); + } + return NULL; +WB_END + +WB_ENTRY(jstring, WB_GetStringVMFlag(JNIEnv* env, jobject o, jstring name)) + ccstr ccstrResult; + if (GetVMFlag (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAt)) { + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + jstring result = env->NewStringUTF(ccstrResult); + CHECK_JNI_EXCEPTION_(env, NULL); + return result; + } + return NULL; +WB_END + +WB_ENTRY(void, WB_SetBooleanVMFlag(JNIEnv* env, jobject o, jstring name, jboolean value)) + bool result = value == JNI_TRUE ? true : false; + SetVMFlag (thread, env, name, &result, &CommandLineFlags::boolAtPut); +WB_END + +WB_ENTRY(void, WB_SetIntxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) + intx result = value; + SetVMFlag (thread, env, name, &result, &CommandLineFlags::intxAtPut); +WB_END + +WB_ENTRY(void, WB_SetUintxVMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) + uintx result = value; + SetVMFlag (thread, env, name, &result, &CommandLineFlags::uintxAtPut); +WB_END + +WB_ENTRY(void, WB_SetUint64VMFlag(JNIEnv* env, jobject o, jstring name, jlong value)) + uint64_t result = value; + SetVMFlag (thread, env, name, &result, &CommandLineFlags::uint64_tAtPut); +WB_END + +WB_ENTRY(void, WB_SetDoubleVMFlag(JNIEnv* env, jobject o, jstring name, jdouble value)) + double result = value; + SetVMFlag (thread, env, name, &result, &CommandLineFlags::doubleAtPut); +WB_END + +WB_ENTRY(void, WB_SetStringVMFlag(JNIEnv* env, jobject o, jstring name, jstring value)) + ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI + const char* ccstrValue = (value == NULL) ? NULL : env->GetStringUTFChars(value, NULL); + ccstr ccstrResult = ccstrValue; + bool needFree; + { + ThreadInVMfromNative ttvfn(thread); // back to VM + needFree = SetVMFlag (thread, env, name, &ccstrResult, &CommandLineFlags::ccstrAtPut); + } + if (value != NULL) { + env->ReleaseStringUTFChars(value, ccstrValue); + } + if (needFree) { + FREE_C_HEAP_ARRAY(char, ccstrResult, mtInternal); + } +WB_END + + WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString)) ResourceMark rm(THREAD); int len; @@ -561,11 +714,7 @@ return result; } - clazz = env->FindClass(vmSymbols::java_lang_Integer()->as_C_string()); - CHECK_JNI_EXCEPTION_(env, NULL); - jmethodID constructor = env->GetMethodID(clazz, vmSymbols::object_initializer_name()->as_C_string(), vmSymbols::int_void_signature()->as_C_string()); - CHECK_JNI_EXCEPTION_(env, NULL); - jobject obj = env->NewObject(clazz, constructor, code->comp_level()); + jobject obj = integerBox(thread, env, code->comp_level()); CHECK_JNI_EXCEPTION_(env, NULL); env->SetObjectArrayElement(result, 0, obj); @@ -695,7 +844,26 @@ CC"(Ljava/lang/reflect/Executable;II)Z", (void*)&WB_EnqueueMethodForCompilation}, {CC"clearMethodState", CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState}, - {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, + {CC"setBooleanVMFlag", CC"(Ljava/lang/String;Z)V",(void*)&WB_SetBooleanVMFlag}, + {CC"setIntxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetIntxVMFlag}, + {CC"setUintxVMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUintxVMFlag}, + {CC"setUint64VMFlag", CC"(Ljava/lang/String;J)V",(void*)&WB_SetUint64VMFlag}, + {CC"setDoubleVMFlag", CC"(Ljava/lang/String;D)V",(void*)&WB_SetDoubleVMFlag}, + {CC"setStringVMFlag", CC"(Ljava/lang/String;Ljava/lang/String;)V", + (void*)&WB_SetStringVMFlag}, + {CC"getBooleanVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Boolean;", + (void*)&WB_GetBooleanVMFlag}, + {CC"getIntxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;", + (void*)&WB_GetIntxVMFlag}, + {CC"getUintxVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;", + (void*)&WB_GetUintxVMFlag}, + {CC"getUint64VMFlag", CC"(Ljava/lang/String;)Ljava/lang/Long;", + (void*)&WB_GetUint64VMFlag}, + {CC"getDoubleVMFlag", CC"(Ljava/lang/String;)Ljava/lang/Double;", + (void*)&WB_GetDoubleVMFlag}, + {CC"getStringVMFlag", CC"(Ljava/lang/String;)Ljava/lang/String;", + (void*)&WB_GetStringVMFlag}, + {CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable }, {CC"fullGC", CC"()V", (void*)&WB_FullGC }, {CC"readReservedMemory", CC"()V", (void*)&WB_ReadReservedMemory }, {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures }, diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/arguments.cpp --- a/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -2187,6 +2187,10 @@ } } + if (!(UseParallelGC || UseParallelOldGC) && FLAG_IS_DEFAULT(ScavengeBeforeFullGC)) { + FLAG_SET_DEFAULT(ScavengeBeforeFullGC, false); + } + status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit"); status = status && verify_percentage(GCTimeLimit, "GCTimeLimit"); if (GCTimeLimit == 100) { @@ -3834,10 +3838,6 @@ // nothing to use the profiling, turn if off FLAG_SET_DEFAULT(TypeProfileLevel, 0); } - if (UseTypeSpeculation && FLAG_IS_DEFAULT(ReplaceInParentMaps)) { - // Doing the replace in parent maps helps speculation - FLAG_SET_DEFAULT(ReplaceInParentMaps, true); - } #endif if (PrintAssembly && FLAG_IS_DEFAULT(DebugNonSafepoints)) { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/deoptimization.cpp --- a/hotspot/src/share/vm/runtime/deoptimization.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1840,6 +1840,7 @@ "speculate_class_check", "speculate_null_check", "rtm_state_change", + "unstable_if", "tenured" }; const char* Deoptimization::_trap_action_name[] = { diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/deoptimization.hpp --- a/hotspot/src/share/vm/runtime/deoptimization.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/deoptimization.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -62,6 +62,10 @@ Reason_speculate_class_check, // saw unexpected object class from type speculation Reason_speculate_null_check, // saw unexpected null from type speculation Reason_rtm_state_change, // rtm state change detected + Reason_unstable_if, // a branch predicted always false was taken + + // Reason_tenured is counted separately, add normal counted Reasons above. + // Related to MethodData::_trap_hist_limit where Reason_tenured isn't included Reason_tenured, // age of the code has reached the limit Reason_LIMIT, // Note: Keep this enum in sync. with _trap_reason_name. @@ -319,6 +323,8 @@ return Reason_class_check; else if (reason == Reason_speculate_null_check) return Reason_null_check; + else if (reason == Reason_unstable_if) + return Reason_intrinsic; else return Reason_none; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/globals.cpp --- a/hotspot/src/share/vm/runtime/globals.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/globals.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -611,7 +611,7 @@ e.commit(); } -bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) { +bool CommandLineFlags::boolAt(const char* name, size_t len, bool* value) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_bool()) return false; @@ -619,7 +619,7 @@ return true; } -bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin) { +bool CommandLineFlags::boolAtPut(const char* name, size_t len, bool* value, Flag::Flags origin) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_bool()) return false; @@ -639,7 +639,7 @@ faddr->set_origin(origin); } -bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) { +bool CommandLineFlags::intxAt(const char* name, size_t len, intx* value) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_intx()) return false; @@ -647,7 +647,7 @@ return true; } -bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin) { +bool CommandLineFlags::intxAtPut(const char* name, size_t len, intx* value, Flag::Flags origin) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_intx()) return false; @@ -667,7 +667,7 @@ faddr->set_origin(origin); } -bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) { +bool CommandLineFlags::uintxAt(const char* name, size_t len, uintx* value) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_uintx()) return false; @@ -675,7 +675,7 @@ return true; } -bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin) { +bool CommandLineFlags::uintxAtPut(const char* name, size_t len, uintx* value, Flag::Flags origin) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_uintx()) return false; @@ -695,7 +695,7 @@ faddr->set_origin(origin); } -bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) { +bool CommandLineFlags::uint64_tAt(const char* name, size_t len, uint64_t* value) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_uint64_t()) return false; @@ -703,7 +703,7 @@ return true; } -bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin) { +bool CommandLineFlags::uint64_tAtPut(const char* name, size_t len, uint64_t* value, Flag::Flags origin) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_uint64_t()) return false; @@ -723,7 +723,7 @@ faddr->set_origin(origin); } -bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) { +bool CommandLineFlags::doubleAt(const char* name, size_t len, double* value) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_double()) return false; @@ -731,7 +731,7 @@ return true; } -bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin) { +bool CommandLineFlags::doubleAtPut(const char* name, size_t len, double* value, Flag::Flags origin) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_double()) return false; @@ -751,7 +751,7 @@ faddr->set_origin(origin); } -bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) { +bool CommandLineFlags::ccstrAt(const char* name, size_t len, ccstr* value) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_ccstr()) return false; @@ -759,7 +759,7 @@ return true; } -bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin) { +bool CommandLineFlags::ccstrAtPut(const char* name, size_t len, ccstr* value, Flag::Flags origin) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false; if (!result->is_ccstr()) return false; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/globals.hpp --- a/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -362,37 +362,37 @@ class CommandLineFlags { public: - static bool boolAt(char* name, size_t len, bool* value); - static bool boolAt(char* name, bool* value) { return boolAt(name, strlen(name), value); } - static bool boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin); - static bool boolAtPut(char* name, bool* value, Flag::Flags origin) { return boolAtPut(name, strlen(name), value, origin); } + static bool boolAt(const char* name, size_t len, bool* value); + static bool boolAt(const char* name, bool* value) { return boolAt(name, strlen(name), value); } + static bool boolAtPut(const char* name, size_t len, bool* value, Flag::Flags origin); + static bool boolAtPut(const char* name, bool* value, Flag::Flags origin) { return boolAtPut(name, strlen(name), value, origin); } - static bool intxAt(char* name, size_t len, intx* value); - static bool intxAt(char* name, intx* value) { return intxAt(name, strlen(name), value); } - static bool intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin); - static bool intxAtPut(char* name, intx* value, Flag::Flags origin) { return intxAtPut(name, strlen(name), value, origin); } + static bool intxAt(const char* name, size_t len, intx* value); + static bool intxAt(const char* name, intx* value) { return intxAt(name, strlen(name), value); } + static bool intxAtPut(const char* name, size_t len, intx* value, Flag::Flags origin); + static bool intxAtPut(const char* name, intx* value, Flag::Flags origin) { return intxAtPut(name, strlen(name), value, origin); } - static bool uintxAt(char* name, size_t len, uintx* value); - static bool uintxAt(char* name, uintx* value) { return uintxAt(name, strlen(name), value); } - static bool uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin); - static bool uintxAtPut(char* name, uintx* value, Flag::Flags origin) { return uintxAtPut(name, strlen(name), value, origin); } + static bool uintxAt(const char* name, size_t len, uintx* value); + static bool uintxAt(const char* name, uintx* value) { return uintxAt(name, strlen(name), value); } + static bool uintxAtPut(const char* name, size_t len, uintx* value, Flag::Flags origin); + static bool uintxAtPut(const char* name, uintx* value, Flag::Flags origin) { return uintxAtPut(name, strlen(name), value, origin); } - static bool uint64_tAt(char* name, size_t len, uint64_t* value); - static bool uint64_tAt(char* name, uint64_t* value) { return uint64_tAt(name, strlen(name), value); } - static bool uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin); - static bool uint64_tAtPut(char* name, uint64_t* value, Flag::Flags origin) { return uint64_tAtPut(name, strlen(name), value, origin); } + static bool uint64_tAt(const char* name, size_t len, uint64_t* value); + static bool uint64_tAt(const char* name, uint64_t* value) { return uint64_tAt(name, strlen(name), value); } + static bool uint64_tAtPut(const char* name, size_t len, uint64_t* value, Flag::Flags origin); + static bool uint64_tAtPut(const char* name, uint64_t* value, Flag::Flags origin) { return uint64_tAtPut(name, strlen(name), value, origin); } - static bool doubleAt(char* name, size_t len, double* value); - static bool doubleAt(char* name, double* value) { return doubleAt(name, strlen(name), value); } - static bool doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin); - static bool doubleAtPut(char* name, double* value, Flag::Flags origin) { return doubleAtPut(name, strlen(name), value, origin); } + static bool doubleAt(const char* name, size_t len, double* value); + static bool doubleAt(const char* name, double* value) { return doubleAt(name, strlen(name), value); } + static bool doubleAtPut(const char* name, size_t len, double* value, Flag::Flags origin); + static bool doubleAtPut(const char* name, double* value, Flag::Flags origin) { return doubleAtPut(name, strlen(name), value, origin); } - static bool ccstrAt(char* name, size_t len, ccstr* value); - static bool ccstrAt(char* name, ccstr* value) { return ccstrAt(name, strlen(name), value); } + static bool ccstrAt(const char* name, size_t len, ccstr* value); + static bool ccstrAt(const char* name, ccstr* value) { return ccstrAt(name, strlen(name), value); } // Contract: Flag will make private copy of the incoming value. // Outgoing value is always malloc-ed, and caller MUST call free. - static bool ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin); - static bool ccstrAtPut(char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); } + static bool ccstrAtPut(const char* name, size_t len, ccstr* value, Flag::Flags origin); + static bool ccstrAtPut(const char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); } // Returns false if name is not a command line flag. static bool wasSetOnCmdline(const char* name, bool* value); @@ -599,6 +599,9 @@ product(bool, UseAES, false, \ "Control whether AES instructions can be used on x86/x64") \ \ + product(bool, UseSHA, false, \ + "Control whether SHA instructions can be used on SPARC") \ + \ product(uintx, LargePageSizeInBytes, 0, \ "Large page size (0 to let VM choose the page size)") \ \ @@ -705,6 +708,15 @@ product(bool, UseAESIntrinsics, false, \ "Use intrinsics for AES versions of crypto") \ \ + product(bool, UseSHA1Intrinsics, false, \ + "Use intrinsics for SHA-1 crypto hash function") \ + \ + product(bool, UseSHA256Intrinsics, false, \ + "Use intrinsics for SHA-224 and SHA-256 crypto hash functions") \ + \ + product(bool, UseSHA512Intrinsics, false, \ + "Use intrinsics for SHA-384 and SHA-512 crypto hash functions") \ + \ product(bool, UseCRC32Intrinsics, false, \ "use intrinsics for java.util.zip.CRC32") \ \ @@ -1097,7 +1109,7 @@ "Call loadClassInternal() rather than loadClass()") \ \ product_pd(bool, DontYieldALot, \ - "Throw away obvious excess yield calls (for Solaris only)") \ + "Throw away obvious excess yield calls") \ \ product_pd(bool, ConvertSleepToYield, \ "Convert sleep(0) to thread yield " \ @@ -1105,7 +1117,7 @@ \ product(bool, ConvertYieldToSleep, false, \ "Convert yield to a sleep of MinSleepInterval to simulate Win32 " \ - "behavior (Solaris only)") \ + "behavior") \ \ product(bool, UseBoundThreads, true, \ "Bind user level threads to kernel threads (for Solaris only)") \ @@ -1143,8 +1155,8 @@ "avoid NPTL-FUTEX hang pthread_cond_timedwait") \ \ product(bool, FilterSpuriousWakeups, true, \ - "Prevent spurious or premature wakeups from object.wait " \ - "(Solaris only)") \ + "When true prevents OS-level spurious, or premature, wakeups " \ + "from Object.wait (Ignored for Windows)") \ \ product(intx, NativeMonitorTimeout, -1, "(Unstable)") \ \ @@ -1450,8 +1462,7 @@ "(ParallelGC only)") \ \ product(bool, ScavengeBeforeFullGC, true, \ - "Scavenge youngest generation before each full GC, " \ - "used with UseParallelGC") \ + "Scavenge youngest generation before each full GC.") \ \ develop(bool, ScavengeWithObjectsInToSpace, false, \ "Allow scavenges to occur when to-space contains objects") \ @@ -2252,9 +2263,6 @@ notproduct(bool, CheckMemoryInitialization, false, \ "Check memory initialization") \ \ - product(bool, CollectGen0First, false, \ - "Collect youngest generation before each full GC") \ - \ diagnostic(bool, BindCMSThreadToCPU, false, \ "Bind CMS Thread to CPU if possible") \ \ @@ -2333,11 +2341,11 @@ NOT_LP64(2200*K) LP64_ONLY(4*M), \ "Initial size of the boot class loader data metaspace") \ \ - product(bool, TraceGen0Time, false, \ - "Trace accumulated time for Gen 0 collection") \ - \ - product(bool, TraceGen1Time, false, \ - "Trace accumulated time for Gen 1 collection") \ + product(bool, TraceYoungGenTime, false, \ + "Trace accumulated time for young collection") \ + \ + product(bool, TraceOldGenTime, false, \ + "Trace accumulated time for old collection") \ \ product(bool, PrintTenuringDistribution, false, \ "Print tenuring age information") \ diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/stubRoutines.cpp --- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, 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 @@ -125,6 +125,13 @@ address StubRoutines::_cipherBlockChaining_encryptAESCrypt = NULL; address StubRoutines::_cipherBlockChaining_decryptAESCrypt = NULL; +address StubRoutines::_sha1_implCompress = NULL; +address StubRoutines::_sha1_implCompressMB = NULL; +address StubRoutines::_sha256_implCompress = NULL; +address StubRoutines::_sha256_implCompressMB = NULL; +address StubRoutines::_sha512_implCompress = NULL; +address StubRoutines::_sha512_implCompressMB = NULL; + address StubRoutines::_updateBytesCRC32 = NULL; address StubRoutines::_crc_table_adr = NULL; diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/stubRoutines.hpp --- a/hotspot/src/share/vm/runtime/stubRoutines.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2014, 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 @@ -207,6 +207,13 @@ static address _cipherBlockChaining_encryptAESCrypt; static address _cipherBlockChaining_decryptAESCrypt; + static address _sha1_implCompress; + static address _sha1_implCompressMB; + static address _sha256_implCompress; + static address _sha256_implCompressMB; + static address _sha512_implCompress; + static address _sha512_implCompressMB; + static address _updateBytesCRC32; static address _crc_table_adr; @@ -356,6 +363,13 @@ static address cipherBlockChaining_encryptAESCrypt() { return _cipherBlockChaining_encryptAESCrypt; } static address cipherBlockChaining_decryptAESCrypt() { return _cipherBlockChaining_decryptAESCrypt; } + static address sha1_implCompress() { return _sha1_implCompress; } + static address sha1_implCompressMB() { return _sha1_implCompressMB; } + static address sha256_implCompress() { return _sha256_implCompress; } + static address sha256_implCompressMB() { return _sha256_implCompressMB; } + static address sha512_implCompress() { return _sha512_implCompress; } + static address sha512_implCompressMB() { return _sha512_implCompressMB; } + static address updateBytesCRC32() { return _updateBytesCRC32; } static address crc_table_addr() { return _crc_table_adr; } diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/vframe.cpp --- a/hotspot/src/share/vm/runtime/vframe.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/vframe.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -274,7 +274,8 @@ // Get oopmap describing oops and int for current bci InterpreterOopMap oop_mask; if (TraceDeoptimization && Verbose) { - methodHandle m_h(thread(), method()); + // need the current JavaThread and not thread() + methodHandle m_h(Thread::current(), method()); OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask); } else { method()->mask_for(bci(), &oop_mask); @@ -335,7 +336,8 @@ if (!method()->is_native()) { // Get oopmap describing oops and int for current bci if (TraceDeoptimization && Verbose) { - methodHandle m_h(method()); + // need the current JavaThread and not thread() + methodHandle m_h(Thread::current(), method()); OopMapCache::compute_one_oop_map(m_h, bci(), &oop_mask); } else { method()->mask_for(bci(), &oop_mask); diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/runtime/vmStructs.cpp --- a/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 19:46:40 2017 +0200 @@ -2504,6 +2504,7 @@ declare_constant(Deoptimization::Reason_speculate_class_check) \ declare_constant(Deoptimization::Reason_speculate_null_check) \ declare_constant(Deoptimization::Reason_rtm_state_change) \ + declare_constant(Deoptimization::Reason_unstable_if) \ declare_constant(Deoptimization::Reason_tenured) \ declare_constant(Deoptimization::Reason_LIMIT) \ declare_constant(Deoptimization::Reason_RECORDED_LIMIT) \ diff -r 53fd25d388da -r 89731ae72a76 hotspot/src/share/vm/utilities/growableArray.hpp --- a/hotspot/src/share/vm/utilities/growableArray.hpp Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/src/share/vm/utilities/growableArray.hpp Wed Jul 05 19:46:40 2017 +0200 @@ -349,6 +349,7 @@ // inserts the given element before the element at index i void insert_before(const int idx, const E& elem) { + assert(0 <= idx && idx <= _len, "illegal index"); check_nesting(); if (_len == _max) grow(_len); for (int j = _len - 1; j >= idx; j--) { @@ -360,7 +361,7 @@ void appendAll(const GrowableArray* l) { for (int i = 0; i < l->_len; i++) { - raw_at_put_grow(_len, l->_data[i], 0); + raw_at_put_grow(_len, l->_data[i], E()); } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/test/TEST.groups --- a/hotspot/test/TEST.groups Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/test/TEST.groups Wed Jul 05 19:46:40 2017 +0200 @@ -117,6 +117,7 @@ # Tests that require compact3 API's # needs_compact3 = \ + compiler/8009761/Test8009761.java \ compiler/whitebox/DeoptimizeMethodTest.java \ compiler/whitebox/SetForceInlineMethodTest.java \ compiler/whitebox/SetDontInlineMethodTest.java \ @@ -216,3 +217,111 @@ -:needs_compact3 \ -:needs_jre \ -:needs_jdk + +# All tests that explicitly set the G1 GC +# +needs_g1gc = \ + compiler/regalloc/C1ObjectSpillInLogicOp.java \ + gc/8000311/Test8000311.java \ + gc/TestG1ZeroPGCTJcmdThreadPrint.java \ + gc/TestSystemGC.java \ + gc/arguments/TestAlignmentToUseLargePages.java \ + gc/arguments/TestG1HeapRegionSize.java \ + gc/arguments/TestG1HeapSizeFlags.java \ + gc/arguments/TestMaxHeapSizeTools.java \ + gc/arguments/TestMaxNewSize.java \ + gc/arguments/TestUseCompressedOopsErgo.java \ + gc/g1/ \ + gc/metaspace/G1AddMetaspaceDependency.java \ + gc/metaspace/TestMetaspacePerfCounters.java \ + gc/startup_warnings/TestG1.java + +# All tests that explicitly set the serial GC +# +needs_serialgc = \ + gc/TestSystemGC.java \ + gc/arguments/TestAlignmentToUseLargePages.java \ + gc/arguments/TestMaxNewSize.java \ + gc/arguments/TestSerialHeapSizeFlags.java \ + gc/arguments/TestUseCompressedOopsErgo.java \ + gc/defnew/HeapChangeLogging.java \ + gc/metaspace/TestMetaspacePerfCounters.java \ + gc/metaspace/TestPerfCountersAndMemoryPools.java \ + gc/startup_warnings/TestSerialGC.java + +# All tests that explicitly set the parallel GC +# +needs_parallelgc = \ + gc/TestSystemGC.java \ + gc/arguments/TestAlignmentToUseLargePages.java \ + gc/arguments/TestMaxNewSize.java \ + gc/arguments/TestMinInitialErgonomics.java \ + gc/arguments/TestUseCompressedOopsErgo.java \ + gc/metaspace/TestMetaspacePerfCounters.java \ + gc/parallelScavenge/ \ + gc/startup_warnings/TestParallelGC.java \ + gc/startup_warnings/TestParallelScavengeSerialOld.java + +# All tests that explicitly set the CMS GC +# +needs_cmsgc = \ + gc/6581734/Test6581734.java \ + gc/TestSystemGC.java \ + gc/arguments/TestAlignmentToUseLargePages.java \ + gc/arguments/TestCMSHeapSizeFlags.java \ + gc/arguments/TestMaxNewSize.java \ + gc/arguments/TestUseCompressedOopsErgo.java \ + gc/concurrentMarkSweep/ \ + gc/startup_warnings/TestCMS.java \ + gc/startup_warnings/TestCMSIncrementalMode.java \ + gc/startup_warnings/TestCMSNoIncrementalMode.java \ + gc/startup_warnings/TestDefNewCMS.java \ + gc/startup_warnings/TestParNewCMS.java + +# All tests that explicitly set some GC +# +needs_gc = \ + :needs_g1gc \ + :needs_serialgc \ + :needs_parallelgc \ + :needs_cmsgc + +# All tests that do not set any GC explicitly +# +not_needs_gc = \ + :jdk \ + -:needs_gc + +# All tests that could be executed with the G1 GC without VM flags conflict +# +applicable_g1gc = \ + :jdk \ + -:needs_serialgc \ + -:needs_parallelgc \ + -:needs_cmsgc + +# All tests that could be executed with the serial GC without VM flags conflict +# +applicable_serialgc = \ + :jdk \ + -:needs_g1gc \ + -:needs_parallelgc \ + -:needs_cmsgc + +# All tests that could be executed with the parallel GC without VM flags conflict +# +applicable_parallelgc = \ + :jdk \ + -:needs_g1gc \ + -:needs_serialgc \ + -:needs_cmsgc + +# All tests that could be executed with the CMS GC without VM flags conflict +# +applicable_cmsgc = \ + :jdk \ + -:needs_g1gc \ + -:needs_serialgc \ + -:needs_parallelgc + + diff -r 53fd25d388da -r 89731ae72a76 hotspot/test/compiler/8009761/Test8009761.java --- a/hotspot/test/compiler/8009761/Test8009761.java Wed Jul 05 19:45:37 2017 +0200 +++ b/hotspot/test/compiler/8009761/Test8009761.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,19 +21,27 @@ * questions. */ +import com.sun.management.HotSpotDiagnosticMXBean; +import com.sun.management.VMOption; +import sun.hotspot.WhiteBox; +import sun.management.ManagementFactoryHelper; + +import java.lang.reflect.Method; + /* * @test * @bug 8009761 + * @library /testlibrary /testlibrary/whitebox * @summary Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates - * @run main/othervm -XX:CompileCommand=exclude,Test8009761::m2 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -Xss256K Test8009761 - * + * @build Test8009761 + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=exclude,Test8009761::m2 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -Xss256K Test8009761 */ - public class Test8009761 { - static class UnloadedClass { - volatile int i; - } + private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); + private static int COMP_LEVEL_FULL_OPTIMIZATION = 4; + private static Method m3 = null; static Object m1(boolean deopt) { // When running interpreted, on sparc, the caller's stack is @@ -142,9 +150,11 @@ ll508, ll509, ll510, ll511; if (deopt) { - UnloadedClass res = new UnloadedClass(); // sufficient to force deopt with c2 but not c1 - res.i = 0; // forces deopt with c1 - return res; + // Force deoptimization of m3 + WHITE_BOX.deoptimizeMethod(m3); + if(WHITE_BOX.isMethodCompiled(m3)) { + throw new RuntimeException(m3 + " not deoptimized"); + } } return null; } @@ -225,6 +235,18 @@ } static public void main(String[] args) { + // Make sure background compilation is disabled + if (backgroundCompilationEnabled()) { + throw new RuntimeException("Background compilation enabled"); + } + + try { + // Get Method object for m3 + m3 = Test8009761.class.getDeclaredMethod("m3", boolean.class, boolean.class); + } catch (NoSuchMethodException | SecurityException ex) { + throw new RuntimeException("Failed to retrieve method m3"); + } + int c1; // Call m2 from m3 recursively until stack overflow. Count the number of recursive calls. try { @@ -232,10 +254,14 @@ } catch(StackOverflowError soe) { } c1 = count; + // Force the compilation of m3() that will inline m1() - for (int i = 0; i < 20000; i++) { - m3(false, false); + WHITE_BOX.enqueueMethodForCompilation(m3, COMP_LEVEL_FULL_OPTIMIZATION); + // Because background compilation is disabled, method should now be compiled + if(!WHITE_BOX.isMethodCompiled(m3)) { + throw new RuntimeException(m3 + " not compiled"); } + count = 0; // Force deoptimization of m3() in m1(), then return from m1() // to m3(), call recursively m2(). If deoptimization correctly @@ -245,11 +271,26 @@ m3(false, true); } catch(StackOverflowError soe) { } - if (c1 != count) { - System.out.println("Failed: init recursive calls: " + c1 + ". After deopt " + count); - System.exit(97); + // Allow number of recursive calls to vary by 1 + if ((c1 < (count - 1)) || (c1 > (count + 1))) { + throw new RuntimeException("Failed: init recursive calls: " + c1 + ". After deopt " + count); } else { System.out.println("PASSED " + c1); } } + + /** + * Checks if background compilation (-XX:+BackgroundCompilation) is enabled. + * @return True if background compilation is enabled, false otherwise + */ + private static boolean backgroundCompilationEnabled() { + HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean(); + VMOption backgroundCompilation; + try { + backgroundCompilation = diagnostic.getVMOption("BackgroundCompilation"); + } catch (IllegalArgumentException e) { + return false; + } + return Boolean.valueOf(backgroundCompilation.getValue()); + } } diff -r 53fd25d388da -r 89731ae72a76 hotspot/test/compiler/intrinsics/clone/TestObjectClone.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/intrinsics/clone/TestObjectClone.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + * + */ + +/* + * @test + * @bug 8033626 + * @summary assert(ex_map->jvms()->same_calls_as(_exceptions->jvms())) failed: all collected exceptions must come from the same place + * @library /testlibrary + * @run main/othervm -XX:-TieredCompilation -Xbatch -XX:CompileOnly=TestObjectClone::f TestObjectClone + */ +import com.oracle.java.testlibrary.Asserts; + +public class TestObjectClone implements Cloneable { + static class A extends TestObjectClone {} + static class B extends TestObjectClone { + public B clone() { + return (B)TestObjectClone.b; + } + } + static class C extends TestObjectClone { + public C clone() { + return (C)TestObjectClone.c; + } + } + static class D extends TestObjectClone { + public D clone() { + return (D)TestObjectClone.d; + } + } + static TestObjectClone a = new A(), b = new B(), c = new C(), d = new D(); + + public static Object f(TestObjectClone o) throws CloneNotSupportedException { + // Polymorphic call site: >90% Object::clone / <10% other methods + return o.clone(); + } + + public static void main(String[] args) throws Exception { + TestObjectClone[] params1 = {a, a, a, a, a, a, a, a, a, a, a, + a, a, a, a, a, a, a, a, a, a, a, + a, a, a, a, a, a, a, a, a, a, a, + b, c, d}; + + for (int i = 0; i < 15000; i++) { + f(params1[i % params1.length]); + } + + Asserts.assertTrue(f(a) != a); + Asserts.assertTrue(f(b) == b); + Asserts.assertTrue(f(c) == c); + Asserts.assertTrue(f(d) == d); + + try { + f(null); + throw new AssertionError(""); + } catch (NullPointerException e) { /* expected */ } + + System.out.println("TEST PASSED"); + } +} diff -r 53fd25d388da -r 89731ae72a76 hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +/* + * @test + * @bug 8011646 + * @summary SEGV in compiled code with loop predication + * @run main/othervm -XX:-TieredCompilation -XX:CompileOnly=TestHashCode.m1,Object.hashCode TestHashCode + * + */ + +public class TestHashCode { + static class A { + int i; + } + + static class B extends A { + } + + static boolean crash = false; + + static A m2() { + if (crash) { + return null; + } + return new A(); + } + + static int m1(A aa) { + int res = 0; + for (int i = 0; i < 10; i++) { + A a = m2(); + int j = a.i; + if (aa instanceof B) { + } + res += a.hashCode(); + } + return res; + } + + public static void main(String[] args) { + A a = new A(); + for (int i = 0; i < 20000; i++) { + m1(a); + } + crash = true; + try { + m1(a); + } catch (NullPointerException e) { + System.out.println("Test passed"); + } + } +} diff -r 53fd25d388da -r 89731ae72a76 hotspot/test/compiler/intrinsics/sha/TestSHA.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/intrinsics/sha/TestSHA.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + * + */ + +/** + * @test + * @bug 8035968 + * @summary C2 support for SHA on SPARC + * + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 TestSHA + * + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Doffset=1 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 -Doffset=1 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Doffset=1 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 -Doffset=1 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 -Doffset=1 TestSHA + * + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-256 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-512 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Dalgorithm2=SHA-512 TestSHA + * + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=MD5 TestSHA + * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=MD5 -Dalgorithm2=SHA-1 TestSHA + */ + +import java.security.MessageDigest; +import java.util.Arrays; + +public class TestSHA { + private static final int HASH_LEN = 64; /* up to 512-bit */ + private static final int ALIGN = 8; /* for different data alignments */ + + public static void main(String[] args) throws Exception { + String provider = System.getProperty("provider", "SUN"); + String algorithm = System.getProperty("algorithm", "SHA-1"); + String algorithm2 = System.getProperty("algorithm2", ""); + int msgSize = Integer.getInteger("msgSize", 1024); + int offset = Integer.getInteger("offset", 0) % ALIGN; + int iters = (args.length > 0 ? Integer.valueOf(args[0]) : 100000); + int warmupIters = (args.length > 1 ? Integer.valueOf(args[1]) : 20000); + + testSHA(provider, algorithm, msgSize, offset, iters, warmupIters); + + if (algorithm2.equals("") == false) { + testSHA(provider, algorithm2, msgSize, offset, iters, warmupIters); + } + } + + static void testSHA(String provider, String algorithm, int msgSize, + int offset, int iters, int warmupIters) throws Exception { + System.out.println("provider = " + provider); + System.out.println("algorithm = " + algorithm); + System.out.println("msgSize = " + msgSize + " bytes"); + System.out.println("offset = " + offset); + System.out.println("iters = " + iters); + + byte[] expectedHash = new byte[HASH_LEN]; + byte[] hash = new byte[HASH_LEN]; + byte[] data = new byte[msgSize + offset]; + for (int i = 0; i < (msgSize + offset); i++) { + data[i] = (byte)(i & 0xff); + } + + try { + MessageDigest sha = MessageDigest.getInstance(algorithm, provider); + + /* do once, which doesn't use intrinsics */ + sha.reset(); + sha.update(data, offset, msgSize); + expectedHash = sha.digest(); + + /* warm up */ + for (int i = 0; i < warmupIters; i++) { + sha.reset(); + sha.update(data, offset, msgSize); + hash = sha.digest(); + } + + /* check result */ + if (Arrays.equals(hash, expectedHash) == false) { + System.out.println("TestSHA Error: "); + showArray(expectedHash, "expectedHash"); + showArray(hash, "computedHash"); + //System.exit(1); + throw new Exception("TestSHA Error"); + } else { + showArray(hash, "hash"); + } + + /* measure performance */ + long start = System.nanoTime(); + for (int i = 0; i < iters; i++) { + sha.reset(); + sha.update(data, offset, msgSize); + hash = sha.digest(); + } + long end = System.nanoTime(); + double total = (double)(end - start)/1e9; /* in seconds */ + double thruput = (double)msgSize*iters/1e6/total; /* in MB/s */ + System.out.println("TestSHA runtime = " + total + " seconds"); + System.out.println("TestSHA throughput = " + thruput + " MB/s"); + System.out.println(); + } catch (Exception e) { + System.out.println("Exception: " + e); + //System.exit(1); + throw new Exception(e); + } + } + + static void showArray(byte b[], String name) { + System.out.format("%s [%d]: ", name, b.length); + for (int i = 0; i < Math.min(b.length, HASH_LEN); i++) { + System.out.format("%02x ", b[i] & 0xff); + } + System.out.println(); + } +} diff -r 53fd25d388da -r 89731ae72a76 hotspot/test/compiler/loopopts/TestLogSum.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/loopopts/TestLogSum.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +/* + * @test + * @bug 8046516 + * @summary Segmentation fault in JVM (easily reproducible) + * @run main/othervm -XX:-TieredCompilation -Xbatch TestLogSum + * @author jackkamm@gmail.com + */ + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +public class TestLogSum { + public static void main(String[] args) { + double sum; + + for (int i = 0; i < 6; i++) { + for (int n = 2; n < 30; n++) { + for (int j = 1; j <= n; j++) { + for (int k = 1; k <= j; k++) { + // System.out.println(computeSum(k, j)); + sum = computeSum(k, j); + } + } + } + } + } + + private static Map, Double> cache = new HashMap, Double>(); + public static double computeSum(int x, int y) { + List key = Arrays.asList(new Integer[] {x, y}); + + if (!cache.containsKey(key)) { + + // explicitly creating/updating a double[] array, instead of using the LogSumArray wrapper object, will prevent the error + LogSumArray toReturn = new LogSumArray(x); + + // changing loop indices will prevent the error + // in particular, for(z=0; z { + public static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); + + private static final String NONEXISTENT_FLAG = "NonexistentFlag"; + private final String flagName; + private final BiConsumer test; + private final BiConsumer set; + private final Function get; + + protected VmFlagTest(String flagName, BiConsumer set, + Function get, boolean isPositive) { + this.flagName = flagName; + this.set = set; + this.get = get; + if (isPositive) { + test = this::testPositive; + } else { + test = this::testNegative; + } + } + + private void setNewValue(T value) { + set.accept(flagName, value); + } + + private T getValue() { + return get.apply(flagName); + } + + protected static void runTest(String existentFlag, T[] tests, + BiConsumer set, Function get) { + runTest(existentFlag, tests, tests, set, get); + } + + protected static void runTest(String existentFlag, T[] tests, + T[] results, BiConsumer set, Function get) { + if (existentFlag != null) { + new VmFlagTest(existentFlag, set, get, true).test(tests, results); + } + new VmFlagTest(NONEXISTENT_FLAG, set, get, false).test(tests, results); + } + + public final void test(T[] tests, T[] results) { + Asserts.assertEQ(tests.length, results.length, "[TESTBUG] tests.length != results.length"); + for (int i = 0, n = tests.length ; i < n; ++i) { + test.accept(tests[i], results[i]); + } + } + + protected String getVMOptionAsString() { + HotSpotDiagnosticMXBean diagnostic + = ManagementFactoryHelper.getDiagnosticMXBean(); + VMOption tmp; + try { + tmp = diagnostic.getVMOption(flagName); + } catch (IllegalArgumentException e) { + tmp = null; + } + return tmp == null ? null : tmp.getValue(); + } + + private void testPositive(T value, T expected) { + Asserts.assertEQ(getVMOptionAsString(), asString(getValue())); + setNewValue(value); + String newValue = getVMOptionAsString(); + Asserts.assertEQ(newValue, asString(expected)); + Asserts.assertEQ(getVMOptionAsString(), asString(getValue())); + } + + private void testNegative(T value, T expected) { + String oldValue = getVMOptionAsString(); + Asserts.assertEQ(oldValue, asString(getValue())); + setNewValue(value); + String newValue = getVMOptionAsString(); + Asserts.assertEQ(oldValue, newValue); + } + + private String asString(Object value) { + return value == null ? null : "" + value; + } +} + diff -r 53fd25d388da -r 89731ae72a76 jaxp/.hgtags --- a/jaxp/.hgtags Wed Jul 05 19:45:37 2017 +0200 +++ b/jaxp/.hgtags Wed Jul 05 19:46:40 2017 +0200 @@ -261,3 +261,4 @@ a1461221b05d4620e4d7d1907e2a0282aaedf31c jdk9-b16 6f923fcbe5129eceb9617a9a18dbdd743980e785 jdk9-b17 5afa90c28742d175431be75f9098745510bd2b30 jdk9-b18 +f9c82769a6bc2b219a8f01c24afe5c91039267d7 jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 jaxws/.hgtags --- a/jaxws/.hgtags Wed Jul 05 19:45:37 2017 +0200 +++ b/jaxws/.hgtags Wed Jul 05 19:46:40 2017 +0200 @@ -264,3 +264,4 @@ 1e1a3b2215b7551d88e89d1ca8c1e1ebe3d3c0ab jdk9-b16 6b159e727dac283f424b7d19f5be3ddd9f85acf5 jdk9-b17 275f2385aed80c84297840638d58656366350c58 jdk9-b18 +7f922a73e8a2c6ce42634238090fce7c6d599541 jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 jdk/.hgtags --- a/jdk/.hgtags Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/.hgtags Wed Jul 05 19:46:40 2017 +0200 @@ -261,3 +261,4 @@ ab7d2c565b0de5bee1361d282d4029371327fc9e jdk9-b16 fd8e675f141b9bdb2f46d1ae8251f4ee3a895d64 jdk9-b17 6ad17b31f0d30593392b1e8695b9709dbbd7fb70 jdk9-b18 +27561aede285c25a3e9ed8bf8918234ad3bb81e3 jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 jdk/THIRD_PARTY_README --- a/jdk/THIRD_PARTY_README Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/THIRD_PARTY_README Wed Jul 05 19:46:40 2017 +0200 @@ -1471,7 +1471,7 @@ version 2.0. The NSS libraries are supplied in executable form, built from unmodified -NSS source code labeled with the "NSS_3.13.1_RTM" release tag. +NSS source code labeled with the "NSS_3_16_RTM" HG tag. The NSS source code is available in the OpenJDK source code repository at: jdk/test/sun/security/pkcs11/nss/src diff -r 53fd25d388da -r 89731ae72a76 jdk/make/CompileDemos.gmk --- a/jdk/make/CompileDemos.gmk Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/make/CompileDemos.gmk Wed Jul 05 19:46:40 2017 +0200 @@ -1,6 +1,5 @@ - # -# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2014, 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 @@ -320,7 +319,6 @@ endif $(eval $(call SetupJVMTIDemo,hprof, java_crw_demo, \ - -I$(JDK_TOPDIR)/src/share/npt -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt \ $(BUILD_LIBHPROF_AIX_EXTRA_CFLAGS), C, \ -ldl, ws2_32.lib winmm.lib, -lsocket -lnsl, -lpthread, $(BUILD_LIBHPROF_AIX_EXTRA_SRC))) diff -r 53fd25d388da -r 89731ae72a76 jdk/make/CreateJars.gmk --- a/jdk/make/CreateJars.gmk Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/make/CreateJars.gmk Wed Jul 05 19:46:40 2017 +0200 @@ -676,15 +676,6 @@ ########################################################################################## -# -# This is an empty jar (only contains manifest) and fits poorly into framework... -# create simple rule instead -# -$(IMAGES_OUTPUTDIR)/lib/management-agent.jar: $(JDK_TOPDIR)/src/share/classes/sun/management/manifest - $(JAR) cfm $@ $< - -########################################################################################## - # This file is imported from hotspot in Import.gmk. Copying it into images/lib so that # all jars can be found in one place when creating images in Images.gmk. It needs to be # done here so that clean targets can be simple and accurate. diff -r 53fd25d388da -r 89731ae72a76 jdk/make/lib/CoreLibraries.gmk --- a/jdk/make/lib/CoreLibraries.gmk Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/make/lib/CoreLibraries.gmk Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2014, 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 @@ -526,30 +526,3 @@ BUILD_LIBRARIES += $(JDK_OUTPUTDIR)/objs/libjli_static.a endif - -########################################################################################## - -$(eval $(call SetupNativeCompilation,BUILD_LIBNPT, \ - LIBRARY := npt, \ - OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ - SRC := $(JDK_TOPDIR)/src/share/npt $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, \ - LANG := C, \ - OPTIMIZATION := LOW, \ - CFLAGS := $(CFLAGS_JDKLIB) \ - -I$(JDK_TOPDIR)/src/share/npt \ - -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, \ - MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libnpt/mapfile-vers, \ - LDFLAGS := $(LDFLAGS_JDKLIB) \ - $(call SET_SHARED_LIBRARY_ORIGIN), \ - LDFLAGS_macosx := -liconv, \ - LDFLAGS_SUFFIX_windows := -export:nptInitialize -export:nptTerminate, \ - LDFLAGS_SUFFIX_solaris := -lc, \ - VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ - RC_FLAGS := $(RC_FLAGS) \ - -D "JDK_FNAME=npt.dll" \ - -D "JDK_INTERNAL_NAME=npt" \ - -D "JDK_FTYPE=0x2L", \ - OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libnpt, \ - DEBUG_SYMBOLS := true)) - -BUILD_LIBRARIES += $(BUILD_LIBNPT) diff -r 53fd25d388da -r 89731ae72a76 jdk/make/lib/ServiceabilityLibraries.gmk --- a/jdk/make/lib/ServiceabilityLibraries.gmk Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/make/lib/ServiceabilityLibraries.gmk Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2014, 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 @@ -147,8 +147,6 @@ CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DJDWP_LOGGING \ -I$(JDK_TOPDIR)/src/share/transport/export \ -I$(JDK_TOPDIR)/src/share/back/export \ - -I$(JDK_TOPDIR)/src/share/npt \ - -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt \ -I$(JDK_TOPDIR)/src/share/back \ -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/back \ -I$(JDK_OUTPUTDIR)/gensrc_jdwp_headers, \ @@ -158,6 +156,7 @@ LDFLAGS_SUFFIX_linux := $(LIBDL), \ LDFLAGS_SUFFIX_solaris := $(LIBDL) -lc, \ LDFLAGS_SUFFIX_windows := $(LDFLAGS_JDKLIB_SUFFIX), \ + LDFLAGS_SUFFIX_macosx := -liconv, \ VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ RC_FLAGS := $(RC_FLAGS) \ -D "JDK_FNAME=jdwp.dll" \ @@ -340,8 +339,6 @@ BUILD_LIBHPROF_SRC := $(JDK_TOPDIR)/src/share/demo/jvmti/hprof $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/demo/jvmti/hprof BUILD_LIBHPROF_CFLAGS := -I$(JDK_TOPDIR)/src/share/demo/jvmti/hprof \ - -I$(JDK_TOPDIR)/src/share/npt \ - -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt \ -I$(JDK_TOPDIR)/src/share/demo/jvmti/java_crw_demo ifeq ($(OPENJDK_TARGET_OS), aix) diff -r 53fd25d388da -r 89731ae72a76 jdk/make/mapfiles/libnpt/mapfile-vers --- a/jdk/make/mapfiles/libnpt/mapfile-vers Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -# -# Copyright (c) 2004, 2013, 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. -# - -# Define public interface. - -SUNWprivate_1.1 { - global: - nptInitialize; - nptTerminate; - local: - *; -}; diff -r 53fd25d388da -r 89731ae72a76 jdk/make/profile-includes.txt --- a/jdk/make/profile-includes.txt Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/make/profile-includes.txt Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2014, 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 @@ -127,12 +127,9 @@ $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)jsdt.diz \ $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)management$(SHARED_LIBRARY_SUFFIX) \ $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)management.diz \ - $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)npt$(SHARED_LIBRARY_SUFFIX) \ - $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)npt.diz \ $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)prefs$(SHARED_LIBRARY_SUFFIX) \ $(OPENJDK_TARGET_CPU_LEGACY_LIB)/$(LIBRARY_PREFIX)sctp$(SHARED_LIBRARY_SUFFIX) \ jvm.hprof.txt \ - management-agent.jar \ management/jmxremote.access \ management/jmxremote.password.template \ management/management.properties \ @@ -140,8 +137,7 @@ PROFILE_3_JRE_OTHER_FILES := -PROFILE_3_JRE_JAR_FILES := \ - management-agent.jar +PROFILE_3_JRE_JAR_FILES := FULL_JRE_BIN_FILES := \ diff -r 53fd25d388da -r 89731ae72a76 jdk/make/src/classes/build/tools/buildmetaindex/BuildMetaIndex.java --- a/jdk/make/src/classes/build/tools/buildmetaindex/BuildMetaIndex.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/make/src/classes/build/tools/buildmetaindex/BuildMetaIndex.java Wed Jul 05 19:46:40 2017 +0200 @@ -53,7 +53,6 @@ com/sun/net/ javax/ com/sun/security/ -# management-agent.jar ! rt.jar org/w3c/ com/sun/image/ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/debugInit.c --- a/jdk/src/share/back/debugInit.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/back/debugInit.c Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, 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 @@ -202,8 +202,6 @@ jint jvmtiCompileTimeMajorVersion; jint jvmtiCompileTimeMinorVersion; jint jvmtiCompileTimeMicroVersion; - char *boot_path = NULL; - char npt_lib[MAXPATHLEN]; /* See if it's already loaded */ if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) { @@ -268,24 +266,6 @@ forceExit(1); /* Kill entire process, no core dump wanted */ } - JVMTI_FUNC_PTR(gdata->jvmti, GetSystemProperty) - (gdata->jvmti, (const char *)"sun.boot.library.path", - &boot_path); - - dbgsysBuildLibName(npt_lib, sizeof(npt_lib), boot_path, NPT_LIBNAME); - /* Npt and Utf function init */ - NPT_INITIALIZE(npt_lib, &(gdata->npt), NPT_VERSION, NULL); - jvmtiDeallocate(boot_path); - if (gdata->npt == NULL) { - ERROR_MESSAGE(("JDWP: unable to initialize NPT library")); - return JNI_ERR; - } - gdata->npt->utf = (gdata->npt->utfInitialize)(NULL); - if (gdata->npt->utf == NULL) { - ERROR_MESSAGE(("JDWP: UTF function initialization failed")); - return JNI_ERR; - } - /* Parse input options */ if (!parseOptions(options)) { /* No message necessary, should have been printed out already */ @@ -1307,22 +1287,26 @@ if ( error != JVMTI_ERROR_NONE ) { exit_code = 1; if ( docoredump ) { + LOG_MISC(("Dumping core as requested by command line")); finish_logging(exit_code); abort(); } } + if ( msg==NULL ) { msg = ""; } LOG_MISC(("Exiting with error %s(%d): %s", jvmtiErrorText(error), error, msg)); - gdata->vmDead = JNI_TRUE; + if (gdata != NULL) { + gdata->vmDead = JNI_TRUE; - /* Let's try and cleanup the JVMTI, if we even have one */ - if ( gdata->jvmti != NULL ) { - /* Dispose of jvmti (gdata->jvmti becomes NULL) */ - disposeEnvironment(gdata->jvmti); + /* Let's try and cleanup the JVMTI, if we even have one */ + if ( gdata->jvmti != NULL ) { + /* Dispose of jvmti (gdata->jvmti becomes NULL) */ + disposeEnvironment(gdata->jvmti); + } } /* Finish up logging. We reach here if JDWP is doing the exiting. */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/error_messages.c --- a/jdk/src/share/back/error_messages.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/back/error_messages.c Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, 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 @@ -47,6 +47,7 @@ #include #include "util.h" +#include "utf_util.h" #include "proc_md.h" /* Maximim length of a message */ @@ -70,13 +71,8 @@ len = (int)strlen((char*)utf8buf); /* Convert to platform encoding (ignore errors, dangerous area) */ - if (gdata->npt != NULL) { - (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf, - utf8buf, len, pbuf, MAX_MESSAGE_LEN); - } else { - /* May be called before NPT is initialized so don't fault */ - strncpy(pbuf, (char*)utf8buf, len); - } + (void)utf8ToPlatform(utf8buf, len, pbuf, MAX_MESSAGE_LEN); + (void)fprintf(fp, "%s%s%s", prefix, pbuf, suffix); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/inStream.c --- a/jdk/src/share/back/inStream.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/back/inStream.c Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, 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 @@ -24,6 +24,7 @@ */ #include "util.h" +#include "utf_util.h" #include "stream.h" #include "inStream.h" #include "transport.h" @@ -379,15 +380,12 @@ string[length] = '\0'; /* This is Standard UTF-8, convert to Modified UTF-8 if necessary */ - new_length = (gdata->npt->utf8sToUtf8mLength) - (gdata->npt->utf, (jbyte*)string, length); + new_length = utf8sToUtf8mLength((jbyte*)string, length); if ( new_length != length ) { char *new_string; new_string = jvmtiAllocate(new_length+1); - (gdata->npt->utf8sToUtf8m) - (gdata->npt->utf, (jbyte*)string, length, - (jbyte*)new_string, new_length); + utf8sToUtf8m((jbyte*)string, length, (jbyte*)new_string, new_length); jvmtiDeallocate(string); return new_string; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/outStream.c --- a/jdk/src/share/back/outStream.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/back/outStream.c Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, 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 @@ -24,6 +24,7 @@ */ #include "util.h" +#include "utf_util.h" #include "stream.h" #include "outStream.h" #include "inStream.h" @@ -307,8 +308,7 @@ } else { jint new_length; - new_length = (gdata->npt->utf8mToUtf8sLength) - (gdata->npt->utf, (jbyte*)string, length); + new_length = utf8mToUtf8sLength((jbyte*)string, length); if ( new_length == length ) { (void)outStream_writeInt(stream, length); error = writeBytes(stream, (jbyte *)string, length); @@ -316,9 +316,7 @@ char *new_string; new_string = jvmtiAllocate(new_length+1); - (gdata->npt->utf8mToUtf8s) - (gdata->npt->utf, (jbyte*)string, length, - (jbyte*)new_string, new_length); + utf8mToUtf8s((jbyte*)string, length, (jbyte*)new_string, new_length); (void)outStream_writeInt(stream, new_length); error = writeBytes(stream, (jbyte *)new_string, new_length); jvmtiDeallocate(new_string); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/transport.c --- a/jdk/src/share/back/transport.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/back/transport.c Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, 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 @@ -24,6 +24,7 @@ */ #include "util.h" +#include "utf_util.h" #include "transport.h" #include "debugLoop.h" #include "sys.h" @@ -65,8 +66,7 @@ len = (int)strlen(msg); maxlen = len+len/2+2; /* Should allow for plenty of room */ utf8msg = (jbyte*)jvmtiAllocate(maxlen+1); - (void)(gdata->npt->utf8FromPlatform)(gdata->npt->utf, - msg, len, utf8msg, maxlen); + (void)utf8FromPlatform(msg, len, utf8msg, maxlen); utf8msg[maxlen] = 0; } if (rv == JDWPTRANSPORT_ERROR_NONE) { @@ -110,8 +110,7 @@ int len; len = (int)strlen(libdir); - (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf, - (jbyte*)libdir, len, buf, (int)sizeof(buf)); + (void)utf8ToPlatform((jbyte*)libdir, len, buf, (int)sizeof(buf)); plibdir = buf; } @@ -392,8 +391,7 @@ /* Convert commandLine from UTF-8 to platform encoding */ len = (int)strlen(commandLine); buf = jvmtiAllocate(len*3+3); - (void)(gdata->npt->utf8ToPlatform)(gdata->npt->utf, - (jbyte*)commandLine, len, buf, len*3+3); + (void)utf8ToPlatform((jbyte*)commandLine, len, buf, len*3+3); /* Exec commandLine */ rc = dbgsysExec(buf); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/utf_util.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/back/utf_util.c Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,540 @@ +/* + * Copyright (c) 1998, 2014, 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. + */ + +#include +#include + +#include "jni.h" + +#include "utf_util.h" + + +/* Error and assert macros */ +#define UTF_ERROR(m) utfError(__FILE__, __LINE__, m) +#define UTF_ASSERT(x) ( (x)==0 ? UTF_ERROR("ASSERT ERROR " #x) : (void)0 ) + +// Platform independed part + +static void utfError(char *file, int line, char *message) { + (void)fprintf(stderr, "UTF ERROR [\"%s\":%d]: %s\n", file, line, message); + abort(); +} + +/* Determine length of this Standard UTF-8 in Modified UTF-8. + * Validation is done of the basic UTF encoding rules, returns + * length (no change) when errors are detected in the UTF encoding. + * + * Note: Accepts Modified UTF-8 also, no verification on the + * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok. + */ +int JNICALL utf8sToUtf8mLength(jbyte *string, int length) { + int newLength; + int i; + + newLength = 0; + for ( i = 0 ; i < length ; i++ ) { + unsigned byte; + + byte = (unsigned char)string[i]; + if ( (byte & 0x80) == 0 ) { /* 1byte encoding */ + newLength++; + if ( byte == 0 ) { + newLength++; /* We gain one byte in length on NULL bytes */ + } + } else if ( (byte & 0xE0) == 0xC0 ) { /* 2byte encoding */ + /* Check encoding of following bytes */ + if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) { + break; /* Error condition */ + } + i++; /* Skip next byte */ + newLength += 2; + } else if ( (byte & 0xF0) == 0xE0 ) { /* 3byte encoding */ + /* Check encoding of following bytes */ + if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80 + || (string[i+2] & 0xC0) != 0x80 ) { + break; /* Error condition */ + } + i += 2; /* Skip next two bytes */ + newLength += 3; + } else if ( (byte & 0xF8) == 0xF0 ) { /* 4byte encoding */ + /* Check encoding of following bytes */ + if ( (i+3) >= length || (string[i+1] & 0xC0) != 0x80 + || (string[i+2] & 0xC0) != 0x80 + || (string[i+3] & 0xC0) != 0x80 ) { + break; /* Error condition */ + } + i += 3; /* Skip next 3 bytes */ + newLength += 6; /* 4byte encoding turns into 2 3byte ones */ + } else { + break; /* Error condition */ + } + } + if ( i != length ) { + /* Error in finding new length, return old length so no conversion */ + /* FIXUP: ERROR_MESSAGE? */ + return length; + } + return newLength; +} + +/* Convert Standard UTF-8 to Modified UTF-8. + * Assumes the UTF-8 encoding was validated by utf8mLength() above. + * + * Note: Accepts Modified UTF-8 also, no verification on the + * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok. + */ +void JNICALL utf8sToUtf8m(jbyte *string, int length, jbyte *newString, int newLength) { + int i; + int j; + + j = 0; + for ( i = 0 ; i < length ; i++ ) { + unsigned byte1; + + byte1 = (unsigned char)string[i]; + + /* NULL bytes and bytes starting with 11110xxx are special */ + if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */ + if ( byte1 == 0 ) { + /* Bits out: 11000000 10000000 */ + newString[j++] = (jbyte)0xC0; + newString[j++] = (jbyte)0x80; + } else { + /* Single byte */ + newString[j++] = byte1; + } + } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */ + newString[j++] = byte1; + newString[j++] = string[++i]; + } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */ + newString[j++] = byte1; + newString[j++] = string[++i]; + newString[j++] = string[++i]; + } else if ( (byte1 & 0xF8) == 0xF0 ) { /* 4byte encoding */ + /* Beginning of 4byte encoding, turn into 2 3byte encodings */ + unsigned byte2, byte3, byte4, u21; + + /* Bits in: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + byte2 = (unsigned char)string[++i]; + byte3 = (unsigned char)string[++i]; + byte4 = (unsigned char)string[++i]; + /* Reconstruct full 21bit value */ + u21 = (byte1 & 0x07) << 18; + u21 += (byte2 & 0x3F) << 12; + u21 += (byte3 & 0x3F) << 6; + u21 += (byte4 & 0x3F); + /* Bits out: 11101101 1010xxxx 10xxxxxx */ + newString[j++] = (jbyte)0xED; + newString[j++] = (jbyte)(0xA0 + (((u21 >> 16) - 1) & 0x0F)); + newString[j++] = (jbyte)(0x80 + ((u21 >> 10) & 0x3F)); + /* Bits out: 11101101 1011xxxx 10xxxxxx */ + newString[j++] = (jbyte)0xED; + newString[j++] = (jbyte)(0xB0 + ((u21 >> 6) & 0x0F)); + newString[j++] = byte4; + } + } + UTF_ASSERT(i==length); + UTF_ASSERT(j==newLength); + newString[j] = (jbyte)0; +} + +/* Given a Modified UTF-8 string, calculate the Standard UTF-8 length. + * Basic validation of the UTF encoding rules is done, and length is + * returned (no change) when errors are detected. + * + * Note: No validation is made that this is indeed Modified UTF-8 coming in. + * + */ +int JNICALL utf8mToUtf8sLength(jbyte *string, int length) { + int newLength; + int i; + + newLength = 0; + for ( i = 0 ; i < length ; i++ ) { + unsigned byte1, byte2, byte3, byte4, byte5, byte6; + + byte1 = (unsigned char)string[i]; + if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */ + newLength++; + } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */ + /* Check encoding of following bytes */ + if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) { + break; /* Error condition */ + } + byte2 = (unsigned char)string[++i]; + if ( byte1 != 0xC0 || byte2 != 0x80 ) { + newLength += 2; /* Normal 2byte encoding, not 0xC080 */ + } else { + newLength++; /* We will turn 0xC080 into 0 */ + } + } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */ + /* Check encoding of following bytes */ + if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80 + || (string[i+2] & 0xC0) != 0x80 ) { + break; /* Error condition */ + } + byte2 = (unsigned char)string[++i]; + byte3 = (unsigned char)string[++i]; + newLength += 3; + /* Possible process a second 3byte encoding */ + if ( (i+3) < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) { + /* See if this is a pair of 3byte encodings */ + byte4 = (unsigned char)string[i+1]; + byte5 = (unsigned char)string[i+2]; + byte6 = (unsigned char)string[i+3]; + if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) { + /* Check encoding of 3rd byte */ + if ( (byte6 & 0xC0) != 0x80 ) { + break; /* Error condition */ + } + newLength++; /* New string will have 4byte encoding */ + i += 3; /* Skip next 3 bytes */ + } + } + } else { + break; /* Error condition */ + } + } + if ( i != length ) { + /* Error in UTF encoding */ + /* FIXUP: ERROR_MESSAGE()? */ + return length; + } + return newLength; +} + +/* Convert a Modified UTF-8 string into a Standard UTF-8 string + * It is assumed that this string has been validated in terms of the + * basic UTF encoding rules by utf8Length() above. + * + * Note: No validation is made that this is indeed Modified UTF-8 coming in. + * + */ +void JNICALL utf8mToUtf8s(jbyte *string, int length, jbyte *newString, int newLength) { + int i; + int j; + + j = 0; + for ( i = 0 ; i < length ; i++ ) { + unsigned byte1, byte2, byte3, byte4, byte5, byte6; + + byte1 = (unsigned char)string[i]; + if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */ + /* Single byte */ + newString[j++] = byte1; + } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */ + byte2 = (unsigned char)string[++i]; + if ( byte1 != 0xC0 || byte2 != 0x80 ) { + newString[j++] = byte1; + newString[j++] = byte2; + } else { + newString[j++] = 0; + } + } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */ + byte2 = (unsigned char)string[++i]; + byte3 = (unsigned char)string[++i]; + if ( i+3 < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) { + /* See if this is a pair of 3byte encodings */ + byte4 = (unsigned char)string[i+1]; + byte5 = (unsigned char)string[i+2]; + byte6 = (unsigned char)string[i+3]; + if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) { + unsigned u21; + + /* Bits in: 11101101 1010xxxx 10xxxxxx */ + /* Bits in: 11101101 1011xxxx 10xxxxxx */ + i += 3; + + /* Reconstruct 21 bit code */ + u21 = ((byte2 & 0x0F) + 1) << 16; + u21 += (byte3 & 0x3F) << 10; + u21 += (byte5 & 0x0F) << 6; + u21 += (byte6 & 0x3F); + + /* Bits out: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + + /* Convert to 4byte encoding */ + newString[j++] = 0xF0 + ((u21 >> 18) & 0x07); + newString[j++] = 0x80 + ((u21 >> 12) & 0x3F); + newString[j++] = 0x80 + ((u21 >> 6) & 0x3F); + newString[j++] = 0x80 + (u21 & 0x3F); + continue; + } + } + /* Normal 3byte encoding */ + newString[j++] = byte1; + newString[j++] = byte2; + newString[j++] = byte3; + } + } + UTF_ASSERT(i==length); + UTF_ASSERT(j==newLength); + newString[j] = 0; +} + +#ifdef _WIN32 +// Microsoft Windows specific part + +#include + +static UINT getCodepage() { + LANGID langID; + LCID localeID; + TCHAR strCodePage[7]; // ANSI code page id + + static UINT intCodePage = -1; + + if (intCodePage == -1) { + // Firts call, get codepage from the os + langID = LANGIDFROMLCID(GetUserDefaultLCID()); + localeID = MAKELCID(langID, SORT_DEFAULT); + if (GetLocaleInfo(localeID, LOCALE_IDEFAULTANSICODEPAGE, + strCodePage, sizeof(strCodePage)/sizeof(TCHAR)) > 0 ) { + intCodePage = atoi(strCodePage); + } + else { + intCodePage = GetACP(); + } + } + + return intCodePage; +} + +/* + * Get wide string (assumes len>0) + */ +static WCHAR* getWideString(UINT codePage, char* str, int len, int *pwlen) { + int wlen; + WCHAR* wstr; + + /* Convert the string to WIDE string */ + wlen = MultiByteToWideChar(codePage, 0, str, len, NULL, 0); + *pwlen = wlen; + if (wlen <= 0) { + UTF_ERROR(("Can't get WIDE string length")); + return NULL; + } + wstr = (WCHAR*)malloc(wlen * sizeof(WCHAR)); + if (wstr == NULL) { + UTF_ERROR(("Can't malloc() any space")); + return NULL; + } + if (MultiByteToWideChar(codePage, 0, str, len, wstr, wlen) == 0) { + UTF_ERROR(("Can't get WIDE string")); + return NULL; + } + return wstr; +} + +/* + * Convert UTF-8 to a platform string + */ +int JNICALL utf8ToPlatform(jbyte *utf8, int len, char* output, int outputMaxLen) { + int wlen; + int plen; + WCHAR* wstr; + UINT codepage; + + UTF_ASSERT(utf8); + UTF_ASSERT(output); + UTF_ASSERT(outputMaxLen > len); + + /* Zero length is ok, but we don't need to do much */ + if ( len == 0 ) { + output[0] = 0; + return 0; + } + + /* Get WIDE string version (assumes len>0) */ + wstr = getWideString(CP_UTF8, (char*)utf8, len, &wlen); + if ( wstr == NULL ) { + // Can't allocate WIDE string + goto just_copy_bytes; + } + + /* Convert WIDE string to MultiByte string */ + codepage = getCodepage(); + plen = WideCharToMultiByte(codepage, 0, wstr, wlen, + output, outputMaxLen, NULL, NULL); + free(wstr); + if (plen <= 0) { + // Can't convert WIDE string to multi-byte + goto just_copy_bytes; + } + output[plen] = '\0'; + return plen; + +just_copy_bytes: + (void)memcpy(output, utf8, len); + output[len] = 0; + return len; +} + +/* + * Convert Platform Encoding to UTF-8. + */ +int JNICALL utf8FromPlatform(char *str, int len, jbyte *output, int outputMaxLen) { + int wlen; + int plen; + WCHAR* wstr; + UINT codepage; + + UTF_ASSERT(str); + UTF_ASSERT(output); + UTF_ASSERT(outputMaxLen > len); + + /* Zero length is ok, but we don't need to do much */ + if ( len == 0 ) { + output[0] = 0; + return 0; + } + + /* Get WIDE string version (assumes len>0) */ + codepage = getCodepage(); + wstr = getWideString(codepage, str, len, &wlen); + if ( wstr == NULL ) { + goto just_copy_bytes; + } + + /* Convert WIDE string to UTF-8 string */ + plen = WideCharToMultiByte(CP_UTF8, 0, wstr, wlen, + (char*)output, outputMaxLen, NULL, NULL); + free(wstr); + if (plen <= 0) { + UTF_ERROR(("Can't convert WIDE string to multi-byte")); + goto just_copy_bytes; + } + output[plen] = '\0'; + return plen; + +just_copy_bytes: + (void)memcpy(output, str, len); + output[len] = 0; + return len; +} + + +#else +// *NIX specific part + +#include +#include +#include +#include + +typedef enum {TO_UTF8, FROM_UTF8} conv_direction; + +/* + * Do iconv() conversion. + * Returns length or -1 if output overflows. + */ +static int iconvConvert(conv_direction drn, char *bytes, size_t len, char *output, size_t outputMaxLen) { + + static char *codeset = 0; + iconv_t func; + size_t bytes_converted; + size_t inLeft, outLeft; + char *inbuf, *outbuf; + + UTF_ASSERT(bytes); + UTF_ASSERT(output); + UTF_ASSERT(outputMaxLen > len); + + /* Zero length is ok, but we don't need to do much */ + if ( len == 0 ) { + output[0] = 0; + return 0; + } + + if (codeset == NULL && codeset != (char *) -1) { + // locale is not initialized, do it now + if (setlocale(LC_ALL, "") != NULL) { + // nl_langinfo returns ANSI_X3.4-1968 by default + codeset = (char*)nl_langinfo(CODESET); + } + + if (codeset == NULL) { + // Not able to intialize process locale from platform one. + codeset = (char *) -1; + } + } + + if (codeset == (char *) -1) { + // There was an error during initialization, so just bail out + goto just_copy_bytes; + } + + func = (drn == TO_UTF8) ? iconv_open(codeset, "UTF-8") : iconv_open("UTF-8", codeset); + if (func == (iconv_t) -1) { + // Requested charset combination is not supported, conversion couldn't be done. + // make sure we will not try it again + codeset = (char *) -1; + goto just_copy_bytes; + } + + // perform conversion + inbuf = bytes; + outbuf = output; + inLeft = len; + outLeft = outputMaxLen; + + bytes_converted = iconv(func, (void*)&inbuf, &inLeft, &outbuf, &outLeft); + if (bytes_converted == (size_t) -1 || bytes_converted == 0 || inLeft != 0) { + // Input string is invalid, not able to convert entire string + // or some other iconv error happens. + iconv_close(func); + goto just_copy_bytes; + } + + iconv_close(func); + // Overwrite bytes_converted with value of actually stored bytes + bytes_converted = outputMaxLen-outLeft; + output[bytes_converted] = 0; + return bytes_converted; + + +just_copy_bytes: + (void)memcpy(output, bytes, len); + output[len] = 0; + return len; + } + +/* + * Convert UTF-8 to Platform Encoding. + * Returns length or -1 if output overflows. + */ +int JNICALL utf8ToPlatform(jbyte *utf8, int len, char *output, int outputMaxLen) { + return iconvConvert(FROM_UTF8, (char*)utf8, len, output, outputMaxLen); +} + +/* + * Convert Platform Encoding to UTF-8. + * Returns length or -1 if output overflows. + */ +int JNICALL utf8FromPlatform(char *str, int len, jbyte *output, int outputMaxLen) { + return iconvConvert(TO_UTF8, str, len, (char*) output, outputMaxLen); +} + +#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/utf_util.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/back/utf_util.h Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,40 @@ +/* + * Copyright (c) 1998, 2014, 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. + */ + +#ifndef _utf_util_h_ +#define _utf_util_h_ + +#include "jni.h" + + +int JNICALL utf8sToUtf8mLength(jbyte *string, int length); +void JNICALL utf8sToUtf8m(jbyte *string, int length, jbyte *newString, int newLength); +int JNICALL utf8mToUtf8sLength(jbyte *string, int length); +void JNICALL utf8mToUtf8s(jbyte *string, int length, jbyte *newString, int newLength); + +int JNICALL utf8ToPlatform(jbyte *utf8, int len, char* output, int outputMaxLen); +int JNICALL utf8FromPlatform(char *str, int len, jbyte *output, int outputMaxLen); + +#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/back/util.h --- a/jdk/src/share/back/util.h Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/back/util.h Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, 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 @@ -53,9 +53,6 @@ #include "error_messages.h" #include "debugInit.h" -/* Get access to Native Platform Toolkit functions */ -#include "npt.h" - /* Definition of a CommonRef tracked by the backend for the frontend */ typedef struct RefNode { jlong seqNum; /* ID of reference, also key for hash table */ @@ -123,9 +120,6 @@ unsigned log_flags; - /* The Native Platform Toolkit access */ - NptEnv *npt; - /* Common References static data */ jrawMonitorID refLock; jlong nextSeqNum; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java --- a/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java Wed Jul 05 19:46:40 2017 +0200 @@ -509,7 +509,7 @@ byte[] signature = new byte[6]; stream.readFully(signature); - StringBuffer version = new StringBuffer(3); + StringBuilder version = new StringBuilder(3); version.append((char)signature[3]); version.append((char)signature[4]); version.append((char)signature[5]); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java --- a/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGMetadata.java Wed Jul 05 19:46:40 2017 +0200 @@ -900,7 +900,7 @@ if (times == 1) { return s; } - StringBuffer sb = new StringBuffer((s.length() + 1)*times - 1); + StringBuilder sb = new StringBuilder((s.length() + 1)*times - 1); sb.append(s); for (int i = 1; i < times; i++) { sb.append(" "); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Wed Jul 05 19:46:40 2017 +0200 @@ -169,23 +169,23 @@ result.add(typedInName); } - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); len = result.size(); // construct the resulting string for (int i=0; i 0) { - buf.append(" "); + sb.append(" "); } if (len > 1) { - buf.append("\""); + sb.append("\""); } - buf.append(result.get(i)); + sb.append(result.get(i)); if (len > 1) { - buf.append("\""); + sb.append("\""); } } - return buf.toString(); + return sb.toString(); } public void setFileName(String fileName) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java Wed Jul 05 19:46:40 2017 +0200 @@ -533,13 +533,13 @@ // Pending: verify character encoding spec for gconf Reader reader = new InputStreamReader(url.openStream(), "ISO-8859-1"); char[] buf = new char[1024]; - StringBuffer strBuf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); int n; while ((n = reader.read(buf)) >= 0) { - strBuf.append(buf, 0, n); + sb.append(buf, 0, n); } reader.close(); - String str = strBuf.toString(); + String str = sb.toString(); if (str != null) { String strLowerCase = str.toLowerCase(); int i = strLowerCase.indexOf(" 0) { - buf.append(" "); + sb.append(" "); } if (files.length > 1) { - buf.append("\""); + sb.append("\""); } - buf.append(fileNameString(files[i])); + sb.append(fileNameString(files[i])); if (files.length > 1) { - buf.append("\""); + sb.append("\""); } } - return buf.toString(); + return sb.toString(); } public MotifFileChooserUI(JFileChooser filechooser) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Wed Jul 05 19:46:40 2017 +0200 @@ -690,7 +690,7 @@ } private String fileNameString(File[] files) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; files != null && i < files.length; i++) { if (i > 0) { buf.append(" "); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java --- a/jdk/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/BandStructure.java Wed Jul 05 19:46:40 2017 +0200 @@ -628,7 +628,7 @@ } if (metaCoding.length > 0 && (verbose > 2 || verbose > 1 && metaCoding.length > 1)) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < metaCoding.length; i++) { if (i == 1) sb.append(" /"); sb.append(" ").append(metaCoding[i] & 0xFF); @@ -756,7 +756,7 @@ " size="+outputSize()+ irr+" coding="+bandCoding); if (metaCoding != noMetaCoding) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < metaCoding.length; i++) { if (i == 1) sb.append(" /"); sb.append(" ").append(metaCoding[i] & 0xFF); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java --- a/jdk/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/ConstantPool.java Wed Jul 05 19:46:40 2017 +0200 @@ -1026,7 +1026,7 @@ } static String stringValueOf(MethodHandleEntry bsmRef, Entry[] argRefs) { - StringBuffer sb = new StringBuffer(bsmRef.stringValue()); + StringBuilder sb = new StringBuilder(bsmRef.stringValue()); // Arguments are formatted as "" instead of "[foo,bar,baz]". // This ensures there will be no confusion if "[,]" appear inside of names. char nextSep = '<'; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/NetMaskImpl.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/NetMaskImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/NetMaskImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -63,12 +63,12 @@ if (SNMP_LOGGER.isLoggable(Level.FINEST)) { SNMP_LOGGER.logp(Level.FINEST, NetMaskImpl.class.getName(), "extractSubNet", "BINARY ARRAY :"); - StringBuffer buff = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for(int i =0; i < addrLength; i++) { - buff.append((b[i] &0xFF) +":"); + sb.append((b[i] & 0xFF) + ":"); } SNMP_LOGGER.logp(Level.FINEST, NetMaskImpl.class.getName(), - "extractSubNet", buff.toString()); + "extractSubNet", sb.toString()); } // 8 is a byte size. Common to any InetAddress (V4 or V6). diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/ParseException.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/ParseException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/ParseException.java Wed Jul 05 19:46:40 2017 +0200 @@ -170,7 +170,7 @@ * string literal. */ protected String add_escapes(String str) { - StringBuffer retval = new StringBuffer(); + StringBuilder retval = new StringBuilder(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/SnmpAcl.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/SnmpAcl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/SnmpAcl.java Wed Jul 05 19:46:40 2017 +0200 @@ -186,8 +186,8 @@ public static String getDefaultAclFileName() { final String fileSeparator = System.getProperty("file.separator"); - final StringBuffer defaultAclName = - new StringBuffer(System.getProperty("java.home")). + final StringBuilder defaultAclName = + new StringBuilder(System.getProperty("java.home")). append(fileSeparator).append("lib").append(fileSeparator). append("snmp.acl"); return defaultAclName.toString(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/TokenMgrError.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/TokenMgrError.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/IPAcl/TokenMgrError.java Wed Jul 05 19:46:40 2017 +0200 @@ -65,7 +65,7 @@ * equivalents in the given string */ protected static final String addEscapes(String str) { - StringBuffer retval = new StringBuffer(); + StringBuilder retval = new StringBuilder(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/SnmpMessage.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMessage.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMessage.java Wed Jul 05 19:46:40 2017 +0200 @@ -347,7 +347,7 @@ * @return The string containing the dump. */ public String printMessage() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (community == null) { sb.append("Community: null") ; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/SnmpMsg.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMsg.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpMsg.java Wed Jul 05 19:46:40 2017 +0200 @@ -181,22 +181,22 @@ * @return The string containing the dump. */ public static String dumpHexBuffer(byte [] b, int offset, int len) { - StringBuffer buf = new StringBuffer(len << 1) ; + StringBuilder sb = new StringBuilder(len << 1) ; int k = 1 ; int flen = offset + len ; for (int i = offset; i < flen ; i++) { int j = b[i] & 0xFF ; - buf.append(Character.forDigit((j >>> 4) , 16)) ; - buf.append(Character.forDigit((j & 0x0F), 16)) ; + sb.append(Character.forDigit((j >>> 4), 16)) ; + sb.append(Character.forDigit((j & 0x0F), 16)) ; k++ ; if (k%16 == 0) { - buf.append('\n') ; + sb.append('\n') ; k = 1 ; } else - buf.append(' ') ; + sb.append(' ') ; } - return buf.toString() ; + return sb.toString() ; } /** @@ -205,7 +205,7 @@ * @return The string containing the dump. */ public String printMessage() { - StringBuffer sb = new StringBuffer() ; + StringBuilder sb = new StringBuilder() ; sb.append("Version: ") ; sb.append(version) ; sb.append("\n") ; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/SnmpOpaque.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpOpaque.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpOpaque.java Wed Jul 05 19:46:40 2017 +0200 @@ -73,7 +73,7 @@ * @return The String representation of the value. */ public String toString() { - StringBuffer result = new StringBuffer() ; + StringBuilder result = new StringBuilder() ; for (int i = 0 ; i < value.length ; i++) { byte b = value[i] ; int n = (b >= 0) ? b : b + 256 ; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jmx/snmp/SnmpV3Message.java --- a/jdk/src/share/classes/com/sun/jmx/snmp/SnmpV3Message.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jmx/snmp/SnmpV3Message.java Wed Jul 05 19:46:40 2017 +0200 @@ -478,7 +478,7 @@ * @return The string containing the dump. */ public String printMessage() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("msgId : " + msgId + "\n"); sb.append("msgMaxSize : " + msgMaxSize + "\n"); sb.append("msgFlags : " + msgFlags + "\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/cosnaming/CNNameParser.java --- a/jdk/src/share/classes/com/sun/jndi/cosnaming/CNNameParser.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/cosnaming/CNNameParser.java Wed Jul 05 19:46:40 2017 +0200 @@ -96,7 +96,7 @@ * Used by CNCtx.getNameInNamespace(), CNCompoundName.toString(). */ static String cosNameToInsString(NameComponent[] cname) { - StringBuffer str = new StringBuffer(); + StringBuilder str = new StringBuilder(); for ( int i = 0; i < cname.length; i++) { if ( i > 0) { str.append(compSeparator); @@ -254,7 +254,7 @@ } private static String stringifyComponent(NameComponent comp) { - StringBuffer one = new StringBuffer(escape(comp.id)); + StringBuilder one = new StringBuilder(escape(comp.id)); if (comp.kind != null && !comp.kind.equals("")) { one.append(kindSeparator + escape(comp.kind)); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/dns/DnsContextFactory.java --- a/jdk/src/share/classes/com/sun/jndi/dns/DnsContextFactory.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/dns/DnsContextFactory.java Wed Jul 05 19:46:40 2017 +0200 @@ -198,14 +198,14 @@ } } - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < servers.length; i++) { if (i > 0) { - buf.append(' '); + sb.append(' '); } - buf.append("dns://").append(servers[i]).append(path); + sb.append("dns://").append(servers[i]).append(path); } - return buf.toString(); + return sb.toString(); } /* diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/dns/DnsName.java --- a/jdk/src/share/classes/com/sun/jndi/dns/DnsName.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/dns/DnsName.java Wed Jul 05 19:46:40 2017 +0200 @@ -415,7 +415,7 @@ */ private void parse(String name) throws InvalidNameException { - StringBuffer label = new StringBuffer(); // label being parsed + StringBuilder label = new StringBuilder(); // label being parsed for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); @@ -564,15 +564,15 @@ * into account. See compareLabels(). */ private static String keyForLabel(String label) { - StringBuffer buf = new StringBuffer(label.length()); + StringBuilder sb = new StringBuilder(label.length()); for (int i = 0; i < label.length(); i++) { char c = label.charAt(i); if (c >= 'A' && c <= 'Z') { c += 'a' - 'A'; // to lower case } - buf.append(c); + sb.append(c); } - return buf.toString(); + return sb.toString(); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/dns/ResourceRecord.java --- a/jdk/src/share/classes/com/sun/jndi/dns/ResourceRecord.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/dns/ResourceRecord.java Wed Jul 05 19:46:40 2017 +0200 @@ -596,21 +596,21 @@ // If bestBase != -1, compress zeros in [bestBase, bestBase+bestLen) boolean compress = (bestBase != -1); - StringBuffer buf = new StringBuffer(40); + StringBuilder sb = new StringBuilder(40); if (bestBase == 0) { - buf.append(':'); + sb.append(':'); } for (int i = 0; i < 8; i++) { if (!compress || (i < bestBase) || (i >= bestBase + bestLen)) { - buf.append(Integer.toHexString(addr6[i])); + sb.append(Integer.toHexString(addr6[i])); if (i < 7) { - buf.append(':'); + sb.append(':'); } } else if (compress && (i == bestBase)) { // first compressed zero - buf.append(':'); + sb.append(':'); } } - return buf.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/ldap/ClientId.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/ClientId.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/ClientId.java Wed Jul 05 19:46:40 2017 +0200 @@ -210,7 +210,7 @@ if (ctls == null) { return ""; } - StringBuffer str = new StringBuffer(); + StringBuilder str = new StringBuilder(); for (int i = 0; i < ctls.length; i++) { str.append(ctls[i].getID()); str.append(' '); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/ldap/DigestClientId.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/DigestClientId.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/DigestClientId.java Wed Jul 05 19:46:40 2017 +0200 @@ -103,14 +103,14 @@ public String toString() { if (propvals != null) { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < propvals.length; i++) { - buf.append(':'); + sb.append(':'); if (propvals[i] != null) { - buf.append(propvals[i]); + sb.append(propvals[i]); } } - return super.toString() + buf.toString(); + return super.toString() + sb.toString(); } else { return super.toString(); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/ldap/LdapSchemaParser.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapSchemaParser.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapSchemaParser.java Wed Jul 05 19:46:40 2017 +0200 @@ -767,7 +767,7 @@ final private String classDef2ObjectDesc(Attributes attrs) throws NamingException { - StringBuffer objectDesc = new StringBuffer("( "); + StringBuilder objectDesc = new StringBuilder("( "); Attribute attr = null; int count = 0; @@ -879,7 +879,7 @@ final private String attrDef2AttrDesc(Attributes attrs) throws NamingException { - StringBuffer attrDesc = new StringBuffer("( "); // opening parens + StringBuilder attrDesc = new StringBuilder("( "); // opening parens Attribute attr = null; int count = 0; @@ -1012,7 +1012,7 @@ final private String syntaxDef2SyntaxDesc(Attributes attrs) throws NamingException { - StringBuffer syntaxDesc = new StringBuffer("( "); // opening parens + StringBuilder syntaxDesc = new StringBuilder("( "); // opening parens Attribute attr = null; int count = 0; @@ -1068,7 +1068,7 @@ final private String matchRuleDef2MatchRuleDesc(Attributes attrs) throws NamingException { - StringBuffer matchRuleDesc = new StringBuffer("( "); // opening parens + StringBuilder matchRuleDesc = new StringBuilder("( "); // opening parens Attribute attr = null; int count = 0; @@ -1196,7 +1196,7 @@ // write QDList - StringBuffer qdList = new StringBuffer(attr.getID()); + StringBuilder qdList = new StringBuilder(attr.getID()); qdList.append(WHSP); qdList.append(OID_LIST_BEGIN); @@ -1233,7 +1233,7 @@ // write OID List - StringBuffer oidList = new StringBuffer(oidsAttr.getID()); + StringBuilder oidList = new StringBuilder(oidsAttr.getID()); oidList.append(WHSP); oidList.append(OID_LIST_BEGIN); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/ldap/ServiceLocator.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/ServiceLocator.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/ServiceLocator.java Wed Jul 05 19:46:40 2017 +0200 @@ -68,7 +68,7 @@ if (dn == null) { return null; } - StringBuffer domain = new StringBuffer(); + StringBuilder domain = new StringBuilder(); LdapName ldapName = new LdapName(dn); // process RDNs left-to-right diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java Wed Jul 05 19:46:40 2017 +0200 @@ -88,7 +88,7 @@ } } if (selected == -1) { - StringBuffer allChoices = new StringBuffer(); + StringBuilder allChoices = new StringBuilder(); for (int j = 0; j < choices.length; j++) { allChoices.append(choices[j] + ","); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java --- a/jdk/src/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Wed Jul 05 19:46:40 2017 +0200 @@ -520,30 +520,30 @@ str = (String)obj; } int len = str.length(); - StringBuffer buf = new StringBuffer(len); + StringBuilder sb = new StringBuilder(len); char ch; for (int i = 0; i < len; i++) { switch (ch=str.charAt(i)) { case '*': - buf.append("\\2a"); + sb.append("\\2a"); break; case '(': - buf.append("\\28"); + sb.append("\\28"); break; case ')': - buf.append("\\29"); + sb.append("\\29"); break; case '\\': - buf.append("\\5c"); + sb.append("\\5c"); break; case 0: - buf.append("\\00"); + sb.append("\\00"); break; default: - buf.append(ch); + sb.append(ch); } } - return buf.toString(); + return sb.toString(); } @@ -585,7 +585,7 @@ int param; int where = 0, start = 0; - StringBuffer answer = new StringBuffer(expr.length()); + StringBuilder answer = new StringBuilder(expr.length()); while ((where = findUnescaped('{', expr, start)) >= 0) { int pstart = where + 1; // skip '{' diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java Wed Jul 05 19:46:40 2017 +0200 @@ -326,7 +326,7 @@ private static KeySortComparator keySortComparator = new KeySortComparator(); private String extractKeys(ModelConnectionBlock conn) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (conn.getSources() != null) { sb.append("["); ModelSource[] srcs = conn.getSources(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java --- a/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java Wed Jul 05 19:46:40 2017 +0200 @@ -162,7 +162,7 @@ 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); private String decodeChannelMask(long channelmask) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); long m = 1; for (int i = 0; i < allchannelnames.length; i++) { if ((channelmask & m) != 0L) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/Base64.java --- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/Base64.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/Base64.java Wed Jul 05 19:46:40 2017 +0200 @@ -257,7 +257,7 @@ public static final byte[] decode(Element element) throws Base64DecodingException { Node sibling = element.getFirstChild(); - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); while (sibling != null) { if (sibling.getNodeType() == Node.TEXT_NODE) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/security/sasl/CramMD5Base.java --- a/jdk/src/share/classes/com/sun/security/sasl/CramMD5Base.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/security/sasl/CramMD5Base.java Wed Jul 05 19:46:40 2017 +0200 @@ -195,7 +195,7 @@ digest = md5.digest(); // Get character representation of digest - StringBuffer digestString = new StringBuffer(); + StringBuilder digestString = new StringBuilder(); for (i = 0; i < digest.length; i++) { if ((digest[i] & 0x000000ff) < 0x10) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/security/sasl/CramMD5Server.java --- a/jdk/src/share/classes/com/sun/security/sasl/CramMD5Server.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/security/sasl/CramMD5Server.java Wed Jul 05 19:46:40 2017 +0200 @@ -117,15 +117,15 @@ long rand = random.nextLong(); long timestamp = System.currentTimeMillis(); - StringBuffer buf = new StringBuffer(); - buf.append('<'); - buf.append(rand); - buf.append('.'); - buf.append(timestamp); - buf.append('@'); - buf.append(fqdn); - buf.append('>'); - String challengeStr = buf.toString(); + StringBuilder sb = new StringBuilder(); + sb.append('<'); + sb.append(rand); + sb.append('.'); + sb.append(timestamp); + sb.append('@'); + sb.append(fqdn); + sb.append('>'); + String challengeStr = sb.toString(); logger.log(Level.FINE, "CRAMSRV01:Generated challenge: {0}", challengeStr); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java --- a/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java Wed Jul 05 19:46:40 2017 +0200 @@ -387,7 +387,7 @@ protected byte[] binaryToHex(byte[] digest) throws UnsupportedEncodingException { - StringBuffer digestString = new StringBuffer(); + StringBuilder digestString = new StringBuilder(); for (int i = 0; i < digest.length; i ++) { if ((digest[i] & 0x000000ff) < 0x10) { @@ -598,7 +598,7 @@ protected static String nonceCountToHex(int count) { String str = Integer.toHexString(count); - StringBuffer pad = new StringBuffer(); + StringBuilder pad = new StringBuilder(); if (str.length() < 8) { for (int i = 0; i < 8-str.length(); i ++) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Server.java --- a/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Server.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Server.java Wed Jul 05 19:46:40 2017 +0200 @@ -203,19 +203,19 @@ String supportedCiphers = null; if ((allQop&PRIVACY_PROTECTION) != 0) { myCiphers = getPlatformCiphers(); - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); // myCipher[i] is a byte that indicates whether CIPHER_TOKENS[i] // is supported for (int i = 0; i < CIPHER_TOKENS.length; i++) { if (myCiphers[i] != 0) { - if (buf.length() > 0) { - buf.append(','); + if (sb.length() > 0) { + sb.append(','); } - buf.append(CIPHER_TOKENS[i]); + sb.append(CIPHER_TOKENS[i]); } } - supportedCiphers = buf.toString(); + supportedCiphers = sb.toString(); } try { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/security/sasl/util/AbstractSaslImpl.java --- a/jdk/src/share/classes/com/sun/security/sasl/util/AbstractSaslImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/security/sasl/util/AbstractSaslImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -80,13 +80,13 @@ "SASLIMPL02:Preferred qop mask: {0}", new Byte(allQop)); if (qop.length > 0) { - StringBuffer qopbuf = new StringBuffer(); + StringBuilder str = new StringBuilder(); for (int i = 0; i < qop.length; i++) { - qopbuf.append(Byte.toString(qop[i])); - qopbuf.append(' '); + str.append(Byte.toString(qop[i])); + str.append(' '); } logger.logp(Level.FINE, myClassName, "constructor", - "SASLIMPL03:Preferred qops : {0}", qopbuf.toString()); + "SASLIMPL03:Preferred qops : {0}", str.toString()); } } @@ -95,13 +95,13 @@ logger.logp(Level.FINE, myClassName, "constructor", "SASLIMPL04:Preferred strength property: {0}", prop); if (logger.isLoggable(Level.FINE) && strength.length > 0) { - StringBuffer strbuf = new StringBuffer(); + StringBuilder str = new StringBuilder(); for (int i = 0; i < strength.length; i++) { - strbuf.append(Byte.toString(strength[i])); - strbuf.append(' '); + str.append(Byte.toString(strength[i])); + str.append(' '); } logger.logp(Level.FINE, myClassName, "constructor", - "SASLIMPL05:Cipher strengths: {0}", strbuf.toString()); + "SASLIMPL05:Cipher strengths: {0}", str.toString()); } // Max receive buffer size diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExceptionSpec.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExceptionSpec.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/ExceptionSpec.java Wed Jul 05 19:46:40 2017 +0200 @@ -102,8 +102,8 @@ @Override public String toString() { - StringBuffer buffer = new StringBuffer("exception catch "); - buffer.append(refSpec.toString()); - return buffer.toString(); + StringBuilder sb = new StringBuilder("exception catch "); + sb.append(refSpec.toString()); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/LineBreakpointSpec.java Wed Jul 05 19:46:40 2017 +0200 @@ -118,13 +118,13 @@ @Override public String toString() { - StringBuffer buffer = new StringBuffer("breakpoint "); - buffer.append(refSpec.toString()); - buffer.append(':'); - buffer.append(lineNumber); - buffer.append(" ("); - buffer.append(getStatusString()); - buffer.append(')'); - return buffer.toString(); + StringBuilder sb = new StringBuilder("breakpoint "); + sb.append(refSpec.toString()); + sb.append(':'); + sb.append(lineNumber); + sb.append(" ("); + sb.append(getStatusString()); + sb.append(')'); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/bdi/MethodBreakpointSpec.java Wed Jul 05 19:46:40 2017 +0200 @@ -126,26 +126,26 @@ @Override public String toString() { - StringBuffer buffer = new StringBuffer("breakpoint "); - buffer.append(refSpec.toString()); - buffer.append('.'); - buffer.append(methodId); + StringBuilder sb = new StringBuilder("breakpoint "); + sb.append(refSpec.toString()); + sb.append('.'); + sb.append(methodId); if (methodArgs != null) { boolean first = true; - buffer.append('('); + sb.append('('); for (String name : methodArgs) { if (!first) { - buffer.append(','); + sb.append(','); } - buffer.append(name); + sb.append(name); first = false; } - buffer.append(")"); + sb.append(")"); } - buffer.append(" ("); - buffer.append(getStatusString()); - buffer.append(')'); - return buffer.toString(); + sb.append(" ("); + sb.append(getStatusString()); + sb.append(')'); + return sb.toString(); } private boolean isValidMethodName(String s) { @@ -225,8 +225,8 @@ * stripping whitespace after the name ends. */ int i = 0; - StringBuffer typePart = new StringBuffer(); - StringBuffer arrayPart = new StringBuffer(); + StringBuilder typePart = new StringBuilder(); + StringBuilder arrayPart = new StringBuilder(); name = name.trim(); int nameLength = name.length(); /* diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java Wed Jul 05 19:46:40 2017 +0200 @@ -185,7 +185,7 @@ } final public String Name() throws ParseException { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); jj_consume_token(IDENTIFIER); sb.append(token); label_2: diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/ParseException.java Wed Jul 05 19:46:40 2017 +0200 @@ -114,7 +114,7 @@ int[][] expectedTokenSequences, String[] tokenImage) { String eol = System.getProperty("line.separator", "\n"); - StringBuffer expected = new StringBuffer(); + StringBuilder expected = new StringBuilder(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { @@ -164,7 +164,7 @@ * string literal. */ static String add_escapes(String str) { - StringBuffer retval = new StringBuffer(); + StringBuilder retval = new StringBuilder(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java Wed Jul 05 19:46:40 2017 +0200 @@ -73,7 +73,7 @@ * equivalents in the given string */ protected static final String addEscapes(String str) { - StringBuffer retval = new StringBuffer(); + StringBuilder retval = new StringBuilder(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/CommandInterpreter.java Wed Jul 05 19:46:40 2017 +0200 @@ -267,7 +267,7 @@ buf[j] = ' '; } buf[79] = '\0'; - StringBuffer sbOut = new StringBuffer(); + StringBuilder sbOut = new StringBuilder(); sbOut.append(buf); // Right-justify the thread number at start of output string @@ -381,16 +381,16 @@ } } else { clname = t.nextToken(); - StringBuffer sbuf = new StringBuffer(); + StringBuilder str = new StringBuilder(); // Allow VM arguments to be specified here? while (t.hasMoreTokens()) { String tok = t.nextToken(); - sbuf.append(tok); + str.append(tok); if (t.hasMoreTokens()) { - sbuf.append(' '); + str.append(' '); } } - String args = sbuf.toString(); + String args = str.toString(); try { String vmArgs = context.getVmArguments(); runtime.run(suspended, vmArgs, clname, args); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/gui/ContextManager.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/ContextManager.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/ContextManager.java Wed Jul 05 19:46:40 2017 +0200 @@ -333,7 +333,7 @@ private String processClasspathDefaults(String javaArgs) { if (javaArgs.indexOf("-classpath ") == -1) { - StringBuffer munged = new StringBuffer(javaArgs); + StringBuilder munged = new StringBuilder(javaArgs); SearchPath classpath = classManager.getClassPath(); if (classpath.isEmpty()) { String envcp = System.getProperty("env.class.path"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/gui/SourceModel.java Wed Jul 05 19:46:40 2017 +0200 @@ -236,7 +236,7 @@ private String expandTabs(String s) { int col = 0; int len = s.length(); - StringBuffer sb = new StringBuffer(132); + StringBuilder sb = new StringBuilder(132); for (int i = 0; i < len; i++) { char c = s.charAt(i); sb.append(c); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java Wed Jul 05 19:46:40 2017 +0200 @@ -154,27 +154,27 @@ @Override public String toString() { - StringBuffer buffer = new StringBuffer(refSpec.toString()); + StringBuilder sb = new StringBuilder(refSpec.toString()); if (isMethodBreakpoint()) { - buffer.append('.'); - buffer.append(methodId); + sb.append('.'); + sb.append(methodId); if (methodArgs != null) { boolean first = true; - buffer.append('('); + sb.append('('); for (String arg : methodArgs) { if (!first) { - buffer.append(','); + sb.append(','); } - buffer.append(arg); + sb.append(arg); first = false; } - buffer.append(")"); + sb.append(")"); } } else { - buffer.append(':'); - buffer.append(lineNumber); + sb.append(':'); + sb.append(lineNumber); } - return MessageOutput.format("breakpoint", buffer.toString()); + return MessageOutput.format("breakpoint", sb.toString()); } private Location location(ReferenceType refType) throws @@ -275,8 +275,8 @@ * stripping whitespace after the name ends */ int i = 0; - StringBuffer typePart = new StringBuffer(); - StringBuffer arrayPart = new StringBuffer(); + StringBuilder typePart = new StringBuilder(); + StringBuilder arrayPart = new StringBuilder(); name = name.trim(); int nameLength = name.length(); /* diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Commands.java Wed Jul 05 19:46:40 2017 +0200 @@ -164,30 +164,30 @@ } String typedName(Method method) { - StringBuffer buf = new StringBuffer(); - buf.append(method.name()); - buf.append("("); + StringBuilder sb = new StringBuilder(); + sb.append(method.name()); + sb.append("("); List args = method.argumentTypeNames(); int lastParam = args.size() - 1; // output param types except for the last for (int ii = 0; ii < lastParam; ii++) { - buf.append(args.get(ii)); - buf.append(", "); + sb.append(args.get(ii)); + sb.append(", "); } if (lastParam >= 0) { // output the last param String lastStr = args.get(lastParam); if (method.isVarArgs()) { // lastParam is an array. Replace the [] with ... - buf.append(lastStr.substring(0, lastStr.length() - 2)); - buf.append("..."); + sb.append(lastStr.substring(0, lastStr.length() - 2)); + sb.append("..."); } else { - buf.append(lastStr); + sb.append(lastStr); } } - buf.append(")"); - return buf.toString(); + sb.append(")"); + return sb.toString(); } void commandConnectors(VirtualMachineManager vmm) { @@ -226,7 +226,7 @@ } void commandClasses() { - StringBuffer classList = new StringBuffer(); + StringBuilder classList = new StringBuilder(); for (ReferenceType refType : Env.vm().allClasses()) { classList.append(refType.name()); classList.append("\n"); @@ -309,7 +309,7 @@ String idClass = t.nextToken(); ReferenceType cls = Env.getReferenceTypeFromToken(idClass); if (cls != null) { - StringBuffer methodsList = new StringBuffer(); + StringBuilder methodsList = new StringBuilder(); for (Method method : cls.allMethods()) { methodsList.append(method.declaringType().name()); methodsList.append(" "); @@ -333,7 +333,7 @@ if (cls != null) { List fields = cls.allFields(); List visible = cls.visibleFields(); - StringBuffer fieldsList = new StringBuffer(); + StringBuilder fieldsList = new StringBuilder(); for (Field field : fields) { String s; if (!visible.contains(field)) { @@ -391,11 +391,11 @@ * very long thread names, at the possible cost of lines * being wrapped by the display device. */ - StringBuffer idBuffer = new StringBuffer(Env.description(thr)); + StringBuilder idBuffer = new StringBuilder(Env.description(thr)); for (int i = idBuffer.length(); i < maxIdLength; i++) { idBuffer.append(" "); } - StringBuffer nameBuffer = new StringBuffer(thr.name()); + StringBuilder nameBuffer = new StringBuilder(thr.name()); for (int i = nameBuffer.length(); i < maxNameLength; i++) { nameBuffer.append(" "); } @@ -1606,16 +1606,16 @@ private void dump(ObjectReference obj, ReferenceType refType, ReferenceType refTypeBase) { for (Field field : refType.fields()) { - StringBuffer o = new StringBuffer(); - o.append(" "); + StringBuilder sb = new StringBuilder(); + sb.append(" "); if (!refType.equals(refTypeBase)) { - o.append(refType.name()); - o.append("."); + sb.append(refType.name()); + sb.append("."); } - o.append(field.name()); - o.append(MessageOutput.format("colon space")); - o.append(obj.getValue(field)); - MessageOutput.printDirectln(o.toString()); // Special case: use printDirectln() + sb.append(field.name()); + sb.append(MessageOutput.format("colon space")); + sb.append(obj.getValue(field)); + MessageOutput.printDirectln(sb.toString()); // Special case: use printDirectln() } if (refType instanceof ClassType) { ClassType sup = ((ClassType)refType).superclass(); @@ -1954,7 +1954,7 @@ } } - StringBuffer line = new StringBuffer(80); + StringBuilder line = new StringBuilder(80); line.append("0000: "); for (int i = 0; i < bytecodes.length; i++) { if ((i > 0) && (i % 16 == 0)) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/Env.java Wed Jul 05 19:46:40 2017 +0200 @@ -114,12 +114,12 @@ } static String excludesString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (String pattern : excludes()) { - buffer.append(pattern); - buffer.append(","); + sb.append(pattern); + sb.append(","); } - return buffer.toString(); + return sb.toString(); } static void addExcludes(StepRequest request) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java --- a/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/debug/tty/TTY.java Wed Jul 05 19:46:40 2017 +0200 @@ -827,17 +827,17 @@ private static String addArgument(String string, String argument) { if (hasWhitespace(argument) || argument.indexOf(',') != -1) { // Quotes were stripped out for this argument, add 'em back. - StringBuffer buffer = new StringBuffer(string); - buffer.append('"'); + StringBuilder sb = new StringBuilder(string); + sb.append('"'); for (int i = 0; i < argument.length(); i++) { char c = argument.charAt(i); if (c == '"') { - buffer.append('\\'); + sb.append('\\'); } - buffer.append(c); + sb.append(c); } - buffer.append("\" "); - return buffer.toString(); + sb.append("\" "); + return sb.toString(); } else { return string + argument + ' '; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/example/trace/Trace.java --- a/jdk/src/share/classes/com/sun/tools/example/trace/Trace.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/example/trace/Trace.java Wed Jul 05 19:46:40 2017 +0200 @@ -121,7 +121,7 @@ usage(); System.exit(1); } - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(args[inx]); for (++inx; inx < args.length; ++inx) { sb.append(' '); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/hat/internal/util/Misc.java --- a/jdk/src/share/classes/com/sun/tools/hat/internal/util/Misc.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/hat/internal/util/Misc.java Wed Jul 05 19:46:40 2017 +0200 @@ -83,30 +83,30 @@ public static String encodeHtml(String str) { final int len = str.length(); - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { char ch = str.charAt(i); if (ch == '<') { - buf.append("<"); + sb.append("<"); } else if (ch == '>') { - buf.append(">"); + sb.append(">"); } else if (ch == '"') { - buf.append("""); + sb.append("""); } else if (ch == '\'') { - buf.append("'"); + sb.append("'"); } else if (ch == '&') { - buf.append("&"); + sb.append("&"); } else if (ch < ' ') { - buf.append("&#" + Integer.toString(ch) + ";"); + sb.append("&#" + Integer.toString(ch) + ";"); } else { int c = (ch & 0xFFFF); if (c > 127) { - buf.append("&#" + Integer.toString(c) + ";"); + sb.append("&#" + Integer.toString(c) + ";"); } else { - buf.append(ch); + sb.append(ch); } } } - return buf.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/jdi/FieldImpl.java --- a/jdk/src/share/classes/com/sun/tools/jdi/FieldImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/jdi/FieldImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -95,12 +95,12 @@ } public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buf.append(declaringType().name()); - buf.append('.'); - buf.append(name()); + sb.append(declaringType().name()); + sb.append('.'); + sb.append(name()); - return buf.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/jdi/JNITypeParser.java --- a/jdk/src/share/classes/com/sun/tools/jdi/JNITypeParser.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/jdi/JNITypeParser.java Wed Jul 05 19:46:40 2017 +0200 @@ -44,11 +44,11 @@ } static String typeNameToSignature(String signature) { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); int firstIndex = signature.indexOf('['); int index = firstIndex; while (index != -1) { - buffer.append('['); + sb.append('['); index = signature.indexOf('[', index + 1); } @@ -57,28 +57,28 @@ } if (signature.equals("boolean")) { - buffer.append('Z'); + sb.append('Z'); } else if (signature.equals("byte")) { - buffer.append('B'); + sb.append('B'); } else if (signature.equals("char")) { - buffer.append('C'); + sb.append('C'); } else if (signature.equals("short")) { - buffer.append('S'); + sb.append('S'); } else if (signature.equals("int")) { - buffer.append('I'); + sb.append('I'); } else if (signature.equals("long")) { - buffer.append('J'); + sb.append('J'); } else if (signature.equals("float")) { - buffer.append('F'); + sb.append('F'); } else if (signature.equals("double")) { - buffer.append('D'); + sb.append('D'); } else { - buffer.append('L'); - buffer.append(signature.replace('.', '/')); - buffer.append(';'); + sb.append('L'); + sb.append(signature.replace('.', '/')); + sb.append(';'); } - return buffer.toString(); + return sb.toString(); } String typeName() { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/jdi/MethodImpl.java --- a/jdk/src/share/classes/com/sun/tools/jdi/MethodImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/jdi/MethodImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -387,7 +387,7 @@ } public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(declaringType().name()); sb.append("."); sb.append(name()); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java --- a/jdk/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -751,7 +751,7 @@ String baseSourceDir() { if (baseSourceDir == null) { String typeName = name(); - StringBuffer sb = new StringBuffer(typeName.length() + 10); + StringBuilder sb = new StringBuilder(typeName.length() + 10); int index = 0; int nextIndex; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/jdi/SDE.java --- a/jdk/src/share/classes/com/sun/tools/jdi/SDE.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/jdi/SDE.java Wed Jul 05 19:46:40 2017 +0200 @@ -56,16 +56,16 @@ if (sourcePath == null) { sourcePath = refType.baseSourceDir() + sourceName; } else { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < sourcePath.length(); ++i) { char ch = sourcePath.charAt(i); if (ch == '/') { - buf.append(File.separatorChar); + sb.append(File.separatorChar); } else { - buf.append(ch); + sb.append(ch); } } - sourcePath = buf.toString(); + sourcePath = sb.toString(); } isConverted = true; } @@ -327,7 +327,7 @@ } String readLine() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); char ch; ignoreWhite(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/jdi/TargetVM.java --- a/jdk/src/share/classes/com/sun/tools/jdi/TargetVM.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/jdi/TargetVM.java Wed Jul 05 19:46:40 2017 +0200 @@ -78,7 +78,7 @@ ", errorCode=" + packet.errorCode + ", flags=" + packet.flags); } - StringBuffer line = new StringBuffer(80); + StringBuilder line = new StringBuilder(80); line.append("0000: "); for (int i = 0; i < packet.data.length; i++) { if ((i > 0) && (i % 16 == 0)) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java --- a/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -742,7 +742,7 @@ } void printReceiveTrace(int depth, String string) { - StringBuffer sb = new StringBuffer("Receiving:"); + StringBuilder sb = new StringBuilder("Receiving:"); for (int i = depth; i > 0; --i) { sb.append(" "); } @@ -872,7 +872,7 @@ ReferenceTypeImpl referenceType(long id, int tag, String signature) { if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("Looking up "); if (tag == JDWP.TypeTag.CLASS) { sb.append("Class"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/beans/Introspector.java --- a/jdk/src/share/classes/java/beans/Introspector.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/beans/Introspector.java Wed Jul 05 19:46:40 2017 +0200 @@ -1282,7 +1282,7 @@ * Creates a key for a method in a method cache. */ private static String makeQualifiedMethodName(String name, String[] params) { - StringBuffer sb = new StringBuffer(name); + StringBuilder sb = new StringBuilder(name); sb.append('='); for (int i = 0; i < params.length; i++) { sb.append(':'); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/beans/Statement.java --- a/jdk/src/share/classes/java/beans/Statement.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/beans/Statement.java Wed Jul 05 19:46:40 2017 +0200 @@ -340,7 +340,7 @@ if (arguments == null) { arguments = emptyArray; } - StringBuffer result = new StringBuffer(instanceName(target) + "." + methodName + "("); + StringBuilder result = new StringBuilder(instanceName(target) + "." + methodName + "("); int n = arguments.length; for(int i = 0; i < n; i++) { result.append(instanceName(arguments[i])); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/io/RandomAccessFile.java --- a/jdk/src/share/classes/java/io/RandomAccessFile.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/io/RandomAccessFile.java Wed Jul 05 19:46:40 2017 +0200 @@ -890,7 +890,7 @@ */ public final String readLine() throws IOException { - StringBuffer input = new StringBuffer(); + StringBuilder input = new StringBuilder(); int c = -1; boolean eol = false; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java --- a/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed Jul 05 19:46:40 2017 +0200 @@ -40,6 +40,7 @@ import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.LambdaForm.BasicType.*; import sun.invoke.util.VerifyType; +import sun.reflect.misc.ReflectUtil; /** * Code generation backend for LambdaForm. @@ -594,6 +595,8 @@ return false; // inner class of some sort if (cls.getClassLoader() != MethodHandle.class.getClassLoader()) return false; // not on BCP + if (ReflectUtil.isVMAnonymousClass(cls)) // FIXME: switch to supported API once it is added + return false; MethodType mtype = member.getMethodOrFieldType(); if (!isStaticallyNameable(mtype.returnType())) return false; @@ -612,6 +615,8 @@ cls = cls.getComponentType(); if (cls.isPrimitive()) return true; // int[].class, for example + if (ReflectUtil.isVMAnonymousClass(cls)) // FIXME: switch to supported API once it is added + return false; // could use VerifyAccess.isClassAccessible but the following is a safe approximation if (cls.getClassLoader() != Object.class.getClassLoader()) return false; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/net/IDN.java --- a/jdk/src/share/classes/java/net/IDN.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/net/IDN.java Wed Jul 05 19:46:40 2017 +0200 @@ -111,7 +111,7 @@ public static String toASCII(String input, int flag) { int p = 0, q = 0; - StringBuffer out = new StringBuffer(); + StringBuilder out = new StringBuilder(); if (isRootLabel(input)) { return "."; @@ -172,7 +172,7 @@ */ public static String toUnicode(String input, int flag) { int p = 0, q = 0; - StringBuffer out = new StringBuffer(); + StringBuilder out = new StringBuilder(); if (isRootLabel(input)) { return "."; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/net/SocketPermission.java --- a/jdk/src/share/classes/java/net/SocketPermission.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/net/SocketPermission.java Wed Jul 05 19:46:40 2017 +0200 @@ -733,7 +733,7 @@ InetAddress auth; try { - StringBuffer sb = new StringBuffer(39); + StringBuilder sb = new StringBuilder(39); for (int i = 15; i >= 0; i--) { sb.append(Integer.toHexString(((addr[i]) & 0x0f))); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/net/URI.java --- a/jdk/src/share/classes/java/net/URI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/net/URI.java Wed Jul 05 19:46:40 2017 +0200 @@ -1957,7 +1957,7 @@ private void defineString() { if (string != null) return; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (scheme != null) { sb.append(scheme); sb.append(':'); @@ -2015,7 +2015,7 @@ if (i >= 0) path = base.substring(0, i + 1); } else { - StringBuffer sb = new StringBuffer(base.length() + cn); + StringBuilder sb = new StringBuilder(base.length() + cn); // 5.2 (6a) if (i >= 0) sb.append(base.substring(0, i + 1)); @@ -2778,7 +2778,7 @@ if (s.indexOf('%') < 0) return s; - StringBuffer sb = new StringBuffer(n); + StringBuilder sb = new StringBuilder(n); ByteBuffer bb = ByteBuffer.allocate(n); CharBuffer cb = CharBuffer.allocate(n); CharsetDecoder dec = ThreadLocalCoders.decoderFor("UTF-8") diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/net/URISyntaxException.java --- a/jdk/src/share/classes/java/net/URISyntaxException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/net/URISyntaxException.java Wed Jul 05 19:46:40 2017 +0200 @@ -121,7 +121,7 @@ * @return A string describing the parse error */ public String getMessage() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(getReason()); if (index > -1) { sb.append(" at index "); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/net/URLDecoder.java --- a/jdk/src/share/classes/java/net/URLDecoder.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/net/URLDecoder.java Wed Jul 05 19:46:40 2017 +0200 @@ -134,7 +134,7 @@ boolean needToChange = false; int numChars = s.length(); - StringBuffer sb = new StringBuffer(numChars > 500 ? numChars / 2 : numChars); + StringBuilder sb = new StringBuilder(numChars > 500 ? numChars / 2 : numChars); int i = 0; if (enc.length() == 0) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/net/URLEncoder.java --- a/jdk/src/share/classes/java/net/URLEncoder.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/net/URLEncoder.java Wed Jul 05 19:46:40 2017 +0200 @@ -201,7 +201,7 @@ throws UnsupportedEncodingException { boolean needToChange = false; - StringBuffer out = new StringBuffer(s.length()); + StringBuilder out = new StringBuilder(s.length()); Charset charset; CharArrayWriter charArrayWriter = new CharArrayWriter(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/net/URLStreamHandler.java --- a/jdk/src/share/classes/java/net/URLStreamHandler.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/net/URLStreamHandler.java Wed Jul 05 19:46:40 2017 +0200 @@ -486,7 +486,7 @@ if (u.getRef() != null) len += 1 + u.getRef().length(); - StringBuffer result = new StringBuffer(len); + StringBuilder result = new StringBuilder(len); result.append(u.getProtocol()); result.append(":"); if (u.getAuthority() != null && u.getAuthority().length() > 0) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/nio/file/InvalidPathException.java --- a/jdk/src/share/classes/java/nio/file/InvalidPathException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/nio/file/InvalidPathException.java Wed Jul 05 19:46:40 2017 +0200 @@ -117,7 +117,7 @@ * @return a string describing the error */ public String getMessage() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(getReason()); if (index > -1) { sb.append(" at index "); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/rmi/dgc/VMID.java --- a/jdk/src/share/classes/java/rmi/dgc/VMID.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/rmi/dgc/VMID.java Wed Jul 05 19:46:40 2017 +0200 @@ -120,15 +120,15 @@ * Return string representation of this VMID. */ public String toString() { - StringBuffer result = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (addr != null) for (int i = 0; i < addr.length; ++ i) { int x = addr[i] & 0xFF; - result.append((x < 0x10 ? "0" : "") + - Integer.toString(x, 16)); + sb.append((x < 0x10 ? "0" : "") + + Integer.toString(x, 16)); } - result.append(':'); - result.append(uid.toString()); - return result.toString(); + sb.append(':'); + sb.append(uid.toString()); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/CodeSigner.java --- a/jdk/src/share/classes/java/security/CodeSigner.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/CodeSigner.java Wed Jul 05 19:46:40 2017 +0200 @@ -154,7 +154,7 @@ * if present. */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("("); sb.append("Signer: " + signerCertPath.getCertificates().get(0)); if (timestamp != null) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/Timestamp.java --- a/jdk/src/share/classes/java/security/Timestamp.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/Timestamp.java Wed Jul 05 19:46:40 2017 +0200 @@ -141,7 +141,7 @@ * its signer's certificate. */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("("); sb.append("timestamp: " + timestamp); List certs = signerCertPath.getCertificates(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/CertPath.java --- a/jdk/src/share/classes/java/security/cert/CertPath.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/CertPath.java Wed Jul 05 19:46:40 2017 +0200 @@ -220,7 +220,7 @@ * @return a string representation of this certification path */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); Iterator stringIterator = getCertificates().iterator(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/CollectionCertStoreParameters.java --- a/jdk/src/share/classes/java/security/cert/CollectionCertStoreParameters.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/CollectionCertStoreParameters.java Wed Jul 05 19:46:40 2017 +0200 @@ -132,7 +132,7 @@ * @return a formatted string describing the parameters */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("CollectionCertStoreParameters: [\n"); sb.append(" collection: " + coll + "\n"); sb.append("]"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/LDAPCertStoreParameters.java --- a/jdk/src/share/classes/java/security/cert/LDAPCertStoreParameters.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/LDAPCertStoreParameters.java Wed Jul 05 19:46:40 2017 +0200 @@ -138,7 +138,7 @@ * @return a formatted string describing the parameters */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("LDAPCertStoreParameters: [\n"); sb.append(" serverName: " + serverName + "\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/PKIXBuilderParameters.java --- a/jdk/src/share/classes/java/security/cert/PKIXBuilderParameters.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/PKIXBuilderParameters.java Wed Jul 05 19:46:40 2017 +0200 @@ -189,7 +189,7 @@ * @return a formatted string describing the parameters */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("[\n"); sb.append(super.toString()); sb.append(" Maximum Path Length: " + maxPathLength + "\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/PKIXCertPathBuilderResult.java --- a/jdk/src/share/classes/java/security/cert/PKIXCertPathBuilderResult.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/PKIXCertPathBuilderResult.java Wed Jul 05 19:46:40 2017 +0200 @@ -107,7 +107,7 @@ * {@code PKIXCertPathBuilderResult} */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("PKIXCertPathBuilderResult: [\n"); sb.append(" Certification Path: " + certPath + "\n"); sb.append(" Trust Anchor: " + getTrustAnchor().toString() + "\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/PKIXCertPathValidatorResult.java --- a/jdk/src/share/classes/java/security/cert/PKIXCertPathValidatorResult.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/PKIXCertPathValidatorResult.java Wed Jul 05 19:46:40 2017 +0200 @@ -148,7 +148,7 @@ * {@code PKIXCertPathValidatorResult} */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("PKIXCertPathValidatorResult: [\n"); sb.append(" Trust Anchor: " + trustAnchor.toString() + "\n"); sb.append(" Policy Tree: " + String.valueOf(policyTree) + "\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/PKIXParameters.java --- a/jdk/src/share/classes/java/security/cert/PKIXParameters.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/PKIXParameters.java Wed Jul 05 19:46:40 2017 +0200 @@ -693,7 +693,7 @@ * @return a formatted string describing the parameters. */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("[\n"); /* start with trusted anchor info */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/PolicyQualifierInfo.java --- a/jdk/src/share/classes/java/security/cert/PolicyQualifierInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/PolicyQualifierInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -161,7 +161,7 @@ if (pqiString != null) return pqiString; HexDumpEncoder enc = new HexDumpEncoder(); - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("PolicyQualifierInfo: [\n"); sb.append(" qualifierID: " + mId + "\n"); sb.append(" qualifier: " + diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/TrustAnchor.java --- a/jdk/src/share/classes/java/security/cert/TrustAnchor.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/TrustAnchor.java Wed Jul 05 19:46:40 2017 +0200 @@ -317,7 +317,7 @@ * @return a formatted string describing the {@code TrustAnchor} */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("[\n"); if (pubKey != null) { sb.append(" Trusted CA Public Key: " + pubKey.toString() + "\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/X509CRLSelector.java --- a/jdk/src/share/classes/java/security/cert/X509CRLSelector.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/X509CRLSelector.java Wed Jul 05 19:46:40 2017 +0200 @@ -566,7 +566,7 @@ * {@code X509CRLSelector}. */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("X509CRLSelector: [\n"); if (issuerNames != null) { sb.append(" IssuerNames:\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/security/cert/X509CertSelector.java --- a/jdk/src/share/classes/java/security/cert/X509CertSelector.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/security/cert/X509CertSelector.java Wed Jul 05 19:46:40 2017 +0200 @@ -1811,7 +1811,7 @@ * {@code CertSelector} */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("X509CertSelector: [\n"); if (x509Cert != null) { sb.append(" Certificate: " + x509Cert.toString() + "\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/text/AttributedString.java --- a/jdk/src/share/classes/java/text/AttributedString.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/text/AttributedString.java Wed Jul 05 19:46:40 2017 +0200 @@ -243,11 +243,11 @@ throw new IllegalArgumentException("Invalid substring range"); // Copy the given string - StringBuffer textBuffer = new StringBuffer(); + StringBuilder textBuilder = new StringBuilder(); text.setIndex(beginIndex); for (char c = text.current(); text.getIndex() < endIndex; c = text.next()) - textBuffer.append(c); - this.text = textBuffer.toString(); + textBuilder.append(c); + this.text = textBuilder.toString(); if (beginIndex == endIndex) return; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/text/ChoiceFormat.java --- a/jdk/src/share/classes/java/text/ChoiceFormat.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/text/ChoiceFormat.java Wed Jul 05 19:46:40 2017 +0200 @@ -259,7 +259,7 @@ * @return the pattern string */ public String toPattern() { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); for (int i = 0; i < choiceLimits.length; ++i) { if (i != 0) { result.append('|'); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/time/Instant.java --- a/jdk/src/share/classes/java/time/Instant.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/time/Instant.java Wed Jul 05 19:46:40 2017 +0200 @@ -375,7 +375,7 @@ return Instant.ofEpochSecond(instantSecs, nanoOfSecond); } catch (DateTimeException ex) { throw new DateTimeException("Unable to obtain Instant from TemporalAccessor: " + - temporal + " of type " + temporal.getClass().getName()); + temporal + " of type " + temporal.getClass().getName(), ex); } } @@ -1058,7 +1058,8 @@ } // inline TemporalAccessor.super.query(query) as an optimization if (query == TemporalQueries.chronology() || query == TemporalQueries.zoneId() || - query == TemporalQueries.zone() || query == TemporalQueries.offset()) { + query == TemporalQueries.zone() || query == TemporalQueries.offset() || + query == TemporalQueries.localDate() || query == TemporalQueries.localTime()) { return null; } return query.queryFrom(this); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/time/OffsetDateTime.java --- a/jdk/src/share/classes/java/time/OffsetDateTime.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/time/OffsetDateTime.java Wed Jul 05 19:46:40 2017 +0200 @@ -357,10 +357,11 @@ } try { ZoneOffset offset = ZoneOffset.from(temporal); - try { - LocalDateTime ldt = LocalDateTime.from(temporal); - return OffsetDateTime.of(ldt, offset); - } catch (DateTimeException ignore) { + LocalDate date = temporal.query(TemporalQueries.localDate()); + LocalTime time = temporal.query(TemporalQueries.localTime()); + if (date != null && time != null) { + return OffsetDateTime.of(date, time, offset); + } else { Instant instant = Instant.from(temporal); return OffsetDateTime.ofInstant(instant, offset); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/time/ZonedDateTime.java --- a/jdk/src/share/classes/java/time/ZonedDateTime.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/time/ZonedDateTime.java Wed Jul 05 19:46:40 2017 +0200 @@ -81,6 +81,7 @@ import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAmount; import java.time.temporal.TemporalField; +import java.time.temporal.TemporalQueries; import java.time.temporal.TemporalQuery; import java.time.temporal.TemporalUnit; import java.time.temporal.UnsupportedTemporalTypeException; @@ -551,14 +552,14 @@ } try { ZoneId zone = ZoneId.from(temporal); - try { + if (temporal.isSupported(INSTANT_SECONDS)) { long epochSecond = temporal.getLong(INSTANT_SECONDS); int nanoOfSecond = temporal.get(NANO_OF_SECOND); return create(epochSecond, nanoOfSecond, zone); - - } catch (DateTimeException ex1) { - LocalDateTime ldt = LocalDateTime.from(temporal); - return of(ldt, zone); + } else { + LocalDate date = LocalDate.from(temporal); + LocalTime time = LocalTime.from(temporal); + return of(date, time, zone); } } catch (DateTimeException ex) { throw new DateTimeException("Unable to obtain ZonedDateTime from TemporalAccessor: " + @@ -2039,8 +2040,12 @@ * @throws DateTimeException if unable to query (defined by the query) * @throws ArithmeticException if numeric overflow occurs (defined by the query) */ + @SuppressWarnings("unchecked") @Override // override for Javadoc public R query(TemporalQuery query) { + if (query == TemporalQueries.localDate()) { + return (R) toLocalDate(); + } return ChronoZonedDateTime.super.query(query); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java --- a/jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Jul 05 19:46:40 2017 +0200 @@ -3283,7 +3283,7 @@ } catch (RuntimeException ex) { return ~position; } - int successPos = text.length(); + int successPos = pos; successPos = context.setParsedField(INSTANT_SECONDS, instantSecs, position, successPos); return context.setParsedField(NANO_OF_SECOND, nano, position, successPos); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/time/format/Parsed.java --- a/jdk/src/share/classes/java/time/format/Parsed.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/time/format/Parsed.java Wed Jul 05 19:46:40 2017 +0200 @@ -66,6 +66,7 @@ import static java.time.temporal.ChronoField.CLOCK_HOUR_OF_DAY; import static java.time.temporal.ChronoField.HOUR_OF_AMPM; import static java.time.temporal.ChronoField.HOUR_OF_DAY; +import static java.time.temporal.ChronoField.INSTANT_SECONDS; import static java.time.temporal.ChronoField.MICRO_OF_DAY; import static java.time.temporal.ChronoField.MICRO_OF_SECOND; import static java.time.temporal.ChronoField.MILLI_OF_DAY; @@ -74,14 +75,17 @@ import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; import static java.time.temporal.ChronoField.NANO_OF_DAY; import static java.time.temporal.ChronoField.NANO_OF_SECOND; +import static java.time.temporal.ChronoField.OFFSET_SECONDS; import static java.time.temporal.ChronoField.SECOND_OF_DAY; import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; import java.time.DateTimeException; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalTime; import java.time.Period; import java.time.ZoneId; +import java.time.ZoneOffset; import java.time.chrono.ChronoLocalDate; import java.time.chrono.ChronoLocalDateTime; import java.time.chrono.ChronoZonedDateTime; @@ -241,12 +245,15 @@ resolveTimeLenient(); crossCheck(); resolvePeriod(); + resolveFractional(); + resolveInstant(); return this; } //----------------------------------------------------------------------- private void resolveFields() { // resolve ChronoField + resolveInstantFields(); resolveDateFields(); resolveTimeFields(); @@ -300,6 +307,7 @@ } // if something changed then have to redo ChronoField resolve if (changedCount > 0) { + resolveInstantFields(); resolveDateFields(); resolveTimeFields(); } @@ -316,6 +324,29 @@ } //----------------------------------------------------------------------- + private void resolveInstantFields() { + // resolve parsed instant seconds to date and time if zone available + if (fieldValues.containsKey(INSTANT_SECONDS)) { + if (zone != null) { + resolveInstantFields0(zone); + } else { + Long offsetSecs = fieldValues.get(OFFSET_SECONDS); + if (offsetSecs != null) { + ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSecs.intValue()); + resolveInstantFields0(offset); + } + } + } + } + + private void resolveInstantFields0(ZoneId selectedZone) { + Instant instant = Instant.ofEpochSecond(fieldValues.remove(INSTANT_SECONDS)); + ChronoZonedDateTime zdt = chrono.zonedDateTime(instant, selectedZone); + updateCheckConflict(zdt.toLocalDate()); + updateCheckConflict(INSTANT_SECONDS, SECOND_OF_DAY, (long) zdt.toLocalTime().toSecondOfDay()); + } + + //----------------------------------------------------------------------- private void resolveDateFields() { updateCheckConflict(chrono.resolveDate(fieldValues, resolverStyle)); } @@ -533,6 +564,42 @@ } } + private void resolveFractional() { + // ensure fractional seconds available as ChronoField requires + // resolveTimeLenient() will have merged MICRO_OF_SECOND/MILLI_OF_SECOND to NANO_OF_SECOND + if (time == null && + (fieldValues.containsKey(INSTANT_SECONDS) || + fieldValues.containsKey(SECOND_OF_DAY) || + fieldValues.containsKey(SECOND_OF_MINUTE))) { + if (fieldValues.containsKey(NANO_OF_SECOND)) { + long nos = fieldValues.get(NANO_OF_SECOND); + fieldValues.put(MICRO_OF_SECOND, nos / 1000); + fieldValues.put(MILLI_OF_SECOND, nos / 1000000); + } else { + fieldValues.put(NANO_OF_SECOND, 0L); + fieldValues.put(MICRO_OF_SECOND, 0L); + fieldValues.put(MILLI_OF_SECOND, 0L); + } + } + } + + private void resolveInstant() { + // add instant seconds if we have date, time and zone + if (date != null && time != null) { + if (zone != null) { + long instant = date.atTime(time).atZone(zone).getLong(ChronoField.INSTANT_SECONDS); + fieldValues.put(INSTANT_SECONDS, instant); + } else { + Long offsetSecs = fieldValues.get(OFFSET_SECONDS); + if (offsetSecs != null) { + ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSecs.intValue()); + long instant = date.atTime(time).atZone(offset).getLong(ChronoField.INSTANT_SECONDS); + fieldValues.put(INSTANT_SECONDS, instant); + } + } + } + } + private void updateCheckConflict(LocalTime timeToSet, Period periodToSet) { if (time != null) { if (time.equals(timeToSet) == false) { @@ -568,18 +635,20 @@ for (Iterator> it = fieldValues.entrySet().iterator(); it.hasNext(); ) { Entry entry = it.next(); TemporalField field = entry.getKey(); - long val1; - try { - val1 = target.getLong(field); - } catch (RuntimeException ex) { - continue; + if (target.isSupported(field)) { + long val1; + try { + val1 = target.getLong(field); + } catch (RuntimeException ex) { + continue; + } + long val2 = entry.getValue(); + if (val1 != val2) { + throw new DateTimeException("Conflict found: Field " + field + " " + val1 + + " differs from " + field + " " + val2 + " derived from " + target); + } + it.remove(); } - long val2 = entry.getValue(); - if (val1 != val2) { - throw new DateTimeException("Conflict found: Field " + field + " " + val1 + - " differs from " + field + " " + val2 + " derived from " + target); - } - it.remove(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/util/Properties.java --- a/jdk/src/share/classes/java/util/Properties.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/util/Properties.java Wed Jul 05 19:46:40 2017 +0200 @@ -602,7 +602,7 @@ if (bufLen < 0) { bufLen = Integer.MAX_VALUE; } - StringBuffer outBuffer = new StringBuffer(bufLen); + StringBuilder outBuffer = new StringBuilder(bufLen); for(int x=0; xA ConcurrentHashMap can be used as scalable frequency map (a + *

A ConcurrentHashMap can be used as a scalable frequency map (a * form of histogram or multiset) by using {@link * java.util.concurrent.atomic.LongAdder} values and initializing via * {@link #computeIfAbsent computeIfAbsent}. For example, to add a count * to a {@code ConcurrentHashMap freqs}, you can use - * {@code freqs.computeIfAbsent(k -> new LongAdder()).increment();} + * {@code freqs.computeIfAbsent(key, k -> new LongAdder()).increment();} * *

This class and its views and iterators implement all of the * optional methods of the {@link Map} and {@link Iterator} diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/util/concurrent/atomic/LongAdder.java --- a/jdk/src/share/classes/java/util/concurrent/atomic/LongAdder.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/util/concurrent/atomic/LongAdder.java Wed Jul 05 19:46:40 2017 +0200 @@ -57,7 +57,7 @@ * frequency map (a form of histogram or multiset). For example, to * add a count to a {@code ConcurrentHashMap freqs}, * initializing if not already present, you can use {@code - * freqs.computeIfAbsent(k -> new LongAdder()).increment();} + * freqs.computeIfAbsent(key, k -> new LongAdder()).increment();} * *

This class extends {@link Number}, but does not define * methods such as {@code equals}, {@code hashCode} and {@code diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/util/prefs/Base64.java --- a/jdk/src/share/classes/java/util/prefs/Base64.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/util/prefs/Base64.java Wed Jul 05 19:46:40 2017 +0200 @@ -57,7 +57,7 @@ int numFullGroups = aLen/3; int numBytesInPartialGroup = aLen - 3*numFullGroups; int resultLen = 4*((aLen + 2)/3); - StringBuffer result = new StringBuffer(resultLen); + StringBuilder result = new StringBuilder(resultLen); char[] intToAlpha = (alternate ? intToAltBase64 : intToBase64); // Translate all full groups from byte array elements to Base64 diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/java/util/regex/PatternSyntaxException.java --- a/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java Wed Jul 05 19:46:40 2017 +0200 @@ -105,7 +105,7 @@ * @return The full detail message */ public String getMessage() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(desc); if (index >= 0) { sb.append(" near index "); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java --- a/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/imageio/stream/ImageInputStreamImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -289,7 +289,7 @@ } public String readLine() throws IOException { - StringBuffer input = new StringBuffer(); + StringBuilder input = new StringBuilder(); int c = -1; boolean eol = false; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/naming/BinaryRefAddr.java --- a/jdk/src/share/classes/javax/naming/BinaryRefAddr.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/naming/BinaryRefAddr.java Wed Jul 05 19:46:40 2017 +0200 @@ -165,7 +165,7 @@ * @return The non-null string representation of this address. */ public String toString(){ - StringBuffer str = new StringBuffer("Address Type: " + addrType + "\n"); + StringBuilder str = new StringBuilder("Address Type: " + addrType + "\n"); str.append("AddressContents: "); for (int i = 0; i"i-j" otherwise. */ public String toString() { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); int n = members.length; for (int i = 0; i < n; i++) { if (i > 0) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java --- a/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/print/attribute/Size2DSyntax.java Wed Jul 05 19:46:40 2017 +0200 @@ -257,7 +257,7 @@ * (unchecked exception) Thrown if {@code units < 1}. */ public String toString(int units, String unitsName) { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append(getX (units)); result.append('x'); result.append(getY (units)); @@ -312,7 +312,7 @@ * The values are reported in the internal units of micrometers. */ public String toString() { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append(x); result.append('x'); result.append(y); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java --- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Wed Jul 05 19:46:40 2017 +0200 @@ -636,11 +636,11 @@ public String toString() { if (destroyed) throw new IllegalStateException("This ticket is no longer valid"); - StringBuffer caddrBuf = new StringBuffer(); + StringBuilder caddrString = new StringBuilder(); if (clientAddresses != null) { for (int i = 0; i < clientAddresses.length; i++) { - caddrBuf.append("clientAddresses[" + i + "] = " + - clientAddresses[i].toString()); + caddrString.append("clientAddresses[" + i + "] = " + + clientAddresses[i].toString()); } } return ("Ticket (hex) = " + "\n" + @@ -660,7 +660,7 @@ "End Time = " + endTime.toString() + "\n" + "Renew Till = " + String.valueOf(renewTill) + "\n" + "Client Addresses " + - (clientAddresses == null ? " Null " : caddrBuf.toString() + + (clientAddresses == null ? " Null " : caddrString.toString() + "\n")); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sound/sampled/CompoundControl.java --- a/jdk/src/share/classes/javax/sound/sampled/CompoundControl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sound/sampled/CompoundControl.java Wed Jul 05 19:46:40 2017 +0200 @@ -94,18 +94,18 @@ */ public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < controls.length; i++) { if (i != 0) { - buf.append(", "); + sb.append(", "); if ((i + 1) == controls.length) { - buf.append("and "); + sb.append("and "); } } - buf.append(controls[i].getType()); + sb.append(controls[i].getType()); } - return new String(getType() + " Control containing " + buf + " Controls."); + return new String(getType() + " Control containing " + sb + " Controls."); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sound/sampled/DataLine.java --- a/jdk/src/share/classes/javax/sound/sampled/DataLine.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sound/sampled/DataLine.java Wed Jul 05 19:46:40 2017 +0200 @@ -471,23 +471,23 @@ */ public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if ( (formats.length == 1) && (formats[0] != null) ) { - buf.append(" supporting format " + formats[0]); + sb.append(" supporting format " + formats[0]); } else if (getFormats().length > 1) { - buf.append(" supporting " + getFormats().length + " audio formats"); + sb.append(" supporting " + getFormats().length + " audio formats"); } if ( (minBufferSize != AudioSystem.NOT_SPECIFIED) && (maxBufferSize != AudioSystem.NOT_SPECIFIED) ) { - buf.append(", and buffers of " + minBufferSize + " to " + maxBufferSize + " bytes"); + sb.append(", and buffers of " + minBufferSize + " to " + maxBufferSize + " bytes"); } else if ( (minBufferSize != AudioSystem.NOT_SPECIFIED) && (minBufferSize > 0) ) { - buf.append(", and buffers of at least " + minBufferSize + " bytes"); + sb.append(", and buffers of at least " + minBufferSize + " bytes"); } else if (maxBufferSize != AudioSystem.NOT_SPECIFIED) { - buf.append(", and buffers of up to " + minBufferSize + " bytes"); + sb.append(", and buffers of up to " + minBufferSize + " bytes"); } - return new String(super.toString() + buf); + return new String(super.toString() + sb); } } // class Info diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/CommonDataSource.java --- a/jdk/src/share/classes/javax/sql/CommonDataSource.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/CommonDataSource.java Wed Jul 05 19:46:40 2017 +0200 @@ -34,6 +34,7 @@ * Interface that defines the methods which are common between DataSource, * XADataSource and ConnectionPoolDataSource. * + * @since 1.6 */ public interface CommonDataSource { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/BaseRowSet.java --- a/jdk/src/share/classes/javax/sql/rowset/BaseRowSet.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/BaseRowSet.java Wed Jul 05 19:46:40 2017 +0200 @@ -291,6 +291,8 @@ * extending class overrides and reimplements any BaseRowSet method and encounters * connectivity or underlying data source issues, that method may in addition throw an * SQLException object for that reason. +* +* @since 1.5 */ public abstract class BaseRowSet implements Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java --- a/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/CachedRowSet.java Wed Jul 05 19:46:40 2017 +0200 @@ -626,6 +626,7 @@ * * * @author Jonathan Bruce + * @since 1.5 */ public interface CachedRowSet extends RowSet, Joinable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/FilteredRowSet.java --- a/jdk/src/share/classes/javax/sql/rowset/FilteredRowSet.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/FilteredRowSet.java Wed Jul 05 19:46:40 2017 +0200 @@ -122,6 +122,7 @@ * synchronized with the data source. * * @author Jonathan Bruce + * @since 1.5 */ public interface FilteredRowSet extends WebRowSet { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/JdbcRowSet.java --- a/jdk/src/share/classes/javax/sql/rowset/JdbcRowSet.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/JdbcRowSet.java Wed Jul 05 19:46:40 2017 +0200 @@ -118,6 +118,7 @@ * requirements of connected and disconnected RowSet objects. * * @author Jonathan Bruce + * @since 1.5 */ public interface JdbcRowSet extends RowSet, Joinable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/JoinRowSet.java --- a/jdk/src/share/classes/javax/sql/rowset/JoinRowSet.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/JoinRowSet.java Wed Jul 05 19:46:40 2017 +0200 @@ -217,6 +217,7 @@ * This method creates a copy that can be persisted to the data source. * * + * @since 1.5 */ public interface JoinRowSet extends WebRowSet { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/Joinable.java --- a/jdk/src/share/classes/javax/sql/rowset/Joinable.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/Joinable.java Wed Jul 05 19:46:40 2017 +0200 @@ -129,6 +129,7 @@ * * @see JoinRowSet * @author Jonathan Bruce + * @since 1.5 */ public interface Joinable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/Predicate.java --- a/jdk/src/share/classes/javax/sql/rowset/Predicate.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/Predicate.java Wed Jul 05 19:46:40 2017 +0200 @@ -97,6 +97,7 @@ * applications that use both column identification conventions. * * @author Jonathan Bruce, Amit Handa + * @since 1.5 * */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java --- a/jdk/src/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -48,6 +48,8 @@ * Therefore, any RowSetMetaDataImpl method that retrieves information * is defined as having unspecified behavior when it is called * before the RowSet object contains data. + * + * @since 1.5 */ public class RowSetMetaDataImpl implements RowSetMetaData, Serializable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/RowSetWarning.java --- a/jdk/src/share/classes/javax/sql/rowset/RowSetWarning.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/RowSetWarning.java Wed Jul 05 19:46:40 2017 +0200 @@ -50,6 +50,8 @@ * The inherited methods getMessage, getSQLState, * and getErrorCode retrieve information contained in a * RowSetWarning object. + * + * @since 1.5 */ public class RowSetWarning extends SQLException { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/WebRowSet.java --- a/jdk/src/share/classes/javax/sql/rowset/WebRowSet.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/WebRowSet.java Wed Jul 05 19:46:40 2017 +0200 @@ -408,6 +408,7 @@ * @see javax.sql.rowset.CachedRowSet * @see javax.sql.rowset.FilteredRowSet * @see javax.sql.rowset.JoinRowSet + * @since 1.5 */ public interface WebRowSet extends CachedRowSet { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SQLOutputImpl.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SQLOutputImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SQLOutputImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -52,6 +52,8 @@ * to write data from the SQLData object to * the SQLOutputImpl output stream as the * representation of an SQL user-defined type. + * + * @since 1.5 */ public class SQLOutputImpl implements SQLOutput { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialArray.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialArray.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialArray.java Wed Jul 05 19:46:40 2017 +0200 @@ -56,6 +56,7 @@ * SerialArray is to be used by more than one thread then access to the * SerialArray should be controlled by appropriate synchronization. * + * @since 1.5 */ public class SerialArray implements Array, Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialBlob.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialBlob.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialBlob.java Wed Jul 05 19:46:40 2017 +0200 @@ -58,6 +58,7 @@ * should be controlled by appropriate synchronization. * * @author Jonathan Bruce + * @since 1.5 */ public class SerialBlob implements Blob, Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialClob.java Wed Jul 05 19:46:40 2017 +0200 @@ -49,7 +49,9 @@ *

A SerialClob is not safe for use by multiple concurrent threads. If a * SerialClob is to be used by more than one thread then access to the SerialClob * should be controlled by appropriate synchronization. + * * @author Jonathan Bruce + * @since 1.5 */ public class SerialClob implements Clob, Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialDatalink.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialDatalink.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialDatalink.java Wed Jul 05 19:46:40 2017 +0200 @@ -48,6 +48,8 @@ * A SerialDatalink is not safe for use by multiple concurrent threads. If a * SerialDatalink is to be used by more than one thread then access to the * SerialDatalink should be controlled by appropriate synchronization. + * + * @since 1.5 */ public class SerialDatalink implements Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialException.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialException.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,6 +32,7 @@ * SQL types such as BLOB, CLOB, STRUCT or ARRAY in * addition to SQL types such as DATALINK and JAVAOBJECT * + * @since 1.5 */ public class SerialException extends java.sql.SQLException { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialJavaObject.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialJavaObject.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialJavaObject.java Wed Jul 05 19:46:40 2017 +0200 @@ -54,6 +54,7 @@ * SerialJavaObject should be controlled by appropriate synchronization. * * @author Jonathan Bruce + * @since 1.5 */ public class SerialJavaObject implements Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialRef.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialRef.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialRef.java Wed Jul 05 19:46:40 2017 +0200 @@ -43,6 +43,7 @@ * SerialRef is to be used by more than one thread then access to the SerialRef * should be controlled by appropriate synchronization. * + * @since 1.5 */ public class SerialRef implements Ref, Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/serial/SerialStruct.java --- a/jdk/src/share/classes/javax/sql/rowset/serial/SerialStruct.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/serial/SerialStruct.java Wed Jul 05 19:46:40 2017 +0200 @@ -57,6 +57,7 @@ * SerialStruct is to be used by more than one thread then access to the * SerialStruct should be controlled by appropriate synchronization. * + * @since 1.5 */ public class SerialStruct implements Struct, Serializable, Cloneable { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Wed Jul 05 19:46:40 2017 +0200 @@ -200,6 +200,7 @@ * @author Jonathan Bruce * @see javax.sql.rowset.spi.SyncProvider * @see javax.sql.rowset.spi.SyncFactoryException + * @since 1.5 */ public class SyncFactory { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/SyncFactoryException.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactoryException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncFactoryException.java Wed Jul 05 19:46:40 2017 +0200 @@ -35,6 +35,7 @@ * @author Jonathan Bruce * @see javax.sql.rowset.spi.SyncFactory * @see javax.sql.rowset.spi.SyncFactoryException + * @since 1.5 */ public class SyncFactoryException extends java.sql.SQLException { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/SyncProvider.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncProvider.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncProvider.java Wed Jul 05 19:46:40 2017 +0200 @@ -209,6 +209,7 @@ * @author Jonathan Bruce * @see javax.sql.rowset.spi.SyncFactory * @see javax.sql.rowset.spi.SyncFactoryException + * @since 1.5 */ public abstract class SyncProvider { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/SyncProviderException.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncProviderException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncProviderException.java Wed Jul 05 19:46:40 2017 +0200 @@ -61,6 +61,7 @@ * @see javax.sql.rowset.spi.SyncFactory * @see javax.sql.rowset.spi.SyncResolver * @see javax.sql.rowset.spi.SyncFactoryException + * @since 1.5 */ public class SyncProviderException extends java.sql.SQLException { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/SyncResolver.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/SyncResolver.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/SyncResolver.java Wed Jul 05 19:46:40 2017 +0200 @@ -231,7 +231,9 @@ * } * } * } + * * @author Jonathan Bruce + * @since 1.5 */ public interface SyncResolver extends RowSet { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/TransactionalWriter.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/TransactionalWriter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/TransactionalWriter.java Wed Jul 05 19:46:40 2017 +0200 @@ -44,6 +44,8 @@ * the CachedRowSet constant COMMIT_ON_ACCEPT_CHANGES * to false and use the commit and rollback * methods defined in this interface to manage transaction boundaries. + * + * @since 1.5 */ public interface TransactionalWriter extends RowSetWriter { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/XmlReader.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/XmlReader.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/XmlReader.java Wed Jul 05 19:46:40 2017 +0200 @@ -46,6 +46,8 @@ * rowset's xmlReader field. When the WebRowSet * object's readXml method is invoked, it in turn invokes * its XML reader's readXML method. + * + * @since 1.5 */ public interface XmlReader extends RowSetReader { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/sql/rowset/spi/XmlWriter.java --- a/jdk/src/share/classes/javax/sql/rowset/spi/XmlWriter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/sql/rowset/spi/XmlWriter.java Wed Jul 05 19:46:40 2017 +0200 @@ -44,6 +44,8 @@ * Writing a WebRowSet object includes printing the * rowset's data, metadata, and properties, all with the * appropriate XML tags. + * + * @since 1.5 */ public interface XmlWriter extends RowSetWriter { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/AbstractButton.java --- a/jdk/src/share/classes/javax/swing/AbstractButton.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/AbstractButton.java Wed Jul 05 19:46:40 2017 +0200 @@ -947,6 +947,7 @@ *

* This is a JavaBeans bound property. * + * @param iconTextGap the space between icon and text if these properties are set. * @since 1.4 * @see #getIconTextGap * @beaninfo @@ -1337,6 +1338,7 @@ * that of the Action. * * @param a the button's action + * @return the {@code PropertyChangeListener} * @since 1.3 * @see Action * @see #setAction @@ -2070,12 +2072,20 @@ } } - + /** + * Returns {@code ActionListener} that is added to model. + * + * @return the {@code ActionListener} + */ protected ActionListener createActionListener() { return getHandler(); } - + /** + * Returns {@code ItemListener} that is added to model. + * + * @return the {@code ItemListener} + */ protected ItemListener createItemListener() { return getHandler(); } @@ -2148,7 +2158,7 @@ return listenerList.getListeners(ItemListener.class); } - /** + /** * Returns an array (length 1) containing the label or * null if the button is not selected. * @@ -2164,6 +2174,12 @@ return selectedObjects; } + /** + * Initialization of the {@code AbstractButton}. + * + * @param text the text of the button + * @param icon the Icon image to display on the button + */ protected void init(String text, Icon icon) { if(text != null) { setText(text); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/AbstractSpinnerModel.java --- a/jdk/src/share/classes/javax/swing/AbstractSpinnerModel.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/AbstractSpinnerModel.java Wed Jul 05 19:46:40 2017 +0200 @@ -131,6 +131,7 @@ * myAbstractSpinnerModel.getListeners(ChangeListener.class); * * + * @param the type of requested listeners * @param listenerType the type of listeners to return, e.g. ChangeListener.class * @return all of the objects receiving listenerType notifications * from this model diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/Action.java --- a/jdk/src/share/classes/javax/swing/Action.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/Action.java Wed Jul 05 19:46:40 2017 +0200 @@ -337,6 +337,9 @@ /** * Gets one of this object's properties * using the associated key. + * + * @param key a {@code String} containing the key + * @return the {@code Object} value * @see #putValue */ public Object getValue(String key); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/ActionMap.java --- a/jdk/src/share/classes/javax/swing/ActionMap.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/ActionMap.java Wed Jul 05 19:46:40 2017 +0200 @@ -94,6 +94,9 @@ * for key. *

In most instances, key will be * action.getValue(NAME). + * + * @param key a key + * @param action a binding for {@code key} */ public void put(Object key, Action action) { if (key == null) { @@ -113,6 +116,9 @@ /** * Returns the binding for key, messaging the * parent ActionMap if the binding is not locally defined. + * + * @param key a key + * @return the binding for {@code key} */ public Action get(Object key) { Action value = (arrayTable == null) ? null : @@ -130,6 +136,8 @@ /** * Removes the binding for key from this ActionMap. + * + * @param key a key */ public void remove(Object key) { if (arrayTable != null) { @@ -148,6 +156,8 @@ /** * Returns the Action names that are bound in this ActionMap. + * + * @return an array of the keys */ public Object[] keys() { if (arrayTable == null) { @@ -172,6 +182,8 @@ * Returns an array of the keys defined in this ActionMap and * its parent. This method differs from keys() in that * this method includes the keys defined in the parent. + * + * @return an array of the keys */ public Object[] allKeys() { int count = size(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/ButtonGroup.java --- a/jdk/src/share/classes/javax/swing/ButtonGroup.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/ButtonGroup.java Wed Jul 05 19:46:40 2017 +0200 @@ -167,9 +167,11 @@ } /** - * Returns whether a ButtonModel is selected. - * @return true if the button is selected, - * otherwise returns false + * Returns whether a {@code ButtonModel} is selected. + * + * @param m an isntance of {@code ButtonModel} + * @return {@code true} if the button is selected, + * otherwise returns {@code false} */ public boolean isSelected(ButtonModel m) { return (m == selection); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/ComboBoxEditor.java --- a/jdk/src/share/classes/javax/swing/ComboBoxEditor.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/ComboBoxEditor.java Wed Jul 05 19:46:40 2017 +0200 @@ -34,23 +34,44 @@ */ public interface ComboBoxEditor { - /** Return the component that should be added to the tree hierarchy for - * this editor - */ + /** + * Returns the component that should be added to the tree hierarchy for + * this editor + * + * @return the component + */ public Component getEditorComponent(); - /** Set the item that should be edited. Cancel any editing if necessary **/ + /** + * Set the item that should be edited. Cancel any editing if necessary + * + * @param anObject an item + */ public void setItem(Object anObject); - /** Return the edited item **/ + /** + * Returns the edited item + * + * @return the edited item + */ public Object getItem(); - /** Ask the editor to start editing and to select everything **/ + /** + * Ask the editor to start editing and to select everything + */ public void selectAll(); - /** Add an ActionListener. An action event is generated when the edited item changes **/ + /** + * Add an ActionListener. An action event is generated when the edited item changes + * + * @param l an {@code ActionListener} + */ public void addActionListener(ActionListener l); - /** Remove an ActionListener **/ + /** + * Remove an ActionListener + * + * @param l an {@code ActionListener} + */ public void removeActionListener(ActionListener l); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/ComponentInputMap.java --- a/jdk/src/share/classes/javax/swing/ComponentInputMap.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/ComponentInputMap.java Wed Jul 05 19:46:40 2017 +0200 @@ -78,7 +78,9 @@ } /** - * Returns the component the InputMap was created for. + * Returns the component the {@code InputMap} was created for. + * + * @return the component the {@code InputMap} was created for. */ public JComponent getComponent() { return component; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/DefaultButtonModel.java --- a/jdk/src/share/classes/javax/swing/DefaultButtonModel.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/DefaultButtonModel.java Wed Jul 05 19:46:40 2017 +0200 @@ -477,6 +477,7 @@ * If no such listeners exist, * this method returns an empty array. * + * @param the type of requested listeners * @param listenerType the type of listeners requested; * this parameter should specify an interface * that descends from java.util.EventListener diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/FocusManager.java --- a/jdk/src/share/classes/javax/swing/FocusManager.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/FocusManager.java Wed Jul 05 19:46:40 2017 +0200 @@ -140,6 +140,7 @@ * Returns whether the application has invoked * disableSwingFocusManager(). * + * @return {@code true} if focus manager is enabled. * @see #disableSwingFocusManager * @deprecated As of 1.4, replaced by * KeyboardFocusManager.getDefaultFocusTraversalPolicy() diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/GroupLayout.java --- a/jdk/src/share/classes/javax/swing/GroupLayout.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/GroupLayout.java Wed Jul 05 19:46:40 2017 +0200 @@ -670,6 +670,7 @@ * @param resizable whether the group is resizable * @param anchorBaselineToTop whether the baseline is anchored to * the top or bottom of the group + * @return the {@code ParallelGroup} * @see #createBaselineGroup * @see ParallelGroup */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JColorChooser.java --- a/jdk/src/share/classes/javax/swing/JColorChooser.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JColorChooser.java Wed Jul 05 19:46:40 2017 +0200 @@ -542,7 +542,7 @@ * @return a string representation of this JColorChooser */ protected String paramString() { - StringBuffer chooserPanelsString = new StringBuffer(""); + StringBuilder chooserPanelsString = new StringBuilder(""); for (int i=0; iAction. * * @param a the combobox's action + * @return the {@code PropertyChangeListener} * @since 1.3 * @see Action * @see #setAction @@ -1357,6 +1367,8 @@ * * @param keyChar a char, typically this is a keyboard key * typed by the user + * @return {@code true} if there is an item corresponding to that character. + * Otherwise, returns {@code false}. */ public boolean selectWithKeyChar(char keyChar) { int index; @@ -1443,6 +1455,7 @@ * selection. Typically, the first selection with a matching first * character becomes the selected item. * + * @param aManager a key selection manager * @beaninfo * expert: true * description: The objects that changes the selection when a key is pressed. diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JOptionPane.java --- a/jdk/src/share/classes/javax/swing/JOptionPane.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JOptionPane.java Wed Jul 05 19:46:40 2017 +0200 @@ -435,6 +435,7 @@ * @exception HeadlessException if * GraphicsEnvironment.isHeadless returns * true + * @return user's input * @see java.awt.GraphicsEnvironment#isHeadless */ public static String showInputDialog(Object message) @@ -451,6 +452,7 @@ * @param message the Object to display * @param initialSelectionValue the value used to initialize the input * field + * @return user's input * @since 1.4 */ public static String showInputDialog(Object message, Object initialSelectionValue) { @@ -469,6 +471,7 @@ * @exception HeadlessException if * GraphicsEnvironment.isHeadless returns * true + * @return user's input * @see java.awt.GraphicsEnvironment#isHeadless */ public static String showInputDialog(Component parentComponent, @@ -489,6 +492,7 @@ * @param message the Object to display * @param initialSelectionValue the value used to initialize the input * field + * @return user's input * @since 1.4 */ public static String showInputDialog(Component parentComponent, Object message, @@ -515,6 +519,7 @@ * WARNING_MESSAGE, * QUESTION_MESSAGE, * or PLAIN_MESSAGE + * @return user's input * @exception HeadlessException if * GraphicsEnvironment.isHeadless returns * true @@ -1348,6 +1353,7 @@ * @param parentComponent the parent Component * for the dialog * @param message the Object to display + * @return user's input */ public static String showInternalInputDialog(Component parentComponent, Object message) { @@ -1368,6 +1374,7 @@ * @param messageType the type of message that is to be displayed: * ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, * QUESTION_MESSAGE, or PLAIN_MESSAGE + * @return user's input */ public static String showInternalInputDialog(Component parentComponent, Object message, String title, int messageType) { @@ -2246,6 +2253,8 @@ *

* This is a bound property. * + * @param newValue if true, an input component whose parent is {@code parentComponent} + * is provided to allow the user to input a value. * @see #setSelectionValues * @see #setInputValue * @beaninfo diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JProgressBar.java --- a/jdk/src/share/classes/javax/swing/JProgressBar.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JProgressBar.java Wed Jul 05 19:46:40 2017 +0200 @@ -665,6 +665,7 @@ * to the {@code ChangeListener}s that have been added directly to the * progress bar. * + * @return the instance of a custom {@code ChangeListener} implementation. * @see #changeListener * @see #fireStateChanged * @see javax.swing.event.ChangeListener diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JRadioButton.java --- a/jdk/src/share/classes/javax/swing/JRadioButton.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JRadioButton.java Wed Jul 05 19:46:40 2017 +0200 @@ -118,6 +118,7 @@ * Creates a radiobutton where properties are taken from the * Action supplied. * + * @param a an {@code Action} * @since 1.3 */ public JRadioButton(Action a) { @@ -175,6 +176,8 @@ * * @param text the string displayed on the radio button * @param icon the image that the button should display + * @param selected if {@code true}, the button is initially selected + * otherwise, the button is initially unselected */ public JRadioButton (String text, Icon icon, boolean selected) { super(text, icon, selected); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java --- a/jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java Wed Jul 05 19:46:40 2017 +0200 @@ -173,6 +173,8 @@ * * @param text the string displayed on the radio button * @param icon the image that the button should display + * @param selected if {@code true}, the button is initially selected, + * otherwise, the button is initially unselected */ public JRadioButtonMenuItem(String text, Icon icon, boolean selected) { super(text, icon); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JScrollBar.java --- a/jdk/src/share/classes/javax/swing/JScrollBar.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JScrollBar.java Wed Jul 05 19:46:40 2017 +0200 @@ -149,6 +149,12 @@ * @see #setVisibleAmount * @see #setMinimum * @see #setMaximum + * + * @param orientation an orientation of the {@code JScrollBar} + * @param value an int giving the current value + * @param extent an int giving the amount by which the value can "jump" + * @param min an int giving the minimum value + * @param max an int giving the maximum value */ public JScrollBar(int orientation, int value, int extent, int min, int max) { @@ -172,6 +178,8 @@ * value = 0 * extent = 10 * + * + * @param orientation an orientation of the {@code JScrollBar} */ public JScrollBar(int orientation) { this(orientation, 0, 10, 0, 100); @@ -213,6 +221,7 @@ * Returns the delegate that implements the look and feel for * this component. * + * @return the scroll bar's current UI. * @see JComponent#setUI */ public ScrollBarUI getUI() { @@ -258,6 +267,7 @@ * Set the scrollbar's orientation to either VERTICAL or * HORIZONTAL. * + * @param orientation an orientation of the {@code JScrollBar} * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL * @see #getOrientation * @beaninfo @@ -293,6 +303,8 @@ * Returns data model that handles the scrollbar's four * fundamental properties: minimum, maximum, value, extent. * + * @return the data model + * * @see #setModel */ public BoundedRangeModel getModel() { @@ -304,6 +316,7 @@ * Sets the model that handles the scrollbar's four * fundamental properties: minimum, maximum, value, extent. * + * @param newModel a new model * @see #getModel * @beaninfo * bound: true @@ -583,6 +596,8 @@ * scrollbar model will not generate ChangeEvents while * valueIsAdjusting is true. * + * @param b {@code true} if the upcoming changes to the value property are part of a series + * * @see #getValueIsAdjusting * @see BoundedRangeModel#setValueIsAdjusting * @beaninfo @@ -610,6 +625,10 @@ * minimum ≤ value ≤ value+extent ≤ maximum * * + * @param newValue an int giving the current value + * @param newExtent an int giving the amount by which the value can "jump" + * @param newMin an int giving the minimum value + * @param newMax an int giving the maximum value * * @see BoundedRangeModel#setRangeProperties * @see #setValue @@ -681,6 +700,10 @@ /** * Notify listeners that the scrollbar's model has changed. * + * @param id an integer indicating the type of event. + * @param type an integer indicating the adjustment type. + * @param value the current value of the adjustment + * * @see #addAdjustmentListener * @see EventListenerList */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JToggleButton.java --- a/jdk/src/share/classes/javax/swing/JToggleButton.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JToggleButton.java Wed Jul 05 19:46:40 2017 +0200 @@ -140,6 +140,7 @@ * Creates a toggle button where properties are taken from the * Action supplied. * + * @param a an instance of an {@code Action} * @since 1.3 */ public JToggleButton(Action a) { @@ -390,6 +391,9 @@ protected class AccessibleJToggleButton extends AccessibleAbstractButton implements ItemListener { + /** + * Constructs {@code AccessibleJToggleButton} + */ public AccessibleJToggleButton() { super(); JToggleButton.this.addItemListener(this); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JToolBar.java --- a/jdk/src/share/classes/javax/swing/JToolBar.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JToolBar.java Wed Jul 05 19:46:40 2017 +0200 @@ -161,6 +161,8 @@ /** * Returns the tool bar's current UI. + * + * @return the tool bar's current UI. * @see #setUI */ public ToolBarUI getUI() { @@ -555,7 +557,8 @@ * or null if the default * property change listener for the control is desired. * - * @return null + * @param b a {@code JButton} + * @return {@code null} */ protected PropertyChangeListener createActionChangeListener(JButton b) { return null; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/JTree.java --- a/jdk/src/share/classes/javax/swing/JTree.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JTree.java Wed Jul 05 19:46:40 2017 +0200 @@ -986,6 +986,7 @@ * or equal to 0 the height for each row is determined by the * renderer. * + * @return the height of each row */ public int getRowHeight() { @@ -1115,6 +1116,7 @@ *

* This is a bound property. * + * @param clickCount the number of mouse clicks to get a node expanded or closed * @since 1.3 * @beaninfo * bound: true @@ -1508,6 +1510,7 @@ * is provided as an entry point for subclassers to add filtered * editing without having to resort to creating a new editor. * + * @param path a {@code TreePath} identifying a node * @return true if every parent node and the node itself is editable * @see #isEditable */ @@ -1984,6 +1987,8 @@ /** * Returns true if the node identified by the path has ever been * expanded. + * + * @param path a {@code TreePath} identifying a node * @return true if the path has ever been expanded */ public boolean hasBeenExpanded(TreePath path) { @@ -2079,6 +2084,7 @@ * which means it is either the root or all of its parents are expanded. * Otherwise, this method returns false. * + * @param path {@code TreePath} identifying a node * @return true if the node is viewable, otherwise false */ public boolean isVisible(TreePath path) { @@ -2472,6 +2478,7 @@ * set the selection model to null, which forces an empty * selection model to be used. * + * @return the model for selections * @see #setSelectionModel */ public TreeSelectionModel getSelectionModel() { @@ -2817,6 +2824,7 @@ * * @param path the TreePath indicating the node that was * expanded + * @throws ExpandVetoException if the expansion is prevented from occurring * @see EventListenerList */ public void fireTreeWillExpand(TreePath path) throws ExpandVetoException { @@ -2843,6 +2851,7 @@ * * @param path the TreePath indicating the node that was * expanded + * @throws ExpandVetoException if the collapse is prevented from occurring * @see EventListenerList */ public void fireTreeWillCollapse(TreePath path) throws ExpandVetoException { @@ -3541,6 +3550,11 @@ * path are marked EXPANDED, but path itself * is marked collapsed.

* This will fail if a TreeWillExpandListener vetos it. + * + * @param path a {@code TreePath} identifying a node + * @param state if {@code true}, all parents of @{code path} and path are marked as expanded. + * Otherwise, all parents of {@code path} are marked EXPANDED, + * but {@code path} itself is marked collapsed. */ protected void setExpandedState(TreePath path, boolean state) { if(path != null) { @@ -3636,9 +3650,12 @@ } /** - * Returns an Enumeration of TreePaths + * Returns an {@code Enumeration} of {@code TreePaths} * that have been expanded that - * are descendants of parent. + * are descendants of {@code parent}. + * + * @param parent a path + * @return the {@code Enumeration} of {@code TreePaths} */ protected Enumeration getDescendantToggledPaths(TreePath parent) @@ -3701,6 +3718,8 @@ *

* For more information on what expanded state means, see the * JTree description above. + * + * @return the instance of {@code TreeModelHandler} */ protected TreeModelListener createTreeModelListener() { return new TreeModelHandler(); @@ -3711,6 +3730,9 @@ * path. If includePath is true and * path is selected, it will be removed from the selection. * + * @param path a path + * @param includePath is {@code true} and {@code path} is selected, + * it will be removed from the selection. * @return true if a descendant was selected * @since 1.3 */ @@ -3891,6 +3913,9 @@ * elements are added is children, otherwise if children * is a hashtable all the key/value pairs are added in the order * Enumeration returns them. + * + * @param parent the parent node + * @param children the children */ public static void createChildren(DefaultMutableTreeNode parent, Object children) { @@ -4113,6 +4138,9 @@ TreePath leadSelectionPath; Accessible leadSelectionAccessible; + /** + * Constructs {@code AccessibleJTree} + */ public AccessibleJTree() { // Add a tree model listener for JTree TreeModel model = JTree.this.getModel(); @@ -4551,7 +4579,11 @@ private boolean isLeaf = false; /** - * Constructs an AccessibleJTreeNode + * Constructs an AccessibleJTreeNode + * + * @param t an instance of {@code JTree} + * @param p an instance of {@code TreePath} + * @param ap an instance of {@code Accessible} * @since 1.4 */ public AccessibleJTreeNode(JTree t, TreePath p, Accessible ap) { @@ -5183,6 +5215,11 @@ } } + /** + * Returns the relative location of the node + * + * @return the relative location of the node + */ protected Point getLocationInJTree() { Rectangle r = tree.getPathBounds(path); if (r != null) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/ListSelectionModel.java --- a/jdk/src/share/classes/javax/swing/ListSelectionModel.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/ListSelectionModel.java Wed Jul 05 19:46:40 2017 +0200 @@ -134,18 +134,25 @@ /** * Returns the first selected index or -1 if the selection is empty. + * + * @return the first selected index or -1 if the selection is empty. */ int getMinSelectionIndex(); /** * Returns the last selected index or -1 if the selection is empty. + * + * @return the last selected index or -1 if the selection is empty. */ int getMaxSelectionIndex(); /** * Returns true if the specified index is selected. + * + * @param index an index + * @return {@code true} if the specified index is selected */ boolean isSelectedIndex(int index); @@ -158,6 +165,7 @@ * indices specially, e.g. Windows95 displays the lead index with a * dotted yellow outline. * + * @return the anchor selection index * @see #getLeadSelectionIndex * @see #setSelectionInterval * @see #addSelectionInterval @@ -168,6 +176,7 @@ /** * Set the anchor selection index. * + * @param index the anchor selection index * @see #getAnchorSelectionIndex */ void setAnchorSelectionIndex(int index); @@ -177,6 +186,7 @@ * Return the second index argument from the most recent call to * setSelectionInterval(), addSelectionInterval() or removeSelectionInterval(). * + * @return the lead selection index. * @see #getAnchorSelectionIndex * @see #setSelectionInterval * @see #addSelectionInterval @@ -186,6 +196,7 @@ /** * Set the lead selection index. * + * @param index the lead selection index * @see #getLeadSelectionIndex */ void setLeadSelectionIndex(int index); @@ -200,20 +211,30 @@ /** * Returns true if no indices are selected. + * + * @return {@code true} if no indices are selected. */ boolean isSelectionEmpty(); /** - * Insert length indices beginning before/after index. This is typically + * Insert {@code length} indices beginning before/after {@code index}. This is typically * called to sync the selection model with a corresponding change * in the data model. + * + * @param index the beginning of the interval + * @param length the length of the interval + * @param before if {@code true}, interval inserts before the {@code index}, + * otherwise, interval inserts after the {@code index} */ void insertIndexInterval(int index, int length, boolean before); /** - * Remove the indices in the interval index0,index1 (inclusive) from + * Remove the indices in the interval {@code index0,index1} (inclusive) from * the selection model. This is typically called to sync the selection * model width a corresponding change in the data model. + * + * @param index0 the beginning of the interval + * @param index1 the end of the interval */ void removeIndexInterval(int index0, int index1); @@ -272,6 +293,7 @@ * In this mode, there's no restriction on what can be selected. * * + * @param selectionMode the selection mode * @see #getSelectionMode * @throws IllegalArgumentException if the selection mode isn't * one of those allowed diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/MultiUIDefaults.java --- a/jdk/src/share/classes/javax/swing/MultiUIDefaults.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/MultiUIDefaults.java Wed Jul 05 19:46:40 2017 +0200 @@ -190,18 +190,18 @@ @Override public synchronized String toString() { - StringBuffer buf = new StringBuffer(); - buf.append("{"); + StringBuilder sb = new StringBuilder(); + sb.append("{"); Enumeration keys = keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); - buf.append(key + "=" + get(key) + ", "); + sb.append(key + "=" + get(key) + ", "); } - int length = buf.length(); + int length = sb.length(); if (length > 1) { - buf.delete(length-2, length); + sb.delete(length-2, length); } - buf.append("}"); - return buf.toString(); + sb.append("}"); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/RepaintManager.java --- a/jdk/src/share/classes/javax/swing/RepaintManager.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/RepaintManager.java Wed Jul 05 19:46:40 2017 +0200 @@ -331,6 +331,7 @@ * for the event dispatching thread that will validate the components * first isValidateRoot() ancestor. * + * @param invalidComponent a component * @see JComponent#isValidateRoot * @see #removeInvalidComponent */ @@ -374,6 +375,7 @@ /** * Remove a component from the list of invalid components. * + * @param component a component * @see #addInvalidComponent */ public synchronized void removeInvalidComponent(JComponent component) { @@ -610,9 +612,13 @@ return false; } - /** Return the current dirty region for a component. - * Return an empty rectangle if the component is not - * dirty. + /** + * Return the current dirty region for a component. + * Return an empty rectangle if the component is not + * dirty. + * + * @param aComponent a component + * @return the region */ public Rectangle getDirtyRegion(JComponent aComponent) { RepaintManager delegate = getDelegate(aComponent); @@ -632,6 +638,8 @@ /** * Mark a component completely dirty. aComponent will be * completely painted during the next paintDirtyRegions() call. + * + * @param aComponent a component */ public void markCompletelyDirty(JComponent aComponent) { RepaintManager delegate = getDelegate(aComponent); @@ -645,6 +653,8 @@ /** * Mark a component completely clean. aComponent will not * get painted during the next paintDirtyRegions() call. + * + * @param aComponent a component */ public void markCompletelyClean(JComponent aComponent) { RepaintManager delegate = getDelegate(aComponent); @@ -662,6 +672,10 @@ * painted during the next paintDirtyRegions(). If computing dirty regions is * expensive for your component, use this method and avoid computing dirty region * if it return true. + * + * @param aComponent a component + * @return {@code true} if aComponent will be completely + * painted during the next paintDirtyRegions(). */ public boolean isCompletelyDirty(JComponent aComponent) { RepaintManager delegate = getDelegate(aComponent); @@ -975,20 +989,26 @@ * @return a String representation of this object */ public synchronized String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if(dirtyComponents != null) sb.append("" + dirtyComponents); return sb.toString(); } - /** + /** * Return the offscreen buffer that should be used as a double buffer with * the component c. * By default there is a double buffer per RepaintManager. * The buffer might be smaller than (proposedWidth,proposedHeight) * This happens when the maximum double buffer size as been set for the receiving * repaint manager. + * + * @param c the component + * @param proposedWidth the width of the buffer + * @param proposedHeight the height of the buffer + * + * @return the image */ public Image getOffscreenBuffer(Component c,int proposedWidth,int proposedHeight) { RepaintManager delegate = getDelegate(c); @@ -998,18 +1018,23 @@ return _getOffscreenBuffer(c, proposedWidth, proposedHeight); } - /** - * Return a volatile offscreen buffer that should be used as a - * double buffer with the specified component c. - * The image returned will be an instance of VolatileImage, or null - * if a VolatileImage object could not be instantiated. - * This buffer might be smaller than (proposedWidth,proposedHeight). - * This happens when the maximum double buffer size has been set for this - * repaint manager. - * - * @see java.awt.image.VolatileImage - * @since 1.4 - */ + /** + * Return a volatile offscreen buffer that should be used as a + * double buffer with the specified component c. + * The image returned will be an instance of VolatileImage, or null + * if a VolatileImage object could not be instantiated. + * This buffer might be smaller than (proposedWidth,proposedHeight). + * This happens when the maximum double buffer size has been set for this + * repaint manager. + * + * @param c the component + * @param proposedWidth the width of the buffer + * @param proposedHeight the height of the buffer + * + * @return the volatile image + * @see java.awt.image.VolatileImage + * @since 1.4 + */ public Image getVolatileOffscreenBuffer(Component c, int proposedWidth,int proposedHeight) { RepaintManager delegate = getDelegate(c); @@ -1104,7 +1129,11 @@ } - /** Set the maximum double buffer size. **/ + /** + * Set the maximum double buffer size. + * + * @param d the dimension + */ public void setDoubleBufferMaximumSize(Dimension d) { doubleBufferMaxSize = d; if (doubleBufferMaxSize == null) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/RootPaneContainer.java --- a/jdk/src/share/classes/javax/swing/RootPaneContainer.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/RootPaneContainer.java Wed Jul 05 19:46:40 2017 +0200 @@ -132,6 +132,7 @@ * Generally implemented with

      *    getRootPane().setLayeredPane(layeredPane);
* + * @param layeredPane the layered pane * @exception java.awt.IllegalComponentStateException (a runtime * exception) if the layered pane parameter is null * @see #getLayeredPane @@ -162,6 +163,7 @@ * Generally implemented with * getRootPane().setGlassPane(glassPane); * + * @param glassPane the glass pane * @see #getGlassPane * @see JRootPane#setGlassPane */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/ScrollPaneLayout.java --- a/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/ScrollPaneLayout.java Wed Jul 05 19:46:40 2017 +0200 @@ -168,6 +168,8 @@ * }; * scrollpane.setLayout(mySPLayout): * + * + * @param sp an instance of the {@code JScrollPane} */ public void syncWithScrollPane(JScrollPane sp) { viewport = sp.getViewport(); @@ -1106,6 +1108,7 @@ * Returns the bounds of the border around the specified scroll pane's * viewport. * + * @param scrollpane an instance of the {@code JScrollPane} * @return the size and position of the viewport border * @deprecated As of JDK version Swing1.1 * replaced by JScrollPane.getViewportBorderBounds(). diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/SwingUtilities.java --- a/jdk/src/share/classes/javax/swing/SwingUtilities.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/SwingUtilities.java Wed Jul 05 19:46:40 2017 +0200 @@ -103,15 +103,23 @@ } /** - * Return true if a contains b + * Return {@code true} if @{code a} contains {@code b} + * + * @param a the first rectangle + * @param b the second rectangle + * + * @return {@code true} if @{code a} contains {@code b} */ - public static final boolean isRectangleContainingRectangle(Rectangle a,Rectangle b) { + public static boolean isRectangleContainingRectangle(Rectangle a,Rectangle b) { return b.x >= a.x && (b.x + b.width) <= (a.x + a.width) && b.y >= a.y && (b.y + b.height) <= (a.y + a.height); } /** - * Return the rectangle (0,0,bounds.width,bounds.height) for the component aComponent + * Return the rectangle (0,0,bounds.width,bounds.height) for the component {@code aComponent} + * + * @param aComponent a component + * @return the local bounds for the component {@code aComponent} */ public static Rectangle getLocalBounds(Component aComponent) { Rectangle b = new Rectangle(aComponent.getBounds()); @@ -165,6 +173,12 @@ * root component coordinate system. * If both source and destination are {@code null}, return aPoint * without any conversion. + * + * @param source the source component + * @param aPoint the point + * @param destination the destination component + * + * @return the converted coordinate */ public static Point convertPoint(Component source,Point aPoint,Component destination) { Point p; @@ -196,6 +210,13 @@ * root component coordinate system. * If both source and destination are {@code null}, return (x,y) * without any conversion. + * + * @param source the source component + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @param destination the destination component + * + * @return the converted coordinate */ public static Point convertPoint(Component source,int x, int y,Component destination) { Point point = new Point(x,y); @@ -211,6 +232,12 @@ * root component coordinate system. * If both source and destination are {@code null}, return aRectangle * without any conversion. + * + * @param source the source component + * @param aRectangle a rectangle + * @param destination the destination component + * + * @return the converted rectangle */ public static Rectangle convertRectangle(Component source,Rectangle aRectangle,Component destination) { Point point = new Point(aRectangle.x,aRectangle.y); @@ -222,6 +249,12 @@ * Convenience method for searching above comp in the * component hierarchy and returns the first object of class c it * finds. Can return {@code null}, if a class c cannot be found. + * + * @param c the class of a component + * @param comp the component + * + * @return the ancestor of the {@code comp}, + * or {@code null} if {@code c} cannot be found. */ public static Container getAncestorOfClass(Class c, Component comp) { @@ -238,6 +271,12 @@ * Convenience method for searching above comp in the * component hierarchy and returns the first object of name it * finds. Can return {@code null}, if name cannot be found. + * + * @param name the name of a component + * @param comp the component + * + * @return the ancestor of the {@code comp}, + * or {@code null} if {@code name} cannot be found. */ public static Container getAncestorNamed(String name, Component comp) { if(comp == null || name == null) @@ -260,6 +299,8 @@ * @param parent the root component to begin the search * @param x the x target location * @param y the y target location + * + * @return the deepest component */ public static Component getDeepestComponentAt(Component parent, int x, int y) { if (!parent.contains(x, y)) { @@ -297,6 +338,12 @@ * to destination if destination is non-{@code null} * use the translateMouseEvent() method to translate a mouse event from * one component to another without changing the source. + * + * @param source the source component + * @param sourceEvent the source mouse event + * @param destination the destination component + * + * @return the new mouse event */ public static MouseEvent convertMouseEvent(Component source, MouseEvent sourceEvent, @@ -456,7 +503,11 @@ } /** - * Return true if a component a descends from a component b + * Return {@code true} if a component {@code a} descends from a component {@code b} + * + * @param a the first component + * @param b the second component + * @return {@code true} if a component {@code a} descends from a component {@code b} */ public static boolean isDescendingFrom(Component a,Component b) { if(a == b) @@ -531,6 +582,12 @@ * Convenience returning an array of rect representing the regions within * rectA that do not overlap with rectB. If the * two Rects do not overlap, returns an empty array + * + * @param rectA the first rectangle + * @param rectB the second rectangle + * + * @return an array of rectangles representing the regions within {@code rectA} + * that do not overlap with {@code rectB}. */ public static Rectangle[] computeDifference(Rectangle rectA,Rectangle rectB) { if (rectB == null || !rectA.intersects(rectB) || isRectangleContainingRectangle(rectB,rectA)) { @@ -841,6 +898,21 @@ * relative to the viewR rectangle. * The JComponents orientation (LEADING/TRAILING) will also be taken * into account and translated into LEFT/RIGHT values accordingly. + * + * @param c the component + * @param fm the instance of {@code FontMetrics} + * @param text the text + * @param icon the icon + * @param verticalAlignment the vertical alignment + * @param horizontalAlignment the horizontal alignment + * @param verticalTextPosition the vertical text position + * @param horizontalTextPosition the horizontal text position + * @param viewR the available rectangle + * @param iconR the rectangle for the icon + * @param textR the rectangle for the text + * @param textIconGap the gap between text and icon + * + * @return the possibly clipped version of the compound labels string */ public static String layoutCompoundLabel(JComponent c, FontMetrics fm, @@ -910,6 +982,20 @@ * values in horizontalTextPosition (they will default to RIGHT) and in * horizontalAlignment (they will default to CENTER). * Use the other version of layoutCompoundLabel() instead. + * + * @param fm the instance of {@code FontMetrics} + * @param text the text + * @param icon the icon + * @param verticalAlignment the vertical alignment + * @param horizontalAlignment the horizontal alignment + * @param verticalTextPosition the vertical text position + * @param horizontalTextPosition the horizontal text position + * @param viewR the available rectangle + * @param iconR the rectangle for the icon + * @param textR the rectangle for the text + * @param textIconGap the gap between text and icon + * + * @return the possibly clipped version of the compound labels string */ public static String layoutCompoundLabel( FontMetrics fm, @@ -1219,6 +1305,8 @@ * A simple minded look and feel change: ask each node in the tree * to updateUI() -- that is, to initialize its UI property * with the current look and feel. + * + * @param c the component */ public static void updateComponentTreeUI(Component c) { updateComponentTreeUI0(c); @@ -1284,6 +1372,7 @@ *

* Unlike the rest of Swing, this method can be invoked from any thread. * + * @param doRun the instance of {@code Runnable} * @see #invokeAndWait */ public static void invokeLater(Runnable doRun) { @@ -1334,6 +1423,7 @@ * As of 1.3 this method is just a cover for * java.awt.EventQueue.invokeAndWait(). * + * @param doRun the instance of {@code Runnable} * @exception InterruptedException if we're interrupted while waiting for * the event dispatching thread to finish executing * doRun.run() @@ -1374,6 +1464,7 @@ * Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead * of using this method. * + * @param c the component * @return -1 of this object does not have an accessible parent. * Otherwise, the index of the child in its accessible parent. */ @@ -1386,6 +1477,8 @@ * local coordinate Point, if one exists. * Otherwise returns null. * + * @param c the component + * @param p the local coordinate * @return the Accessible at the specified location, * if it exists; otherwise null */ @@ -1431,6 +1524,7 @@ * Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead * of using this method. * + * @param c the component * @return an instance of AccessibleStateSet containing the current state * set of the object * @see AccessibleState @@ -1448,6 +1542,7 @@ * Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead * of using this method. * + * @param c the component * @return the number of accessible children in the object. */ public static int getAccessibleChildrenCount(Component c) { @@ -1461,6 +1556,7 @@ * Component.AccessibleAWTComponent.getAccessibleIndexInParent() instead * of using this method. * + * @param c the component * @param i zero-based index of child * @return the nth Accessible child of the object */ @@ -1502,6 +1598,8 @@ /** * If c is a JRootPane descendant return its JRootPane ancestor. * If c is a RootPaneContainer then return its JRootPane. + * + * @param c the component * @return the JRootPane for Component c or {@code null}. */ public static JRootPane getRootPane(Component c) { @@ -1519,6 +1617,8 @@ /** * Returns the root component for the current component tree. + * + * @param c the component * @return the first ancestor of c that's a Window or the last Applet ancestor */ public static Component getRoot(Component c) { @@ -1616,6 +1716,14 @@ * This will return true if action is non-{@code null} and * actionPerformed is invoked on it. * + * @param action an action + * @param ks a key stroke + * @param event a key event + * @param sender a sender + * @param modifiers action modifiers + * @return {@code true} if {@code action} is non-{@code null} and + * actionPerformed is invoked on it. + * * @since 1.3 */ public static boolean notifyAction(Action action, KeyStroke ks, @@ -1672,6 +1780,9 @@ * to uiInputMap. If uiInputMap is {@code null}, * this removes any previously installed UI InputMap. * + * @param component a component + * @param type a type + * @param uiInputMap an {@code InputMap} * @since 1.3 */ public static void replaceUIInputMap(JComponent component, int type, @@ -1694,6 +1805,8 @@ * to uiActionMap. If uiActionMap is {@code null}, * this removes any previously installed UI ActionMap. * + * @param component a component + * @param uiActionMap an {@code ActionMap} * @since 1.3 */ public static void replaceUIActionMap(JComponent component, @@ -1714,9 +1827,14 @@ /** * Returns the InputMap provided by the UI for condition * condition in component component. - *

This will return {@code null} if the UI has not installed a InputMap + *

This will return {@code null} if the UI has not installed an InputMap * of the specified type. * + * @param component a component + * @param condition a condition + * @return the {@code ActionMap} provided by the UI for {@code condition} + * in the component, or {@code null} if the UI has not installed + * an InputMap of the specified type. * @since 1.3 */ public static InputMap getUIInputMap(JComponent component, int condition) { @@ -1736,6 +1854,9 @@ * in component component. *

This will return {@code null} if the UI has not installed an ActionMap. * + * @param component a component + * @return the {@code ActionMap} provided by the UI in the component, + * or {@code null} if the UI has not installed an ActionMap. * @since 1.3 */ public static ActionMap getUIActionMap(JComponent component) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/event/TreeModelEvent.java --- a/jdk/src/share/classes/javax/swing/event/TreeModelEvent.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/event/TreeModelEvent.java Wed Jul 05 19:46:40 2017 +0200 @@ -292,24 +292,24 @@ * @return a String representation of this object */ public String toString() { - StringBuffer retBuffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - retBuffer.append(getClass().getName() + " " + - Integer.toString(hashCode())); + sb.append(getClass().getName() + " " + + Integer.toString(hashCode())); if(path != null) - retBuffer.append(" path " + path); + sb.append(" path " + path); if(childIndices != null) { - retBuffer.append(" indices [ "); + sb.append(" indices [ "); for(int counter = 0; counter < childIndices.length; counter++) - retBuffer.append(Integer.toString(childIndices[counter])+ " "); - retBuffer.append("]"); + sb.append(Integer.toString(childIndices[counter])+ " "); + sb.append("]"); } if(children != null) { - retBuffer.append(" children [ "); + sb.append(" children [ "); for(int counter = 0; counter < children.length; counter++) - retBuffer.append(children[counter] + " "); - retBuffer.append("]"); + sb.append(children[counter] + " "); + sb.append("]"); } - return retBuffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Wed Jul 05 19:46:40 2017 +0200 @@ -1322,8 +1322,8 @@ return null; } - StringBuffer plainBuf = new StringBuffer(); - StringBuffer htmlBuf = new StringBuffer(); + StringBuilder plainBuf = new StringBuilder(); + StringBuilder htmlBuf = new StringBuilder(); htmlBuf.append("\n\n

    \n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Wed Jul 05 19:46:40 2017 +0200 @@ -2855,23 +2855,23 @@ return null; } - StringBuffer plainBuf = new StringBuffer(); - StringBuffer htmlBuf = new StringBuffer(); + StringBuilder plainStr = new StringBuilder(); + StringBuilder htmlStr = new StringBuilder(); - htmlBuf.append("\n\n
      \n"); + htmlStr.append("\n\n
        \n"); for (int i = 0; i < values.length; i++) { Object obj = values[i]; String val = ((obj == null) ? "" : obj.toString()); - plainBuf.append(val + "\n"); - htmlBuf.append("
      • " + val + "\n"); + plainStr.append(val + "\n"); + htmlStr.append("
      • " + val + "\n"); } // remove the last newline - plainBuf.deleteCharAt(plainBuf.length() - 1); - htmlBuf.append("
      \n\n"); + plainStr.deleteCharAt(plainStr.length() - 1); + htmlStr.append("
    \n\n"); - return new BasicTransferable(plainBuf.toString(), htmlBuf.toString()); + return new BasicTransferable(plainStr.toString(), htmlStr.toString()); } return null; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableUI.java Wed Jul 05 19:46:40 2017 +0200 @@ -2182,29 +2182,29 @@ return null; } - StringBuffer plainBuf = new StringBuffer(); - StringBuffer htmlBuf = new StringBuffer(); + StringBuilder plainStr = new StringBuilder(); + StringBuilder htmlStr = new StringBuilder(); - htmlBuf.append("\n\n\n"); + htmlStr.append("\n\n
    \n"); for (int row = 0; row < rows.length; row++) { - htmlBuf.append("\n"); + htmlStr.append("\n"); for (int col = 0; col < cols.length; col++) { Object obj = table.getValueAt(rows[row], cols[col]); String val = ((obj == null) ? "" : obj.toString()); - plainBuf.append(val + "\t"); - htmlBuf.append(" \n"); + plainStr.append(val + "\t"); + htmlStr.append(" \n"); } // we want a newline at the end of each line and not a tab - plainBuf.deleteCharAt(plainBuf.length() - 1).append("\n"); - htmlBuf.append("\n"); + plainStr.deleteCharAt(plainStr.length() - 1).append("\n"); + htmlStr.append("\n"); } // remove the last newline - plainBuf.deleteCharAt(plainBuf.length() - 1); - htmlBuf.append("
    " + val + "" + val + "
    \n\n"); + plainStr.deleteCharAt(plainStr.length() - 1); + htmlStr.append("\n\n"); - return new BasicTransferable(plainBuf.toString(), htmlBuf.toString()); + return new BasicTransferable(plainStr.toString(), htmlStr.toString()); } return null; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Wed Jul 05 19:46:40 2017 +0200 @@ -3213,10 +3213,10 @@ return null; } - StringBuffer plainBuf = new StringBuffer(); - StringBuffer htmlBuf = new StringBuffer(); - - htmlBuf.append("\n\n
      \n"); + StringBuilder plainStr = new StringBuilder(); + StringBuilder htmlStr = new StringBuilder(); + + htmlStr.append("\n\n
        \n"); TreeModel model = tree.getModel(); TreePath lastPath = null; @@ -3227,17 +3227,17 @@ boolean leaf = model.isLeaf(node); String label = getDisplayString(path, true, leaf); - plainBuf.append(label + "\n"); - htmlBuf.append("
      • " + label + "\n"); + plainStr.append(label + "\n"); + htmlStr.append("
      • " + label + "\n"); } // remove the last newline - plainBuf.deleteCharAt(plainBuf.length() - 1); - htmlBuf.append("
      \n\n"); + plainStr.deleteCharAt(plainStr.length() - 1); + htmlStr.append("
    \n\n"); tree = null; - return new BasicTransferable(plainBuf.toString(), htmlBuf.toString()); + return new BasicTransferable(plainStr.toString(), htmlStr.toString()); } return null; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java --- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Wed Jul 05 19:46:40 2017 +0200 @@ -618,20 +618,20 @@ } private String fileNameString(File[] files) { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; files != null && i < files.length; i++) { if (i > 0) { - buf.append(" "); + sb.append(" "); } if (files.length > 1) { - buf.append("\""); + sb.append("\""); } - buf.append(fileNameString(files[i])); + sb.append(fileNameString(files[i])); if (files.length > 1) { - buf.append("\""); + sb.append("\""); } } - return buf.toString(); + return sb.toString(); } /* The following methods are used by the PropertyChange Listener */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/plaf/nimbus/State.java --- a/jdk/src/share/classes/javax/swing/plaf/nimbus/State.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/State.java Wed Jul 05 19:46:40 2017 +0200 @@ -179,35 +179,35 @@ } private static String toString(int state) { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if ((state & SynthConstants.DEFAULT) == SynthConstants.DEFAULT) { - buffer.append("Default"); + sb.append("Default"); } if ((state & SynthConstants.DISABLED) == SynthConstants.DISABLED) { - if (buffer.length() > 0) buffer.append("+"); - buffer.append("Disabled"); + if (sb.length() > 0) sb.append("+"); + sb.append("Disabled"); } if ((state & SynthConstants.ENABLED) == SynthConstants.ENABLED) { - if (buffer.length() > 0) buffer.append("+"); - buffer.append("Enabled"); + if (sb.length() > 0) sb.append("+"); + sb.append("Enabled"); } if ((state & SynthConstants.FOCUSED) == SynthConstants.FOCUSED) { - if (buffer.length() > 0) buffer.append("+"); - buffer.append("Focused"); + if (sb.length() > 0) sb.append("+"); + sb.append("Focused"); } if ((state & SynthConstants.MOUSE_OVER) == SynthConstants.MOUSE_OVER) { - if (buffer.length() > 0) buffer.append("+"); - buffer.append("MouseOver"); + if (sb.length() > 0) sb.append("+"); + sb.append("MouseOver"); } if ((state & SynthConstants.PRESSED) == SynthConstants.PRESSED) { - if (buffer.length() > 0) buffer.append("+"); - buffer.append("Pressed"); + if (sb.length() > 0) sb.append("+"); + sb.append("Pressed"); } if ((state & SynthConstants.SELECTED) == SynthConstants.SELECTED) { - if (buffer.length() > 0) buffer.append("+"); - buffer.append("Selected"); + if (sb.length() > 0) sb.append("+"); + sb.append("Selected"); } - return buffer.toString(); + return sb.toString(); } } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/plaf/synth/ParsedSynthStyle.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/ParsedSynthStyle.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/ParsedSynthStyle.java Wed Jul 05 19:46:40 2017 +0200 @@ -156,7 +156,7 @@ } public String toString() { - StringBuffer text = new StringBuffer(super.toString()); + StringBuilder text = new StringBuilder(super.toString()); if (_painters != null) { text.append(",painters=["); for (int i = 0; i < +_painters.length; i++) { @@ -208,7 +208,7 @@ } public String toString() { - StringBuffer text = new StringBuffer(super.toString()); + StringBuilder text = new StringBuilder(super.toString()); text.append(",painters=["); if (_painterInfo != null) { for (int i = 0; i < +_painterInfo.length; i++) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java --- a/jdk/src/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java Wed Jul 05 19:46:40 2017 +0200 @@ -1153,23 +1153,23 @@ */ public String toString() { int selCount = getSelectionCount(); - StringBuffer retBuffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); int[] rows; if(rowMapper != null) rows = rowMapper.getRowsForPaths(selection); else rows = null; - retBuffer.append(getClass().getName() + " " + hashCode() + " [ "); + sb.append(getClass().getName() + " " + hashCode() + " [ "); for(int counter = 0; counter < selCount; counter++) { if(rows != null) - retBuffer.append(selection[counter].toString() + "@" + - Integer.toString(rows[counter])+ " "); + sb.append(selection[counter].toString() + "@" + + Integer.toString(rows[counter])+ " "); else - retBuffer.append(selection[counter].toString() + " "); + sb.append(selection[counter].toString() + " "); } - retBuffer.append("]"); - return retBuffer.toString(); + sb.append("]"); + return sb.toString(); } /** diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/javax/swing/tree/TreePath.java --- a/jdk/src/share/classes/javax/swing/tree/TreePath.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/tree/TreePath.java Wed Jul 05 19:46:40 2017 +0200 @@ -349,7 +349,7 @@ * @return a String representation of this object */ public String toString() { - StringBuffer tempSpot = new StringBuffer("["); + StringBuilder tempSpot = new StringBuilder("["); for(int counter = 0, maxCounter = getPathCount();counter < maxCounter; counter++) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/ApacheNodeSetData.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: ApacheNodeSetData.java 1203890 2011-11-18 22:47:56Z mullan $ @@ -47,7 +47,7 @@ this.xi = xi; } - public Iterator iterator() { + public Iterator iterator() { // If nodefilters are set, must execute them first to create node-set if (xi.getNodeFilters() != null && !xi.getNodeFilters().isEmpty()) { return Collections.unmodifiableSet diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMExcC14NMethod.java Wed Jul 05 19:46:40 2017 +0200 @@ -118,7 +118,7 @@ } ExcC14NParameterSpec params = (ExcC14NParameterSpec)spec; - StringBuffer prefixListAttr = new StringBuffer(""); + StringBuilder prefixListAttr = new StringBuilder(""); @SuppressWarnings("unchecked") List prefixList = params.getPrefixList(); for (int i = 0, size = prefixList.size(); i < size; i++) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfo.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMKeyInfo.java 1333869 2012-05-04 10:42:44Z coheigea $ @@ -138,7 +138,7 @@ return id; } - public List getContent() { + public List getContent() { return keyInfoTypes; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfoFactory.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfoFactory.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyInfoFactory.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMKeyInfoFactory.java 1333869 2012-05-04 10:42:44Z coheigea $ @@ -48,11 +48,12 @@ public DOMKeyInfoFactory() { } + @SuppressWarnings("rawtypes") public KeyInfo newKeyInfo(List content) { return newKeyInfo(content, null); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public KeyInfo newKeyInfo(List content, String id) { return new DOMKeyInfo(content, id); } @@ -78,12 +79,12 @@ return newPGPData(keyId, null, null); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public PGPData newPGPData(byte[] keyId, byte[] keyPacket, List other) { return new DOMPGPData(keyId, keyPacket, other); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public PGPData newPGPData(byte[] keyPacket, List other) { return new DOMPGPData(keyPacket, other); } @@ -92,7 +93,7 @@ return newRetrievalMethod(uri, null, null); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public RetrievalMethod newRetrievalMethod(String uri, String type, List transforms) { if (uri == null) { @@ -101,7 +102,7 @@ return new DOMRetrievalMethod(uri, type, transforms); } - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") public X509Data newX509Data(List content) { return new DOMX509Data(content); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMKeyValue.java 1333415 2012-05-03 12:03:51Z coheigea $ @@ -364,15 +364,16 @@ } void getMethods() throws ClassNotFoundException, NoSuchMethodException { - Class c = Class.forName("sun.security.ec.ECParameters"); - Class[] params = new Class[] { ECPoint.class, EllipticCurve.class }; + Class c = Class.forName("sun.security.ec.ECParameters"); + Class[] params = new Class[] { ECPoint.class, + EllipticCurve.class }; encodePoint = c.getMethod("encodePoint", params); - params = new Class[] { ECParameterSpec.class }; + params = new Class[] { ECParameterSpec.class }; getCurveName = c.getMethod("getCurveName", params); - params = new Class[] { byte[].class, EllipticCurve.class }; + params = new Class[] { byte[].class, EllipticCurve.class }; decodePoint = c.getMethod("decodePoint", params); c = Class.forName("sun.security.ec.NamedCurve"); - params = new Class[] { String.class }; + params = new Class[] { String.class }; getECParameterSpec = c.getMethod("getECParameterSpec", params); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMManifest.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMManifest.java 1333415 2012-05-03 12:03:51Z coheigea $ @@ -127,7 +127,12 @@ return id; } - public List getReferences() { + @SuppressWarnings("unchecked") + static List getManifestReferences(Manifest mf) { + return mf.getReferences(); + } + + public List getReferences() { return references; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMPGPData.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMPGPData.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMPGPData.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMPGPData.java 1203846 2011-11-18 21:18:17Z mullan $ @@ -184,7 +184,7 @@ return (keyPacket == null ? null : keyPacket.clone()); } - public List getExternalElements() { + public List getExternalElements() { return externalElements; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMReference.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * =========================================================================== @@ -293,7 +293,7 @@ return type; } - public List getTransforms() { + public List getTransforms() { return Collections.unmodifiableList(allTransforms); } @@ -643,7 +643,7 @@ try { final Set s = xsi.getNodeSet(); return new NodeSetData() { - public Iterator iterator() { return s.iterator(); } + public Iterator iterator() { return s.iterator(); } }; } catch (Exception e) { // log a warning diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMRetrievalMethod.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * =========================================================================== @@ -177,7 +177,7 @@ return type; } - public List getTransforms() { + public List getTransforms() { return transforms; } @@ -245,7 +245,7 @@ // guard against RetrievalMethod loops if ((data instanceof NodeSetData) && Utils.secureValidation(context)) { NodeSetData nsd = (NodeSetData)data; - Iterator i = nsd.iterator(); + Iterator i = nsd.iterator(); if (i.hasNext()) { Node root = (Node)i.next(); if ("RetrievalMethod".equals(root.getLocalName())) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperties.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMSignatureProperties.java 1333415 2012-05-03 12:03:51Z coheigea $ @@ -125,7 +125,7 @@ } } - public List getProperties() { + public List getProperties() { return properties; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignatureProperty.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMSignatureProperty.java 1333415 2012-05-03 12:03:51Z coheigea $ @@ -123,7 +123,7 @@ } } - public List getContent() { + public List getContent() { return content; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSignedInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMSignedInfo.java 1333415 2012-05-03 12:03:51Z coheigea $ @@ -206,7 +206,7 @@ return id; } - public List getReferences() { + public List getReferences() { return references; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMSubTreeData.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id$ @@ -54,7 +54,7 @@ this.excludeComments = excludeComments; } - public Iterator iterator() { + public Iterator iterator() { return new DelayedNodeIterator(root, excludeComments); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMURIDereferencer.java 1231033 2012-01-13 12:12:12Z coheigea $ @@ -111,7 +111,8 @@ try { ResourceResolver apacheResolver = ResourceResolver.getInstance(uriAttr, baseURI, secVal); - XMLSignatureInput in = apacheResolver.resolve(uriAttr, baseURI); + XMLSignatureInput in = apacheResolver.resolve(uriAttr, + baseURI, secVal); if (in.isOctetStream()) { return new ApacheOctetStreamData(in); } else { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509Data.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509Data.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMX509Data.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMX509Data.java 1333415 2012-05-03 12:03:51Z coheigea $ @@ -135,7 +135,7 @@ this.content = Collections.unmodifiableList(content); } - public List getContent() { + public List getContent() { return content; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLObject.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * $Id: DOMXMLObject.java 1333415 2012-05-03 12:03:51Z coheigea $ @@ -139,7 +139,7 @@ this.objectElem = objElem; } - public List getContent() { + public List getContent() { return content; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignature.java Wed Jul 05 19:46:40 2017 +0200 @@ -21,7 +21,7 @@ * under the License. */ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. */ /* * =========================================================================== @@ -188,7 +188,7 @@ return si; } - public List getObjects() { + public List getObjects() { return objects; } @@ -471,7 +471,8 @@ digestReference((DOMReference)xs, signContext); } else if (xs instanceof Manifest) { Manifest man = (Manifest)xs; - List manRefs = man.getReferences(); + List manRefs = + DOMManifest.getManifestReferences(man); for (int i = 0, size = manRefs.size(); i < size; i++) { digestReference((DOMReference)manRefs.get(i), signContext); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java --- a/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMXMLSignatureFactory.java Wed Jul 05 19:46:40 2017 +0200 @@ -58,7 +58,7 @@ return new DOMXMLSignature(si, ki, null, null, null); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public XMLSignature newXMLSignature(SignedInfo si, KeyInfo ki, List objects, String id, String signatureValueId) { return new DOMXMLSignature(si, ki, objects, id, signatureValueId); @@ -68,13 +68,13 @@ return newReference(uri, dm, null, null, null); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public Reference newReference(String uri, DigestMethod dm, List transforms, String type, String id) { return new DOMReference(uri, type, dm, transforms, id, getProvider()); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public Reference newReference(String uri, DigestMethod dm, List appliedTransforms, Data result, List transforms, String type, String id) { @@ -91,7 +91,7 @@ (uri, type, dm, appliedTransforms, result, transforms, id, getProvider()); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public Reference newReference(String uri, DigestMethod dm, List transforms, String type, String id, byte[] digestValue) { if (digestValue == null) { @@ -101,41 +101,41 @@ (uri, type, dm, null, null, transforms, id, digestValue, getProvider()); } - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") public SignedInfo newSignedInfo(CanonicalizationMethod cm, SignatureMethod sm, List references) { return newSignedInfo(cm, sm, references, null); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public SignedInfo newSignedInfo(CanonicalizationMethod cm, SignatureMethod sm, List references, String id) { return new DOMSignedInfo(cm, sm, references, id); } // Object factory methods - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public XMLObject newXMLObject(List content, String id, String mimeType, String encoding) { return new DOMXMLObject(content, id, mimeType, encoding); } - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") public Manifest newManifest(List references) { return newManifest(references, null); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public Manifest newManifest(List references, String id) { return new DOMManifest(references, id); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public SignatureProperties newSignatureProperties(List props, String id) { return new DOMSignatureProperties(props, id); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public SignatureProperty newSignatureProperty (List info, String target, String id) { return new DOMSignatureProperty(info, target, id); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/applet/AppletViewer.java --- a/jdk/src/share/classes/sun/applet/AppletViewer.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/applet/AppletViewer.java Wed Jul 05 19:46:40 2017 +0200 @@ -1000,15 +1000,15 @@ * Scan identifier */ public static String scanIdentifier(Reader in) throws IOException { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); while (true) { if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')) || (c == '_')) { - buf.append((char)c); + sb.append((char) c); c = in.read(); } else { - return buf.toString(); + return sb.toString(); } } } @@ -1031,19 +1031,19 @@ quote = c; c = in.read(); } - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); while ((c > 0) && (((quote < 0) && (c != ' ') && (c != '\t') && (c != '\n') && (c != '\r') && (c != '>')) || ((quote >= 0) && (c != quote)))) { - buf.append((char)c); + sb.append((char) c); c = in.read(); } if (c == quote) { c = in.read(); } skipSpace(in); - val = buf.toString(); + val = sb.toString(); } //statusMsgStream.println("PUT " + att + " = '" + val + "'"); if (! val.equals("")) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/font/Decoration.java --- a/jdk/src/share/classes/sun/font/Decoration.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/font/Decoration.java Wed Jul 05 19:46:40 2017 +0200 @@ -428,17 +428,17 @@ public String toString() { - StringBuffer buf = new StringBuffer(); - buf.append(super.toString()); - buf.append("["); - if (fgPaint != null) buf.append("fgPaint: " + fgPaint); - if (bgPaint != null) buf.append(" bgPaint: " + bgPaint); - if (swapColors) buf.append(" swapColors: true"); - if (strikethrough) buf.append(" strikethrough: true"); - if (stdUnderline != null) buf.append(" stdUnderline: " + stdUnderline); - if (imUnderline != null) buf.append(" imUnderline: " + imUnderline); - buf.append("]"); - return buf.toString(); + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()); + sb.append("["); + if (fgPaint != null) sb.append("fgPaint: " + fgPaint); + if (bgPaint != null) sb.append(" bgPaint: " + bgPaint); + if (swapColors) sb.append(" swapColors: true"); + if (strikethrough) sb.append(" strikethrough: true"); + if (stdUnderline != null) sb.append(" stdUnderline: " + stdUnderline); + if (imUnderline != null) sb.append(" imUnderline: " + imUnderline); + sb.append("]"); + return sb.toString(); } } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/font/ExtendedTextSourceLabel.java --- a/jdk/src/share/classes/sun/font/ExtendedTextSourceLabel.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/font/ExtendedTextSourceLabel.java Wed Jul 05 19:46:40 2017 +0200 @@ -896,31 +896,31 @@ if (true) { return source.toString(TextSource.WITHOUT_CONTEXT); } - StringBuffer buf = new StringBuffer(); - buf.append(super.toString()); - buf.append("[source:"); - buf.append(source.toString(TextSource.WITHOUT_CONTEXT)); - buf.append(", lb:"); - buf.append(lb); - buf.append(", ab:"); - buf.append(ab); - buf.append(", vb:"); - buf.append(vb); - buf.append(", gv:"); - buf.append(gv); - buf.append(", ci: "); + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()); + sb.append("[source:"); + sb.append(source.toString(TextSource.WITHOUT_CONTEXT)); + sb.append(", lb:"); + sb.append(lb); + sb.append(", ab:"); + sb.append(ab); + sb.append(", vb:"); + sb.append(vb); + sb.append(", gv:"); + sb.append(gv); + sb.append(", ci: "); if (charinfo == null) { - buf.append("null"); + sb.append("null"); } else { - buf.append(charinfo[0]); + sb.append(charinfo[0]); for (int i = 1; i < charinfo.length;) { - buf.append(i % numvals == 0 ? "; " : ", "); - buf.append(charinfo[i]); + sb.append(i % numvals == 0 ? "; " : ", "); + sb.append(charinfo[i]); } } - buf.append("]"); + sb.append("]"); - return buf.toString(); + return sb.toString(); } //public static ExtendedTextLabel create(TextSource source) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/font/StandardTextSource.java --- a/jdk/src/share/classes/sun/font/StandardTextSource.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/font/StandardTextSource.java Wed Jul 05 19:46:40 2017 +0200 @@ -210,16 +210,16 @@ } public String toString(boolean withContext) { - StringBuffer buf = new StringBuffer(super.toString()); - buf.append("[start:"); - buf.append(start); - buf.append(", len:" ); - buf.append(len); - buf.append(", cstart:"); - buf.append(cstart); - buf.append(", clen:" ); - buf.append(clen); - buf.append(", chars:\""); + StringBuilder sb = new StringBuilder(super.toString()); + sb.append("[start:"); + sb.append(start); + sb.append(", len:" ); + sb.append(len); + sb.append(", cstart:"); + sb.append(cstart); + sb.append(", clen:" ); + sb.append(clen); + sb.append(", chars:\""); int chStart, chLimit; if (withContext == WITH_CONTEXT) { chStart = cstart; @@ -231,23 +231,23 @@ } for (int i = chStart; i < chLimit; ++i) { if (i > chStart) { - buf.append(" "); + sb.append(" "); } - buf.append(Integer.toHexString(chars[i])); + sb.append(Integer.toHexString(chars[i])); } - buf.append("\""); - buf.append(", level:"); - buf.append(level); - buf.append(", flags:"); - buf.append(flags); - buf.append(", font:"); - buf.append(font); - buf.append(", frc:"); - buf.append(frc); - buf.append(", cm:"); - buf.append(cm); - buf.append("]"); + sb.append("\""); + sb.append(", level:"); + sb.append(level); + sb.append(", flags:"); + sb.append(flags); + sb.append(", font:"); + sb.append(font); + sb.append(", frc:"); + sb.append(frc); + sb.append(", cm:"); + sb.append(cm); + sb.append("]"); - return buf.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/font/Type1Font.java --- a/jdk/src/share/classes/sun/font/Type1Font.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/font/Type1Font.java Wed Jul 05 19:46:40 2017 +0200 @@ -529,7 +529,7 @@ } private String expandName(String s, boolean tryExpandAbbreviations) { - StringBuffer res = new StringBuffer(s.length() + 10); + StringBuilder res = new StringBuilder(s.length() + 10); int start=0, end; while(start < s.length()) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/java2d/opengl/OGLContext.java --- a/jdk/src/share/classes/sun/java2d/opengl/OGLContext.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/java2d/opengl/OGLContext.java Wed Jul 05 19:46:40 2017 +0200 @@ -201,29 +201,29 @@ @Override public String toString() { - StringBuffer buf = new StringBuffer(super.toString()); + StringBuilder sb = new StringBuilder(super.toString()); if ((caps & CAPS_EXT_FBOBJECT) != 0) { - buf.append("CAPS_EXT_FBOBJECT|"); + sb.append("CAPS_EXT_FBOBJECT|"); } if ((caps & CAPS_STORED_ALPHA) != 0) { - buf.append("CAPS_STORED_ALPHA|"); + sb.append("CAPS_STORED_ALPHA|"); } if ((caps & CAPS_DOUBLEBUFFERED) != 0) { - buf.append("CAPS_DOUBLEBUFFERED|"); + sb.append("CAPS_DOUBLEBUFFERED|"); } if ((caps & CAPS_EXT_LCD_SHADER) != 0) { - buf.append("CAPS_EXT_LCD_SHADER|"); + sb.append("CAPS_EXT_LCD_SHADER|"); } if ((caps & CAPS_EXT_BIOP_SHADER) != 0) { - buf.append("CAPS_BIOP_SHADER|"); + sb.append("CAPS_BIOP_SHADER|"); } if ((caps & CAPS_EXT_GRAD_SHADER) != 0) { - buf.append("CAPS_EXT_GRAD_SHADER|"); + sb.append("CAPS_EXT_GRAD_SHADER|"); } if ((caps & CAPS_EXT_TEXRECT) != 0) { - buf.append("CAPS_EXT_TEXRECT|"); + sb.append("CAPS_EXT_TEXRECT|"); } - return buf.toString(); + return sb.toString(); } } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/java2d/pipe/Region.java --- a/jdk/src/share/classes/sun/java2d/pipe/Region.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/java2d/pipe/Region.java Wed Jul 05 19:46:40 2017 +0200 @@ -1277,7 +1277,7 @@ } public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("Region[["); sb.append(lox); sb.append(", "); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/java2d/pipe/hw/ContextCapabilities.java --- a/jdk/src/share/classes/sun/java2d/pipe/hw/ContextCapabilities.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/java2d/pipe/hw/ContextCapabilities.java Wed Jul 05 19:46:40 2017 +0200 @@ -93,37 +93,37 @@ @Override public String toString() { - StringBuffer buf = - new StringBuffer("ContextCapabilities: adapter=" + + StringBuilder sb = + new StringBuilder("ContextCapabilities: adapter=" + adapterId+", caps="); if (caps == CAPS_EMPTY) { - buf.append("CAPS_EMPTY"); + sb.append("CAPS_EMPTY"); } else { if ((caps & CAPS_RT_PLAIN_ALPHA) != 0) { - buf.append("CAPS_RT_PLAIN_ALPHA|"); + sb.append("CAPS_RT_PLAIN_ALPHA|"); } if ((caps & CAPS_RT_TEXTURE_ALPHA) != 0) { - buf.append("CAPS_RT_TEXTURE_ALPHA|"); + sb.append("CAPS_RT_TEXTURE_ALPHA|"); } if ((caps & CAPS_RT_TEXTURE_OPAQUE) != 0) { - buf.append("CAPS_RT_TEXTURE_OPAQUE|"); + sb.append("CAPS_RT_TEXTURE_OPAQUE|"); } if ((caps & CAPS_MULTITEXTURE) != 0) { - buf.append("CAPS_MULTITEXTURE|"); + sb.append("CAPS_MULTITEXTURE|"); } if ((caps & CAPS_TEXNONPOW2) != 0) { - buf.append("CAPS_TEXNONPOW2|"); + sb.append("CAPS_TEXNONPOW2|"); } if ((caps & CAPS_TEXNONSQUARE) != 0) { - buf.append("CAPS_TEXNONSQUARE|"); + sb.append("CAPS_TEXNONSQUARE|"); } if ((caps & CAPS_PS20) != 0) { - buf.append("CAPS_PS20|"); + sb.append("CAPS_PS20|"); } if ((caps & CAPS_PS30) != 0) { - buf.append("CAPS_PS30|"); + sb.append("CAPS_PS30|"); } } - return buf.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/jvmstat/monitor/HostIdentifier.java --- a/jdk/src/share/classes/sun/jvmstat/monitor/HostIdentifier.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/jvmstat/monitor/HostIdentifier.java Wed Jul 05 19:46:40 2017 +0200 @@ -358,7 +358,7 @@ URI nuri = null; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(scheme).append("://"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/jvmstat/monitor/MonitoredHost.java --- a/jdk/src/share/classes/sun/jvmstat/monitor/MonitoredHost.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/jvmstat/monitor/MonitoredHost.java Wed Jul 05 19:46:40 2017 +0200 @@ -257,7 +257,7 @@ throws MonitorException { String hostname = hostId.getHost(); String scheme = hostId.getScheme(); - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); assert hostname != null; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/jvmstat/monitor/VmIdentifier.java --- a/jdk/src/share/classes/sun/jvmstat/monitor/VmIdentifier.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/jvmstat/monitor/VmIdentifier.java Wed Jul 05 19:46:40 2017 +0200 @@ -255,7 +255,7 @@ * a MonitorException in a future version. */ public HostIdentifier getHostIdentifier() throws URISyntaxException { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (getScheme() != null) { sb.append(getScheme()).append(":"); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/management/Agent.java --- a/jdk/src/share/classes/sun/management/Agent.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/management/Agent.java Wed Jul 05 19:46:40 2017 +0200 @@ -34,7 +34,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.InetAddress; -import java.net.Socket; import java.net.UnknownHostException; import java.text.MessageFormat; import java.util.MissingResourceException; @@ -88,7 +87,7 @@ // return empty property set private static Properties parseString(String args) { Properties argProps = new Properties(); - if (args != null) { + if (args != null && !args.trim().equals("")) { for (String option : args.split(",")) { String s[] = option.split("=", 2); String name = s[0].trim(); @@ -160,53 +159,59 @@ throw new RuntimeException(getText(INVALID_STATE, "Agent already started")); } - Properties argProps = parseString(args); - Properties configProps = new Properties(); + try { + Properties argProps = parseString(args); + Properties configProps = new Properties(); - // Load the management properties from the config file - // if config file is not specified readConfiguration implicitly - // reads /lib/management/management.properties + // Load the management properties from the config file + // if config file is not specified readConfiguration implicitly + // reads /lib/management/management.properties + + String fname = System.getProperty(CONFIG_FILE); + readConfiguration(fname, configProps); - String fname = System.getProperty(CONFIG_FILE); - readConfiguration(fname, configProps); + // management properties can be overridden by system properties + // which take precedence + Properties sysProps = System.getProperties(); + synchronized (sysProps) { + configProps.putAll(sysProps); + } - // management properties can be overridden by system properties - // which take precedence - Properties sysProps = System.getProperties(); - synchronized (sysProps) { - configProps.putAll(sysProps); - } + // if user specifies config file into command line for either + // jcmd utilities or attach command it overrides properties set in + // command line at the time of VM start + String fnameUser = argProps.getProperty(CONFIG_FILE); + if (fnameUser != null) { + readConfiguration(fnameUser, configProps); + } - // if user specifies config file into command line for either - // jcmd utilities or attach command it overrides properties set in - // command line at the time of VM start - String fnameUser = argProps.getProperty(CONFIG_FILE); - if (fnameUser != null) { - readConfiguration(fnameUser, configProps); - } + // arguments specified in command line of jcmd utilities + // override both system properties and one set by config file + // specified in jcmd command line + configProps.putAll(argProps); - // arguments specified in command line of jcmd utilities - // override both system properties and one set by config file - // specified in jcmd command line - configProps.putAll(argProps); + // jcmd doesn't allow to change ThreadContentionMonitoring, but user + // can specify this property inside config file, so enable optional + // monitoring functionality if this property is set + final String enableThreadContentionMonitoring = + configProps.getProperty(ENABLE_THREAD_CONTENTION_MONITORING); - // jcmd doesn't allow to change ThreadContentionMonitoring, but user - // can specify this property inside config file, so enable optional - // monitoring functionality if this property is set - final String enableThreadContentionMonitoring = - configProps.getProperty(ENABLE_THREAD_CONTENTION_MONITORING); + if (enableThreadContentionMonitoring != null) { + ManagementFactory.getThreadMXBean(). + setThreadContentionMonitoringEnabled(true); + } - if (enableThreadContentionMonitoring != null) { - ManagementFactory.getThreadMXBean(). - setThreadContentionMonitoringEnabled(true); - } + String jmxremotePort = configProps.getProperty(JMXREMOTE_PORT); + if (jmxremotePort != null) { + jmxServer = ConnectorBootstrap. + startRemoteConnectorServer(jmxremotePort, configProps); - String jmxremotePort = configProps.getProperty(JMXREMOTE_PORT); - if (jmxremotePort != null) { - jmxServer = ConnectorBootstrap. - startRemoteConnectorServer(jmxremotePort, configProps); - - startDiscoveryService(configProps); + startDiscoveryService(configProps); + } else { + throw new AgentConfigurationError(INVALID_JMXREMOTE_PORT, "No port specified"); + } + } catch (AgentConfigurationError err) { + error(err.getError(), err.getParams()); } } @@ -401,7 +406,7 @@ if (home == null) { throw new Error("Can't find java.home ??"); } - StringBuffer defaultFileName = new StringBuffer(home); + StringBuilder defaultFileName = new StringBuilder(home); defaultFileName.append(File.separator).append("lib"); defaultFileName.append(File.separator).append("management"); defaultFileName.append(File.separator).append("management.properties"); @@ -495,7 +500,7 @@ if (params == null || params.length == 0) { error(key); } else { - StringBuffer message = new StringBuffer(params[0]); + StringBuilder message = new StringBuilder(params[0]); for (int i = 1; i < params.length; i++) { message.append(" " + params[i]); } @@ -507,7 +512,7 @@ String keyText = getText(key); System.err.print(getText("agent.err.error") + ": " + keyText); System.err.println(": " + message); - throw new RuntimeException(keyText); + throw new RuntimeException(keyText + ": " + message); } public static void error(Exception e) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/management/manifest --- a/jdk/src/share/classes/sun/management/manifest Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -Premain-Class: sun.management.Agent -Agent-Class: sun.management.Agent - diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/management/resources/agent.properties --- a/jdk/src/share/classes/sun/management/resources/agent.properties Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/management/resources/agent.properties Wed Jul 05 19:46:40 2017 +0200 @@ -43,7 +43,7 @@ agent.err.premain.notfound = premain(String) does not exist in agent class agent.err.agentclass.access.denied = Access to premain(String) is denied agent.err.invalid.agentclass = Invalid com.sun.management.agent.class property value -agent.err.invalid.state = Invalid agent state +agent.err.invalid.state = Invalid agent state: {0} agent.err.invalid.jmxremote.port = Invalid com.sun.management.jmxremote.port number agent.err.invalid.jmxremote.rmi.port = Invalid com.sun.management.jmxremote.rmi.port number diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/management/snmp/jvminstr/JvmThreadInstanceEntryImpl.java --- a/jdk/src/share/classes/sun/management/snmp/jvminstr/JvmThreadInstanceEntryImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/management/snmp/jvminstr/JvmThreadInstanceEntryImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -311,19 +311,19 @@ StackTraceElement[] stackTrace = info.getStackTrace(); //We append the stack trace in a buffer // XXX Revisit: should check isDebugOn() - StringBuffer b = new StringBuffer(); + StringBuilder sb = new StringBuilder(); final int stackSize = stackTrace.length; log.debug("getJvmThreadInstStackTrace", "Stack size : " + stackSize); for(int i = 0; i < stackSize; i++) { log.debug("getJvmThreadInstStackTrace", "Append " + stackTrace[i].toString()); - b.append(stackTrace[i].toString()); + sb.append(stackTrace[i].toString()); //Append \n at the end of each line except the last one if(i < stackSize) - b.append("\n"); + sb.append("\n"); } //The stack trace is truncated if its size exceeds 255. - return validPathElementTC(b.toString()); + return validPathElementTC(sb.toString()); } static final MibLogger log = new MibLogger(JvmThreadInstanceEntryImpl.class); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/misc/MessageUtils.java --- a/jdk/src/share/classes/sun/misc/MessageUtils.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/misc/MessageUtils.java Wed Jul 05 19:46:40 2017 +0200 @@ -55,7 +55,7 @@ } public static String subst(String patt, String args[]) { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); int len = patt.length(); for (int i = 0; i >= 0 && i < len; i++) { char ch = patt.charAt(i); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/misc/Timeable.java --- a/jdk/src/share/classes/sun/misc/Timeable.java Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/* - * Copyright (c) 1995, 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. - */ - -package sun.misc; - -/** - * This interface is used by the Timer class. A class that uses - * Timer objects must implement this interface. - * - * @see Timer - * @author Patrick Chan - */ -public interface Timeable { - /** - * This method is executed every time a timer owned by this - * object ticks. An object can own more than one timer but - * all timers call this method when they tick; - * you can use the supplied timer parameter to determine - * which timer has ticked. - * @param timer a handle to the timer that has just ticked. - */ - public void tick(Timer timer); -} diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/misc/Timer.java --- a/jdk/src/share/classes/sun/misc/Timer.java Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,647 +0,0 @@ -/* - * Copyright (c) 1995, 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. - */ - -package sun.misc; - -/** - A Timer object is used by algorithms that require timed events. - For example, in an animation loop, a timer would help in - determining when to change frames. - - A timer has an interval which determines when it "ticks"; - that is, a timer delays for the specified interval and then - it calls the owner's tick() method. - - Here's an example of creating a timer with a 5 sec interval: - -
    -    class Main implements Timeable {
    -        public void tick(Timer timer) {
    -            System.out.println("tick");
    -        }
    -        public static void main(String args[]) {
    -            (new Timer(this, 5000)).cont();
    -        }
    -    }
    -    
    - - A timer can be stopped, continued, or reset at any time. - A timer's state is not stopped while it's calling the - owner's tick() method. - - A timer can be regular or irregular. If in regular mode, - a timer ticks at the specified interval, regardless of - how long the owner's tick() method takes. While the timer - is running, no ticks are ever discarded. That means that if - the owner's tick() method takes longer than the interval, - the ticks that would have occurred are delivered immediately. - - In irregular mode, a timer starts delaying for exactly - the specified interval only after the tick() method returns. - - Synchronization issues: do not hold the timer's monitor - while calling any of the Timer operations below otherwise - the Timer class will deadlock. - - @author Patrick Chan -*/ - -/* - Synchronization issues: there are two data structures that - require locking. A Timer object and the Timer queue - (described in the TimerThread class). To avoid deadlock, - the timer queue monitor is always acquired before the timer - object's monitor. However, the timer queue monitor is acquired - only if the timer operation will make use of the timer - queue, e.g. stop(). - - The class monitor on the class TimerThread severs as the monitor - to the timer queue. - - Possible feature: perhaps a timer should have an associated - thread priority. The thread that makes the callback temporarily - takes on that priority before calling the owner's tick() method. -*/ - -public class Timer { - /** - * This is the owner of the timer. Its tick method is - * called when the timer ticks. - */ - public Timeable owner; - - /* - * This is the interval of time in ms. - */ - long interval; - - /* - * This variable is used for two different purposes. - * This is done in order to save space. - * If 'stopped' is true, this variable holds the time - * that the timer was stopped; otherwise, this variable - * is used by the TimerThread to determine when the timer - * should tick. - */ - long sleepUntil; - - /* - * This is the time remaining before the timer ticks. It - * is only valid if 'stopped' is true. If the timer is - * continued, the next tick will happen remaingTime - * milliseconds later. - */ - long remainingTime; - - /* - * True iff the timer is in regular mode. - */ - boolean regular; - - /* - * True iff the timer has been stopped. - */ - boolean stopped; - - /* ************************************************************** - * Timer queue-related variables - * ************************************************************** */ - - /* - * A link to another timer object. This is used while the - * timer object is enqueued in the timer queue. - */ - Timer next; - - /* ************************************************************** - * Timer methods - * ************************************************************** */ - - /* - * This variable holds a handle to the TimerThread class for - * the purpose of getting at the class monitor. The reason - * why Class.forName("TimerThread") is not used is because it - * doesn't appear to work when loaded via a net class loader. - */ - static TimerThread timerThread = null; - - /** - * Creates a timer object that is owned by 'owner' and - * with the interval 'interval' milliseconds. The new timer - * object is stopped and is regular. getRemainingTime() - * return 'interval' at this point. getStopTime() returns - * the time this object was created. - * @param owner owner of the timer object - * @param interval interval of the timer in milliseconds - */ - public Timer(Timeable owner, long interval) { - this.owner = owner; - this.interval = interval; - remainingTime = interval; - regular = true; - sleepUntil = System.currentTimeMillis(); - stopped = true; - synchronized (getClass()) { - if (timerThread == null) { - timerThread = new TimerThread(); - } - } - } - - /** - * Returns true if this timer is stopped. - */ - public synchronized boolean isStopped() { - return stopped; - } - - /** - * Stops the timer. The amount of time the timer has already - * delayed is saved so if the timer is continued, it will only - * delay for the amount of time remaining. - * Note that even after stopping a timer, one more tick may - * still occur. - * This method is MT-safe; i.e. it is synchronized but for - * implementation reasons, the synchronized modifier cannot - * be included in the method declaration. - */ - public void stop() { - long now = System.currentTimeMillis(); - - synchronized (timerThread) { - synchronized (this) { - if (!stopped) { - TimerThread.dequeue(this); - remainingTime = Math.max(0, sleepUntil - now); - sleepUntil = now; // stop time - stopped = true; - } - } - } - } - - /** - * Continue the timer. The next tick will come at getRemainingTime() - * milliseconds later. If the timer is not stopped, this - * call will be a no-op. - * This method is MT-safe; i.e. it is synchronized but for - * implementation reasons, the synchronized modifier cannot - * be included in the method declaration. - */ - public void cont() { - synchronized (timerThread) { - synchronized (this) { - if (stopped) { - // The TimerTickThread avoids requeuing the - // timer only if the sleepUntil value has changed. - // The following guarantees that the sleepUntil - // value will be different; without this guarantee, - // it's theoretically possible for the timer to be - // inserted twice. - sleepUntil = Math.max(sleepUntil + 1, - System.currentTimeMillis() + remainingTime); - TimerThread.enqueue(this); - stopped = false; - } - } - } - } - - /** - * Resets the timer's remaining time to the timer's interval. - * If the timer's running state is not altered. - */ - public void reset() { - synchronized (timerThread) { - synchronized (this) { - setRemainingTime(interval); - } - } - } - - /** - * Returns the time at which the timer was last stopped. The - * return value is valid only if the timer is stopped. - */ - public synchronized long getStopTime() { - return sleepUntil; - } - - /** - * Returns the timer's interval. - */ - public synchronized long getInterval() { - return interval; - } - - /** - * Changes the timer's interval. The new interval setting - * does not take effect until after the next tick. - * This method does not alter the remaining time or the - * running state of the timer. - * @param interval new interval of the timer in milliseconds - */ - public synchronized void setInterval(long interval) { - this.interval = interval; - } - - /** - * Returns the remaining time before the timer's next tick. - * The return value is valid only if timer is stopped. - */ - public synchronized long getRemainingTime() { - return remainingTime; - } - - /** - * Sets the remaining time before the timer's next tick. - * This method does not alter the timer's running state. - * This method is MT-safe; i.e. it is synchronized but for - * implementation reasons, the synchronized modifier cannot - * be included in the method declaration. - * @param time new remaining time in milliseconds. - */ - public void setRemainingTime(long time) { - synchronized (timerThread) { - synchronized (this) { - if (stopped) { - remainingTime = time; - } else { - stop(); - remainingTime = time; - cont(); - } - } - } - } - - /** - * In regular mode, a timer ticks at the specified interval, - * regardless of how long the owner's tick() method takes. - * While the timer is running, no ticks are ever discarded. - * That means that if the owner's tick() method takes longer - * than the interval, the ticks that would have occurred are - * delivered immediately. - * - * In irregular mode, a timer starts delaying for exactly - * the specified interval only after the tick() method returns. - */ - public synchronized void setRegular(boolean regular) { - this.regular = regular; - } - - /* - * This method is used only for testing purposes. - */ - protected Thread getTimerThread() { - return TimerThread.timerThread; - } -} - - -/* - -This class implements the timer queue and is exclusively used by the -Timer class. There are only two methods exported to the Timer class - -enqueue, for inserting a timer into queue and dequeue, for removing -a timer from the queue. - -A timer in the timer queue is awaiting a tick. When a timer is to be -ticked, it is removed from the timer queue before the owner's tick() -method is called. - -A single timer thread manages the timer queue. This timer thread -looks at the head of the timer queue and delays until it's time for -the timer to tick. When the time comes, the timer thread creates a -callback thread to call the timer owner's tick() method. The timer -thread then processes the next timer in the queue. - -When a timer is inserted at the head of the queue, the timer thread is -notified. This causes the timer thread to prematurely wake up and -process the new head of the queue. - -*/ - -class TimerThread extends Thread { - /* - * Set to true to get debugging output. - */ - public static boolean debug = false; - - /* - * This is a handle to the thread managing the thread queue. - */ - static TimerThread timerThread; - - /* - * This flag is set if the timer thread has been notified - * while it was in the timed wait. This flag allows the - * timer thread to tell whether or not the wait completed. - */ - static boolean notified = false; - - protected TimerThread() { - super("TimerThread"); - timerThread = this; - start(); - } - - public synchronized void run() { - while (true) { - long delay; - - while (timerQueue == null) { - try { - wait(); - } catch (InterruptedException ex) { - // Just drop through and check timerQueue. - } - } - notified = false; - delay = timerQueue.sleepUntil - System.currentTimeMillis(); - if (delay > 0) { - try { - wait(delay); - } catch (InterruptedException ex) { - // Just drop through. - } - } - // remove from timer queue. - if (!notified) { - Timer timer = timerQueue; - timerQueue = timerQueue.next; - TimerTickThread thr = TimerTickThread.call( - timer, timer.sleepUntil); - if (debug) { - long delta = (System.currentTimeMillis() - timer.sleepUntil); - System.out.println("tick(" + thr.getName() + "," - + timer.interval + ","+delta+ ")"); - if (delta > 250) { - System.out.println("*** BIG DELAY ***"); - } - } - } - } - } - - /* ******************************************************* - Timer Queue - ******************************************************* */ - - /* - * The timer queue is a queue of timers waiting to tick. - */ - static Timer timerQueue = null; - - /* - * Uses timer.sleepUntil to determine where in the queue - * to insert the timer object. - * A new ticker thread is created only if the timer - * is inserted at the beginning of the queue. - * The timer must not already be in the queue. - * Assumes the caller has the TimerThread monitor. - */ - static protected void enqueue(Timer timer) { - Timer prev = null; - Timer cur = timerQueue; - - if (cur == null || timer.sleepUntil <= cur.sleepUntil) { - // insert at front of queue - timer.next = timerQueue; - timerQueue = timer; - notified = true; - timerThread.notify(); - } else { - do { - prev = cur; - cur = cur.next; - } while (cur != null && timer.sleepUntil > cur.sleepUntil); - // insert or append to the timer queue - timer.next = cur; - prev.next = timer; - } - if (debug) { - long now = System.currentTimeMillis(); - - System.out.print(Thread.currentThread().getName() - + ": enqueue " + timer.interval + ": "); - cur = timerQueue; - while(cur != null) { - long delta = cur.sleepUntil - now; - System.out.print(cur.interval + "(" + delta + ") "); - cur = cur.next; - } - System.out.println(); - } - } - - /* - * If the timer is not in the queue, returns false; - * otherwise removes the timer from the timer queue and returns true. - * Assumes the caller has the TimerThread monitor. - */ - static protected boolean dequeue(Timer timer) { - Timer prev = null; - Timer cur = timerQueue; - - while (cur != null && cur != timer) { - prev = cur; - cur = cur.next; - } - if (cur == null) { - if (debug) { - System.out.println(Thread.currentThread().getName() - + ": dequeue " + timer.interval + ": no-op"); - } - return false; - } if (prev == null) { - timerQueue = timer.next; - notified = true; - timerThread.notify(); - } else { - prev.next = timer.next; - } - timer.next = null; - if (debug) { - long now = System.currentTimeMillis(); - - System.out.print(Thread.currentThread().getName() - + ": dequeue " + timer.interval + ": "); - cur = timerQueue; - while(cur != null) { - long delta = cur.sleepUntil - now; - System.out.print(cur.interval + "(" + delta + ") "); - cur = cur.next; - } - System.out.println(); - } - return true; - } - - /* - * Inserts the timer back into the queue. This method - * is used by a callback thread after it has called the - * timer owner's tick() method. This method recomputes - * the sleepUntil field. - * Assumes the caller has the TimerThread and Timer monitor. - */ - protected static void requeue(Timer timer) { - if (!timer.stopped) { - long now = System.currentTimeMillis(); - if (timer.regular) { - timer.sleepUntil += timer.interval; - } else { - timer.sleepUntil = now + timer.interval; - } - enqueue(timer); - } else if (debug) { - System.out.println(Thread.currentThread().getName() - + ": requeue " + timer.interval + ": no-op"); - } - } -} - -/* - -This class implements a simple thread whose only purpose is to call a -timer owner's tick() method. A small fixed-sized pool of threads is -maintained and is protected by the class monitor. If the pool is -exhausted, a new thread is temporarily created and destroyed when -done. - -A thread that's in the pool waits on it's own monitor. When the -thread is retrieved from the pool, the retriever notifies the thread's -monitor. - -*/ - -class TimerTickThread extends Thread { - /* - * Maximum size of the thread pool. - */ - static final int MAX_POOL_SIZE = 3; - - /* - * Number of threads in the pool. - */ - static int curPoolSize = 0; - - /* - * The pool of timer threads. - */ - static TimerTickThread pool = null; - - /* - * Is used when linked into the thread pool. - */ - TimerTickThread next = null; - - /* - * This is the handle to the timer whose owner's - * tick() method will be called. - */ - Timer timer; - - /* - * The value of a timer's sleepUntil value is captured here. - * This is used to determine whether or not the timer should - * be reinserted into the queue. If the timer's sleepUntil - * value has changed, the timer is not reinserted. - */ - long lastSleepUntil; - - /* - * Creates a new callback thread to call the timer owner's - * tick() method. A thread is taken from the pool if one - * is available, otherwise, a new thread is created. - * The thread handle is returned. - */ - protected static synchronized TimerTickThread call( - Timer timer, long sleepUntil) { - TimerTickThread thread = pool; - - if (thread == null) { - // create one. - thread = new TimerTickThread(); - thread.timer = timer; - thread.lastSleepUntil = sleepUntil; - thread.start(); - } else { - pool = pool.next; - thread.timer = timer; - thread.lastSleepUntil = sleepUntil; - synchronized (thread) { - thread.notify(); - } - } - return thread; - } - - /* - * Returns false if the thread should simply exit; - * otherwise the thread is returned the pool, where - * it waits to be notified. (I did try to use the - * class monitor but the time between the notify - * and breaking out of the wait seemed to take - * significantly longer; need to look into this later.) - */ - private boolean returnToPool() { - synchronized (getClass()) { - if (curPoolSize >= MAX_POOL_SIZE) { - return false; - } - next = pool; - pool = this; - curPoolSize++; - timer = null; - } - while (timer == null) { - synchronized (this) { - try { - wait(); - } catch (InterruptedException ex) { - // Just drop through and retest timer. - } - } - } - synchronized (getClass()) { - curPoolSize--; - } - return true; - } - - public void run() { - do { - timer.owner.tick(timer); - synchronized (TimerThread.timerThread) { - synchronized (timer) { - if (lastSleepUntil == timer.sleepUntil) { - TimerThread.requeue(timer); - } - } - } - } while (returnToPool()); - } -} diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/misc/UUDecoder.java --- a/jdk/src/share/classes/sun/misc/UUDecoder.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/misc/UUDecoder.java Wed Jul 05 19:46:40 2017 +0200 @@ -123,7 +123,7 @@ throws IOException { int i, c1, c2, c3, c4; int a, b, c; - StringBuffer x = new StringBuffer(); + StringBuilder x = new StringBuilder(); for (i = 0; i < 4; i++) { c1 = inStream.read(); @@ -152,7 +152,7 @@ */ protected void decodeBufferPrefix(PushbackInputStream inStream, OutputStream outStream) throws IOException { int c; - StringBuffer q = new StringBuffer(32); + StringBuilder q = new StringBuilder(32); String r; boolean sawNewLine; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/net/TransferProtocolClient.java --- a/jdk/src/share/classes/sun/net/TransferProtocolClient.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/net/TransferProtocolClient.java Wed Jul 05 19:46:40 2017 +0200 @@ -53,7 +53,7 @@ * number. Returns -1 on failure. */ public int readServerResponse() throws IOException { - StringBuffer replyBuf = new StringBuffer(32); + StringBuilder replyBuf = new StringBuilder(32); int c; int continuingCode = -1; int code; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java --- a/jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java Wed Jul 05 19:46:40 2017 +0200 @@ -408,7 +408,7 @@ * number. Returns -1 on failure. */ private int readServerResponse() throws IOException { - StringBuffer replyBuf = new StringBuffer(32); + StringBuilder replyBuf = new StringBuilder(32); int c; int continuingCode = -1; int code; @@ -1050,7 +1050,7 @@ // keep the welcome message around so we can // put it in the resulting HTML page. String l; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < serverResponse.size(); i++) { l = serverResponse.elementAt(i); if (l != null) { @@ -1095,7 +1095,7 @@ // keep the welcome message around so we can // put it in the resulting HTML page. - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (serverResponse != null) { for (String l : serverResponse) { if (l != null) { @@ -1493,7 +1493,7 @@ * So we need to remove the 1st and last line */ Vector resp = getResponseStrings(); - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 1; i < resp.size() - 1; i++) { sb.append(resp.get(i)); } @@ -1985,7 +1985,7 @@ * by the server. */ public String getLastResponseString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (serverResponse != null) { for (String l : serverResponse) { if (l != null) { @@ -2188,7 +2188,7 @@ } // on multiple lines answers, like the ones above, remove 1st and last // line, concat the the others. - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 1; i < resp.size() - 1; i++) { sb.append(resp.get(i).substring(3)); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/net/www/MimeEntry.java --- a/jdk/src/share/classes/sun/net/www/MimeEntry.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/net/www/MimeEntry.java Wed Jul 05 19:46:40 2017 +0200 @@ -281,52 +281,52 @@ } public synchronized String toProperty() { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); String separator = "; "; boolean needSeparator = false; int action = getAction(); if (action != MimeEntry.UNKNOWN) { - buf.append("action=" + actionKeywords[action]); + sb.append("action=" + actionKeywords[action]); needSeparator = true; } String command = getLaunchString(); if (command != null && command.length() > 0) { if (needSeparator) { - buf.append(separator); + sb.append(separator); } - buf.append("application=" + command); + sb.append("application=" + command); needSeparator = true; } if (getImageFileName() != null) { if (needSeparator) { - buf.append(separator); + sb.append(separator); } - buf.append("icon=" + getImageFileName()); + sb.append("icon=" + getImageFileName()); needSeparator = true; } String extensions = getExtensionsAsList(); if (extensions.length() > 0) { if (needSeparator) { - buf.append(separator); + sb.append(separator); } - buf.append("file_extensions=" + extensions); + sb.append("file_extensions=" + extensions); needSeparator = true; } String description = getDescription(); if (description != null && !description.equals(getType())) { if (needSeparator) { - buf.append(separator); + sb.append(separator); } - buf.append("description=" + description); + sb.append("description=" + description); } - return buf.toString(); + return sb.toString(); } public String toString() { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/net/www/http/HttpClient.java --- a/jdk/src/share/classes/sun/net/www/http/HttpClient.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/net/www/http/HttpClient.java Wed Jul 05 19:46:40 2017 +0200 @@ -558,7 +558,7 @@ // Do not use URLStreamHandler.toExternalForm as the fragment // should not be part of the RequestURI. It should be an // absolute URI which does not have a fragment part. - StringBuffer result = new StringBuffer(128); + StringBuilder result = new StringBuilder(128); result.append(url.getProtocol()); result.append(":"); if (url.getAuthority() != null && url.getAuthority().length() > 0) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java --- a/jdk/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java Wed Jul 05 19:46:40 2017 +0200 @@ -191,7 +191,7 @@ if (isDirectory) { FileNameMap map = java.net.URLConnection.getFileNameMap(); - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); if (files == null) { throw new FileNotFoundException(filename); @@ -201,11 +201,11 @@ for (int i = 0 ; i < files.size() ; i++) { String fileName = files.get(i); - buf.append(fileName); - buf.append("\n"); + sb.append(fileName); + sb.append("\n"); } // Put it into a (default) locale-specific byte-stream. - is = new ByteArrayInputStream(buf.toString().getBytes()); + is = new ByteArrayInputStream(sb.toString().getBytes()); } else { throw new FileNotFoundException(filename); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java --- a/jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Wed Jul 05 19:46:40 2017 +0200 @@ -532,7 +532,7 @@ } byte[] digest = md.digest(); - StringBuffer res = new StringBuffer(digest.length * 2); + StringBuilder res = new StringBuilder(digest.length * 2); for (int i = 0; i < digest.length; i++) { int hashchar = ((digest[i] >>> 4) & 0xf); res.append(charArray[hashchar]); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java --- a/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -382,7 +382,7 @@ } public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(this.getClass().getName()); sb.append('['); if (!isOpen()) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java --- a/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -983,7 +983,7 @@ @Override public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(this.getClass().getSuperclass().getName()); sb.append('['); if (!isOpen()) diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/print/PSPrinterJob.java --- a/jdk/src/share/classes/sun/print/PSPrinterJob.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/print/PSPrinterJob.java Wed Jul 05 19:46:40 2017 +0200 @@ -1269,7 +1269,7 @@ CharsetString cs = acs[i]; CharsetEncoder fontCS = cs.fontDescriptor.encoder; - StringBuffer nativeStr = new StringBuffer(); + StringBuilder nativeStr = new StringBuilder(); byte[] strSeg = new byte[cs.length * 2]; int len = 0; try { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/reflect/MethodAccessorGenerator.java --- a/jdk/src/share/classes/sun/reflect/MethodAccessorGenerator.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/reflect/MethodAccessorGenerator.java Wed Jul 05 19:46:40 2017 +0200 @@ -751,14 +751,14 @@ } private String buildInternalSignature() { - StringBuffer buf = new StringBuffer(); - buf.append("("); + StringBuilder sb = new StringBuilder(); + sb.append("("); for (int i = 0; i < parameterTypes.length; i++) { - buf.append(getClassName(parameterTypes[i], true)); + sb.append(getClassName(parameterTypes[i], true)); } - buf.append(")"); - buf.append(getClassName(returnType, true)); - return buf.toString(); + sb.append(")"); + sb.append(getClassName(returnType, true)); + return sb.toString(); } private static synchronized String generateName(boolean isConstructor, diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/rmi/server/Activation.java --- a/jdk/src/share/classes/sun/rmi/server/Activation.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/rmi/server/Activation.java Wed Jul 05 19:46:40 2017 +0200 @@ -1239,7 +1239,7 @@ checkArgs(desc, argv); if (debugExec) { - StringBuffer sb = new StringBuffer(argv[0]); + StringBuilder sb = new StringBuilder(argv[0]); int j; for (j = 1; j < argv.length; j++) { sb.append(' '); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/rmi/server/LoaderHandler.java --- a/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java Wed Jul 05 19:46:40 2017 +0200 @@ -793,7 +793,7 @@ } else if (urls.length == 1) { return urls[0].toExternalForm(); } else { - StringBuffer path = new StringBuffer(urls[0].toExternalForm()); + StringBuilder path = new StringBuilder(urls[0].toExternalForm()); for (int i = 1; i < urls.length; i++) { path.append(' '); path.append(urls[i].toExternalForm()); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/rmi/server/Util.java --- a/jdk/src/share/classes/sun/rmi/server/Util.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/rmi/server/Util.java Wed Jul 05 19:46:40 2017 +0200 @@ -391,7 +391,7 @@ * the definition of a "method descriptor". */ private static String getMethodNameAndDescriptor(Method m) { - StringBuffer desc = new StringBuffer(m.getName()); + StringBuilder desc = new StringBuilder(m.getName()); desc.append('('); Class[] paramTypes = m.getParameterTypes(); for (int i = 0; i < paramTypes.length; i++) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/acl/AclImpl.java --- a/jdk/src/share/classes/sun/security/acl/AclImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/acl/AclImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -253,7 +253,7 @@ * ACL. */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); Enumeration entries = entries(); while (entries.hasMoreElements()) { AclEntry entry = entries.nextElement(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java --- a/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/GSSCredentialImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -636,29 +636,29 @@ } GSSCredentialSpi element = null; - StringBuffer buffer = new StringBuffer("[GSSCredential: "); + StringBuilder sb = new StringBuilder("[GSSCredential: "); Object[] elements = hashtable.entrySet().toArray(); for (int i = 0; i < elements.length; i++) { try { - buffer.append('\n'); + sb.append('\n'); element = (GSSCredentialSpi) ((Map.Entry)elements[i]).getValue(); - buffer.append(element.getName()); - buffer.append(' '); - buffer.append(element.getMechanism()); - buffer.append(element.isInitiatorCredential() ? - " Initiate" : ""); - buffer.append(element.isAcceptorCredential() ? - " Accept" : ""); - buffer.append(" ["); - buffer.append(element.getClass()); - buffer.append(']'); + sb.append(element.getName()); + sb.append(' '); + sb.append(element.getMechanism()); + sb.append(element.isInitiatorCredential() ? + " Initiate" : ""); + sb.append(element.isAcceptorCredential() ? + " Accept" : ""); + sb.append(" ["); + sb.append(element.getClass()); + sb.append(']'); } catch (GSSException e) { // skip to next element } } - buffer.append(']'); - return buffer.toString(); + sb.append(']'); + return sb.toString(); } static class SearchKey { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/GSSHeader.java --- a/jdk/src/share/classes/sun/security/jgss/GSSHeader.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/GSSHeader.java Wed Jul 05 19:46:40 2017 +0200 @@ -327,7 +327,7 @@ private String getHexBytes(byte[] bytes, int len) throws IOException { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { int b1 = (bytes[i]>>4) & 0x0f; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/GSSToken.java --- a/jdk/src/share/classes/sun/security/jgss/GSSToken.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/GSSToken.java Wed Jul 05 19:46:40 2017 +0200 @@ -216,7 +216,7 @@ } public static final String getHexBytes(byte[] bytes, int pos, int len) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = pos; i < (pos+len); i++) { int b1 = (bytes[i]>>4) & 0x0f; int b2 = bytes[i] & 0x0f; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/ProviderList.java --- a/jdk/src/share/classes/sun/security/jgss/ProviderList.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/ProviderList.java Wed Jul 05 19:46:40 2017 +0200 @@ -536,12 +536,12 @@ // For debugging public String toString() { - StringBuffer buf = new StringBuffer("<"); - buf.append(p.getName()); - buf.append(", "); - buf.append(oid); - buf.append(">"); - return buf.toString(); + StringBuilder sb = new StringBuilder("<"); + sb.append(p.getName()); + sb.append(", "); + sb.append(oid); + sb.append(">"); + return sb.toString(); } } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/TokenTracker.java --- a/jdk/src/share/classes/sun/security/jgss/TokenTracker.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/TokenTracker.java Wed Jul 05 19:46:40 2017 +0200 @@ -336,19 +336,19 @@ } public String toString() { - StringBuffer buf = new StringBuffer("TokenTracker: "); - buf.append(" initNumber=").append(initNumber); - buf.append(" windowStart=").append(windowStart); - buf.append(" expectedNumber=").append(expectedNumber); - buf.append(" windowStartIndex=").append(windowStartIndex); - buf.append("\n\tIntervals are: {"); + StringBuilder sb = new StringBuilder("TokenTracker: "); + sb.append(" initNumber=").append(initNumber); + sb.append(" windowStart=").append(windowStart); + sb.append(" expectedNumber=").append(expectedNumber); + sb.append(" windowStartIndex=").append(windowStartIndex); + sb.append("\n\tIntervals are: {"); for (int i = 0; i < list.size(); i++) { if (i != 0) - buf.append(", "); - buf.append(list.get(i).toString()); + sb.append(", "); + sb.append(list.get(i).toString()); } - buf.append('}'); - return buf.toString(); + sb.append('}'); + return sb.toString(); } /** diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Wed Jul 05 19:46:40 2017 +0200 @@ -164,15 +164,15 @@ serviceTicket.getServer(); // Cannot use '\"' instead of "\"" in constructor because // it is interpreted as suggested length! - StringBuffer buf = new StringBuffer("\""); - buf.append(delegateTo.getName()).append('\"'); + StringBuilder sb = new StringBuilder("\""); + sb.append(delegateTo.getName()).append('\"'); String realm = delegateTo.getRealmAsString(); - buf.append(" \"krbtgt/").append(realm).append('@'); - buf.append(realm).append('\"'); + sb.append(" \"krbtgt/").append(realm).append('@'); + sb.append(realm).append('\"'); SecurityManager sm = System.getSecurityManager(); if (sm != null) { DelegationPermission perm = - new DelegationPermission(buf.toString()); + new DelegationPermission(sb.toString()); sm.checkPermission(perm); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 05 19:46:40 2017 +0200 @@ -1345,7 +1345,7 @@ private static String getHexBytes(byte[] bytes, int pos, int len) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { int b1 = (bytes[i]>>4) & 0x0f; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/wrapper/Krb5Util.java --- a/jdk/src/share/classes/sun/security/jgss/wrapper/Krb5Util.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/wrapper/Krb5Util.java Wed Jul 05 19:46:40 2017 +0200 @@ -41,9 +41,9 @@ String krbPrinc = name.getKrbName(); int atIndex = krbPrinc.indexOf('@'); String realm = krbPrinc.substring(atIndex + 1); - StringBuffer buf = new StringBuffer("krbtgt/"); - buf.append(realm).append('@').append(realm); - return buf.toString(); + StringBuilder sb = new StringBuilder("krbtgt/"); + sb.append(realm).append('@').append(realm); + return sb.toString(); } // Perform the Service Permission check using the specified diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java --- a/jdk/src/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Wed Jul 05 19:46:40 2017 +0200 @@ -139,10 +139,10 @@ if (sm != null) { String targetStr = targetName.getKrbName(); String tgsStr = Krb5Util.getTGSName(targetName); - StringBuffer buf = new StringBuffer("\""); - buf.append(targetStr).append("\" \""); - buf.append(tgsStr).append('\"'); - String krbPrincPair = buf.toString(); + StringBuilder sb = new StringBuilder("\""); + sb.append(targetStr).append("\" \""); + sb.append(tgsStr).append('\"'); + String krbPrincPair = sb.toString(); SunNativeProvider.debug("Checking DelegationPermission (" + krbPrincPair + ")"); DelegationPermission perm = diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/Credentials.java --- a/jdk/src/share/classes/sun/security/krb5/Credentials.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/Credentials.java Wed Jul 05 19:46:40 2017 +0200 @@ -510,21 +510,21 @@ } public String toString() { - StringBuffer buffer = new StringBuffer("Credentials:"); - buffer.append( "\n client=").append(client); - buffer.append( "\n server=").append(server); + StringBuilder sb = new StringBuilder("Credentials:"); + sb.append( "\n client=").append(client); + sb.append( "\n server=").append(server); if (authTime != null) { - buffer.append("\n authTime=").append(authTime); + sb.append("\n authTime=").append(authTime); } if (startTime != null) { - buffer.append("\n startTime=").append(startTime); + sb.append("\n startTime=").append(startTime); } - buffer.append( "\n endTime=").append(endTime); - buffer.append( "\n renewTill=").append(renewTill); - buffer.append( "\n flags=").append(flags); - buffer.append( "\nEType (skey)=").append(key.getEType()); - buffer.append( "\n (tkt key)=").append(ticket.encPart.eType); - return buffer.toString(); + sb.append( "\n endTime=").append(endTime); + sb.append( "\n renewTill=").append(renewTill); + sb.append( "\n flags=").append(flags); + sb.append( "\nEType (skey)=").append(key.getEType()); + sb.append( "\n (tkt key)=").append(ticket.encPart.eType); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/KrbException.java --- a/jdk/src/share/classes/sun/security/krb5/KrbException.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/KrbException.java Wed Jul 05 19:46:40 2017 +0200 @@ -96,7 +96,7 @@ public String krbErrorMessage() { - StringBuffer strbuf = new StringBuffer("krb_error " + returnCode); + StringBuilder strbuf = new StringBuilder("krb_error " + returnCode); String msg = getMessage(); if (msg != null) { strbuf.append(" "); @@ -112,7 +112,7 @@ * If the error code is 0 then the first half is skipped. */ public String getMessage() { - StringBuffer message = new StringBuffer(); + StringBuilder message = new StringBuilder(); int returnCode = returnCode(); if (returnCode != 0) { message.append(returnCodeMessage()); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/PrincipalName.java --- a/jdk/src/share/classes/sun/security/krb5/PrincipalName.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/PrincipalName.java Wed Jul 05 19:46:40 2017 +0200 @@ -480,7 +480,7 @@ } public String getPrincipalNameAsString() { - StringBuffer temp = new StringBuffer(nameStrings[0]); + StringBuilder temp = new StringBuilder(nameStrings[0]); for (int i = 1; i < nameStrings.length; i++) temp.append(nameStrings[i]); return temp.toString(); @@ -521,7 +521,7 @@ public String getSalt() { if (salt == null) { - StringBuffer salt = new StringBuffer(); + StringBuilder salt = new StringBuilder(); salt.append(nameRealm.toString()); for (int i = 0; i < nameStrings.length; i++) { salt.append(nameStrings[i]); @@ -532,7 +532,7 @@ } public String toString() { - StringBuffer str = new StringBuffer(); + StringBuilder str = new StringBuilder(); for (int i = 0; i < nameStrings.length; i++) { if (i > 0) str.append("/"); @@ -544,7 +544,7 @@ } public String getNameString() { - StringBuffer str = new StringBuffer(); + StringBuilder str = new StringBuilder(); for (int i = 0; i < nameStrings.length; i++) { if (i > 0) str.append("/"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/internal/EncTicketPart.java --- a/jdk/src/share/classes/sun/security/krb5/internal/EncTicketPart.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/internal/EncTicketPart.java Wed Jul 05 19:46:40 2017 +0200 @@ -117,7 +117,7 @@ private static String getHexBytes(byte[] bytes, int len) throws IOException { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { int b1 = (bytes[i] >> 4) & 0x0f; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/internal/TicketFlags.java --- a/jdk/src/share/classes/sun/security/krb5/internal/TicketFlags.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/internal/TicketFlags.java Wed Jul 05 19:46:40 2017 +0200 @@ -137,7 +137,7 @@ * Returns the string representative of ticket flags. */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); boolean[] flags = toBooleanArray(); for (int i = 0; i < flags.length; i++) { if (flags[i] == true) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java --- a/jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java Wed Jul 05 19:46:40 2017 +0200 @@ -269,7 +269,7 @@ } int len = list.size(); if (len <= 0) { - StringBuffer keystr = new StringBuffer(); + StringBuilder keystr = new StringBuilder(); for (int i = 0; i < keys.length; i++) { keystr.append(toString(keys[i].getEType())); keystr.append(" "); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java --- a/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java Wed Jul 05 19:46:40 2017 +0200 @@ -636,7 +636,7 @@ // Routines used for debugging static String bytesToString(byte[] digest) { // Get character representation of digest - StringBuffer digestString = new StringBuffer(); + StringBuilder digestString = new StringBuilder(); for (int i = 0; i < digest.length; i++) { if ((digest[i] & 0x000000ff) < 0x10) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTabEntry.java --- a/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTabEntry.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/krb5/internal/ktab/KeyTabEntry.java Wed Jul 05 19:46:40 2017 +0200 @@ -73,7 +73,7 @@ } public String getKeyString() { - StringBuffer sb = new StringBuffer("0x"); + StringBuilder sb = new StringBuilder("0x"); for (int i = 0; i < keyblock.length; i++) { sb.append(String.format("%02x", keyblock[i]&0xff)); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java --- a/jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs/PKCS9Attribute.java Wed Jul 05 19:46:40 2017 +0200 @@ -790,26 +790,26 @@ * Returns a string representation of this attribute. */ public String toString() { - StringBuffer buf = new StringBuffer(100); + StringBuilder sb = new StringBuilder(100); - buf.append("["); + sb.append("["); if (index == -1) { - buf.append(oid.toString()); + sb.append(oid.toString()); } else { - buf.append(OID_NAME_TABLE.get(PKCS9_OIDS[index])); + sb.append(OID_NAME_TABLE.get(PKCS9_OIDS[index])); } - buf.append(": "); + sb.append(": "); if (index == -1 || SINGLE_VALUED[index]) { if (value instanceof byte[]) { // special case for octet string HexDumpEncoder hexDump = new HexDumpEncoder(); - buf.append(hexDump.encodeBuffer((byte[]) value)); + sb.append(hexDump.encodeBuffer((byte[]) value)); } else { - buf.append(value.toString()); + sb.append(value.toString()); } - buf.append("]"); - return buf.toString(); + sb.append("]"); + return sb.toString(); } else { // multi-valued boolean first = true; Object[] values = (Object[]) value; @@ -818,11 +818,11 @@ if (first) first = false; else - buf.append(", "); + sb.append(", "); - buf.append(values[j].toString()); + sb.append(values[j].toString()); } - return buf.toString(); + return sb.toString(); } } @@ -857,7 +857,7 @@ private void throwTagException(Byte tag) throws IOException { Byte[] expectedTags = PKCS9_VALUE_TAGS[index]; - StringBuffer msg = new StringBuffer(100); + StringBuilder msg = new StringBuilder(100); msg.append("Value of attribute "); msg.append(oid.toString()); msg.append(" ("); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs/PKCS9Attributes.java --- a/jdk/src/share/classes/sun/security/pkcs/PKCS9Attributes.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs/PKCS9Attributes.java Wed Jul 05 19:46:40 2017 +0200 @@ -323,8 +323,8 @@ * Returns the PKCS9 block in a printable string form. */ public String toString() { - StringBuffer buf = new StringBuffer(200); - buf.append("PKCS9 Attributes: [\n\t"); + StringBuilder sb = new StringBuilder(200); + sb.append("PKCS9 Attributes: [\n\t"); ObjectIdentifier oid; PKCS9Attribute value; @@ -339,14 +339,14 @@ if (first) first = false; else - buf.append(";\n\t"); + sb.append(";\n\t"); - buf.append(value.toString()); + sb.append(value.toString()); } - buf.append("\n\t] (end PKCS9 Attributes)"); + sb.append("\n\t] (end PKCS9 Attributes)"); - return buf.toString(); + return sb.toString(); } /** diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs/SigningCertificateInfo.java --- a/jdk/src/share/classes/sun/security/pkcs/SigningCertificateInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs/SigningCertificateInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -92,15 +92,15 @@ } public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("[\n"); + StringBuilder sb = new StringBuilder(); + sb.append("[\n"); for (int i = 0; i < certId.length; i++) { - buffer.append(certId[i].toString()); + sb.append(certId[i].toString()); } // format policies as a string - buffer.append("\n]"); + sb.append("\n]"); - return buffer.toString(); + return sb.toString(); } public void parse(byte[] bytes) throws IOException { @@ -151,17 +151,17 @@ } public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("[\n\tCertificate hash (SHA-1):\n"); + StringBuilder sb = new StringBuilder(); + sb.append("[\n\tCertificate hash (SHA-1):\n"); if (hexDumper == null) { hexDumper = new HexDumpEncoder(); } - buffer.append(hexDumper.encode(certHash)); + sb.append(hexDumper.encode(certHash)); if (issuer != null && serialNumber != null) { - buffer.append("\n\tIssuer: " + issuer + "\n"); - buffer.append("\t" + serialNumber); + sb.append("\n\tIssuer: " + issuer + "\n"); + sb.append("\t" + serialNumber); } - buffer.append("\n]"); - return buffer.toString(); + sb.append("\n]"); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_AES_CTR_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -50,17 +50,17 @@ } public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("ulCounterBits: "); - buffer.append(ulCounterBits); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulCounterBits: "); + sb.append(ulCounterBits); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("cb: "); - buffer.append(Functions.toHexString(cb)); + sb.append(Constants.INDENT); + sb.append("cb: "); + sb.append(Functions.toHexString(cb)); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_DATE.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_DATE.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_DATE.java Wed Jul 05 19:46:40 2017 +0200 @@ -122,16 +122,16 @@ * @return the string representation of CK_DATE */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(new String(day)); - buffer.append('.'); - buffer.append(new String(month)); - buffer.append('.'); - buffer.append(new String(year)); - buffer.append(" (DD.MM.YYYY)"); + sb.append(new String(day)); + sb.append('.'); + sb.append(new String(month)); + sb.append('.'); + sb.append(new String(year)); + sb.append(" (DD.MM.YYYY)"); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH1_DERIVE_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -105,34 +105,34 @@ * @return the string representation of CK_PKCS5_PBKD2_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("kdf: 0x"); - buffer.append(Functions.toFullHexString(kdf)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("kdf: 0x"); + sb.append(Functions.toFullHexString(kdf)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSharedDataLen: "); - buffer.append(pSharedData.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pSharedDataLen: "); + sb.append(pSharedData.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSharedData: "); - buffer.append(Functions.toHexString(pSharedData)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pSharedData: "); + sb.append(Functions.toHexString(pSharedData)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicDataLen: "); - buffer.append(pPublicData.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicDataLen: "); + sb.append(pPublicData.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicData: "); - buffer.append(Functions.toHexString(pPublicData)); + sb.append(Constants.INDENT); + sb.append("pPublicData: "); + sb.append(Functions.toHexString(pPublicData)); //buffer.append(Constants.NEWLINE); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_ECDH2_DERIVE_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -128,54 +128,54 @@ * @return the string representation of CK_PKCS5_PBKD2_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("kdf: 0x"); - buffer.append(Functions.toFullHexString(kdf)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("kdf: 0x"); + sb.append(Functions.toFullHexString(kdf)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSharedDataLen: "); - buffer.append(pSharedData.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pSharedDataLen: "); + sb.append(pSharedData.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSharedData: "); - buffer.append(Functions.toHexString(pSharedData)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pSharedData: "); + sb.append(Functions.toHexString(pSharedData)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicDataLen: "); - buffer.append(pPublicData.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicDataLen: "); + sb.append(pPublicData.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicData: "); - buffer.append(Functions.toHexString(pPublicData)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicData: "); + sb.append(Functions.toHexString(pPublicData)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulPrivateDataLen: "); - buffer.append(ulPrivateDataLen); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulPrivateDataLen: "); + sb.append(ulPrivateDataLen); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("hPrivateData: "); - buffer.append(hPrivateData); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("hPrivateData: "); + sb.append(hPrivateData); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicDataLen2: "); - buffer.append(pPublicData2.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicDataLen2: "); + sb.append(pPublicData2.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicData2: "); - buffer.append(Functions.toHexString(pPublicData2)); + sb.append(Constants.INDENT); + sb.append("pPublicData2: "); + sb.append(Functions.toHexString(pPublicData2)); //buffer.append(Constants.NEWLINE); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_INFO.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_INFO.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_INFO.java Wed Jul 05 19:46:40 2017 +0200 @@ -131,34 +131,34 @@ * @return the string representation of CK_INFO */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("cryptokiVersion: "); - buffer.append(cryptokiVersion.toString()); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("cryptokiVersion: "); + sb.append(cryptokiVersion.toString()); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("manufacturerID: "); - buffer.append(new String(manufacturerID)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("manufacturerID: "); + sb.append(new String(manufacturerID)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("flags: "); - buffer.append(Functions.toBinaryString(flags)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("flags: "); + sb.append(Functions.toBinaryString(flags)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("libraryDescription: "); - buffer.append(new String(libraryDescription)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("libraryDescription: "); + sb.append(new String(libraryDescription)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("libraryVersion: "); - buffer.append(libraryVersion.toString()); + sb.append(Constants.INDENT); + sb.append("libraryVersion: "); + sb.append(libraryVersion.toString()); //buffer.append(Constants.NEWLINE); - return buffer.toString() ; + return sb.toString() ; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM.java Wed Jul 05 19:46:40 2017 +0200 @@ -143,24 +143,24 @@ * @return the string representation of CK_MECHANISM */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("mechanism: "); - buffer.append(mechanism); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("mechanism: "); + sb.append(mechanism); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pParameter: "); - buffer.append(pParameter.toString()); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pParameter: "); + sb.append(pParameter.toString()); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulParameterLen: ??"); + sb.append(Constants.INDENT); + sb.append("ulParameterLen: ??"); //buffer.append(pParameter.length); //buffer.append(Constants.NEWLINE); - return buffer.toString() ; + return sb.toString() ; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM_INFO.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM_INFO.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_MECHANISM_INFO.java Wed Jul 05 19:46:40 2017 +0200 @@ -103,25 +103,25 @@ * @return the string representation of CK_MECHANISM_INFO */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("ulMinKeySize: "); - buffer.append(String.valueOf(ulMinKeySize)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulMinKeySize: "); + sb.append(String.valueOf(ulMinKeySize)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulMaxKeySize: "); - buffer.append(String.valueOf(ulMaxKeySize)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulMaxKeySize: "); + sb.append(String.valueOf(ulMaxKeySize)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("flags: "); - buffer.append(String.valueOf(flags)); - buffer.append(" = "); - buffer.append(Functions.mechanismInfoFlagsToString(flags)); + sb.append(Constants.INDENT); + sb.append("flags: "); + sb.append(String.valueOf(flags)); + sb.append(" = "); + sb.append(Functions.mechanismInfoFlagsToString(flags)); //buffer.append(Constants.NEWLINE); - return buffer.toString() ; + return sb.toString() ; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PBE_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -109,39 +109,39 @@ * @return the string representation of CK_PBE_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("pInitVector: "); - buffer.append(pInitVector); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pInitVector: "); + sb.append(pInitVector); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulPasswordLen: "); - buffer.append(pPassword.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulPasswordLen: "); + sb.append(pPassword.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPassword: "); - buffer.append(pPassword); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPassword: "); + sb.append(pPassword); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulSaltLen: "); - buffer.append(pSalt.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulSaltLen: "); + sb.append(pSalt.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSalt: "); - buffer.append(pSalt); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pSalt: "); + sb.append(pSalt); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulIteration: "); - buffer.append(ulIteration); + sb.append(Constants.INDENT); + sb.append("ulIteration: "); + sb.append(ulIteration); //buffer.append(Constants.NEWLINE); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_PKCS5_PBKD2_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -118,44 +118,44 @@ * @return the string representation of CK_PKCS5_PBKD2_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("saltSource: "); - buffer.append(saltSource); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("saltSource: "); + sb.append(saltSource); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSaltSourceData: "); - buffer.append(Functions.toHexString(pSaltSourceData)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pSaltSourceData: "); + sb.append(Functions.toHexString(pSaltSourceData)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulSaltSourceDataLen: "); - buffer.append(pSaltSourceData.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulSaltSourceDataLen: "); + sb.append(pSaltSourceData.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("iterations: "); - buffer.append(iterations); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("iterations: "); + sb.append(iterations); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("prf: "); - buffer.append(prf); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("prf: "); + sb.append(prf); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPrfData: "); - buffer.append(Functions.toHexString(pPrfData)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPrfData: "); + sb.append(Functions.toHexString(pPrfData)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulPrfDataLen: "); - buffer.append(pPrfData.length); + sb.append(Constants.INDENT); + sb.append("ulPrfDataLen: "); + sb.append(pPrfData.length); //buffer.append(Constants.NEWLINE); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_OAEP_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -110,34 +110,34 @@ * @return the string representation of CK_RSA_PKCS_OAEP_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("hashAlg: "); - buffer.append(hashAlg); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("hashAlg: "); + sb.append(hashAlg); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("mgf: "); - buffer.append(mgf); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("mgf: "); + sb.append(mgf); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("source: "); - buffer.append(source); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("source: "); + sb.append(source); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSourceData: "); - buffer.append(pSourceData.toString()); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pSourceData: "); + sb.append(pSourceData.toString()); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pSourceDataLen: "); - buffer.append(Functions.toHexString(pSourceData)); + sb.append(Constants.INDENT); + sb.append("pSourceDataLen: "); + sb.append(Functions.toHexString(pSourceData)); //buffer.append(Constants.NEWLINE); - return buffer.toString() ; + return sb.toString() ; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_RSA_PKCS_PSS_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -95,24 +95,24 @@ * @return the string representation of CK_PKCS5_PBKD2_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("hashAlg: 0x"); - buffer.append(Functions.toFullHexString(hashAlg)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("hashAlg: 0x"); + sb.append(Functions.toFullHexString(hashAlg)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("mgf: 0x"); - buffer.append(Functions.toFullHexString(mgf)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("mgf: 0x"); + sb.append(Functions.toFullHexString(mgf)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("sLen: "); - buffer.append(sLen); + sb.append(Constants.INDENT); + sb.append("sLen: "); + sb.append(sLen); //buffer.append(Constants.NEWLINE); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SESSION_INFO.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SESSION_INFO.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SESSION_INFO.java Wed Jul 05 19:46:40 2017 +0200 @@ -114,29 +114,29 @@ * @return the string representation of CK_SESSION_INFO */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("slotID: "); - buffer.append(String.valueOf(slotID)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("slotID: "); + sb.append(String.valueOf(slotID)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("state: "); - buffer.append(Functions.sessionStateToString(state)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("state: "); + sb.append(Functions.sessionStateToString(state)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("flags: "); - buffer.append(Functions.sessionInfoFlagsToString(flags)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("flags: "); + sb.append(Functions.sessionInfoFlagsToString(flags)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulDeviceError: "); - buffer.append(Functions.toHexString(ulDeviceError)); + sb.append(Constants.INDENT); + sb.append("ulDeviceError: "); + sb.append(Functions.toHexString(ulDeviceError)); //buffer.append(Constants.NEWLINE); - return buffer.toString() ; + return sb.toString() ; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SLOT_INFO.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SLOT_INFO.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_SLOT_INFO.java Wed Jul 05 19:46:40 2017 +0200 @@ -130,34 +130,34 @@ * @return the string representation of CK_SLOT_INFO */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("slotDescription: "); - buffer.append(new String(slotDescription)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("slotDescription: "); + sb.append(new String(slotDescription)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("manufacturerID: "); - buffer.append(new String(manufacturerID)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("manufacturerID: "); + sb.append(new String(manufacturerID)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("flags: "); - buffer.append(Functions.slotInfoFlagsToString(flags)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("flags: "); + sb.append(Functions.slotInfoFlagsToString(flags)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("hardwareVersion: "); - buffer.append(hardwareVersion.toString()); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("hardwareVersion: "); + sb.append(hardwareVersion.toString()); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("firmwareVersion: "); - buffer.append(firmwareVersion.toString()); + sb.append(Constants.INDENT); + sb.append("firmwareVersion: "); + sb.append(firmwareVersion.toString()); //buffer.append(Constants.NEWLINE); - return buffer.toString() ; + return sb.toString() ; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TOKEN_INFO.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TOKEN_INFO.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_TOKEN_INFO.java Wed Jul 05 19:46:40 2017 +0200 @@ -271,119 +271,119 @@ * @return the string representation of CK_TOKEN_INFO */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("label: "); - buffer.append(new String(label)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("label: "); + sb.append(new String(label)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("manufacturerID: "); - buffer.append(new String(manufacturerID)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("manufacturerID: "); + sb.append(new String(manufacturerID)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("model: "); - buffer.append(new String(model)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("model: "); + sb.append(new String(model)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("serialNumber: "); - buffer.append(new String(serialNumber)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("serialNumber: "); + sb.append(new String(serialNumber)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("flags: "); - buffer.append(Functions.tokenInfoFlagsToString(flags)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("flags: "); + sb.append(Functions.tokenInfoFlagsToString(flags)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulMaxSessionCount: "); - buffer.append((ulMaxSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE) + sb.append(Constants.INDENT); + sb.append("ulMaxSessionCount: "); + sb.append((ulMaxSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE) ? "CK_EFFECTIVELY_INFINITE" : (ulMaxSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulMaxSessionCount)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulSessionCount: "); - buffer.append((ulSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) + sb.append(Constants.INDENT); + sb.append("ulSessionCount: "); + sb.append((ulSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulSessionCount)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulMaxRwSessionCount: "); - buffer.append((ulMaxRwSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE) + sb.append(Constants.INDENT); + sb.append("ulMaxRwSessionCount: "); + sb.append((ulMaxRwSessionCount == PKCS11Constants.CK_EFFECTIVELY_INFINITE) ? "CK_EFFECTIVELY_INFINITE" : (ulMaxRwSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulMaxRwSessionCount)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulRwSessionCount: "); - buffer.append((ulRwSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) + sb.append(Constants.INDENT); + sb.append("ulRwSessionCount: "); + sb.append((ulRwSessionCount == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulRwSessionCount)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulMaxPinLen: "); - buffer.append(String.valueOf(ulMaxPinLen)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulMaxPinLen: "); + sb.append(String.valueOf(ulMaxPinLen)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulMinPinLen: "); - buffer.append(String.valueOf(ulMinPinLen)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulMinPinLen: "); + sb.append(String.valueOf(ulMinPinLen)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulTotalPublicMemory: "); - buffer.append((ulTotalPublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) + sb.append(Constants.INDENT); + sb.append("ulTotalPublicMemory: "); + sb.append((ulTotalPublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulTotalPublicMemory)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulFreePublicMemory: "); - buffer.append((ulFreePublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) + sb.append(Constants.INDENT); + sb.append("ulFreePublicMemory: "); + sb.append((ulFreePublicMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulFreePublicMemory)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulTotalPrivateMemory: "); - buffer.append((ulTotalPrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) + sb.append(Constants.INDENT); + sb.append("ulTotalPrivateMemory: "); + sb.append((ulTotalPrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulTotalPrivateMemory)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulFreePrivateMemory: "); - buffer.append((ulFreePrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) + sb.append(Constants.INDENT); + sb.append("ulFreePrivateMemory: "); + sb.append((ulFreePrivateMemory == PKCS11Constants.CK_UNAVAILABLE_INFORMATION) ? "CK_UNAVAILABLE_INFORMATION" : String.valueOf(ulFreePrivateMemory)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("hardwareVersion: "); - buffer.append(hardwareVersion.toString()); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("hardwareVersion: "); + sb.append(hardwareVersion.toString()); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("firmwareVersion: "); - buffer.append(firmwareVersion.toString()); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("firmwareVersion: "); + sb.append(firmwareVersion.toString()); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("utcTime: "); - buffer.append(new String(utcTime)); + sb.append(Constants.INDENT); + sb.append("utcTime: "); + sb.append(new String(utcTime)); //buffer.append(Constants.NEWLINE); - return buffer.toString() ; + return sb.toString() ; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH1_DERIVE_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -99,34 +99,34 @@ * @return the string representation of CK_PKCS5_PBKD2_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("kdf: 0x"); - buffer.append(Functions.toFullHexString(kdf)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("kdf: 0x"); + sb.append(Functions.toFullHexString(kdf)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pOtherInfoLen: "); - buffer.append(pOtherInfo.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pOtherInfoLen: "); + sb.append(pOtherInfo.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pOtherInfo: "); - buffer.append(Functions.toHexString(pOtherInfo)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pOtherInfo: "); + sb.append(Functions.toHexString(pOtherInfo)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicDataLen: "); - buffer.append(pPublicData.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicDataLen: "); + sb.append(pPublicData.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicData: "); - buffer.append(Functions.toHexString(pPublicData)); + sb.append(Constants.INDENT); + sb.append("pPublicData: "); + sb.append(Functions.toHexString(pPublicData)); //buffer.append(Constants.NEWLINE); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/CK_X9_42_DH2_DERIVE_PARAMS.java Wed Jul 05 19:46:40 2017 +0200 @@ -128,54 +128,54 @@ * @return the string representation of CK_PKCS5_PBKD2_PARAMS */ public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buffer.append(Constants.INDENT); - buffer.append("kdf: 0x"); - buffer.append(Functions.toFullHexString(kdf)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("kdf: 0x"); + sb.append(Functions.toFullHexString(kdf)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pOtherInfoLen: "); - buffer.append(pOtherInfo.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pOtherInfoLen: "); + sb.append(pOtherInfo.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pOtherInfo: "); - buffer.append(Functions.toHexString(pOtherInfo)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pOtherInfo: "); + sb.append(Functions.toHexString(pOtherInfo)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicDataLen: "); - buffer.append(pPublicData.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicDataLen: "); + sb.append(pPublicData.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicData: "); - buffer.append(Functions.toHexString(pPublicData)); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicData: "); + sb.append(Functions.toHexString(pPublicData)); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("ulPrivateDataLen: "); - buffer.append(ulPrivateDataLen); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("ulPrivateDataLen: "); + sb.append(ulPrivateDataLen); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("hPrivateData: "); - buffer.append(hPrivateData); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("hPrivateData: "); + sb.append(hPrivateData); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicDataLen2: "); - buffer.append(pPublicData2.length); - buffer.append(Constants.NEWLINE); + sb.append(Constants.INDENT); + sb.append("pPublicDataLen2: "); + sb.append(pPublicData2.length); + sb.append(Constants.NEWLINE); - buffer.append(Constants.INDENT); - buffer.append("pPublicData2: "); - buffer.append(Functions.toHexString(pPublicData2)); + sb.append(Constants.INDENT); + sb.append("pPublicData2: "); + sb.append(Functions.toHexString(pPublicData2)); //buffer.append(Constants.NEWLINE); - return buffer.toString(); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java --- a/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/pkcs11/wrapper/Functions.java Wed Jul 05 19:46:40 2017 +0200 @@ -109,14 +109,14 @@ */ public static String toFullHexString(long value) { long currentValue = value; - StringBuffer stringBuffer = new StringBuffer(16); + StringBuilder sb = new StringBuilder(16); for(int j = 0; j < 16; j++) { int currentDigit = (int) currentValue & 0xf; - stringBuffer.append(HEX_DIGITS[currentDigit]); + sb.append(HEX_DIGITS[currentDigit]); currentValue >>>= 4; } - return stringBuffer.reverse().toString(); + return sb.reverse().toString(); } /** @@ -128,14 +128,14 @@ */ public static String toFullHexString(int value) { int currentValue = value; - StringBuffer stringBuffer = new StringBuffer(8); + StringBuilder sb = new StringBuilder(8); for(int i = 0; i < 8; i++) { int currentDigit = currentValue & 0xf; - stringBuffer.append(HEX_DIGITS[currentDigit]); + sb.append(HEX_DIGITS[currentDigit]); currentValue >>>= 4; } - return stringBuffer.reverse().toString(); + return sb.reverse().toString(); } /** @@ -161,20 +161,20 @@ return null; } - StringBuffer buffer = new StringBuffer(2 * value.length); + StringBuilder sb = new StringBuilder(2 * value.length); int single; for (int i = 0; i < value.length; i++) { single = value[i] & 0xFF; if (single < 0x10) { - buffer.append('0'); + sb.append('0'); } - buffer.append(Integer.toString(single, 16)); + sb.append(Integer.toString(single, 16)); } - return buffer.toString(); + return sb.toString(); } /** diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/provider/AuthPolicyFile.java --- a/jdk/src/share/classes/sun/security/provider/AuthPolicyFile.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/provider/AuthPolicyFile.java Wed Jul 05 19:46:40 2017 +0200 @@ -944,7 +944,7 @@ } File f = new File(path); path = f.getCanonicalPath(); - StringBuffer sb = new StringBuffer(path); + StringBuilder sb = new StringBuilder(path); // reappend '*' to canonicalized filename (note that // canonicalization may have removed trailing file // separator, so we have to check for that, too) @@ -1095,7 +1095,7 @@ @Override public String toString(){ - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(rb.getString("LPARAM")); sb.append(getCodeSource()); sb.append("\n"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/provider/X509Factory.java --- a/jdk/src/share/classes/sun/security/provider/X509Factory.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/provider/X509Factory.java Wed Jul 05 19:46:40 2017 +0200 @@ -519,7 +519,7 @@ // Step 2: Read the rest of header, determine the line end int end; - StringBuffer header = new StringBuffer("-----"); + StringBuilder header = new StringBuilder("-----"); while (true) { int next = is.read(); if (next == -1) { @@ -562,7 +562,7 @@ } // Step 4: Consume the footer - StringBuffer footer = new StringBuffer("-"); + StringBuilder footer = new StringBuilder("-"); while (true) { int next = is.read(); // Add next == '\n' for maximum safety, in case endline diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/smartcardio/PCSC.java --- a/jdk/src/share/classes/sun/security/smartcardio/PCSC.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/smartcardio/PCSC.java Wed Jul 05 19:46:40 2017 +0200 @@ -172,7 +172,7 @@ private final static char[] hexDigits = "0123456789abcdef".toCharArray(); public static String toString(byte[] b) { - StringBuffer sb = new StringBuffer(b.length * 3); + StringBuilder sb = new StringBuilder(b.length * 3); for (int i = 0; i < b.length; i++) { int k = b[i] & 0xff; if (i != 0) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java --- a/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java Wed Jul 05 19:46:40 2017 +0200 @@ -1474,17 +1474,17 @@ s.println(); if (protocolVersion.v >= ProtocolVersion.TLS12.v) { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); boolean opened = false; for (SignatureAndHashAlgorithm signAlg : algorithms) { if (opened) { - buffer.append(", " + signAlg.getAlgorithmName()); + sb.append(", " + signAlg.getAlgorithmName()); } else { - buffer.append(signAlg.getAlgorithmName()); + sb.append(signAlg.getAlgorithmName()); opened = true; } } - s.println("Supported Signature Algorithms: " + buffer); + s.println("Supported Signature Algorithms: " + sb); } s.println("Cert Authorities:"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java --- a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -2594,7 +2594,7 @@ */ @Override public String toString() { - StringBuffer retval = new StringBuffer(80); + StringBuilder retval = new StringBuilder(80); retval.append(Integer.toHexString(hashCode())); retval.append("["); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java --- a/jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java Wed Jul 05 19:46:40 2017 +0200 @@ -266,12 +266,12 @@ @Override public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (SNIServerName sniName : sniMap.values()) { - buffer.append("[" + sniName + "]"); + sb.append("[" + sniName + "]"); } - return "Extension " + type + ", server_name: " + buffer; + return "Extension " + type + ", server_name: " + sb; } private static class UnknownServerName extends SNIServerName { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/ssl/SessionId.java --- a/jdk/src/share/classes/sun/security/ssl/SessionId.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/ssl/SessionId.java Wed Jul 05 19:46:40 2017 +0200 @@ -72,16 +72,16 @@ public String toString () { int len = sessionId.length; - StringBuffer s = new StringBuffer (10 + 2 * len); + StringBuilder sb = new StringBuilder (10 + 2 * len); - s.append ("{"); + sb.append("{"); for (int i = 0; i < len; i++) { - s.append (0x0ff & sessionId [i]); + sb.append(0x0ff & sessionId[i]); if (i != (len - 1)) - s.append (", "); + sb.append (", "); } - s.append ("}"); - return s.toString (); + sb.append("}"); + return sb.toString (); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java --- a/jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java Wed Jul 05 19:46:40 2017 +0200 @@ -118,18 +118,18 @@ @Override public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder sb = new StringBuilder(); boolean opened = false; for (SignatureAndHashAlgorithm signAlg : algorithms) { if (opened) { - buffer.append(", " + signAlg.getAlgorithmName()); + sb.append(", " + signAlg.getAlgorithmName()); } else { - buffer.append(signAlg.getAlgorithmName()); + sb.append(signAlg.getAlgorithmName()); opened = true; } } - return "Extension " + type + ", signature_algorithms: " + buffer; + return "Extension " + type + ", signature_algorithms: " + sb; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/tools/jarsigner/Main.java --- a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Wed Jul 05 19:46:40 2017 +0200 @@ -728,7 +728,7 @@ output.put(label, new ArrayList()); } - StringBuffer fb = new StringBuffer(); + StringBuilder fb = new StringBuilder(); String s = Long.toString(je.getSize()); for (int i = 6 - s.length(); i > 0; --i) { fb.append(' '); @@ -1572,25 +1572,25 @@ if (cacheForSignerInfo.containsKey(signer)) { return cacheForSignerInfo.get(signer); } - StringBuffer s = new StringBuffer(); + StringBuilder sb = new StringBuilder(); List certs = signer.getSignerCertPath().getCertificates(); // display the signature timestamp, if present Date timestamp; Timestamp ts = signer.getTimestamp(); if (ts != null) { - s.append(printTimestamp(tab, ts)); - s.append('\n'); + sb.append(printTimestamp(tab, ts)); + sb.append('\n'); timestamp = ts.getTimestamp(); } else { timestamp = null; noTimestamp = true; } - // display the certificate(s). The first one is end-entity cert and + // display the certificate(sb). The first one is end-entity cert and // its KeyUsage should be checked. boolean first = true; for (Certificate c : certs) { - s.append(printCert(tab, c, true, timestamp, first)); - s.append('\n'); + sb.append(printCert(tab, c, true, timestamp, first)); + sb.append('\n'); first = false; } try { @@ -1605,11 +1605,11 @@ // No more warning, we alreay have hasExpiredCert or notYetValidCert } else { chainNotValidated = true; - s.append(tab + rb.getString(".CertPath.not.validated.") + + sb.append(tab + rb.getString(".CertPath.not.validated.") + e.getLocalizedMessage() + "]\n"); // TODO } } - String result = s.toString(); + String result = sb.toString(); cacheForSignerInfo.put(signer, result); return result; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/tools/keytool/Main.java --- a/jdk/src/share/classes/sun/security/tools/keytool/Main.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/tools/keytool/Main.java Wed Jul 05 19:46:40 2017 +0200 @@ -3664,7 +3664,7 @@ .startsWith(s.toLowerCase(Locale.ENGLISH))) { match[nmatch++] = i; } else { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); boolean first = true; for (char c: one.toCharArray()) { if (first) { @@ -3690,7 +3690,7 @@ if (match[1] > experiment) { return match[0]; } - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); MessageFormat form = new MessageFormat(rb.getString ("command.{0}.is.ambiguous.")); Object[] source = {s}; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java --- a/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java Wed Jul 05 19:46:40 2017 +0200 @@ -975,16 +975,16 @@ String result = ""; if ((grantEntry.principals != null) && (!grantEntry.principals.isEmpty())) { - StringBuffer buffer = new StringBuffer(200); + StringBuilder sb = new StringBuilder(200); ListIterator list = grantEntry.principals.listIterator(); while (list.hasNext()) { PolicyParser.PrincipalEntry pppe = list.next(); - buffer.append(" Principal " + pppe.getDisplayClass() + " " + + sb.append(" Principal " + pppe.getDisplayClass() + " " + pppe.getDisplayName(true)); - if (list.hasNext()) buffer.append(", "); + if (list.hasNext()) sb.append(", "); } - result = buffer.toString(); + result = sb.toString(); } return result; } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/util/Debug.java --- a/jdk/src/share/classes/sun/security/util/Debug.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/util/Debug.java Wed Jul 05 19:46:40 2017 +0200 @@ -188,13 +188,13 @@ */ public static String toHexString(BigInteger b) { String hexValue = b.toString(16); - StringBuffer buf = new StringBuffer(hexValue.length()*2); + StringBuilder sb = new StringBuilder(hexValue.length()*2); if (hexValue.startsWith("-")) { - buf.append(" -"); + sb.append(" -"); hexValue = hexValue.substring(1); } else { - buf.append(" "); // four spaces + sb.append(" "); // four spaces } if ((hexValue.length()%2) != 0) { // add back the leading 0 @@ -203,17 +203,17 @@ int i=0; while (i < hexValue.length()) { // one byte at a time - buf.append(hexValue.substring(i, i+2)); + sb.append(hexValue.substring(i, i + 2)); i+=2; if (i!= hexValue.length()) { if ((i%64) == 0) { - buf.append("\n "); // line after eight words + sb.append("\n "); // line after eight words } else if (i%8 == 0) { - buf.append(" "); // space between words + sb.append(" "); // space between words } } } - return buf.toString(); + return sb.toString(); } /** @@ -221,7 +221,7 @@ */ private static String marshal(String args) { if (args != null) { - StringBuffer target = new StringBuffer(); + StringBuilder target = new StringBuilder(); StringBuffer source = new StringBuffer(args); // obtain the "permission=" options diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java --- a/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/util/ManifestEntryVerifier.java Wed Jul 05 19:46:40 2017 +0200 @@ -238,7 +238,7 @@ static String toHex(byte[] data) { - StringBuffer sb = new StringBuffer(data.length*2); + StringBuilder sb = new StringBuilder(data.length*2); for (int i=0; i>4) & 0x0f]); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/util/ObjectIdentifier.java --- a/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java Wed Jul 05 19:46:40 2017 +0200 @@ -418,7 +418,7 @@ String s = stringForm; if (s == null) { int length = encoding.length; - StringBuffer sb = new StringBuffer(length * 4); + StringBuilder sb = new StringBuilder(length * 4); int fromPos = 0; for (int i = 0; i < length; i++) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/util/PropertyExpander.java --- a/jdk/src/share/classes/sun/security/util/PropertyExpander.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/util/PropertyExpander.java Wed Jul 05 19:46:40 2017 +0200 @@ -67,7 +67,7 @@ // no special characters if (p == -1) return value; - StringBuffer sb = new StringBuffer(value.length()); + StringBuilder sb = new StringBuilder(value.length()); int max = value.length(); int i = 0; // index of last character we copied diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java --- a/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Wed Jul 05 19:46:40 2017 +0200 @@ -552,7 +552,7 @@ static String toHex(byte[] data) { - StringBuffer sb = new StringBuffer(data.length*2); + StringBuilder sb = new StringBuilder(data.length*2); for (int i=0; i>4) & 0x0f]); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/security/x509/X509CRLImpl.java --- a/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -536,7 +536,7 @@ * @return value of this CRL in a printable form. */ public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("X.509 CRL v" + (version+1) + "\n"); if (sigAlgId != null) sb.append("Signature Algorithm: " + sigAlgId.toString() + diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/swing/SwingUtilities2.java --- a/jdk/src/share/classes/sun/swing/SwingUtilities2.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/swing/SwingUtilities2.java Wed Jul 05 19:46:40 2017 +0200 @@ -1431,7 +1431,7 @@ } public static String displayPropertiesToCSS(Font font, Color fg) { - StringBuffer rule = new StringBuffer("body {"); + StringBuilder rule = new StringBuilder("body {"); if (font != null) { rule.append(" font-family: "); rule.append(font.getFamily()); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/swing/plaf/synth/DefaultSynthStyle.java --- a/jdk/src/share/classes/sun/swing/plaf/synth/DefaultSynthStyle.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/swing/plaf/synth/DefaultSynthStyle.java Wed Jul 05 19:46:40 2017 +0200 @@ -673,33 +673,33 @@ public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buf.append(super.toString()).append(','); + sb.append(super.toString()).append(','); - buf.append("data=").append(data).append(','); + sb.append("data=").append(data).append(','); - buf.append("font=").append(font).append(','); + sb.append("font=").append(font).append(','); - buf.append("insets=").append(insets).append(','); + sb.append("insets=").append(insets).append(','); - buf.append("synthGraphics=").append(synthGraphics).append(','); + sb.append("synthGraphics=").append(synthGraphics).append(','); - buf.append("painter=").append(painter).append(','); + sb.append("painter=").append(painter).append(','); StateInfo[] states = getStateInfo(); if (states != null) { - buf.append("states["); + sb.append("states["); for (StateInfo state : states) { - buf.append(state.toString()).append(','); + sb.append(state.toString()).append(','); } - buf.append(']').append(','); + sb.append(']').append(','); } // remove last newline - buf.deleteCharAt(buf.length() - 1); + sb.deleteCharAt(sb.length() - 1); - return buf.toString(); + return sb.toString(); } @@ -909,19 +909,19 @@ } public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); - buf.append(super.toString()).append(','); + sb.append(super.toString()).append(','); - buf.append("state=").append(Integer.toString(state)).append(','); + sb.append("state=").append(Integer.toString(state)).append(','); - buf.append("font=").append(font).append(','); + sb.append("font=").append(font).append(','); if (colors != null) { - buf.append("colors=").append(Arrays.asList(colors)). + sb.append("colors=").append(Arrays.asList(colors)). append(','); } - return buf.toString(); + return sb.toString(); } } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java --- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -439,20 +439,20 @@ } private String fileNameString(File[] files) { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; files != null && i < files.length; i++) { if (i > 0) { - buf.append(" "); + sb.append(" "); } if (files.length > 1) { - buf.append("\""); + sb.append("\""); } - buf.append(fileNameString(files[i])); + sb.append(fileNameString(files[i])); if (files.length > 1) { - buf.append("\""); + sb.append("\""); } } - return buf.toString(); + return sb.toString(); } public void uninstallUI(JComponent c) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/text/normalizer/UTF16.java --- a/jdk/src/share/classes/sun/text/normalizer/UTF16.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/text/normalizer/UTF16.java Wed Jul 05 19:46:40 2017 +0200 @@ -530,7 +530,7 @@ return String.valueOf((char)ch); } - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append(getLeadSurrogate(ch)); result.append(getTrailSurrogate(ch)); return result.toString(); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/java/MemberDefinition.java --- a/jdk/src/share/classes/sun/tools/java/MemberDefinition.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/java/MemberDefinition.java Wed Jul 05 19:46:40 2017 +0200 @@ -919,18 +919,18 @@ if (isInitializer()) { return isStatic() ? "static {}" : "instance {}"; } else if (isConstructor()) { - StringBuffer buf = new StringBuffer(); - buf.append(name); - buf.append('('); + StringBuilder sb = new StringBuilder(); + sb.append(name); + sb.append('('); Type argTypes[] = getType().getArgumentTypes(); for (int i = 0 ; i < argTypes.length ; i++) { if (i > 0) { - buf.append(','); + sb.append(','); } - buf.append(argTypes[i].toString()); + sb.append(argTypes[i].toString()); } - buf.append(')'); - return buf.toString(); + sb.append(')'); + return sb.toString(); } else if (isInnerClass()) { return getInnerClass().toString(); } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/java/MethodSet.java --- a/jdk/src/share/classes/sun/tools/java/MethodSet.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/java/MethodSet.java Wed Jul 05 19:46:40 2017 +0200 @@ -261,18 +261,18 @@ */ public String toString() { int len = size(); - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); Iterator all = iterator(); - buf.append("{"); + sb.append("{"); while (all.hasNext()) { - buf.append(all.next().toString()); + sb.append(all.next().toString()); len--; if (len > 0) { - buf.append(", "); + sb.append(", "); } } - buf.append("}"); - return buf.toString(); + sb.append("}"); + return sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/java/MethodType.java --- a/jdk/src/share/classes/sun/tools/java/MethodType.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/java/MethodType.java Wed Jul 05 19:46:40 2017 +0200 @@ -91,17 +91,17 @@ } public String typeString(String id, boolean abbrev, boolean ret) { - StringBuffer buf = new StringBuffer(); - buf.append(id); - buf.append('('); + StringBuilder sb = new StringBuilder(); + sb.append(id); + sb.append('('); for (int i = 0 ; i < argTypes.length ; i++) { if (i > 0) { - buf.append(", "); + sb.append(", "); } - buf.append(argTypes[i].typeString("", abbrev, ret)); + sb.append(argTypes[i].typeString("", abbrev, ret)); } - buf.append(')'); + sb.append(')'); - return ret ? getReturnType().typeString(buf.toString(), abbrev, ret) : buf.toString(); + return ret ? getReturnType().typeString(sb.toString(), abbrev, ret) : sb.toString(); } } diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/java/Parser.java --- a/jdk/src/share/classes/sun/tools/java/Parser.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/java/Parser.java Wed Jul 05 19:46:40 2017 +0200 @@ -1395,24 +1395,24 @@ return res; } - StringBuffer buf = new StringBuffer(res.id.toString()); + StringBuilder sb = new StringBuilder(res.id.toString()); while (token == FIELD) { scan(); if ((token == MUL) && star) { scan(); - buf.append(".*"); + sb.append(".*"); break; } - buf.append('.'); + sb.append('.'); if (token == IDENT) { - buf.append(scanner.idValue); + sb.append(scanner.idValue); } expect(IDENT); } - res.id = Identifier.lookup(buf.toString()); + res.id = Identifier.lookup(sb.toString()); return res; } /** diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/java/Type.java --- a/jdk/src/share/classes/sun/tools/java/Type.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/java/Type.java Wed Jul 05 19:46:40 2017 +0200 @@ -274,15 +274,15 @@ * Create a method type with arguments. */ public static synchronized Type tMethod(Type returnType, Type argTypes[]) { - StringBuffer buf = new StringBuffer(); - buf.append(SIG_METHOD); + StringBuilder sb = new StringBuilder(); + sb.append(SIG_METHOD); for (int i = 0 ; i < argTypes.length ; i++) { - buf.append(argTypes[i].getTypeSignature()); + sb.append(argTypes[i].getTypeSignature()); } - buf.append(SIG_ENDMETHOD); - buf.append(returnType.getTypeSignature()); + sb.append(SIG_ENDMETHOD); + sb.append(returnType.getTypeSignature()); - String sig = buf.toString(); + String sig = sb.toString(); Type t = (Type)typeHash.get(sig); if (t == null) { t = new MethodType(sig, returnType, argTypes); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/jconsole/Formatter.java --- a/jdk/src/share/classes/sun/tools/jconsole/Formatter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/jconsole/Formatter.java Wed Jul 05 19:46:40 2017 +0200 @@ -232,15 +232,15 @@ } static String justify(String str, int size) { - StringBuffer buf = new StringBuffer(); - buf.append(""); + StringBuilder sb = new StringBuilder(); + sb.append(""); int n = size - str.length(); for (int i = 0; i < n; i++) { - buf.append(" "); + sb.append(" "); } - buf.append(str); - buf.append(""); - return buf.toString(); + sb.append(str); + sb.append(""); + return sb.toString(); } static String newRow(String label, String value) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/jstatd/RemoteHostImpl.java --- a/jdk/src/share/classes/sun/tools/jstatd/RemoteHostImpl.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/jstatd/RemoteHostImpl.java Wed Jul 05 19:46:40 2017 +0200 @@ -64,7 +64,7 @@ throws RemoteException, MonitorException { Integer v = new Integer(lvmid); RemoteVm stub = null; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("local://").append(lvmid).append("@localhost"); if (mode != null) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/native2ascii/N2AFilter.java --- a/jdk/src/share/classes/sun/tools/native2ascii/N2AFilter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/native2ascii/N2AFilter.java Wed Jul 05 19:46:40 2017 +0200 @@ -58,7 +58,7 @@ out.write('u'); String hex = Integer.toHexString(buf[i]); - StringBuffer hex4 = new StringBuffer(hex); + StringBuilder hex4 = new StringBuilder(hex); hex4.reverse(); int length = 4 - hex4.length(); for (int j = 0; j < length; j++) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/serialver/SerialVer.java --- a/jdk/src/share/classes/sun/tools/serialver/SerialVer.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/serialver/SerialVer.java Wed Jul 05 19:46:40 2017 +0200 @@ -85,7 +85,7 @@ /* Class not found so far */ } if (!classFound) { - StringBuffer workBuffer = new StringBuffer(classname); + StringBuilder workBuffer = new StringBuilder(classname); String workName = workBuffer.toString(); int i; while ((i = workName.lastIndexOf('.')) != -1 && !classFound) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/tree/FieldExpression.java --- a/jdk/src/share/classes/sun/tools/tree/FieldExpression.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/tree/FieldExpression.java Wed Jul 05 19:46:40 2017 +0200 @@ -79,21 +79,21 @@ * Convert an '.' expression to a qualified identifier */ static public Identifier toIdentifier(Expression e) { - StringBuffer buf = new StringBuffer(); + StringBuilder sb = new StringBuilder(); while (e.op == FIELD) { FieldExpression fe = (FieldExpression)e; if (fe.id == idThis || fe.id == idClass) { return null; } - buf.insert(0, fe.id); - buf.insert(0, '.'); + sb.insert(0, fe.id); + sb.insert(0, '.'); e = fe.right; } if (e.op != IDENT) { return null; } - buf.insert(0, ((IdentifierExpression)e).id); - return Identifier.lookup(buf.toString()); + sb.insert(0, ((IdentifierExpression) e).id); + return Identifier.lookup(sb.toString()); } /** diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tools/tree/Vset.java --- a/jdk/src/share/classes/sun/tools/tree/Vset.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tools/tree/Vset.java Wed Jul 05 19:46:40 2017 +0200 @@ -495,7 +495,7 @@ public String toString() { if (this == DEAD_END) return "{DEAD_END}"; - StringBuffer sb = new StringBuffer("{"); + StringBuilder sb = new StringBuilder("{"); int maxVar = VBITS * (1 + (x.length+1)/2); for (int i = 0; i < maxVar; i++) { if (!testVarUnassigned(i)) { diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java --- a/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Wed Jul 05 19:46:40 2017 +0200 @@ -99,7 +99,7 @@ } public void uncheckedTrigger(Object[] args) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(provider.getName()); sb.append("."); sb.append(name); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/demo/jvmti/hprof/hprof.h --- a/jdk/src/share/demo/jvmti/hprof/hprof.h Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/demo/jvmti/hprof/hprof.h Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -67,10 +67,6 @@ #include "classfile_constants.h" #include "jvm_md.h" -#ifndef SKIP_NPT -#include "npt.h" /* To get NptEnv for doing character conversions */ -#endif - /* Macros to extract the upper and lower 32 bits of a jlong */ #define jlong_high(a) ((jint)((a)>>32)) @@ -207,9 +203,6 @@ jvmtiEnv *jvmti; /* JVMTI env for this session */ JavaVM *jvm; /* JavaVM* for this session */ -#ifndef SKIP_NPT - NptEnv *npt; /* NptEnv* for this session, see npt.h */ -#endif jint cachedJvmtiVersion; /* JVMTI version number */ char *header; /* "JAVA PROFILE 1.0.[12]" */ diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/demo/jvmti/hprof/hprof_init.c --- a/jdk/src/share/demo/jvmti/hprof/hprof_init.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/share/demo/jvmti/hprof/hprof_init.c Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -740,16 +740,11 @@ } if ( gdata->utf8_output_filename != NULL ) { - /* UTF-8 to platform encoding (fill in gdata->output_filename) */ + // Don't attempt to convert output filename. + // If fileystem uses the same encoding as the rest of the OS it will work as is. ulen = (int)strlen(gdata->utf8_output_filename); gdata->output_filename = (char*)HPROF_MALLOC(ulen*3+3); -#ifdef SKIP_NPT (void)strcpy(gdata->output_filename, gdata->utf8_output_filename); -#else - (void)(gdata->npt->utf8ToPlatform) - (gdata->npt->utf, (jbyte*)gdata->utf8_output_filename, ulen, - gdata->output_filename, ulen*3+3); -#endif } /* By default we turn on gdata->alloc_sites and gdata->heap_dump */ @@ -1949,7 +1944,6 @@ Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { char *boot_path = NULL; - char npt_lib[JVM_MAXPATHLEN]; /* See if it's already loaded */ if ( gdata!=NULL && gdata->isLoaded==JNI_TRUE ) { @@ -1970,24 +1964,6 @@ /* Get the JVMTI environment */ getJvmti(); -#ifndef SKIP_NPT - getSystemProperty("sun.boot.library.path", &boot_path); - /* Load in NPT library for character conversions */ - md_build_library_name(npt_lib, sizeof(npt_lib), boot_path, NPT_LIBNAME); - if ( strlen(npt_lib) == 0 ) { - HPROF_ERROR(JNI_TRUE, "Could not find npt library"); - } - jvmtiDeallocate(boot_path); - NPT_INITIALIZE(npt_lib, &(gdata->npt), NPT_VERSION, NULL); - if ( gdata->npt == NULL ) { - HPROF_ERROR(JNI_TRUE, "Cannot load npt library"); - } - gdata->npt->utf = (gdata->npt->utfInitialize)(NULL); - if ( gdata->npt->utf == NULL ) { - HPROF_ERROR(JNI_TRUE, "Cannot initialize npt utf functions"); - } -#endif - /* Lock needed to protect debug_malloc() code, which is not MT safe */ #ifdef DEBUG gdata->debug_malloc_lock = createRawMonitor("HPROF debug_malloc lock"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/npt/README.txt --- a/jdk/src/share/npt/README.txt Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ - -README: For NPT Library. ------------------------- - -To use this Native Platform Toolkit library, you need to add --Isrc/share/npt and -I/src/${platform}/npt (platform is solaris or windows) -to your compilation lines. - -To initialize/use the library: - - #include "npt.h" - - NptEnv *npt; - - NPT_INITIALIZE(&npt, NPT_VERSION, NULL); - if (npt == NULL) { - FATAL_ERROR_MESSAGE(("Unable to gain access to Npt library")); - } - - /* To use the npt utf functions, they require initialization */ - npt->utf = (npt->utfInitialize)(NULL); - if (npt->utf == NULL) { - FATAL_ERROR_MESSAGE(("Unable to gain access to Npt utf functions")); - } - - ... - - - /* After all uses is done, it can be terminated, however, if the - * process will be exiting anyway it isn't necessary, and if - * you have other threads running that might use these handles - * you will need to wait here until all those threads have terminated. - * So in general, termination can be a pain and slow your process - * termination down. - */ - (npt->utfTerminate)(npt->utf,NULL); - NPT_TERMINATE(&npt, NULL); - - diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/npt/npt.c --- a/jdk/src/share/npt/npt.c Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2004, 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. - */ - -#include -#include -#include - -#include "jni.h" - -#include "npt.h" - -#include "utf.h" - -static int -version_check(char *version) -{ - if ( version==NULL || strcmp(version, NPT_VERSION)!=0 ) { - return 1; - } - return 0; -} - -JNIEXPORT void JNICALL -nptInitialize(NptEnv **pnpt, char *nptVersion, char *options) -{ - NptEnv *npt; - - (*pnpt) = NULL; - - if ( version_check(nptVersion) ) { - NPT_ERROR("NPT version doesn't match"); - return; - } - - npt = (NptEnv*)calloc(sizeof(NptEnv), 1); - if ( npt == NULL ) { - NPT_ERROR("Cannot allocate calloc space for NptEnv*"); - return; - } - - if ( options != NULL ) { - npt->options = strdup(options); - } - npt->utfInitialize = &utfInitialize; - npt->utfTerminate = &utfTerminate; - npt->utf8ToPlatform = &utf8ToPlatform; - npt->utf8FromPlatform = &utf8FromPlatform; - npt->utf8ToUtf16 = &utf8ToUtf16; - npt->utf16ToUtf8m = &utf16ToUtf8m; - npt->utf16ToUtf8s = &utf16ToUtf8s; - npt->utf8sToUtf8mLength = &utf8sToUtf8mLength; - npt->utf8sToUtf8m = &utf8sToUtf8m; - npt->utf8mToUtf8sLength = &utf8mToUtf8sLength; - npt->utf8mToUtf8s = &utf8mToUtf8s; - - (*pnpt) = npt; -} - -JNIEXPORT void JNICALL -nptTerminate(NptEnv* npt, char *options) -{ - - /* FIXUP: options? Check memory or something? */ - if ( npt->options != NULL ) { - (void)free(npt->options); - } - (void)free(npt); -} diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/npt/npt.h --- a/jdk/src/share/npt/npt.h Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2004, 2013, 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. - */ - -/* Native Platform Toolkit */ - -#ifndef _NPT_H -#define _NPT_H - -#define NPT_VERSION "0.0.0" - -#include - -#include "jni.h" - -#include "npt_md.h" -#include "utf.h" - -#define NPT_ERROR(s) { (void)fprintf(stderr, "NPT ERROR: %s\n", s); exit(1); } - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - - /* Used to save handle to our own dynamicly loaded library */ - void *libhandle; - - /* Copy of the options sent in at initialization */ - char *options; - - /* Can be used to save the UtfInst handle */ - struct UtfInst *utf; - - /* UTF interfaces, see utf.c */ - struct UtfInst* (JNICALL *utfInitialize) - (char *options); - void (JNICALL *utfTerminate) - (struct UtfInst *utf, char *options); - int (JNICALL *utf8ToPlatform) - (struct UtfInst *utf, jbyte *utf8, int len, - char *output, int outputMaxLen); - int (JNICALL *utf8FromPlatform) - (struct UtfInst *utf, char *str, int len, - jbyte *output, int outputMaxLen); - int (JNICALL *utf8ToUtf16) - (struct UtfInst *utf, jbyte *utf8, int len, - jchar *output, int outputMaxLen); - int (JNICALL *utf16ToUtf8m) - (struct UtfInst *utf, jchar *utf16, int len, - jbyte *output, int outputMaxLen); - int (JNICALL *utf16ToUtf8s) - (struct UtfInst *utf, jchar *utf16, int len, - jbyte *output, int outputMaxLen); - int (JNICALL *utf8sToUtf8mLength) - (struct UtfInst *utf, jbyte *string, int length); - void (JNICALL *utf8sToUtf8m) - (struct UtfInst *utf, jbyte *string, int length, - jbyte *newString, int newLength); - int (JNICALL *utf8mToUtf8sLength) - (struct UtfInst *utf, jbyte *string, int length); - void (JNICALL *utf8mToUtf8s) - (struct UtfInst *utf, jbyte *string, int length, - jbyte *newString, int newLength); - -} NptEnv; - -/* Typedefs for the only 2 'extern' functions in npt library: - * nptInitialize and nptTerminate - * See NPT_INITIALIZE() and NPT_TERMINATE() in npt_md.h. - */ - -JNIEXPORT void JNICALL nptInitialize - (NptEnv **pnpt, char *nptVersion, char *options); -typedef void (JNICALL *NptInitialize) - (NptEnv **pnpt, char *nptVersion, char *options); - -JNIEXPORT void JNICALL nptTerminate - (NptEnv* npt, char *options); -typedef void (JNICALL *NptTerminate) - (NptEnv* npt, char *options); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/npt/utf.c --- a/jdk/src/share/npt/utf.c Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,500 +0,0 @@ -/* - * Copyright (c) 2004, 2013, 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. - */ - -/* Misc functions for conversion of Unicode and UTF-8 and platform encoding */ - -#include -#include -#include -#include -#include -#include - -#include "jni.h" - -#include "utf.h" - -/* - * Error handler - */ -void -utfError(char *file, int line, char *message) -{ - (void)fprintf(stderr, "UTF ERROR [\"%s\":%d]: %s\n", file, line, message); - abort(); -} - -/* - * Convert UTF-8 to UTF-16 - * Returns length or -1 if output overflows. - */ -int JNICALL -utf8ToUtf16(struct UtfInst *ui, jbyte *utf8, int len, unsigned short *output, int outputMaxLen) -{ - int outputLen; - int i; - - UTF_ASSERT(utf8); - UTF_ASSERT(len>=0); - UTF_ASSERT(output); - UTF_ASSERT(outputMaxLen>0); - - i = 0; - outputLen = 0; - while ( i= outputMaxLen ) { - return -1; - } - x = (unsigned char)utf8[i++]; - code = x; - if ( (x & 0xE0)==0xE0 ) { - y = (unsigned char)utf8[i++]; - z = (unsigned char)utf8[i++]; - code = ((x & 0xF)<<12) + ((y & 0x3F)<<6) + (z & 0x3F); - } else if ( (x & 0xC0)==0xC0 ) { - y = (unsigned char)utf8[i++]; - code = ((x & 0x1F)<<6) + (y & 0x3F); - } - output[outputLen++] = code; - } - return outputLen; -} - -/* - * Convert UTF-16 to UTF-8 Modified - * Returns length or -1 if output overflows. - */ -int JNICALL -utf16ToUtf8m(struct UtfInst *ui, unsigned short *utf16, int len, jbyte *output, int outputMaxLen) -{ - int i; - int outputLen; - - UTF_ASSERT(utf16); - UTF_ASSERT(len>=0); - UTF_ASSERT(output); - UTF_ASSERT(outputMaxLen>0); - - outputLen = 0; - for (i = 0; i < len; i++) { - unsigned code; - - code = utf16[i]; - if ( code >= 0x0001 && code <= 0x007F ) { - if ( outputLen + 1 >= outputMaxLen ) { - return -1; - } - output[outputLen++] = code; - } else if ( code == 0 || ( code >= 0x0080 && code <= 0x07FF ) ) { - if ( outputLen + 2 >= outputMaxLen ) { - return -1; - } - output[outputLen++] = ((code>>6) & 0x1F) | 0xC0; - output[outputLen++] = (code & 0x3F) | 0x80; - } else if ( code >= 0x0800 && code <= 0xFFFF ) { - if ( outputLen + 3 >= outputMaxLen ) { - return -1; - } - output[outputLen++] = ((code>>12) & 0x0F) | 0xE0; - output[outputLen++] = ((code>>6) & 0x3F) | 0x80; - output[outputLen++] = (code & 0x3F) | 0x80; - } - } - output[outputLen] = 0; - return outputLen; -} - -int JNICALL -utf16ToUtf8s(struct UtfInst *ui, unsigned short *utf16, int len, jbyte *output, int outputMaxLen) -{ - return -1; /* FIXUP */ -} - -/* Determine length of this Standard UTF-8 in Modified UTF-8. - * Validation is done of the basic UTF encoding rules, returns - * length (no change) when errors are detected in the UTF encoding. - * - * Note: Accepts Modified UTF-8 also, no verification on the - * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok. - */ -int JNICALL -utf8sToUtf8mLength(struct UtfInst *ui, jbyte *string, int length) -{ - int newLength; - int i; - - newLength = 0; - for ( i = 0 ; i < length ; i++ ) { - unsigned byte; - - byte = (unsigned char)string[i]; - if ( (byte & 0x80) == 0 ) { /* 1byte encoding */ - newLength++; - if ( byte == 0 ) { - newLength++; /* We gain one byte in length on NULL bytes */ - } - } else if ( (byte & 0xE0) == 0xC0 ) { /* 2byte encoding */ - /* Check encoding of following bytes */ - if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) { - break; /* Error condition */ - } - i++; /* Skip next byte */ - newLength += 2; - } else if ( (byte & 0xF0) == 0xE0 ) { /* 3byte encoding */ - /* Check encoding of following bytes */ - if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80 - || (string[i+2] & 0xC0) != 0x80 ) { - break; /* Error condition */ - } - i += 2; /* Skip next two bytes */ - newLength += 3; - } else if ( (byte & 0xF8) == 0xF0 ) { /* 4byte encoding */ - /* Check encoding of following bytes */ - if ( (i+3) >= length || (string[i+1] & 0xC0) != 0x80 - || (string[i+2] & 0xC0) != 0x80 - || (string[i+3] & 0xC0) != 0x80 ) { - break; /* Error condition */ - } - i += 3; /* Skip next 3 bytes */ - newLength += 6; /* 4byte encoding turns into 2 3byte ones */ - } else { - break; /* Error condition */ - } - } - if ( i != length ) { - /* Error in finding new length, return old length so no conversion */ - /* FIXUP: ERROR_MESSAGE? */ - return length; - } - return newLength; -} - -/* Convert Standard UTF-8 to Modified UTF-8. - * Assumes the UTF-8 encoding was validated by utf8mLength() above. - * - * Note: Accepts Modified UTF-8 also, no verification on the - * correctness of Standard UTF-8 is done. e,g, 0xC080 input is ok. - */ -void JNICALL -utf8sToUtf8m(struct UtfInst *ui, jbyte *string, int length, jbyte *newString, int newLength) -{ - int i; - int j; - - j = 0; - for ( i = 0 ; i < length ; i++ ) { - unsigned byte1; - - byte1 = (unsigned char)string[i]; - - /* NULL bytes and bytes starting with 11110xxx are special */ - if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */ - if ( byte1 == 0 ) { - /* Bits out: 11000000 10000000 */ - newString[j++] = (jbyte)0xC0; - newString[j++] = (jbyte)0x80; - } else { - /* Single byte */ - newString[j++] = byte1; - } - } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */ - newString[j++] = byte1; - newString[j++] = string[++i]; - } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */ - newString[j++] = byte1; - newString[j++] = string[++i]; - newString[j++] = string[++i]; - } else if ( (byte1 & 0xF8) == 0xF0 ) { /* 4byte encoding */ - /* Beginning of 4byte encoding, turn into 2 3byte encodings */ - unsigned byte2, byte3, byte4, u21; - - /* Bits in: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - byte2 = (unsigned char)string[++i]; - byte3 = (unsigned char)string[++i]; - byte4 = (unsigned char)string[++i]; - /* Reconstruct full 21bit value */ - u21 = (byte1 & 0x07) << 18; - u21 += (byte2 & 0x3F) << 12; - u21 += (byte3 & 0x3F) << 6; - u21 += (byte4 & 0x3F); - /* Bits out: 11101101 1010xxxx 10xxxxxx */ - newString[j++] = (jbyte)0xED; - newString[j++] = (jbyte)(0xA0 + (((u21 >> 16) - 1) & 0x0F)); - newString[j++] = (jbyte)(0x80 + ((u21 >> 10) & 0x3F)); - /* Bits out: 11101101 1011xxxx 10xxxxxx */ - newString[j++] = (jbyte)0xED; - newString[j++] = (jbyte)(0xB0 + ((u21 >> 6) & 0x0F)); - newString[j++] = byte4; - } - } - UTF_ASSERT(i==length); - UTF_ASSERT(j==newLength); - newString[j] = (jbyte)0; -} - -/* Given a Modified UTF-8 string, calculate the Standard UTF-8 length. - * Basic validation of the UTF encoding rules is done, and length is - * returned (no change) when errors are detected. - * - * Note: No validation is made that this is indeed Modified UTF-8 coming in. - * - */ -int JNICALL -utf8mToUtf8sLength(struct UtfInst *ui, jbyte *string, int length) -{ - int newLength; - int i; - - newLength = 0; - for ( i = 0 ; i < length ; i++ ) { - unsigned byte1, byte2, byte3, byte4, byte5, byte6; - - byte1 = (unsigned char)string[i]; - if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */ - newLength++; - } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */ - /* Check encoding of following bytes */ - if ( (i+1) >= length || (string[i+1] & 0xC0) != 0x80 ) { - break; /* Error condition */ - } - byte2 = (unsigned char)string[++i]; - if ( byte1 != 0xC0 || byte2 != 0x80 ) { - newLength += 2; /* Normal 2byte encoding, not 0xC080 */ - } else { - newLength++; /* We will turn 0xC080 into 0 */ - } - } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */ - /* Check encoding of following bytes */ - if ( (i+2) >= length || (string[i+1] & 0xC0) != 0x80 - || (string[i+2] & 0xC0) != 0x80 ) { - break; /* Error condition */ - } - byte2 = (unsigned char)string[++i]; - byte3 = (unsigned char)string[++i]; - newLength += 3; - /* Possible process a second 3byte encoding */ - if ( (i+3) < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) { - /* See if this is a pair of 3byte encodings */ - byte4 = (unsigned char)string[i+1]; - byte5 = (unsigned char)string[i+2]; - byte6 = (unsigned char)string[i+3]; - if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) { - /* Check encoding of 3rd byte */ - if ( (byte6 & 0xC0) != 0x80 ) { - break; /* Error condition */ - } - newLength++; /* New string will have 4byte encoding */ - i += 3; /* Skip next 3 bytes */ - } - } - } else { - break; /* Error condition */ - } - } - if ( i != length ) { - /* Error in UTF encoding */ - /* FIXUP: ERROR_MESSAGE()? */ - return length; - } - return newLength; -} - -/* Convert a Modified UTF-8 string into a Standard UTF-8 string - * It is assumed that this string has been validated in terms of the - * basic UTF encoding rules by utf8Length() above. - * - * Note: No validation is made that this is indeed Modified UTF-8 coming in. - * - */ -void JNICALL -utf8mToUtf8s(struct UtfInst *ui, jbyte *string, int length, jbyte *newString, int newLength) -{ - int i; - int j; - - j = 0; - for ( i = 0 ; i < length ; i++ ) { - unsigned byte1, byte2, byte3, byte4, byte5, byte6; - - byte1 = (unsigned char)string[i]; - if ( (byte1 & 0x80) == 0 ) { /* 1byte encoding */ - /* Single byte */ - newString[j++] = byte1; - } else if ( (byte1 & 0xE0) == 0xC0 ) { /* 2byte encoding */ - byte2 = (unsigned char)string[++i]; - if ( byte1 != 0xC0 || byte2 != 0x80 ) { - newString[j++] = byte1; - newString[j++] = byte2; - } else { - newString[j++] = 0; - } - } else if ( (byte1 & 0xF0) == 0xE0 ) { /* 3byte encoding */ - byte2 = (unsigned char)string[++i]; - byte3 = (unsigned char)string[++i]; - if ( i+3 < length && byte1 == 0xED && (byte2 & 0xF0) == 0xA0 ) { - /* See if this is a pair of 3byte encodings */ - byte4 = (unsigned char)string[i+1]; - byte5 = (unsigned char)string[i+2]; - byte6 = (unsigned char)string[i+3]; - if ( byte4 == 0xED && (byte5 & 0xF0) == 0xB0 ) { - unsigned u21; - - /* Bits in: 11101101 1010xxxx 10xxxxxx */ - /* Bits in: 11101101 1011xxxx 10xxxxxx */ - i += 3; - - /* Reconstruct 21 bit code */ - u21 = ((byte2 & 0x0F) + 1) << 16; - u21 += (byte3 & 0x3F) << 10; - u21 += (byte5 & 0x0F) << 6; - u21 += (byte6 & 0x3F); - - /* Bits out: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - - /* Convert to 4byte encoding */ - newString[j++] = 0xF0 + ((u21 >> 18) & 0x07); - newString[j++] = 0x80 + ((u21 >> 12) & 0x3F); - newString[j++] = 0x80 + ((u21 >> 6) & 0x3F); - newString[j++] = 0x80 + (u21 & 0x3F); - continue; - } - } - /* Normal 3byte encoding */ - newString[j++] = byte1; - newString[j++] = byte2; - newString[j++] = byte3; - } - } - UTF_ASSERT(i==length); - UTF_ASSERT(j==newLength); - newString[j] = 0; -} - -/* ================================================================= */ - -#ifdef COMPILE_WITH_UTF_TEST /* Test program */ - -/* - * Convert any byte array into a printable string. - * Returns length or -1 if output overflows. - */ -static int -bytesToPrintable(struct UtfInst *ui, char *bytes, int len, char *output, int outputMaxLen) -{ - int outputLen; - int i; - - UTF_ASSERT(bytes); - UTF_ASSERT(len>=0); - UTF_ASSERT(output); - UTF_ASSERT(outputMaxLen>=0); - - outputLen = 0; - for ( i=0; i= outputMaxLen ) { - return -1; - } - output[outputLen++] = (char)byte; - } else { - if ( outputLen + 4 >= outputMaxLen ) { - return -1; - } - (void)sprintf(output+outputLen,"\\x%02x",byte); - outputLen += 4; - } - } - output[outputLen] = 0; - return outputLen; -} - -static void -test(void) -{ - static char *strings[] = { - "characters", - "abcdefghijklmnopqrstuvwxyz", - "0123456789", - "!@#$%^&*()_+=-{}[]:;", - NULL }; - int i; - struct UtfInst *ui; - - ui = utfInitialize(NULL); - - i = 0; - while ( strings[i] != NULL ) { - char *str; - #define MAX 1024 - char buf0[MAX]; - char buf1[MAX]; - char buf2[MAX]; - unsigned short buf3[MAX]; - int len1; - int len2; - int len3; - - str = strings[i]; - - (void)bytesToPrintable(ui, str, (int)strlen(str), buf0, 1024); - - len1 = utf8FromPlatform(ui, str, (int)strlen(str), (jbyte*)buf1, 1024); - - UTF_ASSERT(len1==(int)strlen(str)); - - len3 = utf8ToUtf16(ui, (jbyte*)buf1, len1, (jchar*)buf3, 1024); - - UTF_ASSERT(len3==len1); - - len1 = utf16ToUtf8m(ui, (jchar*)buf3, len3, (jbyte*)buf1, 1024); - - UTF_ASSERT(len1==len3); - UTF_ASSERT(strcmp(str, buf1) == 0); - - len2 = utf8ToPlatform(ui, (jbyte*)buf1, len1, buf2, 1024); - - UTF_ASSERT(len2==len1); - UTF_ASSERT(strcmp(str, buf2) == 0); - - i++; - } - - utfTerminate(ui, NULL); - -} - -int -main(int argc, char **argv) -{ - test(); - return 0; -} - -#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/share/npt/utf.h --- a/jdk/src/share/npt/utf.h Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2004, 2012, 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. - */ - -/* Routines for various UTF conversions */ - -#ifndef _UTF_H -#define _UTF_H - -#include - -#include "jni.h" -#include "utf_md.h" - -/* Use THIS_FILE when it is available. */ -#ifndef THIS_FILE - #define THIS_FILE __FILE__ -#endif - -/* Error and assert macros */ -#define UTF_ERROR(m) utfError(THIS_FILE, __LINE__, m) -#define UTF_ASSERT(x) ( (x)==0 ? UTF_ERROR("ASSERT ERROR " #x) : (void)0 ) - -void utfError(char *file, int line, char *message); - -struct UtfInst* JNICALL utfInitialize - (char *options); -void JNICALL utfTerminate - (struct UtfInst *ui, char *options); -int JNICALL utf8ToPlatform - (struct UtfInst *ui, jbyte *utf8, - int len, char *output, int outputMaxLen); -int JNICALL utf8FromPlatform - (struct UtfInst *ui, char *str, int len, - jbyte *output, int outputMaxLen); -int JNICALL utf8ToUtf16 - (struct UtfInst *ui, jbyte *utf8, int len, - jchar *output, int outputMaxLen); -int JNICALL utf16ToUtf8m - (struct UtfInst *ui, jchar *utf16, int len, - jbyte *output, int outputMaxLen); -int JNICALL utf16ToUtf8s - (struct UtfInst *ui, jchar *utf16, int len, - jbyte *output, int outputMaxLen); -int JNICALL utf8sToUtf8mLength - (struct UtfInst *ui, jbyte *string, int length); -void JNICALL utf8sToUtf8m - (struct UtfInst *ui, jbyte *string, int length, - jbyte *new_string, int new_length); -int JNICALL utf8mToUtf8sLength - (struct UtfInst *ui, jbyte *string, int length); -void JNICALL utf8mToUtf8s - (struct UtfInst *ui, jbyte *string, int length, - jbyte *new_string, int new_length); - -#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/solaris/native/java/net/ExtendedOptionsImpl.c --- a/jdk/src/solaris/native/java/net/ExtendedOptionsImpl.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/solaris/native/java/net/ExtendedOptionsImpl.c Wed Jul 05 19:46:40 2017 +0200 @@ -218,6 +218,9 @@ if (errno == ENOPROTOOPT) { JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "unsupported socket option"); + } else if (errno == EACCES || errno == EPERM) { + NET_ERROR(env, JNU_JAVANETPKG "SocketException", + "Permission denied"); } else { NET_ERROR(env, JNU_JAVANETPKG "SocketException", "set option SO_FLOW_SLA failed"); @@ -251,6 +254,9 @@ if (errno == ENOPROTOOPT) { JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "unsupported socket option"); + } else if (errno == EACCES || errno == EPERM) { + NET_ERROR(env, JNU_JAVANETPKG "SocketException", + "Permission denied"); } else { NET_ERROR(env, JNU_JAVANETPKG "SocketException", "set option SO_FLOW_SLA failed"); diff -r 53fd25d388da -r 89731ae72a76 jdk/src/solaris/npt/npt_md.h --- a/jdk/src/solaris/npt/npt_md.h Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2004, 2012, 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. - */ - -/* Native Platform Toolkit */ - -#ifndef _NPT_MD_H -#define _NPT_MD_H - -#include -#include -#include -#include -#include - -#define NPT_LIBNAME "npt" - -#define NPT_INITIALIZE(path,pnpt,version,options) \ - { \ - void *_handle; \ - void *_sym; \ - \ - if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \ - *(pnpt) = NULL; \ - _handle = dlopen(path, RTLD_LAZY); \ - if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \ - _sym = dlsym(_handle, "nptInitialize"); \ - if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \ - ((NptInitialize)_sym)((pnpt), version, (options)); \ - if ( (*(pnpt)) == NULL ) NPT_ERROR("Cannot initialize NptEnv"); \ - (*(pnpt))->libhandle = _handle; \ - } - -#define NPT_TERMINATE(npt,options) \ - { \ - void *_handle; \ - void *_sym; \ - \ - if ( (npt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \ - _handle = (npt)->libhandle; \ - _sym = dlsym(_handle, "nptTerminate"); \ - if ( _sym == NULL ) NPT_ERROR("Cannot find nptTerminate"); \ - ((NptTerminate)_sym)((npt), (options)); \ - if ( _handle != NULL ) (void)dlclose(_handle); \ - } - - -#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/solaris/npt/utf_md.c --- a/jdk/src/solaris/npt/utf_md.c Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2004, 2005, 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. - */ - -#include -#include -#include -#include -#include -#include - -#include "utf.h" - -/* Global variables */ - -/* - * Initialize all utf processing. - */ -struct UtfInst *JNICALL -utfInitialize(char *options) -{ - struct UtfInst *ui; - char *codeset; - - ui = (struct UtfInst*)calloc(sizeof(struct UtfInst), 1); - ui->iconvToPlatform = (void *)-1; - ui->iconvFromPlatform = (void *)-1; - - /* Set the locale from the environment */ - (void)setlocale(LC_ALL, ""); - - /* Get the codeset name */ - codeset = (char*)nl_langinfo(CODESET); - if ( codeset == NULL || codeset[0] == 0 ) { - return ui; - } - - /* If we don't need this, skip it */ - if (strcmp(codeset, "UTF-8") == 0 || strcmp(codeset, "utf8") == 0 ) { - return ui; - } - - /* Open conversion descriptors */ - ui->iconvToPlatform = iconv_open(codeset, "UTF-8"); - if ( ui->iconvToPlatform == (void *)-1 ) { - UTF_ERROR("Failed to complete iconv_open() setup"); - } - ui->iconvFromPlatform = iconv_open("UTF-8", codeset); - if ( ui->iconvFromPlatform == (void *)-1 ) { - UTF_ERROR("Failed to complete iconv_open() setup"); - } - return ui; -} - -/* - * Terminate all utf processing - */ -void JNICALL -utfTerminate(struct UtfInst *ui, char *options) -{ - if ( ui->iconvFromPlatform != (void *)-1 ) { - (void)iconv_close(ui->iconvFromPlatform); - } - if ( ui->iconvToPlatform != (void *)-1 ) { - (void)iconv_close(ui->iconvToPlatform); - } - ui->iconvToPlatform = (void *)-1; - ui->iconvFromPlatform = (void *)-1; - (void)free(ui); -} - -/* - * Do iconv() conversion. - * Returns length or -1 if output overflows. - */ -static int -iconvConvert(iconv_t ic, char *bytes, int len, char *output, int outputMaxLen) -{ - int outputLen = 0; - - UTF_ASSERT(bytes); - UTF_ASSERT(len>=0); - UTF_ASSERT(output); - UTF_ASSERT(outputMaxLen>len); - - output[0] = 0; - outputLen = 0; - - if ( ic != (iconv_t)(void *)-1 ) { - int returnValue; - size_t inLeft; - size_t outLeft; - char *inbuf; - char *outbuf; - - inbuf = bytes; - outbuf = output; - inLeft = len; - outLeft = outputMaxLen; - returnValue = iconv(ic, (void*)&inbuf, &inLeft, &outbuf, &outLeft); - if ( returnValue >= 0 && inLeft==0 ) { - outputLen = outputMaxLen-outLeft; - output[outputLen] = 0; - return outputLen; - } - - /* Failed to do the conversion */ - return -1; - } - - /* Just copy bytes */ - outputLen = len; - (void)memcpy(output, bytes, len); - output[len] = 0; - return outputLen; -} - -/* - * Convert UTF-8 to Platform Encoding. - * Returns length or -1 if output overflows. - */ -int JNICALL -utf8ToPlatform(struct UtfInst*ui, jbyte *utf8, int len, char *output, int outputMaxLen) -{ - /* Negative length is an error */ - if ( len < 0 ) { - return -1; - } - - /* Zero length is ok, but we don't need to do much */ - if ( len == 0 ) { - output[0] = 0; - return 0; - } - - return iconvConvert(ui->iconvToPlatform, (char*)utf8, len, output, outputMaxLen); -} - -/* - * Convert Platform Encoding to UTF-8. - * Returns length or -1 if output overflows. - */ -int JNICALL -utf8FromPlatform(struct UtfInst*ui, char *str, int len, jbyte *output, int outputMaxLen) -{ - /* Negative length is an error */ - if ( len < 0 ) { - return -1; - } - - /* Zero length is ok, but we don't need to do much */ - if ( len == 0 ) { - output[0] = 0; - return 0; - } - - return iconvConvert(ui->iconvFromPlatform, str, len, (char*)output, outputMaxLen); -} diff -r 53fd25d388da -r 89731ae72a76 jdk/src/solaris/npt/utf_md.h --- a/jdk/src/solaris/npt/utf_md.h Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2004, 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. - */ - -#ifndef _UTF_MD_H -#define _UTF_MD_H - -struct UtfInst { - void *iconvToPlatform; - void *iconvFromPlatform; -}; - -#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c --- a/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2014, 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 @@ -59,11 +59,16 @@ numBytes = (*env)->GetArrayLength(env, randArray); randBytes = (*env)->GetByteArrayElements(env, randArray, NULL); + if (randBytes == NULL) { + goto cleanup; + } + if (CryptGenRandom(hCryptProv, numBytes, randBytes)) { result = JNI_TRUE; } (*env)->ReleaseByteArrayElements(env, randArray, randBytes, 0); +cleanup: CryptReleaseContext(hCryptProv, 0); return result; diff -r 53fd25d388da -r 89731ae72a76 jdk/src/windows/npt/npt_md.h --- a/jdk/src/windows/npt/npt_md.h Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2004, 2012, 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. - */ - -/* Native Platform Toolkit */ - -#ifndef _NPT_MD_H -#define _NPT_MD_H - -#include -#include -#include -#include - -#define NPT_LIBNAME "npt" - -#define NPT_INITIALIZE(path,pnpt,version,options) \ - { \ - void *_handle; \ - void *_sym; \ - \ - if ( (pnpt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \ - *(pnpt) = NULL; \ - _handle = LoadLibrary(path); \ - if ( _handle == NULL ) NPT_ERROR("Cannot open library"); \ - _sym = GetProcAddress(_handle, "nptInitialize"); \ - if ( _sym == NULL ) NPT_ERROR("Cannot find nptInitialize"); \ - ((NptInitialize)_sym)((pnpt), version, (options)); \ - if ( *(pnpt) == NULL ) NPT_ERROR("Cannot initialize NptEnv"); \ - (*(pnpt))->libhandle = _handle; \ - } - -#define NPT_TERMINATE(npt,options) \ - { \ - void *_handle; \ - void *_sym; \ - \ - if ( (npt) == NULL ) NPT_ERROR("NptEnv* is NULL"); \ - _handle = (npt)->libhandle; \ - if ( _handle == NULL ) NPT_ERROR("npt->libhandle is NULL"); \ - _sym = GetProcAddress(_handle, "nptTerminate"); \ - if ( _sym == NULL ) NPT_ERROR("Cannot find nptTerminate"); \ - ((NptTerminate)_sym)((npt), (options)); \ - (void)FreeLibrary(_handle); \ - } - -#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/src/windows/npt/utf_md.c --- a/jdk/src/windows/npt/utf_md.c Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2004, 2005, 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. - */ - -#include "utf.h" - -#include -#include -#include - -/* - * Initialize all utf processing. - */ -struct UtfInst * JNICALL -utfInitialize(char *options) -{ - struct UtfInst *ui; - LANGID langID; - LCID localeID; - TCHAR strCodePage[7]; // ANSI code page id - - ui = (struct UtfInst*)calloc(sizeof(struct UtfInst), 1); - - /* - * Get the code page for this locale - */ - langID = LANGIDFROMLCID(GetUserDefaultLCID()); - localeID = MAKELCID(langID, SORT_DEFAULT); - if (GetLocaleInfo(localeID, LOCALE_IDEFAULTANSICODEPAGE, - strCodePage, sizeof(strCodePage)/sizeof(TCHAR)) > 0 ) { - ui->platformCodePage = atoi(strCodePage); - } else { - ui->platformCodePage = GetACP(); - } - return ui; -} - -/* - * Terminate all utf processing - */ -void JNICALL -utfTerminate(struct UtfInst *ui, char *options) -{ - (void)free(ui); -} - -/* - * Get wide string (assumes len>0) - */ -static WCHAR* -getWideString(UINT codePage, char* str, int len, int *pwlen) -{ - int wlen; - WCHAR* wstr; - - /* Convert the string to WIDE string */ - wlen = MultiByteToWideChar(codePage, 0, str, len, NULL, 0); - *pwlen = wlen; - if (wlen <= 0) { - UTF_ERROR(("Can't get WIDE string length")); - return NULL; - } - wstr = (WCHAR*)malloc(wlen * sizeof(WCHAR)); - if (wstr == NULL) { - UTF_ERROR(("Can't malloc() any space")); - return NULL; - } - if (MultiByteToWideChar(codePage, 0, str, len, wstr, wlen) == 0) { - UTF_ERROR(("Can't get WIDE string")); - return NULL; - } - return wstr; -} - -/* - * Convert UTF-8 to a platform string - */ -int JNICALL -utf8ToPlatform(struct UtfInst *ui, jbyte *utf8, int len, char* output, int outputMaxLen) -{ - int wlen; - int plen; - WCHAR* wstr; - - /* Negative length is an error */ - if ( len < 0 ) { - return -1; - } - - /* Zero length is ok, but we don't need to do much */ - if ( len == 0 ) { - output[0] = 0; - return 0; - } - - /* Get WIDE string version (assumes len>0) */ - wstr = getWideString(CP_UTF8, (char*)utf8, len, &wlen); - if ( wstr == NULL ) { - return -1; - } - - /* Convert WIDE string to MultiByte string */ - plen = WideCharToMultiByte(ui->platformCodePage, 0, wstr, wlen, - output, outputMaxLen, NULL, NULL); - free(wstr); - if (plen <= 0) { - UTF_ERROR(("Can't convert WIDE string to multi-byte")); - return -1; - } - output[plen] = '\0'; - return plen; -} - -/* - * Convert Platform Encoding to UTF-8. - */ -int JNICALL -utf8FromPlatform(struct UtfInst *ui, char *str, int len, jbyte *output, int outputMaxLen) -{ - int wlen; - int plen; - WCHAR* wstr; - - /* Negative length is an error */ - if ( len < 0 ) { - return -1; - } - - /* Zero length is ok, but we don't need to do much */ - if ( len == 0 ) { - output[0] = 0; - return 0; - } - - /* Get WIDE string version (assumes len>0) */ - wstr = getWideString(ui->platformCodePage, str, len, &wlen); - if ( wstr == NULL ) { - return -1; - } - - /* Convert WIDE string to UTF-8 string */ - plen = WideCharToMultiByte(CP_UTF8, 0, wstr, wlen, - (char*)output, outputMaxLen, NULL, NULL); - free(wstr); - if (plen <= 0) { - UTF_ERROR(("Can't convert WIDE string to multi-byte")); - return -1; - } - output[plen] = '\0'; - return plen; -} diff -r 53fd25d388da -r 89731ae72a76 jdk/src/windows/npt/utf_md.h --- a/jdk/src/windows/npt/utf_md.h Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2004, 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. - */ - -#ifndef _UTF_MD_H -#define _UTF_MD_H - -struct UtfInst { - unsigned int platformCodePage; -}; - -#endif diff -r 53fd25d388da -r 89731ae72a76 jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/ProblemList.txt Wed Jul 05 19:46:40 2017 +0200 @@ -124,6 +124,10 @@ # jdk_management +# 8046351 +com/sun/management/GarbageCollectorMXBean/GarbageCollectionNotificationContentTest.java generic-all +com/sun/management/GarbageCollectorMXBean/GarbageCollectionNotificationTest.java generic-all + ############################################################################ # jdk_jmx @@ -264,7 +268,6 @@ # 8044419 com/sun/jdi/JdbReadTwiceTest.sh generic-all - ############################################################################ # jdk_util @@ -292,4 +295,10 @@ # 8037285 sun/tools/jstatd/TestJstatdServer.java generic-all +# 8046355 +sun/tools/jstatd/TestJstatdExternalRegistry.java generic-all + +# 8046352 +com/sun/tools/attach/TempDirTest.java generic-all + ############################################################################ diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/AccessSpecifierTest.java --- a/jdk/test/com/sun/jdi/AccessSpecifierTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/AccessSpecifierTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g AccessSpecifierTest.java - * @run main AccessSpecifierTest + * @run driver AccessSpecifierTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/AfterThreadDeathTest.java --- a/jdk/test/com/sun/jdi/AfterThreadDeathTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/AfterThreadDeathTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g AfterThreadDeathTest.java - * @run main AfterThreadDeathTest + * @run driver AfterThreadDeathTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/AllLineLocations.java --- a/jdk/test/com/sun/jdi/AllLineLocations.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/AllLineLocations.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,7 +32,7 @@ * @run compile -g RefTypes.java * @run build AllLineLocations * - * @run main AllLineLocations RefTypes + * @run driver AllLineLocations RefTypes */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/AnyDebuggeeTest.java --- a/jdk/test/com/sun/jdi/AnyDebuggeeTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/AnyDebuggeeTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g AnyDebuggeeTest.java - * @run main AnyDebuggeeeTest + * @run driver AnyDebuggeeeTest * * This test is intended to be run manually to investigate behaviors; * it is not an actual test of any specific functionality, it just diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ArgumentValuesTest.java --- a/jdk/test/com/sun/jdi/ArgumentValuesTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ArgumentValuesTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -7,7 +7,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile ArgumentValuesTest.java - * @run main ArgumentValuesTest + * @run driver ArgumentValuesTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ArrayRangeTest.java --- a/jdk/test/com/sun/jdi/ArrayRangeTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ArrayRangeTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,7 +32,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ArrayRangeTest.java - * @run main ArrayRangeTest + * @run driver ArrayRangeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/BacktraceFieldTest.java --- a/jdk/test/com/sun/jdi/BacktraceFieldTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/BacktraceFieldTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g BacktraceFieldTest.java - * @run main BacktraceFieldTest + * @run driver BacktraceFieldTest */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/BadHandshakeTest.java --- a/jdk/test/com/sun/jdi/BadHandshakeTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/BadHandshakeTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -27,7 +27,7 @@ * @library /lib/testlibrary * * @build jdk.testlibrary.* VMConnection BadHandshakeTest Exit0 - * @run main BadHandshakeTest + * @run driver BadHandshakeTest * */ import java.net.Socket; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/BreakpointTest.java --- a/jdk/test/com/sun/jdi/BreakpointTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/BreakpointTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g BreakpointTest.java - * @run main BreakpointTest + * @run driver BreakpointTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ClassLoaderClassesTest.java --- a/jdk/test/com/sun/jdi/ClassLoaderClassesTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ClassLoaderClassesTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,7 +32,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ClassLoaderClassesTest.java - * @run main ClassLoaderClassesTest + * @run driver ClassLoaderClassesTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ClassesByName.java --- a/jdk/test/com/sun/jdi/ClassesByName.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ClassesByName.java Wed Jul 05 19:46:40 2017 +0200 @@ -34,7 +34,7 @@ * @summary ClassesByName verifies that all the classes in the * loaded class list can be found with classesByName.. * - * @run main ClassesByName HelloWorld + * @run driver ClassesByName HelloWorld */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ClassesByName2Test.java --- a/jdk/test/com/sun/jdi/ClassesByName2Test.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ClassesByName2Test.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ClassesByName2Test.java - * @run main ClassesByName2Test + * @run driver ClassesByName2Test */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ConnectedVMs.java --- a/jdk/test/com/sun/jdi/ConnectedVMs.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ConnectedVMs.java Wed Jul 05 19:46:40 2017 +0200 @@ -28,10 +28,10 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g InstTarg.java - * @run main ConnectedVMs Kill - * @run main ConnectedVMs Resume-to-exit - * @run main ConnectedVMs dispose() - * @run main ConnectedVMs exit() + * @run driver ConnectedVMs Kill + * @run driver ConnectedVMs Resume-to-exit + * @run driver ConnectedVMs dispose() + * @run driver ConnectedVMs exit() * * @summary ConnectedVMs checks the method * VirtualMachineManager.connectedVirtualMachines() diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ConstantPoolInfo.java --- a/jdk/test/com/sun/jdi/ConstantPoolInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ConstantPoolInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection * @run compile -g ConstantPoolInfo.java - * @run main ConstantPoolInfo + * @run driver ConstantPoolInfo */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/CountEvent.java --- a/jdk/test/com/sun/jdi/CountEvent.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/CountEvent.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetAdapter TargetListener * @run compile -g CountEvent.java - * @run main CountEvent + * @run driver CountEvent */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/CountFilterTest.java --- a/jdk/test/com/sun/jdi/CountFilterTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/CountFilterTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g CountFilterTest.java - * @run main CountFilterTest + * @run driver CountFilterTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/DataModelTest.java --- a/jdk/test/com/sun/jdi/DataModelTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/DataModelTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -34,7 +34,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g DataModelTest.java - * @run main DataModelTest + * @run driver DataModelTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/DebuggerThreadTest.java --- a/jdk/test/com/sun/jdi/DebuggerThreadTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/DebuggerThreadTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g DebuggerThreadTest.java - * @run main DebuggerThreadTest + * @run driver DebuggerThreadTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/DeleteAllBkptsTest.java --- a/jdk/test/com/sun/jdi/DeleteAllBkptsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/DeleteAllBkptsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * @library .. * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g DeleteAllBkptsTest.java - * @run main DeleteAllBkptsTest + * @run driver DeleteAllBkptsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/DeleteEventRequestsTest.java --- a/jdk/test/com/sun/jdi/DeleteEventRequestsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/DeleteEventRequestsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g DeleteEventRequestsTest.java - * @run main DeleteEventRequestsTest + * @run driver DeleteEventRequestsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/DoubleAgentTest.java --- a/jdk/test/com/sun/jdi/DoubleAgentTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/DoubleAgentTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -26,14 +26,13 @@ * @summary Check that a double agent request fails * * @build VMConnection DoubleAgentTest Exit0 - * @run main DoubleAgentTest + * @run driver DoubleAgentTest * */ import java.io.InputStream; import java.io.IOException; import java.io.File; import java.net.ServerSocket; -import java.net.Socket; public class DoubleAgentTest { diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java --- a/jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g EarlyReturnNegativeTest.java - * @run main EarlyReturnNegativeTest + * @run driver EarlyReturnNegativeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/EarlyReturnTest.java --- a/jdk/test/com/sun/jdi/EarlyReturnTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/EarlyReturnTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -36,7 +36,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g EarlyReturnTest.java - * @run main EarlyReturnTest + * @run driver EarlyReturnTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/EnumTest.java --- a/jdk/test/com/sun/jdi/EnumTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/EnumTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g EnumTest.java - * @run main EnumTest + * @run driver EnumTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/EventQueueDisconnectTest.java --- a/jdk/test/com/sun/jdi/EventQueueDisconnectTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/EventQueueDisconnectTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -28,7 +28,7 @@ * * @run build VMConnection * @run compile -g EventQueueDisconnectTest.java - * @run main EventQueueDisconnectTest + * @run driver EventQueueDisconnectTest * * @summary EventQueueDisconnectTest checks to see that * VMDisconnectedException is never thrown before VMDisconnectEvent. @@ -64,7 +64,7 @@ "com.sun.jdi.CommandLineLaunch:", VirtualMachine.TRACE_NONE); connection.setConnectorArg("main", "EventQueueDisconnectTarg"); - String debuggeeVMOptions = connection.getDebuggeeVMOptions(); + String debuggeeVMOptions = VMConnection.getDebuggeeVMOptions(); if (!debuggeeVMOptions.equals("")) { if (connection.connectorArg("options").length() > 0) { throw new IllegalArgumentException("VM options in two places"); diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ExceptionEvents.java --- a/jdk/test/com/sun/jdi/ExceptionEvents.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ExceptionEvents.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,32 +32,32 @@ * @run build TestScaffold VMConnection * @run compile -g ExceptionEvents.java * - * @run main/othervm ExceptionEvents N A StackOverflowCaughtTarg java.lang.Exception - * @run main/othervm ExceptionEvents C A StackOverflowCaughtTarg null - * @run main/othervm ExceptionEvents C A StackOverflowCaughtTarg java.lang.Error - * @run main/othervm ExceptionEvents C A StackOverflowCaughtTarg java.lang.StackOverflowError - * @run main/othervm ExceptionEvents N A StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents C A StackOverflowCaughtTarg null + * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.NullPointerException - * @run main/othervm ExceptionEvents N T StackOverflowCaughtTarg java.lang.Exception - * @run main/othervm ExceptionEvents C T StackOverflowCaughtTarg null - * @run main/othervm ExceptionEvents C T StackOverflowCaughtTarg java.lang.Error - * @run main/othervm ExceptionEvents C T StackOverflowCaughtTarg java.lang.StackOverflowError - * @run main/othervm ExceptionEvents N T StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents C T StackOverflowCaughtTarg null + * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.NullPointerException - * @run main/othervm ExceptionEvents N N StackOverflowCaughtTarg java.lang.Exception - * @run main/othervm ExceptionEvents C N StackOverflowCaughtTarg null - * @run main/othervm ExceptionEvents C N StackOverflowCaughtTarg java.lang.Error - * @run main/othervm ExceptionEvents C N StackOverflowCaughtTarg java.lang.StackOverflowError - * @run main/othervm ExceptionEvents N N StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents C N StackOverflowCaughtTarg null + * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.NullPointerException - * @run main/othervm ExceptionEvents N A StackOverflowUncaughtTarg java.lang.Exception - * @run main/othervm ExceptionEvents U A StackOverflowUncaughtTarg null - * @run main/othervm ExceptionEvents U A StackOverflowUncaughtTarg java.lang.Error - * @run main/othervm ExceptionEvents U A StackOverflowUncaughtTarg java.lang.StackOverflowError - * @run main/othervm ExceptionEvents N A StackOverflowUncaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.Exception + * @run driver ExceptionEvents U A StackOverflowUncaughtTarg null + * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.Error + * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.NullPointerException - * @run main/othervm ExceptionEvents N T StackOverflowUncaughtTarg java.lang.NullPointerException - * @run main/othervm ExceptionEvents N N StackOverflowUncaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N T StackOverflowUncaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N N StackOverflowUncaughtTarg java.lang.NullPointerException */ import com.sun.jdi.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ExclusiveBind.java --- a/jdk/test/com/sun/jdi/ExclusiveBind.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ExclusiveBind.java Wed Jul 05 19:46:40 2017 +0200 @@ -28,7 +28,7 @@ * @library /lib/testlibrary * * @build jdk.testlibrary.* VMConnection ExclusiveBind HelloWorld - * @run main ExclusiveBind + * @run driver ExclusiveBind */ import java.net.ServerSocket; import com.sun.jdi.Bootstrap; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java --- a/jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ExpiredRequestDeletionTest.java - * @run main ExpiredRequestDeletionTest + * @run driver ExpiredRequestDeletionTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/FetchLocals.java --- a/jdk/test/com/sun/jdi/FetchLocals.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/FetchLocals.java Wed Jul 05 19:46:40 2017 +0200 @@ -7,7 +7,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g FetchLocals.java - * @run main FetchLocals + * @run driver FetchLocals */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/FieldWatchpoints.java --- a/jdk/test/com/sun/jdi/FieldWatchpoints.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/FieldWatchpoints.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g FieldWatchpoints.java - * @run main/othervm FieldWatchpoints + * @run driver FieldWatchpoints */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/FilterMatch.java --- a/jdk/test/com/sun/jdi/FilterMatch.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/FilterMatch.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * @library scaffold * @run build JDIScaffold VMConnection * @run compile -g HelloWorld.java - * @run main/othervm FilterMatch + * @run driver FilterMatch */ /* Look at patternMatch in JDK file: diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/FilterNoMatch.java --- a/jdk/test/com/sun/jdi/FilterNoMatch.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/FilterNoMatch.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * @library scaffold * @run build JDIScaffold VMConnection * @run compile -g HelloWorld.java - * @run main/othervm FilterNoMatch + * @run driver FilterNoMatch */ /* This tests the patternMatch function in JDK file: diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/FinalLocalsTest.java --- a/jdk/test/com/sun/jdi/FinalLocalsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/FinalLocalsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,7 +32,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g FinalLocalsTest.java - * @run main FinalLocalsTest + * @run driver FinalLocalsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/FinalizerTest.java --- a/jdk/test/com/sun/jdi/FinalizerTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/FinalizerTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g FinalizerTest.java * - * @run main FinalizerTest + * @run driver FinalizerTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/FramesTest.java --- a/jdk/test/com/sun/jdi/FramesTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/FramesTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g FramesTest.java - * @run main FramesTest + * @run driver FramesTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/GenericsTest.java --- a/jdk/test/com/sun/jdi/GenericsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/GenericsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g GenericsTest.java - * @run main GenericsTest + * @run driver GenericsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/GetLocalVariables.java --- a/jdk/test/com/sun/jdi/GetLocalVariables.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/GetLocalVariables.java Wed Jul 05 19:46:40 2017 +0200 @@ -7,7 +7,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g GetLocalVariables.java - * @run main GetLocalVariables + * @run driver GetLocalVariables */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/GetLocalVariables2Test.java --- a/jdk/test/com/sun/jdi/GetLocalVariables2Test.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/GetLocalVariables2Test.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g GetLocalVariables2Test.java - * @run main GetLocalVariables2Test + * @run driver GetLocalVariables2Test */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/GetSetLocalTest.java --- a/jdk/test/com/sun/jdi/GetSetLocalTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/GetSetLocalTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -7,7 +7,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g GetSetLocalTest.java - * @run main GetSetLocalTest + * @run driver GetSetLocalTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/GetUninitializedStringValue.java --- a/jdk/test/com/sun/jdi/GetUninitializedStringValue.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/GetUninitializedStringValue.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g GetUninitializedStringValue.java - * @run main GetUninitializedStringValue + * @run driver GetUninitializedStringValue */ import com.sun.jdi.ReferenceType; import com.sun.jdi.StackFrame; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/HomeTest.java --- a/jdk/test/com/sun/jdi/HomeTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/HomeTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g HomeTest.java - * @run main HomeTest + * @run driver HomeTest */ import com.sun.jdi.*; import com.sun.jdi.connect.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/InstanceFilter.java --- a/jdk/test/com/sun/jdi/InstanceFilter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/InstanceFilter.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetAdapter TargetListener * @run compile -g InstanceFilter.java - * @run main/othervm InstanceFilter + * @run driver InstanceFilter */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/InstancesTest.java --- a/jdk/test/com/sun/jdi/InstancesTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/InstancesTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g InstancesTest.java - * @run main InstancesTest + * @run driver InstancesTest */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/InterfaceMethodsTest.java --- a/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -28,7 +28,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run build InterfaceMethodsTest - * @run main InterfaceMethodsTest + * @run driver InterfaceMethodsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/InterruptHangTest.java --- a/jdk/test/com/sun/jdi/InterruptHangTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/InterruptHangTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -7,7 +7,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g InterruptHangTest.java - * @run main InterruptHangTest + * @run driver InterruptHangTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/InvokeHangTest.java --- a/jdk/test/com/sun/jdi/InvokeHangTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/InvokeHangTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g InvokeHangTest.java - * @run main InvokeHangTest + * @run driver InvokeHangTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/InvokeTest.java --- a/jdk/test/com/sun/jdi/InvokeTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/InvokeTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * @library .. * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g InvokeTest.java - * @run main InvokeTest + * @run driver InvokeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/JITDebug.java --- a/jdk/test/com/sun/jdi/JITDebug.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/JITDebug.java Wed Jul 05 19:46:40 2017 +0200 @@ -46,7 +46,7 @@ * assure that launching on uncaught exception works * * @author Robert Field - * @run main/othervm JITDebug + * @run driver JITDebug */ import com.sun.jdi.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/Java_gTest.java --- a/jdk/test/com/sun/jdi/Java_gTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/Java_gTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g Java_gTest.java - * @run main Java_gTest + * @run driver Java_gTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/LambdaBreakpointTest.java --- a/jdk/test/com/sun/jdi/LambdaBreakpointTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/LambdaBreakpointTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g LambdaBreakpointTest.java - * @run main LambdaBreakpointTest + * @run driver LambdaBreakpointTest */ import java.util.List; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/LambdaStepTest.java --- a/jdk/test/com/sun/jdi/LambdaStepTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/LambdaStepTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g LambdaStepTest.java - * @run main LambdaStepTest + * @run driver LambdaStepTest */ import com.sun.jdi.LocalVariable; import com.sun.jdi.ObjectReference; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/LaunchCommandLine.java --- a/jdk/test/com/sun/jdi/LaunchCommandLine.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/LaunchCommandLine.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,7 +32,7 @@ * @run compile -g HelloWorld.java * @run build LaunchCommandLine * - * @run main LaunchCommandLine + * @run driver LaunchCommandLine */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/LineNumberInfo.java --- a/jdk/test/com/sun/jdi/LineNumberInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/LineNumberInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g LineNumberInfo.java ControlFlow.java * - * @run main LineNumberInfo + * @run driver LineNumberInfo */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/LineNumberOnBraceTest.java --- a/jdk/test/com/sun/jdi/LineNumberOnBraceTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/LineNumberOnBraceTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -7,7 +7,7 @@ * * @run build VMConnection TargetListener TargetAdapter * @run compile -g LineNumberOnBraceTest.java - * @run main LineNumberOnBraceTest + * @run driver LineNumberOnBraceTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/LocalVariableEqual.java --- a/jdk/test/com/sun/jdi/LocalVariableEqual.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/LocalVariableEqual.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g LocalVariableEqual.java - * @run main LocalVariableEqual + * @run driver LocalVariableEqual */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/LocationTest.java --- a/jdk/test/com/sun/jdi/LocationTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/LocationTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g LocationTest.java - * @run main LocationTest + * @run driver LocationTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/MethodEntryExitEvents.java --- a/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,9 +29,9 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g MethodEntryExitEvents.java - * @run main MethodEntryExitEvents SUSPEND_EVENT_THREAD MethodEntryExitEventsDebugee - * @run main MethodEntryExitEvents SUSPEND_NONE MethodEntryExitEventsDebugee - * @run main MethodEntryExitEvents SUSPEND_ALL MethodEntryExitEventsDebugee + * @run driver MethodEntryExitEvents SUSPEND_EVENT_THREAD MethodEntryExitEventsDebugee + * @run driver MethodEntryExitEvents SUSPEND_NONE MethodEntryExitEventsDebugee + * @run driver MethodEntryExitEvents SUSPEND_ALL MethodEntryExitEventsDebugee */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java --- a/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g MethodExitReturnValuesTest.java - * @run main MethodExitReturnValuesTest + * @run driver MethodExitReturnValuesTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ModificationWatchpoints.java --- a/jdk/test/com/sun/jdi/ModificationWatchpoints.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ModificationWatchpoints.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,7 +32,7 @@ * @library scaffold * @run build JDIScaffold VMConnection * @run compile -g ModificationWatchpoints.java - * @run main/othervm ModificationWatchpoints + * @run driver ModificationWatchpoints */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/MonitorEventTest.java --- a/jdk/test/com/sun/jdi/MonitorEventTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/MonitorEventTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g MonitorEventTest.java - * @run main MonitorEventTest + * @run driver MonitorEventTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/MonitorFrameInfo.java --- a/jdk/test/com/sun/jdi/MonitorFrameInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/MonitorFrameInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g MonitorFrameInfo.java - * @run main MonitorFrameInfo + * @run driver MonitorFrameInfo */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/MultiBreakpointsTest.java --- a/jdk/test/com/sun/jdi/MultiBreakpointsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/MultiBreakpointsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g MultiBreakpointsTest.java - * @run main MultiBreakpointsTest + * @run driver MultiBreakpointsTest */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/NativeInstanceFilter.java --- a/jdk/test/com/sun/jdi/NativeInstanceFilter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/NativeInstanceFilter.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * @library scaffold * @run build JDIScaffold VMConnection * @compile -XDignore.symbol.file NativeInstanceFilterTarg.java - * @run main/othervm NativeInstanceFilter + * @run driver NativeInstanceFilter */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/NewInstanceTest.java --- a/jdk/test/com/sun/jdi/NewInstanceTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/NewInstanceTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g NewInstanceTest.java - * @run main NewInstanceTest + * @run driver NewInstanceTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/NoLaunchOptionTest.java --- a/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * * @run compile -g NoLaunchOptionTest.java * @build VMConnection - * @run main/othervm NoLaunchOptionTest + * @run driver NoLaunchOptionTest */ import java.net.ServerSocket; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/NoLocInfoTest.java --- a/jdk/test/com/sun/jdi/NoLocInfoTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/NoLocInfoTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g:none NoLocInfoTest.java - * @run main NoLocInfoTest + * @run driver NoLocInfoTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/NullThreadGroupNameTest.java --- a/jdk/test/com/sun/jdi/NullThreadGroupNameTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/NullThreadGroupNameTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Ensure that JDWP doesn't crash with a null thread group name * * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run main NullThreadGroupNameTest + * @run driver NullThreadGroupNameTest */ import com.sun.jdi.*; import com.sun.jdi.connect.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/OnThrowTest.java --- a/jdk/test/com/sun/jdi/OnThrowTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/OnThrowTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * @run compile -g OnThrowTest.java * @run compile -g OnThrowTarget.java * @run compile -g VMConnection.java - * @run main/othervm OnThrowTest + * @run driver OnThrowTest */ import java.io.File; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/OptionTest.java --- a/jdk/test/com/sun/jdi/OptionTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/OptionTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * @run compile -g OptionTest.java * @run compile -g HelloWorld.java * @run compile -g VMConnection.java - * @run main/othervm OptionTest + * @run driver OptionTest */ import java.net.ServerSocket; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/PopAndInvokeTest.java --- a/jdk/test/com/sun/jdi/PopAndInvokeTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/PopAndInvokeTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g PopAndInvokeTest.java - * @run main PopAndInvokeTest + * @run driver PopAndInvokeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/PopAndStepTest.java --- a/jdk/test/com/sun/jdi/PopAndStepTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/PopAndStepTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -10,7 +10,7 @@ * @library .. * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g PopAndStepTest.java - * @run main PopAndStepTest + * @run driver PopAndStepTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/PopAsynchronousTest.java --- a/jdk/test/com/sun/jdi/PopAsynchronousTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/PopAsynchronousTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g PopAsynchronousTest.java - * @run main PopAsynchronousTest + * @run driver PopAsynchronousTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/PopSynchronousTest.java --- a/jdk/test/com/sun/jdi/PopSynchronousTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/PopSynchronousTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g PopSynchronousTest.java - * @run main PopSynchronousTest + * @run driver PopSynchronousTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/RedefineCrossEvent.java --- a/jdk/test/com/sun/jdi/RedefineCrossEvent.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/RedefineCrossEvent.java Wed Jul 05 19:46:40 2017 +0200 @@ -46,26 +46,26 @@ * @run compile -g RepStepTarg.java * @run compile -g RequestReflectionTest.java * - * @run main AccessSpecifierTest -redefstart -redefevent - * @run main AfterThreadDeathTest -redefstart -redefevent - * @run main ArrayRangeTest -redefstart -redefevent - * @run main BacktraceFieldTest -redefstart -redefevent - * @run main ClassesByName2Test -redefstart -redefevent - * @run main DebuggerThreadTest -redefstart -redefevent - * @run main DeleteEventRequestsTest -redefstart -redefevent - * @run main/othervm ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.Exception - * @run main/othervm ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg null - * @run main/othervm ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg java.lang.StackOverflowError - * @run main/othervm ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.NullPointerException - * @run main/othervm ExceptionEvents -redefstart -redefevent C T StackOverflowCaughtTarg java.lang.Error - * @run main/othervm ExceptionEvents -redefstart -redefevent N T StackOverflowCaughtTarg java.lang.NullPointerException - * @run main/othervm ExceptionEvents -redefstart -redefevent N N StackOverflowCaughtTarg java.lang.Exception - * @run main/othervm ExceptionEvents -redefstart -redefevent C N StackOverflowCaughtTarg java.lang.Error - * @run main/othervm ExceptionEvents -redefstart -redefevent N A StackOverflowUncaughtTarg java.lang.Exception - * @run main ExpiredRequestDeletionTest -redefstart -redefevent - * @run main/othervm FieldWatchpoints -redefstart -redefevent - * @run main/othervm InstanceFilter -redefstart -redefevent - * @run main LocationTest -redefstart -redefevent - * @run main NewInstanceTest -redefstart -redefevent - * @run main RequestReflectionTest -redefstart -redefevent + * @run driver AccessSpecifierTest -redefstart -redefevent + * @run driver AfterThreadDeathTest -redefstart -redefevent + * @run driver ArrayRangeTest -redefstart -redefevent + * @run driver BacktraceFieldTest -redefstart -redefevent + * @run driver ClassesByName2Test -redefstart -redefevent + * @run driver DebuggerThreadTest -redefstart -redefevent + * @run driver DeleteEventRequestsTest -redefstart -redefevent + * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg null + * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents -redefstart -redefevent C T StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents -redefstart -redefevent N T StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents -redefstart -redefevent N N StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents -redefstart -redefevent C N StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowUncaughtTarg java.lang.Exception + * @run driver ExpiredRequestDeletionTest -redefstart -redefevent + * @run driver FieldWatchpoints -redefstart -redefevent + * @run driver InstanceFilter -redefstart -redefevent + * @run driver LocationTest -redefstart -redefevent + * @run driver NewInstanceTest -redefstart -redefevent + * @run driver RequestReflectionTest -redefstart -redefevent */ diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/RedefineCrossStart.java --- a/jdk/test/com/sun/jdi/RedefineCrossStart.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/RedefineCrossStart.java Wed Jul 05 19:46:40 2017 +0200 @@ -37,13 +37,13 @@ * @run compile -g FramesTest.java * @run compile -g InvokeTest.java * - * @run main CountEvent -redefstart - * @run main CountFilterTest -redefstart - * @run main FramesTest -redefstart - * @run main InvokeTest -redefstart + * @run driver CountEvent -redefstart + * @run driver CountFilterTest -redefstart + * @run driver FramesTest -redefstart + * @run driver InvokeTest -redefstart * - * @run main/othervm ExceptionEvents -redefstart U A StackOverflowUncaughtTarg null - * @run main/othervm ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.Error - * @run main/othervm ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.StackOverflowError - * @run main PopSynchronousTest -redefstart + * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg null + * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.Error + * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.StackOverflowError + * @run driver PopSynchronousTest -redefstart */ diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ReferrersTest.java --- a/jdk/test/com/sun/jdi/ReferrersTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ReferrersTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ReferrersTest.java - * @run main ReferrersTest + * @run driver ReferrersTest */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/RepStep.java --- a/jdk/test/com/sun/jdi/RepStep.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/RepStep.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * @run compile -g RepStepTarg.java * @run build VMConnection RepStep * - * @run main/othervm RepStep + * @run driver RepStep * * @summary RepStep detects missed step events due to lack of * frame pop events (in back-end). diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/RequestReflectionTest.java --- a/jdk/test/com/sun/jdi/RequestReflectionTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/RequestReflectionTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -28,7 +28,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g RequestReflectionTest.java - * @run main RequestReflectionTest + * @run driver RequestReflectionTest * * @summary RequestReflectionTest checks to see that reflective * accessors on EventRequests return what they are given. diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ResumeOneThreadTest.java --- a/jdk/test/com/sun/jdi/ResumeOneThreadTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ResumeOneThreadTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ResumeOneThreadTest.java - * @run main ResumeOneThreadTest + * @run driver ResumeOneThreadTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/RunToExit.java --- a/jdk/test/com/sun/jdi/RunToExit.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/RunToExit.java Wed Jul 05 19:46:40 2017 +0200 @@ -26,7 +26,7 @@ * @summary Test that with server=y, when VM runs to System.exit() no error happens * * @build VMConnection RunToExit Exit0 - * @run main/othervm RunToExit + * @run driver RunToExit */ import java.io.InputStream; import java.io.IOException; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/SDENullTest.java --- a/jdk/test/com/sun/jdi/SDENullTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/SDENullTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g SDENullTest.java - * @run main SDENullTest + * @run driver SDENullTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/SimulResumerTest.java --- a/jdk/test/com/sun/jdi/SimulResumerTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/SimulResumerTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g SimulResumerTest.java - * @run main/othervm SimulResumerTest + * @run driver SimulResumerTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/SourceNameFilterTest.java --- a/jdk/test/com/sun/jdi/SourceNameFilterTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/SourceNameFilterTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,9 +30,9 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g SourceNameFilterTest.java - * @run main SourceNameFilterTest + * @run driver SourceNameFilterTest * @run compile -g:none SourceNameFilterTest.java - * @run main SourceNameFilterTest + * @run driver SourceNameFilterTest */ // The compile -g:none suppresses the lineNumber table to trigger bug 6646613. diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/StepTest.java --- a/jdk/test/com/sun/jdi/StepTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/StepTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -51,15 +51,15 @@ * | | | +--- Debuggee command Line * V V V V Workaround-----+ * V - * @run main StepTest 2 line 2 MethodCalls - * @run main StepTest 3 line 14 MethodCalls + * @run driver StepTest 2 line 2 MethodCalls + * @run driver StepTest 3 line 14 MethodCalls * - * @run main StepTest 2 line 18 MethodCallsReflection 12 + * @run driver StepTest 2 line 18 MethodCallsReflection 12 * - * @run main StepTest 2 min 4 MethodCalls - * @run main StepTest 3 min 43 MethodCalls + * @run driver StepTest 2 min 4 MethodCalls + * @run driver StepTest 3 min 43 MethodCalls * - * @run main StepTest 2 line 65 ControlFlow 64 + * @run driver StepTest 2 line 65 ControlFlow 64 */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/SuspendThreadTest.java --- a/jdk/test/com/sun/jdi/SuspendThreadTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/SuspendThreadTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g SuspendThreadTest.java - * @run main SuspendThreadTest + * @run driver SuspendThreadTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/TemplateTest.java --- a/jdk/test/com/sun/jdi/TemplateTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/TemplateTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -33,7 +33,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g TemplateTest.java - * @run main TemplateTest + * @run driver TemplateTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/ThreadGroupTest.java --- a/jdk/test/com/sun/jdi/ThreadGroupTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/ThreadGroupTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile ThreadGroupTest.java - * @run main ThreadGroupTest + * @run driver ThreadGroupTest */ import com.sun.jdi.*; import com.sun.jdi.connect.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/TwoThreadsTest.java --- a/jdk/test/com/sun/jdi/TwoThreadsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/TwoThreadsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g TwoThreadsTest.java - * @run main TwoThreadsTest + * @run driver TwoThreadsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/UTF8Test.java --- a/jdk/test/com/sun/jdi/UTF8Test.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/UTF8Test.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g UTF8Test.java - * @run main UTF8Test + * @run driver UTF8Test */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/UnpreparedByName.java --- a/jdk/test/com/sun/jdi/UnpreparedByName.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/UnpreparedByName.java Wed Jul 05 19:46:40 2017 +0200 @@ -33,7 +33,7 @@ * @run compile -g InnerTarg.java * @run build UnpreparedByName * - * @run main UnpreparedByName InnerTarg + * @run driver UnpreparedByName InnerTarg */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/UnpreparedClasses.java --- a/jdk/test/com/sun/jdi/UnpreparedClasses.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/UnpreparedClasses.java Wed Jul 05 19:46:40 2017 +0200 @@ -33,7 +33,7 @@ * @run compile -g InnerTarg.java * @run build UnpreparedClasses * - * @run main UnpreparedClasses InnerTarg + * @run driver UnpreparedClasses InnerTarg */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/VMConnection.java --- a/jdk/test/com/sun/jdi/VMConnection.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/VMConnection.java Wed Jul 05 19:46:40 2017 +0200 @@ -52,61 +52,23 @@ // When we run under jtreg, test.classes contains the pathname of // the dir in which the .class files will be placed. - BufferedReader reader; String testClasses = System.getProperty("test.classes"); if (testClasses == null) { return retVal; } - retVal += "-classpath " + testClasses + " "; - File myFile = new File(testClasses, "@debuggeeVMOptions"); + retVal += "-classpath " + testClasses; - if (!myFile.canRead()) { - // Not there - look in parent (in case we are in a subdir) - myFile = new File(testClasses); - String parentDir = myFile.getParent(); - if (parentDir != null) { - myFile = new File(parentDir, "@debuggeeVMOptions"); - if (!myFile.canRead()) { - return retVal; - } - } + String vmOpts = System.getProperty("test.vm.opts"); + System.out.println("vmOpts: "+vmOpts); + if (vmOpts != null) { + retVal += " " + vmOpts; } - String wholePath = myFile.getPath(); - try { - reader = new BufferedReader(new FileReader(myFile)); - } catch (FileNotFoundException ee) { - System.out.println("-- Error 2 trying to access file " + - wholePath + ": " + ee); - return retVal; + String javaOpts = System.getProperty("test.java.opts"); + System.out.println("javaOpts: "+javaOpts); + if (javaOpts != null) { + retVal += " " + javaOpts; } - String line; - while (true) { - try { - line = reader.readLine(); - } catch (IOException ee) { - System.out.println("-- Error reading options from file " + - wholePath + ": " + ee); - break; - } - if (line == null) { - System.out.println("-- No debuggee VM options found in file " + - wholePath); - break; - } - line = line.trim(); - if (line.length() != 0 && !line.startsWith("#")) { - System.out.println("-- Added debuggeeVM options from file " + - wholePath + ": " + line); - retVal += line; - break; - } - // Else, read he next line. - } - try { - reader.close(); - } catch (IOException ee) { - } return retVal; } diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/VMDeathLastTest.java --- a/jdk/test/com/sun/jdi/VMDeathLastTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/VMDeathLastTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,7 +31,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g HelloWorld.java * @run build VMDeathLastTest - * @run main VMDeathLastTest + * @run driver VMDeathLastTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/VMDeathRequestTest.java --- a/jdk/test/com/sun/jdi/VMDeathRequestTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/VMDeathRequestTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -29,7 +29,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g HelloWorld.java * @run build VMDeathRequestTest - * @run main VMDeathRequestTest + * @run driver VMDeathRequestTest * * @summary VMDeathRequestTest checks to see that * VMDisconnectedException is never thrown before VMDisconnectEvent. diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/VarargsTest.java --- a/jdk/test/com/sun/jdi/VarargsTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/VarargsTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g VarargsTest.java - * @run main VarargsTest + * @run driver VarargsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/Vars.java --- a/jdk/test/com/sun/jdi/Vars.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/Vars.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * @library scaffold * @run build JDIScaffold VMConnection * @run compile -g Vars.java - * @run main/othervm Vars + * @run driver Vars */ import com.sun.jdi.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/VisibleMethods.java --- a/jdk/test/com/sun/jdi/VisibleMethods.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/VisibleMethods.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,7 +30,7 @@ * * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g VisibleMethods.java - * @run main VisibleMethods + * @run driver VisibleMethods */ import com.sun.jdi.Method; import com.sun.jdi.ReferenceType; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/redefine/RedefineTest.java --- a/jdk/test/com/sun/jdi/redefine/RedefineTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/redefine/RedefineTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -34,7 +34,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g RedefineTest.java * @run shell RedefineSetUp.sh - * @run main/othervm RedefineTest + * @run driver RedefineTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java --- a/jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -32,8 +32,8 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g RedefineTest.java * @run shell RedefineSetUp.sh - * @run main RedefineTest -repeat 3 - * @run main RedefineTest + * @run driver RedefineTest -repeat 3 + * @run driver RedefineTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/sde/FilterMangleTest.java --- a/jdk/test/com/sun/jdi/sde/FilterMangleTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/sde/FilterMangleTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -9,21 +9,21 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE * @run compile FilterMangleTest.java * @run compile -g onion/pickle/Mangle.java - * @run main FilterMangleTest - * @run main FilterMangleTest SDE-pMangle.java* - * @run main FilterMangleTest SDE-pMangle.jav* - * @run main FilterMangleTest SDE-pMangle.j* - * @run main FilterMangleTest SDE-p*Mangle.java - * @run main FilterMangleTest SDE-p*angle.java - * @run main FilterMangleTest SDE-p*java - * @run main FilterMangleTest SDE-pMangle.xyz - * @run main FilterMangleTest SDE-pIncl.rats* - * @run main FilterMangleTest SDE-pIncl.rat* - * @run main FilterMangleTest SDE-p*angle.rats - * @run main FilterMangleTest SDE-f*Incl.rat - * @run main FilterMangleTest SDE-ffred - * @run main FilterMangleTest SDE-f*ratsx - * @run main FilterMangleTest SDE-fMangle.javax* + * @run driver FilterMangleTest + * @run driver FilterMangleTest SDE-pMangle.java* + * @run driver FilterMangleTest SDE-pMangle.jav* + * @run driver FilterMangleTest SDE-pMangle.j* + * @run driver FilterMangleTest SDE-p*Mangle.java + * @run driver FilterMangleTest SDE-p*angle.java + * @run driver FilterMangleTest SDE-p*java + * @run driver FilterMangleTest SDE-pMangle.xyz + * @run driver FilterMangleTest SDE-pIncl.rats* + * @run driver FilterMangleTest SDE-pIncl.rat* + * @run driver FilterMangleTest SDE-p*angle.rats + * @run driver FilterMangleTest SDE-f*Incl.rat + * @run driver FilterMangleTest SDE-ffred + * @run driver FilterMangleTest SDE-f*ratsx + * @run driver FilterMangleTest SDE-fMangle.javax* */ /* diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/sde/MangleStepTest.java --- a/jdk/test/com/sun/jdi/sde/MangleStepTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/sde/MangleStepTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -10,11 +10,11 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE * @run compile MangleStepTest.java * @run compile -g onion/pickle/Mangle.java - * @run main/othervm MangleStepTest unset - * @run main/othervm MangleStepTest Java - * @run main/othervm MangleStepTest XYZ - * @run main/othervm MangleStepTest Rats - * @run main/othervm MangleStepTest bogus + * @run driver MangleStepTest unset + * @run driver MangleStepTest Java + * @run driver MangleStepTest XYZ + * @run driver MangleStepTest Rats + * @run driver MangleStepTest bogus */ import com.sun.jdi.*; import com.sun.jdi.event.*; @@ -82,7 +82,6 @@ } BreakpointEvent bpe = resumeTo(targetName, "main", "([Ljava/lang/String;)V"); - waitForInput(); ThreadReference thread = bpe.thread(); diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/sde/MangleTest.java --- a/jdk/test/com/sun/jdi/sde/MangleTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/sde/MangleTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -10,7 +10,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE * @run compile MangleTest.java * @run compile -g onion/pickle/Mangle.java - * @run main MangleTest + * @run driver MangleTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java --- a/jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -10,7 +10,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE * @run compile SourceDebugExtensionTest.java * @run compile -g SourceDebugExtensionTarg.java - * @run main SourceDebugExtensionTest + * @run driver SourceDebugExtensionTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/jdi/sde/TemperatureTableTest.java --- a/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -10,7 +10,7 @@ * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE HelloWorld * @run compile TemperatureTableTest.java * @run compile -g TemperatureTableServlet.java - * @run main TemperatureTableTest + * @run driver TemperatureTableTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 53fd25d388da -r 89731ae72a76 jdk/test/com/sun/tools/attach/StartManagementAgent.java --- a/jdk/test/com/sun/tools/attach/StartManagementAgent.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/com/sun/tools/attach/StartManagementAgent.java Wed Jul 05 19:46:40 2017 +0200 @@ -93,7 +93,7 @@ } catch(AttachOperationFailedException ex) { // We expect parsing of "apa" above to fail, but if the file path // can't be read we get a different exception message - if (!ex.getMessage().contains("java.lang.NumberFormatException")) { + if (!ex.getMessage().contains("Invalid com.sun.management.jmxremote.port number")) { throw ex; } } diff -r 53fd25d388da -r 89731ae72a76 jdk/test/java/lang/invoke/VMAnonymousClass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/VMAnonymousClass.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +/* @test + * @bug 8046903 + * @summary VM anonymous class members can't be statically invocable + * @run junit test.java.lang.invoke.VMAnonymousClass + */ +package test.java.lang.invoke; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Field; +import org.junit.Test; +import sun.misc.Unsafe; +import jdk.internal.org.objectweb.asm.*; +import static jdk.internal.org.objectweb.asm.Opcodes.*; + +public class VMAnonymousClass { + public static void main(String[] args) throws Throwable { + VMAnonymousClass test = new VMAnonymousClass(); + test.testJavaLang(); + test.testJavaUtil(); + test.testSunMisc(); + test.testJavaLangInvoke(); + System.out.println("TEST PASSED"); + } + + // Test VM anonymous classes from different packages + // (see j.l.i.InvokerBytecodeGenerator::isStaticallyInvocable). + @Test public void testJavaLang() throws Throwable { test("java/lang"); } + @Test public void testJavaUtil() throws Throwable { test("java/util"); } + @Test public void testSunMisc() throws Throwable { test("sun/misc"); } + @Test public void testJavaLangInvoke() throws Throwable { test("java/lang/invoke"); } + + private static Unsafe unsafe = getUnsafe(); + + private static void test(String pkg) throws Throwable { + byte[] bytes = dumpClass(pkg); + // Define VM anonymous class in privileged context (on BCP). + Class anonClass = unsafe.defineAnonymousClass(Object.class, bytes, null); + + MethodType t = MethodType.methodType(Object.class, int.class); + MethodHandle target = MethodHandles.lookup().findStatic(anonClass, "get", t); + + // Wrap target into LF (convert) to get "target" referenced from LF + MethodHandle wrappedMH = target.asType(MethodType.methodType(Object.class, Integer.class)); + + // Invoke enough times to provoke LF compilation to bytecode. + for (int i = 0; i<100; i++) { + Object r = wrappedMH.invokeExact((Integer)1); + } + } + + /* + * Constructs bytecode for the following class: + * public class pkg.MyClass { + * MyClass() {} + * public Object get(int i) { return null; } + * } + */ + public static byte[] dumpClass(String pkg) { + ClassWriter cw = new ClassWriter(0); + MethodVisitor mv; + + cw.visit(52, ACC_SUPER | ACC_PUBLIC, pkg+"/MyClass", null, "java/lang/Object", null); + { + mv = cw.visitMethod(0, "", "()V", null, null); + mv.visitCode(); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + { + mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "get", "(I)Ljava/lang/Object;", null, null); + mv.visitCode(); + mv.visitInsn(ACONST_NULL); + mv.visitInsn(ARETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + cw.visitEnd(); + return cw.toByteArray(); + } + + private static synchronized Unsafe getUnsafe() { + try { + Field f = Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + return (Unsafe) f.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Unable to get Unsafe instance.", e); + } + } +} diff -r 53fd25d388da -r 89731ae72a76 jdk/test/java/time/tck/java/time/format/TCKDateTimeParseResolver.java --- a/jdk/test/java/time/tck/java/time/format/TCKDateTimeParseResolver.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/java/time/tck/java/time/format/TCKDateTimeParseResolver.java Wed Jul 05 19:46:40 2017 +0200 @@ -76,6 +76,7 @@ import static java.time.temporal.ChronoField.ERA; import static java.time.temporal.ChronoField.HOUR_OF_AMPM; import static java.time.temporal.ChronoField.HOUR_OF_DAY; +import static java.time.temporal.ChronoField.INSTANT_SECONDS; import static java.time.temporal.ChronoField.MICRO_OF_DAY; import static java.time.temporal.ChronoField.MICRO_OF_SECOND; import static java.time.temporal.ChronoField.MILLI_OF_DAY; @@ -93,11 +94,13 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Period; import java.time.ZoneId; +import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.chrono.ChronoLocalDate; import java.time.chrono.ChronoLocalDateTime; @@ -1159,4 +1162,102 @@ } }; + //------------------------------------------------------------------------- + // SPEC: ChronoField.INSTANT_SECONDS + @Test + public void test_parse_fromField_InstantSeconds() { + DateTimeFormatter fmt = new DateTimeFormatterBuilder() + .appendValue(INSTANT_SECONDS).toFormatter(); + TemporalAccessor acc = fmt.parse("86402"); + Instant expected = Instant.ofEpochSecond(86402); + assertEquals(acc.isSupported(INSTANT_SECONDS), true); + assertEquals(acc.isSupported(NANO_OF_SECOND), true); + assertEquals(acc.isSupported(MICRO_OF_SECOND), true); + assertEquals(acc.isSupported(MILLI_OF_SECOND), true); + assertEquals(acc.getLong(INSTANT_SECONDS), 86402L); + assertEquals(acc.getLong(NANO_OF_SECOND), 0L); + assertEquals(acc.getLong(MICRO_OF_SECOND), 0L); + assertEquals(acc.getLong(MILLI_OF_SECOND), 0L); + assertEquals(Instant.from(acc), expected); + } + + @Test + public void test_parse_fromField_InstantSeconds_NanoOfSecond() { + DateTimeFormatter fmt = new DateTimeFormatterBuilder() + .appendValue(INSTANT_SECONDS).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter(); + TemporalAccessor acc = fmt.parse("86402.123456789"); + Instant expected = Instant.ofEpochSecond(86402, 123456789); + assertEquals(acc.isSupported(INSTANT_SECONDS), true); + assertEquals(acc.isSupported(NANO_OF_SECOND), true); + assertEquals(acc.isSupported(MICRO_OF_SECOND), true); + assertEquals(acc.isSupported(MILLI_OF_SECOND), true); + assertEquals(acc.getLong(INSTANT_SECONDS), 86402L); + assertEquals(acc.getLong(NANO_OF_SECOND), 123456789L); + assertEquals(acc.getLong(MICRO_OF_SECOND), 123456L); + assertEquals(acc.getLong(MILLI_OF_SECOND), 123L); + assertEquals(Instant.from(acc), expected); + } + + // SPEC: ChronoField.SECOND_OF_DAY + @Test + public void test_parse_fromField_SecondOfDay() { + DateTimeFormatter fmt = new DateTimeFormatterBuilder() + .appendValue(SECOND_OF_DAY).toFormatter(); + TemporalAccessor acc = fmt.parse("864"); + assertEquals(acc.isSupported(SECOND_OF_DAY), true); + assertEquals(acc.isSupported(NANO_OF_SECOND), true); + assertEquals(acc.isSupported(MICRO_OF_SECOND), true); + assertEquals(acc.isSupported(MILLI_OF_SECOND), true); + assertEquals(acc.getLong(SECOND_OF_DAY), 864L); + assertEquals(acc.getLong(NANO_OF_SECOND), 0L); + assertEquals(acc.getLong(MICRO_OF_SECOND), 0L); + assertEquals(acc.getLong(MILLI_OF_SECOND), 0L); + } + + @Test + public void test_parse_fromField_SecondOfDay_NanoOfSecond() { + DateTimeFormatter fmt = new DateTimeFormatterBuilder() + .appendValue(SECOND_OF_DAY).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter(); + TemporalAccessor acc = fmt.parse("864.123456789"); + assertEquals(acc.isSupported(SECOND_OF_DAY), true); + assertEquals(acc.isSupported(NANO_OF_SECOND), true); + assertEquals(acc.isSupported(MICRO_OF_SECOND), true); + assertEquals(acc.isSupported(MILLI_OF_SECOND), true); + assertEquals(acc.getLong(SECOND_OF_DAY), 864L); + assertEquals(acc.getLong(NANO_OF_SECOND), 123456789L); + assertEquals(acc.getLong(MICRO_OF_SECOND), 123456L); + assertEquals(acc.getLong(MILLI_OF_SECOND), 123L); + } + + // SPEC: ChronoField.SECOND_OF_MINUTE + @Test + public void test_parse_fromField_SecondOfMinute() { + DateTimeFormatter fmt = new DateTimeFormatterBuilder() + .appendValue(SECOND_OF_MINUTE).toFormatter(); + TemporalAccessor acc = fmt.parse("32"); + assertEquals(acc.isSupported(SECOND_OF_MINUTE), true); + assertEquals(acc.isSupported(NANO_OF_SECOND), true); + assertEquals(acc.isSupported(MICRO_OF_SECOND), true); + assertEquals(acc.isSupported(MILLI_OF_SECOND), true); + assertEquals(acc.getLong(SECOND_OF_MINUTE), 32L); + assertEquals(acc.getLong(NANO_OF_SECOND), 0L); + assertEquals(acc.getLong(MICRO_OF_SECOND), 0L); + assertEquals(acc.getLong(MILLI_OF_SECOND), 0L); + } + + @Test + public void test_parse_fromField_SecondOfMinute_NanoOfSecond() { + DateTimeFormatter fmt = new DateTimeFormatterBuilder() + .appendValue(SECOND_OF_MINUTE).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter(); + TemporalAccessor acc = fmt.parse("32.123456789"); + assertEquals(acc.isSupported(SECOND_OF_MINUTE), true); + assertEquals(acc.isSupported(NANO_OF_SECOND), true); + assertEquals(acc.isSupported(MICRO_OF_SECOND), true); + assertEquals(acc.isSupported(MILLI_OF_SECOND), true); + assertEquals(acc.getLong(SECOND_OF_MINUTE), 32L); + assertEquals(acc.getLong(NANO_OF_SECOND), 123456789L); + assertEquals(acc.getLong(MICRO_OF_SECOND), 123456L); + assertEquals(acc.getLong(MILLI_OF_SECOND), 123L); + } + } diff -r 53fd25d388da -r 89731ae72a76 jdk/test/java/time/test/java/time/format/TestDateTimeParsing.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/time/test/java/time/format/TestDateTimeParsing.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +/* + * This file is available under and governed by the GNU General Public + * License version 2 only, as published by the Free Software Foundation. + * However, the following notice accompanied the original version of this + * file: + * + * Copyright (c) 2014, Stephen Colebourne & Michael Nascimento Santos + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of JSR-310 nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package test.java.time.format; + +import static java.time.temporal.ChronoField.EPOCH_DAY; +import static java.time.temporal.ChronoField.INSTANT_SECONDS; +import static java.time.temporal.ChronoField.MICRO_OF_SECOND; +import static java.time.temporal.ChronoField.MILLI_OF_SECOND; +import static java.time.temporal.ChronoField.NANO_OF_SECOND; +import static java.time.temporal.ChronoField.OFFSET_SECONDS; +import static java.time.temporal.ChronoField.SECOND_OF_DAY; +import static org.testng.Assert.assertEquals; + +import java.time.DateTimeException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.temporal.TemporalAccessor; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +/** + * Test parsing of edge cases. + */ +@Test +public class TestDateTimeParsing { + + private static final ZoneId PARIS = ZoneId.of("Europe/Paris"); + private static final ZoneOffset OFFSET_0230 = ZoneOffset.ofHoursMinutes(2, 30); + + private static final DateTimeFormatter LOCALFIELDS = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd HH:mm:ss").toFormatter(); + private static final DateTimeFormatter LOCALFIELDS_ZONEID = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd HH:mm:ss ").appendZoneId().toFormatter(); + private static final DateTimeFormatter LOCALFIELDS_OFFSETID = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd HH:mm:ss ").appendOffsetId().toFormatter(); + private static final DateTimeFormatter LOCALFIELDS_WITH_PARIS = LOCALFIELDS.withZone(PARIS); + private static final DateTimeFormatter LOCALFIELDS_WITH_0230 = LOCALFIELDS.withZone(OFFSET_0230); + private static final DateTimeFormatter INSTANT = new DateTimeFormatterBuilder() + .appendInstant().toFormatter(); + private static final DateTimeFormatter INSTANT_WITH_PARIS = INSTANT.withZone(PARIS); + private static final DateTimeFormatter INSTANT_WITH_0230 = INSTANT.withZone(OFFSET_0230); + private static final DateTimeFormatter INSTANT_OFFSETID = new DateTimeFormatterBuilder() + .appendInstant().appendLiteral(' ').appendOffsetId().toFormatter(); + private static final DateTimeFormatter INSTANT_OFFSETSECONDS = new DateTimeFormatterBuilder() + .appendInstant().appendLiteral(' ').appendValue(OFFSET_SECONDS).toFormatter(); + private static final DateTimeFormatter INSTANTSECONDS = new DateTimeFormatterBuilder() + .appendValue(INSTANT_SECONDS).toFormatter(); + private static final DateTimeFormatter INSTANTSECONDS_WITH_PARIS = INSTANTSECONDS.withZone(PARIS); + private static final DateTimeFormatter INSTANTSECONDS_NOS = new DateTimeFormatterBuilder() + .appendValue(INSTANT_SECONDS).appendLiteral('.').appendValue(NANO_OF_SECOND).toFormatter(); + private static final DateTimeFormatter INSTANTSECONDS_NOS_WITH_PARIS = INSTANTSECONDS_NOS.withZone(PARIS); + private static final DateTimeFormatter INSTANTSECONDS_OFFSETSECONDS = new DateTimeFormatterBuilder() + .appendValue(INSTANT_SECONDS).appendLiteral(' ').appendValue(OFFSET_SECONDS).toFormatter(); + + @DataProvider(name = "instantZones") + Object[][] data_instantZones() { + return new Object[][] { + {LOCALFIELDS_ZONEID, "2014-06-30 01:02:03 Europe/Paris", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, PARIS)}, + {LOCALFIELDS_ZONEID, "2014-06-30 01:02:03 +02:30", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, OFFSET_0230)}, + {LOCALFIELDS_OFFSETID, "2014-06-30 01:02:03 +02:30", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, OFFSET_0230)}, + {LOCALFIELDS_WITH_PARIS, "2014-06-30 01:02:03", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, PARIS)}, + {LOCALFIELDS_WITH_0230, "2014-06-30 01:02:03", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, OFFSET_0230)}, + {INSTANT_WITH_PARIS, "2014-06-30T01:02:03Z", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(PARIS)}, + {INSTANT_WITH_0230, "2014-06-30T01:02:03Z", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(OFFSET_0230)}, + {INSTANT_OFFSETID, "2014-06-30T01:02:03Z +02:30", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(OFFSET_0230)}, + {INSTANT_OFFSETSECONDS, "2014-06-30T01:02:03Z 9000", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).withZoneSameInstant(OFFSET_0230)}, + {INSTANTSECONDS_WITH_PARIS, "86402", Instant.ofEpochSecond(86402).atZone(PARIS)}, + {INSTANTSECONDS_NOS_WITH_PARIS, "86402.123456789", Instant.ofEpochSecond(86402, 123456789).atZone(PARIS)}, + {INSTANTSECONDS_OFFSETSECONDS, "86402 9000", Instant.ofEpochSecond(86402).atZone(OFFSET_0230)}, + }; + } + + @Test(dataProvider = "instantZones") + public void test_parse_instantZones_ZDT(DateTimeFormatter formatter, String text, ZonedDateTime expected) { + TemporalAccessor actual = formatter.parse(text); + assertEquals(ZonedDateTime.from(actual), expected); + } + + @Test(dataProvider = "instantZones") + public void test_parse_instantZones_LDT(DateTimeFormatter formatter, String text, ZonedDateTime expected) { + TemporalAccessor actual = formatter.parse(text); + assertEquals(LocalDateTime.from(actual), expected.toLocalDateTime()); + } + + @Test(dataProvider = "instantZones") + public void test_parse_instantZones_Instant(DateTimeFormatter formatter, String text, ZonedDateTime expected) { + TemporalAccessor actual = formatter.parse(text); + assertEquals(Instant.from(actual), expected.toInstant()); + } + + @Test(dataProvider = "instantZones") + public void test_parse_instantZones_supported(DateTimeFormatter formatter, String text, ZonedDateTime expected) { + TemporalAccessor actual = formatter.parse(text); + assertEquals(actual.isSupported(INSTANT_SECONDS), true); + assertEquals(actual.isSupported(EPOCH_DAY), true); + assertEquals(actual.isSupported(SECOND_OF_DAY), true); + assertEquals(actual.isSupported(NANO_OF_SECOND), true); + assertEquals(actual.isSupported(MICRO_OF_SECOND), true); + assertEquals(actual.isSupported(MILLI_OF_SECOND), true); + } + + //----------------------------------------------------------------------- + @DataProvider(name = "instantNoZone") + Object[][] data_instantNoZone() { + return new Object[][] { + {INSTANT, "2014-06-30T01:02:03Z", ZonedDateTime.of(2014, 6, 30, 1, 2, 3, 0, ZoneOffset.UTC).toInstant()}, + {INSTANTSECONDS, "86402", Instant.ofEpochSecond(86402)}, + {INSTANTSECONDS_NOS, "86402.123456789", Instant.ofEpochSecond(86402, 123456789)}, + }; + } + + @Test(dataProvider = "instantNoZone", expectedExceptions = DateTimeException.class) + public void test_parse_instantNoZone_ZDT(DateTimeFormatter formatter, String text, Instant expected) { + TemporalAccessor actual = formatter.parse(text); + ZonedDateTime.from(actual); + } + + @Test(dataProvider = "instantNoZone", expectedExceptions = DateTimeException.class) + public void test_parse_instantNoZone_LDT(DateTimeFormatter formatter, String text, Instant expected) { + TemporalAccessor actual = formatter.parse(text); + LocalDateTime.from(actual); + } + + @Test(dataProvider = "instantNoZone") + public void test_parse_instantNoZone_Instant(DateTimeFormatter formatter, String text, Instant expected) { + TemporalAccessor actual = formatter.parse(text); + assertEquals(Instant.from(actual), expected); + } + + @Test(dataProvider = "instantNoZone") + public void test_parse_instantNoZone_supported(DateTimeFormatter formatter, String text, Instant expected) { + TemporalAccessor actual = formatter.parse(text); + assertEquals(actual.isSupported(INSTANT_SECONDS), true); + assertEquals(actual.isSupported(EPOCH_DAY), false); + assertEquals(actual.isSupported(SECOND_OF_DAY), false); + assertEquals(actual.isSupported(NANO_OF_SECOND), true); + assertEquals(actual.isSupported(MICRO_OF_SECOND), true); + assertEquals(actual.isSupported(MILLI_OF_SECOND), true); + } + +} diff -r 53fd25d388da -r 89731ae72a76 jdk/test/jdk/net/Sockets/Test.java --- a/jdk/test/jdk/net/Sockets/Test.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/jdk/net/Sockets/Test.java Wed Jul 05 19:46:40 2017 +0200 @@ -30,8 +30,10 @@ */ import java.net.*; +import java.io.IOException; import java.nio.channels.*; import java.util.concurrent.*; +import java.util.Set; import jdk.net.*; public class Test { @@ -75,6 +77,13 @@ DatagramSocket dg = new DatagramSocket(0); final int udp_port = dg.getLocalPort(); + // If option not available, end test + Set> options = dg.supportedOptions(); + if (!options.contains(ExtendedSocketOptions.SO_FLOW_SLA)) { + System.out.println("SO_FLOW_SLA not supported"); + return; + } + final Socket s = new Socket("127.0.0.1", tcp_port); final SocketChannel sc = SocketChannel.open(); sc.connect (new InetSocketAddress("127.0.0.1", tcp_port)); @@ -125,6 +134,13 @@ if (success) { throw new RuntimeException("Test failed"); } - } catch (UnsupportedOperationException e) {} + } catch (UnsupportedOperationException e) { + System.out.println (e); + } catch (IOException e) { + // Probably a permission error, but we're not + // going to check unless a specific permission exception + // is defined. + System.out.println (e); + } } } diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.chk Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.chk has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssckbi.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssckbi.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.chk Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.chk has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.chk Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.chk has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/sqlite3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/sqlite3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.chk Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.chk has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nss3.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssckbi.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssckbi.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.chk Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.chk has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.chk Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.chk has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/sqlite3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/sqlite3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.dll Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.dll has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.lib Binary file jdk/test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.lib has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/src/MD5SUMS --- a/jdk/test/sun/security/pkcs11/nss/src/MD5SUMS Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -1390c8a35c667e05e542 nss-3.13.1.tar.gz diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/src/SHA1SUMS --- a/jdk/test/sun/security/pkcs11/nss/src/SHA1SUMS Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -d8e7ee9f9f1e0bfa2ea8b72d25727634fea130a6 nss-3.13.1.tar.gz diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/src/nss-3.13.1.tar.gz Binary file jdk/test/sun/security/pkcs11/nss/src/nss-3.13.1.tar.gz has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz Binary file jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz has changed diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz.sha256 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz.sha256 Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,1 @@ +d2374795528f9cf36de07bf7c77d8c8414bb5b4da12ee7c78a57ec90d68e3706 nss-3.16_nspr-4.10_src.tar.gz diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/tools/jhat/HatHeapDump1Test.java --- a/jdk/test/sun/tools/jhat/HatHeapDump1Test.java Wed Jul 05 19:45:37 2017 +0200 +++ b/jdk/test/sun/tools/jhat/HatHeapDump1Test.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -21,31 +21,68 @@ * questions. */ +import java.io.File; +import java.util.Arrays; -/* @test HatHeapDump1Test.java +import jdk.testlibrary.Asserts; +import jdk.testlibrary.JDKToolLauncher; +import jdk.testlibrary.OutputAnalyzer; +import jdk.testlibrary.ProcessTools; + +/* @test * @bug 5102009 - * @summary Test jhat - * - * @compile -g HelloWorld.java HatRun.java - * @build HatHeapDump1Test - * @run main HatHeapDump1Test HelloWorld + * @summary Sanity test of jhat functionality + * @library /lib/testlibrary + * @build jdk.testlibarary.* + * @compile -g HelloWorld.java + * @run main HatHeapDump1Test */ +public class HatHeapDump1Test { -public class HatHeapDump1Test { + private static final String TEST_CLASSES = System.getProperty("test.classes", "."); public static void main(String args[]) throws Exception { - HatRun run; + String className = "HelloWorld"; + File dumpFile = new File(className + ".hdump"); + + // Generate a heap dump + ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder("-cp", + TEST_CLASSES, + "-Xcheck:jni", + "-Xverify:all", + "-agentlib:hprof=heap=dump,format=b,file=" + dumpFile.getAbsolutePath(), + className); + OutputAnalyzer output = new OutputAnalyzer(processBuilder.start()); + System.out.println(output.getOutput()); + output.shouldHaveExitValue(0); + output.shouldContain("Dumping Java heap ... done"); + Asserts.assertTrue(dumpFile.exists() && dumpFile.isFile(), "Invalid dump file " + dumpFile.getAbsolutePath()); - /* Run hprof and jhat */ - run = new HatRun("heap=dump", ""); - run.runit(args[0]); + // Run jhat to analyze the heap dump + output = jhat("-debug", "2", dumpFile.getAbsolutePath()); + output.shouldHaveExitValue(0); + output.shouldContain("Snapshot resolved"); + output.shouldContain("-debug 2 was used"); + output.shouldNotContain("ERROR"); - /* Make sure patterns in output look ok */ - if (run.output_contains("ERROR")) { - throw new RuntimeException("Test failed - ERROR seen in output"); + dumpFile.delete(); + } + + private static OutputAnalyzer jhat(String... toolArgs) throws Exception { + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhat"); + if (toolArgs != null) { + for (String toolArg : toolArgs) { + launcher.addToolArg(toolArg); + } } - /* Must be a pass. */ - System.out.println("Test passed - cleanly terminated"); + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.command(launcher.getCommand()); + System.out.println(Arrays.toString(processBuilder.command().toArray()).replace(",", "")); + OutputAnalyzer output = new OutputAnalyzer(processBuilder.start()); + System.out.println(output.getOutput()); + + return output; } + } diff -r 53fd25d388da -r 89731ae72a76 jdk/test/sun/tools/jhat/HatRun.java --- a/jdk/test/sun/tools/jhat/HatRun.java Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2005, 2013, 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. - * - * 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. - */ - - -/* - * - * Support classes for running jhat tests - * - */ - -import java.io.InputStream; -import java.io.IOException; -import java.io.File; -import java.io.BufferedInputStream; -import java.io.PrintStream; - -/* - * Helper class to direct process output to a StringBuffer - */ -class MyInputStream implements Runnable { - private String name; - private BufferedInputStream in; - private StringBuffer buffer; - - /* Create MyInputStream that saves all output to a StringBuffer */ - MyInputStream(String name, InputStream in) { - this.name = name; - this.in = new BufferedInputStream(in); - buffer = new StringBuffer(4096); - Thread thr = new Thread(this); - thr.setDaemon(true); - thr.start(); - } - - /* Dump the buffer */ - void dump(PrintStream x) { - String str = buffer.toString(); - x.println(""); - x.println(str); - x.println(""); - } - - /* Check to see if a pattern is inside the output. */ - boolean contains(String pattern) { - String str = buffer.toString(); - return str.contains(pattern); - } - - /* Runs as a separate thread capturing all output in a StringBuffer */ - public void run() { - try { - byte b[] = new byte[100]; - for (;;) { - int n = in.read(b); - String str; - if (n < 0) { - break; - } - str = new String(b, 0, n); - buffer.append(str); - System.out.print(str); - } - } catch (IOException ioe) { /* skip */ } - } -} - -/* - * Main jhat run - */ -public class HatRun { - - private String all_hprof_options; - private String all_hat_options; - private String dumpfile; - private MyInputStream output; - private MyInputStream error; - - /* Create a Hat run process */ - public HatRun(String hprof_options, String hat_options) - { - all_hprof_options = hprof_options; - all_hat_options = hat_options; - } - - /* - * Execute a process with an -agentpath or -agentlib command option - */ - public void runit(String class_name) - { - runit(class_name, null); - } - - /* - * Execute a command. - */ - private void execute(String cmd[]) - { - /* Begin process */ - Process p; - String cmdLine = ""; - int i; - - for ( i = 0 ; i < cmd.length; i++ ) { - cmdLine += cmd[i]; - cmdLine += " "; - } - System.out.println("Starting: " + cmdLine); - - try { - p = Runtime.getRuntime().exec(cmd); - } catch ( IOException e ) { - throw new RuntimeException("Test failed - exec got IO exception"); - } - - /* Save process output in StringBuffers */ - output = new MyInputStream("Input Stream", p.getInputStream()); - error = new MyInputStream("Error Stream", p.getErrorStream()); - - /* Wait for process to complete, and if exit code is non-zero we fail */ - try { - int exitStatus; - exitStatus = p.waitFor(); - if ( exitStatus != 0) { - System.out.println("Exit code is " + exitStatus); - error.dump(System.out); - output.dump(System.out); - throw new RuntimeException("Test failed - " + - "exit return code non-zero " + - "(exitStatus==" + exitStatus + ")"); - } - } catch ( InterruptedException e ) { - throw new RuntimeException("Test failed - process interrupted"); - } - System.out.println("Completed: " + cmdLine); - } - - /* - * Execute a process with an -agentpath or -agentlib command option - * plus any set of other java options. - */ - public void runit(String class_name, String vm_options[]) - { - String jre_home = System.getProperty("java.home"); - String sdk_home = (jre_home.endsWith("jre") ? - (jre_home + File.separator + "..") : - jre_home ); - String cdir = System.getProperty("test.classes", "."); - String os_arch = System.getProperty("os.arch"); - String os_name = System.getProperty("os.name"); - String java = jre_home - + File.separator + "bin" - + File.separator + "java"; - String jhat = sdk_home + File.separator + "bin" - + File.separator + "jhat"; - /* Array of strings to be passed in for exec: - * 1. java - * 2. -Dtest.classes=. - * 3. -Xcheck:jni (Just because it finds bugs) - * 4. -Xverify:all (Make sure verification is on full blast) - * 5. -agent - * vm_options - * 6+i. classname - */ - int nvm_options = 0; - if ( vm_options != null ) nvm_options = vm_options.length; - String cmd[] = new String[1 + 7 + nvm_options]; - int i,j; - - i = 0; - cmd[i++] = java; - cmd[i++] = "-cp"; - cmd[i++] = cdir; - cmd[i++] = "-Dtest.classes=" + cdir; - cmd[i++] = "-Xcheck:jni"; - cmd[i++] = "-Xverify:all"; - dumpfile= cdir + File.separator + class_name + ".hdump"; - cmd[i++] = "-agentlib:hprof=" + all_hprof_options - + ",format=b,file=" + dumpfile; - /* Add any special VM options */ - for ( j = 0; j < nvm_options; j++ ) { - cmd[i++] = vm_options[j]; - } - /* Add classname */ - cmd[i++] = class_name; - - /* Execute process */ - execute(cmd); - - /* Run jhat */ - String jhat_cmd[] = new String[4]; - jhat_cmd[0] = jhat; - jhat_cmd[1] = "-debug"; - jhat_cmd[2] = "2"; - jhat_cmd[3] = dumpfile; - - /* Execute process */ - execute(jhat_cmd); - - } - - /* Does the pattern appear in the output of this process */ - public boolean output_contains(String pattern) - { - return output.contains(pattern) || error.contains(pattern); - } -} diff -r 53fd25d388da -r 89731ae72a76 langtools/.hgtags --- a/langtools/.hgtags Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/.hgtags Wed Jul 05 19:46:40 2017 +0200 @@ -261,3 +261,4 @@ 7d67ebd3e35c3c36ad2caee482a84f8310d2f838 jdk9-b16 b64f8d5b97faa29e4d629bf4e56ebe0e26c40ecc jdk9-b17 fd8da51c5df4546995c360fc49f0b985cbf8fbd3 jdk9-b18 +a9accd7c44159f191ad09740d54493e563c39f95 jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Wed Jul 05 19:46:40 2017 +0200 @@ -31,6 +31,7 @@ import java.lang.annotation.Target; import java.text.Collator; import java.util.*; + import javax.tools.StandardLocation; import com.sun.javadoc.*; @@ -783,9 +784,8 @@ } /** - * A general purpose String comparator, which compares two Strings using a Collator - * strength of "SECONDARY", thus providing optimum case insensitive comparisons in - * most Locales. + * A general purpose case insensitive String comparator, which compares two Strings using a Collator + * strength of "TERTIARY". * * @param s1 first String to compare. * @param s2 second String to compare. @@ -793,14 +793,32 @@ * argument is less than, equal to, or greater than the second. */ public static int compareStrings(String s1, String s2) { + return compareStrings(true, s1, s2); + } + /** + * A general purpose case sensitive String comparator, which compares two Strings using a Collator + * strength of "SECONDARY". + * + * @param s1 first String to compare. + * @param s2 second String to compare. + * @return a negative integer, zero, or a positive integer as the first + * argument is less than, equal to, or greater than the second. + */ + public static int compareCaseCompare(String s1, String s2) { + return compareStrings(false, s1, s2); + } + private static int compareStrings(boolean caseSensitive, String s1, String s2) { Collator collator = Collator.getInstance(); - collator.setStrength(Collator.SECONDARY); + collator.setStrength(caseSensitive ? Collator.TERTIARY : Collator.SECONDARY); return collator.compare(s1, s2); } - /** - * A comparator for index file uses, this sorts first on names, then on - * parameter types and finally on the fully qualified name. + * A comparator for index file uses, + * 1. this sorts first on simple names + * 2. if equal, case insensitive comparison of Parameter types + * 3. if equal, case sensitive comparison of Parameter types + * 4. if equal, compare the FQNs of the entities + * 5. if equal, then compare the DocKinds ex: Package, Interface etc. * @return a comparator for index file use */ public static Comparator makeComparatorForIndexUse() { @@ -816,29 +834,35 @@ * argument is less than, equal to, or greater than the second. */ public int compare(Doc d1, Doc d2) { - int result = compareStrings(d1.name(), d2.name()); + int result = compareNames(d1, d2); if (result != 0) { return result; } if (d1 instanceof ExecutableMemberDoc && d2 instanceof ExecutableMemberDoc) { - result = compareExecutableMembers( - (ExecutableMemberDoc) d1, - (ExecutableMemberDoc) d2); + Parameter[] param1 = ((ExecutableMemberDoc) d1).parameters(); + Parameter[] param2 = ((ExecutableMemberDoc) d2).parameters(); + result = compareParameters(false, param1, param2); if (result != 0) { return result; } + result = compareParameters(true, param1, param2); } - if (d1 instanceof ProgramElementDoc && d2 instanceof ProgramElementDoc) { - return compareProgramElementDoc((ProgramElementDoc)d1, (ProgramElementDoc)d2); + if (result != 0) { + return result; } - return 0; + result = compareFullyQualifiedNames(d1, d2); + if (result != 0) { + return result; + } + return compareDocKinds(d1, d2); } }; } /** * Comparator for ClassUse representations, this sorts on member names, - * fully qualified member names and then the parameter types if applicable. + * fully qualified member names and then the parameter types if applicable, + * and finally the Doc kinds ie. package, class, interface etc. * @return a comparator to sort classes and members for class use */ public static Comparator makeComparatorForClassUse() { @@ -853,46 +877,88 @@ * argument is less than, equal to, or greater than the second. */ public int compare(Doc d1, Doc d2) { - int result = compareStrings(d1.name(), d2.name()); + int result = compareNames(d1, d2); if (result != 0) { return result; } - if (d1 instanceof ProgramElementDoc && d2 instanceof ProgramElementDoc) { - result = compareProgramElementDoc((ProgramElementDoc) d1, (ProgramElementDoc) d2); + result = compareFullyQualifiedNames(d1, d2); + if (result != 0) { + return result; + } + if (d1 instanceof ExecutableMemberDoc && d2 instanceof ExecutableMemberDoc) { + Parameter[] param1 = ((ExecutableMemberDoc) d1).parameters(); + Parameter[] param2 = ((ExecutableMemberDoc) d2).parameters(); + result = compareParameters(false, param1, param2); if (result != 0) { return result; } + return compareParameters(true, param1, param2); } - if (d1 instanceof ExecutableMemberDoc && d2 instanceof ExecutableMemberDoc) { - return compareExecutableMembers((ExecutableMemberDoc)d1, (ExecutableMemberDoc)d2); - } - return 0; + return compareDocKinds(d1, d2); } }; } + /** * A general purpose comparator to sort Doc entities, basically provides the building blocks * for creating specific comparators for an use-case. * @param a Doc entity */ static abstract class DocComparator implements Comparator { + static enum DocKinds { + PACKAGE, + FIELD, + ENUM, + ANNOTATION, + INTERFACE, + CLASS, + CONSTRUCTOR, + METHOD + }; + private DocKinds getValue(Doc d) { + if (d.isAnnotationType() || d.isAnnotationTypeElement()) { + return DocKinds.ANNOTATION; + } else if (d.isEnum() || d.isEnumConstant()) { + return DocKinds.ENUM; + } else if (d.isField()) { + return DocKinds.FIELD; + } else if (d.isInterface()) { + return DocKinds.INTERFACE; + } else if (d.isClass()) { + return DocKinds.CLASS; + } else if (d.isConstructor()) { + return DocKinds.CONSTRUCTOR; + } else if (d.isMethod()) { + return DocKinds.METHOD; + } else { + return DocKinds.PACKAGE; + } + } /** - * compares two parameter arrays by comparing each Type of the parameter in the array, - * as possible, if the matched strings are identical, and have mismatched array lengths - * then compare the lengths. + * Compares two Doc entities' kinds, and these are ordered as defined in + * the DocKinds enumeration. + * @param d1 the first Doc object + * @param d2 the second Doc object + * @return a negative integer, zero, or a positive integer as the first + * argument is less than, equal to, or greater than the second. + */ + protected int compareDocKinds(Doc d1, Doc d2) { + return getValue(d1).compareTo(getValue(d2)); + } + /** + * Compares two parameter arrays by comparing each Type of the parameter in the array, + * and as many as possible, otherwise compare their lengths. + * @param ignoreCase specifies case sensitive or insensitive comparison. * @param params1 the first parameter array. * @param params2 the first parameter array. * @return a negative integer, zero, or a positive integer as the first * argument is less than, equal to, or greater than the second. */ - protected int compareParameters(Parameter[] params1, Parameter[] params2) { - if (params1.length == 0 && params2.length == 0) { - return 0; - } + protected int compareParameters(boolean ignoreCase, Parameter[] params1, Parameter[] params2) { // try to compare as many as possible for (int i = 0; i < params1.length && i < params2.length; i++) { - int result = compareStrings(params1[i].typeName(), params2[i].typeName()); + int result = compareStrings(ignoreCase, params1[i].typeName(), params2[i].typeName()); if (result != 0) { return result; } @@ -901,41 +967,32 @@ } /** - * Compares two MemberDocs, typically the name of a method, - * field or constructor. - * @param e1 the first MemberDoc. - * @param e2 the second MemberDoc. + * Compares two Doc entities typically the simple name of a method, + * field, constructor etc. + * @param d1 the first Doc. + * @param d2 the second Doc. * @return a negative integer, zero, or a positive integer as the first * argument is less than, equal to, or greater than the second. */ - protected int compareMembers(MemberDoc e1, MemberDoc e2) { - return compareStrings(e1.name(), e2.name()); - } - - /** - * Compares two ExecutableMemberDocs such as methods and constructors, - * as well as the parameters the entity might take. - * @param m1 the first ExecutableMemberDoc. - * @param m2 the second ExecutableMemberDoc. - * @return a negative integer, zero, or a positive integer as the first - * argument is less than, equal to, or greater than the second. - */ - protected int compareExecutableMembers(ExecutableMemberDoc m1, ExecutableMemberDoc m2) { - int result = compareMembers(m1, m2); - if (result == 0) - result = compareParameters(m1.parameters(), m2.parameters()); - return result; + protected int compareNames(Doc d1, Doc d2) { + return compareStrings(d1.name(), d2.name()); } /** * Compares the fully qualified names of the entities - * @param p1 the first ProgramElementDoc. - * @param p2 the first ProgramElementDoc. + * @param d1 the first entity + * @param d2 the second entity * @return a negative integer, zero, or a positive integer as the first * argument is less than, equal to, or greater than the second. */ - protected int compareProgramElementDoc(ProgramElementDoc p1, ProgramElementDoc p2) { - return compareStrings(p1.qualifiedName(), p2.qualifiedName()); + protected int compareFullyQualifiedNames(Doc d1, Doc d2) { + String name1 = (d1 instanceof ProgramElementDoc) + ? ((ProgramElementDoc)d1).qualifiedName() + : d1.name(); + String name2 = (d2 instanceof ProgramElementDoc) + ? ((ProgramElementDoc)d2).qualifiedName() + : d2.name(); + return compareStrings(name1, name2); } } } diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java --- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -161,7 +161,7 @@ } } - public static void processOptions(Context context, + private void processOptions(Context context, JavaFileManager fileManager, Iterable options) { diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/code/Flags.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Wed Jul 05 19:46:40 2017 +0200 @@ -277,6 +277,11 @@ */ public static final long LAMBDA_METHOD = 1L<<49; + /** + * Flag to control recursion in TransTypes + */ + public static final long TYPE_TRANSLATED = 1L<<50; + /** Modifier masks. */ public static final int @@ -386,7 +391,8 @@ BAD_OVERRIDE(Flags.BAD_OVERRIDE), SIGNATURE_POLYMORPHIC(Flags.SIGNATURE_POLYMORPHIC), THROWS(Flags.THROWS), - LAMBDA_METHOD(Flags.LAMBDA_METHOD); + LAMBDA_METHOD(Flags.LAMBDA_METHOD), + TYPE_TRANSLATED(Flags.TYPE_TRANSLATED); Flag(long flag) { this.value = flag; diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/code/Source.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java Wed Jul 05 19:46:40 2017 +0200 @@ -237,6 +237,9 @@ public boolean allowFunctionalInterfaceMostSpecific() { return compareTo(JDK1_8) >= 0; } + public boolean allowPostApplicabilityVarargsAccessCheck() { + return compareTo(JDK1_8) >= 0; + } public static SourceVersion toSourceVersion(Source source) { switch(source) { case JDK1_2: diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Wed Jul 05 19:46:40 2017 +0200 @@ -770,42 +770,41 @@ @Override public List getAnnotationMirrors() { - return onlyTypeVariableAnnotations(owner.getRawTypeAttributes()); - } - - private List onlyTypeVariableAnnotations( - List candidates) { - // Declaration annotations on TypeParameters are stored in type attributes + // Declaration annotations on type variables are stored in type attributes + // on the owner of the TypeVariableSymbol + List candidates = owner.getRawTypeAttributes(); + int index = owner.getTypeParameters().indexOf(this); List res = List.nil(); for (Attribute.TypeCompound a : candidates) { - if (a.position.type == TargetType.CLASS_TYPE_PARAMETER || - a.position.type == TargetType.METHOD_TYPE_PARAMETER) + if (isCurrentSymbolsAnnotation(a, index)) res = res.prepend(a); } - return res = res.reverse(); + return res.reverse(); } - - // Helper to getAnnotation[s] @Override public Attribute.Compound getAttribute(Class annoType) { - String name = annoType.getName(); // Declaration annotations on type variables are stored in type attributes // on the owner of the TypeVariableSymbol List candidates = owner.getRawTypeAttributes(); + int index = owner.getTypeParameters().indexOf(this); for (Attribute.TypeCompound anno : candidates) - if (anno.position.type == TargetType.CLASS_TYPE_PARAMETER || - anno.position.type == TargetType.METHOD_TYPE_PARAMETER) - if (name.contentEquals(anno.type.tsym.flatName())) - return anno; + if (isCurrentSymbolsAnnotation(anno, index) && + name.contentEquals(anno.type.tsym.flatName())) + return anno; return null; } - + //where: + boolean isCurrentSymbolsAnnotation(Attribute.TypeCompound anno, int index) { + return (anno.position.type == TargetType.CLASS_TYPE_PARAMETER || + anno.position.type == TargetType.METHOD_TYPE_PARAMETER) && + anno.position.parameter_index == index; + } @Override diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jul 05 19:46:40 2017 +0200 @@ -92,6 +92,7 @@ final JCDiagnostic.Factory diags; final Annotate annotate; final DeferredLintHandler deferredLintHandler; + final TypeEnvs typeEnvs; public static Attr instance(Context context) { Attr instance = context.get(attrKey); @@ -120,6 +121,7 @@ diags = JCDiagnostic.Factory.instance(context); annotate = Annotate.instance(context); deferredLintHandler = DeferredLintHandler.instance(context); + typeEnvs = TypeEnvs.instance(context); Options options = Options.instance(context); @@ -429,7 +431,7 @@ } public Type attribType(JCTree node, TypeSymbol sym) { - Env env = enter.typeEnvs.get(sym); + Env env = typeEnvs.get(sym); Env localEnv = env.dup(node, env.info.dup()); return attribTree(node, localEnv, unknownTypeInfo); } @@ -4252,7 +4254,7 @@ // ... and attribute the bound class c.flags_field |= UNATTRIBUTED; Env cenv = enter.classEnv(cd, env); - enter.typeEnvs.put(c, cenv); + typeEnvs.put(c, cenv); attribClass(c); return owntype; } @@ -4398,9 +4400,9 @@ c.flags_field &= ~UNATTRIBUTED; // Get environment current at the point of class definition. - Env env = enter.typeEnvs.get(c); - - // The info.lint field in the envs stored in enter.typeEnvs is deliberately uninitialized, + Env env = typeEnvs.get(c); + + // The info.lint field in the envs stored in typeEnvs is deliberately uninitialized, // because the annotations were not available at the time the env was created. Therefore, // we look up the environment chain for the first enclosing environment for which the // lint value is set. Typically, this is the parent env, but might be further if there diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Wed Jul 05 19:46:40 2017 +0200 @@ -78,6 +78,7 @@ final Flow flow; final Names names; final Annotate annotate; + final TypeEnvs typeEnvs; public static DeferredAttr instance(Context context) { DeferredAttr instance = context.get(deferredAttrKey); @@ -102,6 +103,7 @@ names = Names.instance(context); stuckTree = make.Ident(names.empty).setType(Type.stuckType); annotate = Annotate.instance(context); + typeEnvs = TypeEnvs.instance(context); emptyDeferredAttrContext = new DeferredAttrContext(AttrMode.CHECK, null, MethodResolutionPhase.BOX, infer.emptyContext, null, null) { @Override @@ -420,7 +422,7 @@ //it is possible that nested expressions inside argument expression //are left unchecked - in such cases there's nothing to clean up. if (csym == null) return; - enter.typeEnvs.remove(csym); + typeEnvs.remove(csym); chk.compiled.remove(csym.flatname); syms.classes.remove(csym.flatname); super.visitClassDef(tree); diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Wed Jul 05 19:46:40 2017 +0200 @@ -103,6 +103,7 @@ Names names; JavaFileManager fileManager; PkgInfo pkginfoOpt; + TypeEnvs typeEnvs; private final Todo todo; @@ -139,13 +140,9 @@ Options options = Options.instance(context); pkginfoOpt = PkgInfo.get(options); + typeEnvs = TypeEnvs.instance(context); } - /** A hashtable mapping classes and packages to the environments current - * at the points of their definitions. - */ - Map> typeEnvs = new HashMap<>(); - /** Accessor for typeEnvs */ public Env getEnv(TypeSymbol sym) { diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Wed Jul 05 19:46:40 2017 +0200 @@ -79,6 +79,7 @@ private final ConstFold cfolder; private final Target target; private final Source source; + private final TypeEnvs typeEnvs; private final boolean allowEnums; private final Name dollarAssertionsDisabled; private final Name classDollar; @@ -99,6 +100,7 @@ cfolder = ConstFold.instance(context); target = Target.instance(context); source = Source.instance(context); + typeEnvs = TypeEnvs.instance(context); allowEnums = source.allowEnums(); dollarAssertionsDisabled = names. fromString(target.syntheticNameChar() + "assertionsDisabled"); @@ -2450,10 +2452,16 @@ } public void visitClassDef(JCClassDecl tree) { + Env prevEnv = attrEnv; ClassSymbol currentClassPrev = currentClass; MethodSymbol currentMethodSymPrev = currentMethodSym; + currentClass = tree.sym; currentMethodSym = null; + attrEnv = typeEnvs.remove(currentClass); + if (attrEnv == null) + attrEnv = prevEnv; + classdefs.put(currentClass, tree); proxies = proxies.dup(currentClass); @@ -2525,6 +2533,7 @@ // Append translated tree to `translated' queue. translated.append(tree); + attrEnv = prevEnv; currentClass = currentClassPrev; currentMethodSym = currentMethodSymPrev; diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Wed Jul 05 19:46:40 2017 +0200 @@ -82,6 +82,7 @@ private final Target target; private final DeferredLintHandler deferredLintHandler; private final Lint lint; + private final TypeEnvs typeEnvs; public static MemberEnter instance(Context context) { MemberEnter instance = context.get(memberEnterKey); @@ -107,6 +108,7 @@ target = Target.instance(context); deferredLintHandler = DeferredLintHandler.instance(context); lint = Lint.instance(context); + typeEnvs = TypeEnvs.instance(context); allowTypeAnnos = source.allowTypeAnnotations(); } @@ -1000,7 +1002,7 @@ ClassSymbol c = (ClassSymbol)sym; ClassType ct = (ClassType)c.type; - Env env = enter.typeEnvs.get(c); + Env env = typeEnvs.get(c); JCClassDecl tree = (JCClassDecl)env.tree; boolean wasFirst = isFirst; isFirst = false; diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Wed Jul 05 19:46:40 2017 +0200 @@ -95,6 +95,7 @@ public final boolean varargsEnabled; public final boolean allowMethodHandles; public final boolean allowFunctionalInterfaceMostSpecific; + public final boolean checkVarargsAccessDuringResolution; private final boolean debugResolve; private final boolean compactMethodDiags; final EnumSet verboseResolutionMode; @@ -136,6 +137,8 @@ Target target = Target.instance(context); allowMethodHandles = target.hasMethodHandles(); allowFunctionalInterfaceMostSpecific = source.allowFunctionalInterfaceMostSpecific(); + checkVarargsAccessDuringResolution = + source.allowPostApplicabilityVarargsAccessCheck(); polymorphicSignatureScope = new Scope(syms.noSymbol); inapplicableMethodException = new InapplicableMethodException(diags); @@ -833,7 +836,10 @@ Warner warn) { super.argumentsAcceptable(env, deferredAttrContext, argtypes, formals, warn); //should we expand formals? - if (deferredAttrContext.phase.isVarargsRequired()) { + if ((!checkVarargsAccessDuringResolution || + (checkVarargsAccessDuringResolution && + deferredAttrContext.mode == AttrMode.CHECK)) && + deferredAttrContext.phase.isVarargsRequired()) { //check varargs element type accessibility varargsAccessible(env, types.elemtype(formals.last()), deferredAttrContext.inferenceContext); diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Wed Jul 05 19:46:40 2017 +0200 @@ -966,10 +966,11 @@ translateClass((ClassSymbol)st.tsym); } - Env myEnv = enter.typeEnvs.remove(c); - if (myEnv == null) { + Env myEnv = enter.getEnv(c); + if (myEnv == null || (c.flags_field & TYPE_TRANSLATED) != 0) { return; } + c.flags_field |= TYPE_TRANSLATED; /* The two assertions below are set for early detection of any attempt * to translate a class that: diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2014, 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. + */ + +package com.sun.tools.javac.comp; + +import java.util.Collection; +import java.util.HashMap; +import com.sun.tools.javac.code.Symbol.TypeSymbol; +import com.sun.tools.javac.util.Context; + +/** This class contains the type environments used by Enter, MemberEnter, + * Attr, DeferredAttr, and Lower. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +class TypeEnvs { + private static final long serialVersionUID = 571524752489954631L; + + protected static final Context.Key typeEnvsKey = new Context.Key<>(); + public static TypeEnvs instance(Context context) { + TypeEnvs instance = context.get(typeEnvsKey); + if (instance == null) + instance = new TypeEnvs(context); + return instance; + } + + private HashMap> map; + protected TypeEnvs(Context context) { + map = new HashMap<>(); + context.put(typeEnvsKey, this); + } + + Env get(TypeSymbol sym) { return map.get(sym); } + Env put(TypeSymbol sym, Env env) { return map.put(sym, env); } + Env remove(TypeSymbol sym) { return map.remove(sym); } + Collection> values() { return map.values(); } + void clear() { map.clear(); } +} diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/main/Main.java --- a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java Wed Jul 05 19:46:40 2017 +0200 @@ -384,7 +384,7 @@ /** Programmatic interface for main function. * @param args The command line parameters. */ - public Result compile(String[] args, + protected Result compile(String[] args, Context context, List fileObjects, Iterable processors) diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java --- a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Wed Jul 05 19:46:40 2017 +0200 @@ -354,13 +354,41 @@ private final DiagnosticType type; private final DiagnosticSource source; private final DiagnosticPosition position; - private final int line; - private final int column; private final String key; protected final Object[] args; private final Set flags; private final LintCategory lintCategory; + /** source line position (set lazily) */ + private SourcePosition sourcePosition; + + /** + * This class is used to defer the line/column position fetch logic after diagnostic construction. + */ + class SourcePosition { + + private final int line; + private final int column; + + SourcePosition() { + int n = (position == null ? Position.NOPOS : position.getPreferredPosition()); + if (n == Position.NOPOS || source == null) + line = column = -1; + else { + line = source.getLineNumber(n); + column = source.getColumnNumber(n, true); + } + } + + public int getLineNumber() { + return line; + } + + public int getColumnNumber() { + return column; + } + } + /** * Create a diagnostic object. * @param formatter the formatter to use for the diagnostic @@ -390,14 +418,6 @@ this.position = pos; this.key = key; this.args = args; - - int n = (pos == null ? Position.NOPOS : pos.getPreferredPosition()); - if (n == Position.NOPOS || source == null) - line = column = -1; - else { - line = source.getLineNumber(n); - column = source.getColumnNumber(n, true); - } } /** @@ -494,7 +514,10 @@ * @return the line number within the source referred to by this diagnostic */ public long getLineNumber() { - return line; + if (sourcePosition == null) { + sourcePosition = new SourcePosition(); + } + return sourcePosition.getLineNumber(); } /** @@ -502,7 +525,10 @@ * @return the column number within the line of source referred to by this diagnostic */ public long getColumnNumber() { - return column; + if (sourcePosition == null) { + sourcePosition = new SourcePosition(); + } + return sourcePosition.getColumnNumber(); } /** diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/sjavac/comp/Dependencies.java --- a/langtools/src/share/classes/com/sun/tools/sjavac/comp/Dependencies.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/sjavac/comp/Dependencies.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2014, 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 @@ -72,10 +72,6 @@ private Dependencies(Context context) { context.put(dependenciesKey, this); log = Log.instance(context); - } - - public void reset() - { deps = new HashMap<>(); explicitPackages = new HashSet<>(); publicApiPerClass = new HashMap<>(); diff -r 53fd25d388da -r 89731ae72a76 langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java --- a/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, 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 @@ -39,23 +39,26 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; -import java.util.Map; import java.util.concurrent.Future; + +import javax.tools.JavaCompiler.CompilationTask; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; +import com.sun.tools.javac.api.JavacTaskImpl; +import com.sun.tools.javac.util.BaseFileManager; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Log; -import com.sun.tools.javac.util.BaseFileManager; import com.sun.tools.javac.util.StringUtils; import com.sun.tools.sjavac.comp.AttrWithDeps; import com.sun.tools.sjavac.comp.Dependencies; import com.sun.tools.sjavac.comp.JavaCompilerWithDeps; +import com.sun.tools.sjavac.comp.ResolveWithDeps; import com.sun.tools.sjavac.comp.SmartFileManager; -import com.sun.tools.sjavac.comp.ResolveWithDeps; /** * The compiler thread maintains a JavaCompiler instance and @@ -78,7 +81,6 @@ // The necessary classes to do a compilation. private com.sun.tools.javac.api.JavacTool compiler; private StandardJavaFileManager fileManager; - private BaseFileManager fileManagerBase; private SmartFileManager smartFileManager; private Context context; @@ -127,10 +129,8 @@ inUse = true; compiler = com.sun.tools.javac.api.JavacTool.create(); fileManager = compiler.getStandardFileManager(null, null, null); - fileManagerBase = (BaseFileManager)fileManager; smartFileManager = new SmartFileManager(fileManager); context = new Context(); - context.put(JavaFileManager.class, smartFileManager); ResolveWithDeps.preRegister(context); AttrWithDeps.preRegister(context); JavaCompilerWithDeps.preRegister(context, this); @@ -145,7 +145,6 @@ inUse = false; compiler = null; fileManager = null; - fileManagerBase = null; smartFileManager = null; context = null; subTasks = null; @@ -315,24 +314,13 @@ com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK; try { if (compilationUnits.size() > 0) { - // Bind the new logger to the existing context. - context.put(Log.outKey, stderr); - Log.instance(context).setWriter(Log.WriterKind.NOTICE, stdout); - Log.instance(context).setWriter(Log.WriterKind.WARNING, stderr); - Log.instance(context).setWriter(Log.WriterKind.ERROR, stderr); - // Process the options. - com.sun.tools.javac.api.JavacTool.processOptions(context, smartFileManager, the_options); - fileManagerBase.setContext(context); smartFileManager.setVisibleSources(visibleSources); smartFileManager.cleanArtifacts(); smartFileManager.setLog(stdout); - Dependencies.instance(context).reset(); - - com.sun.tools.javac.main.Main ccompiler = new com.sun.tools.javac.main.Main("javacTask", stderr); - String[] aa = the_options.toArray(new String[0]); // Do the compilation! - rc = ccompiler.compile(aa, context, compilationUnits.toList(), null); + CompilationTask task = compiler.getTask(stderr, smartFileManager, null, the_options, null, compilationUnits, context); + rc = ((JavacTaskImpl) task).doCall(); while (numActiveSubTasks()>0) { try { Thread.sleep(1000); } catch (InterruptedException e) { } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/com/sun/javadoc/lib/JavadocTester.java --- a/langtools/test/com/sun/javadoc/lib/JavadocTester.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/com/sun/javadoc/lib/JavadocTester.java Wed Jul 05 19:46:40 2017 +0200 @@ -451,8 +451,12 @@ for (String s : strings) { int currentIndex = fileString.indexOf(s); checking(s + " at index " + currentIndex); - if (currentIndex >= prevIndex) { - passed(s + "is in the correct order"); + if (currentIndex == -1) { + failed(s + " not found."); + continue; + } + if (currentIndex > prevIndex) { + passed(s + " is in the correct order"); } else { failed(s + " is in the wrong order."); } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java --- a/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java Wed Jul 05 19:46:40 2017 +0200 @@ -23,7 +23,7 @@ /* * @test - * @bug 8039410 8042601 + * @bug 8039410 8042601 8042829 * @summary test to determine if members are ordered correctly * @author ksrini * @library ../lib/ @@ -31,6 +31,16 @@ * @run main TestOrdering */ +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static java.nio.file.StandardOpenOption.*; + public class TestOrdering extends JavadocTester { public static void main(String[] args) throws Exception { @@ -39,7 +49,7 @@ } @Test - void testUnnamedPackages() { + void testUnnamedPackagesForClassUse() { javadoc("-d", "out", "-sourcepath", testSrc, "-use", @@ -49,16 +59,94 @@ } @Test - void testNamedPackages() { + void testNamedPackagesForClassUse() { javadoc("-d", "out-1", "-sourcepath", testSrc, "-use", "pkg1"); checkExit(Exit.OK); checkClassUseOrdering("pkg1/class-use/UsedClass.html"); - checkIndexPathOrdering("index-all.html"); } + enum ListOrder { NONE, REVERSE, SHUFFLE }; + /* + * By default we do not shuffle the input list, in order to keep the list deterministic, + * and the test predictable. However, we can turn on the stress mode, by setting the following + * property if required. + */ + static final ListOrder STRESS_MODE = Boolean.getBoolean("TestOrder.STRESS") + ? ListOrder.SHUFFLE + : ListOrder.REVERSE; + + /* + * Controls the number of sibling packages, pkg0, pkg1, pkg2, ..... + */ + static final int MAX_PACKAGES = 4; + + /* + * Controls the number of children packages, pkg0, pkg0.pkg, pkg0.pkg.pkg, ..... + * Note: having too long a depth (> 256 chars on Windows), will likely lead to + * cause problems with automated build and test systems. + */ + static final int MAX_SUBPACKAGES_DEPTH = 4; + @Test + void testIndexOrdering() throws IOException { + final String clsname = "Add"; + List cmdArgs = new ArrayList(); + cmdArgs.add("-d"); + cmdArgs.add("out-2"); + cmdArgs.add("-sourcepath"); + cmdArgs.add("src"); + cmdArgs.add("-package"); + System.out.println("STRESS_MODE: " + STRESS_MODE); + emitFile(null, clsname, STRESS_MODE); + for (int width = 0 ; width < MAX_PACKAGES ; width++) { + String wpkgname = "add" + width; + String dpkgname = wpkgname; + emitFile(wpkgname, clsname, ListOrder.NONE); // list as-is + cmdArgs.add(wpkgname); + for (int depth = 1 ; depth < MAX_SUBPACKAGES_DEPTH ; depth++) { + dpkgname = dpkgname + ".add"; + emitFile(dpkgname, clsname, STRESS_MODE); + cmdArgs.add(dpkgname); + } + } + File srcDir = new File(new File("."), "src"); + cmdArgs.add(new File(srcDir, clsname + ".java").getPath()); + javadoc(cmdArgs.toArray(new String[cmdArgs.size()])); + checkExit(Exit.OK); + checkOrder("index-all.html", composeTestVectors()); + } + String[] composeTestVectors() { + List testList = new ArrayList<>(); + + for (String x : expectedMethodOrdering) { + testList.add(x); + for (int i = 0; i < MAX_PACKAGES; i++) { + String wpkg = "add" + i; + testList.add(wpkg + "/" + x); + String dpkg = wpkg; + for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) { + dpkg = dpkg + "/" + "add"; + testList.add(dpkg + "/" + x); + } + } + } + for (String x : expectedEnumOrdering) { + testList.add(x.replace("REPLACE_ME", "<Unnamed>")); + for (int i = 0; i < MAX_PACKAGES; i++) { + String wpkg = "add" + i; + testList.add(wpkg + "/" + x.replace("REPLACE_ME", wpkg)); + String dpkg = wpkg; + for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) { + dpkg = dpkg + "/" + "add"; + testList.add(dpkg + "/" + x.replace("REPLACE_ME", pathToPackage(dpkg))); + } + } + } + testList.addAll(Arrays.asList(expectedFieldOrdering)); + return testList.toArray(new String[testList.size()]); + } void checkExecutableMemberOrdering(String usePage) { String contents = readFile(usePage); // check constructors @@ -109,29 +197,125 @@ } } - void checkIndexPathOrdering(String indexPage) { - checkOrder(indexPage, - "pkg1/UsedClass.html#add--", - "pkg1/ZZTop.html#add--", - "pkg1/UsedClass.html#add-double-", - "pkg1/UsedClass.html#add-java.lang.Double-", - "pkg1/ZZTop.html#add-double-", - "pkg1/ZZTop.html#add-java.lang.Double-", - "pkg1/UsedClass.html#add-double-byte-", - "pkg1/ZZTop.html#add-double-byte-", - "pkg1/UsedClass.html#add-double-double-", - "pkg1/UsedClass.html#add-double-java.lang.Double-", - "pkg1/ZZTop.html#add-double-double-", - "pkg1/ZZTop.html#add-double-java.lang.Double-", - "pkg1/UsedClass.html#add-float-", - "pkg1/ZZTop.html#add-float-", - "pkg1/UsedClass.html#add-float-int-", - "pkg1/ZZTop.html#add-float-int-", - "pkg1/UsedClass.html#add-int-", - "pkg1/ZZTop.html#add-int-", - "pkg1/UsedClass.html#add-int-float-", - "pkg1/ZZTop.html#add-int-float-", - "pkg1/UsedClass.html#add-java.lang.Integer-", - "pkg1/ZZTop.html#add-java.lang.Integer-"); + static String[] contents = { + "public add ADDADD;", + "public add AddAdd;", + "public add addadd;", + "public enum add {add, ADD, addd, ADDD};", + "public enum ADD {ADD, add, addd, ADDD};", + "public void add(){}", + "public void add(double d){}", + "public void add(int i, float f){}", + "public void add(float f, int i){}", + "public void add(double d, byte b){}", + "public Double add(Double d) {return (double) 22/7;}", + "public double add(double d1, double d2) {return d1 + d2;}", + "public double add(double d1, Double d2) {return d1 + d2;}", + "public Float add(float f) {return (float) 22/7;}", + "public void add(int i){}", + "public int add(Integer i) {return 0;}" + }; + + void emitFile(String pkgname, String clsname, ListOrder order) throws IOException { + File srcDir = new File("src"); + File outDir = pkgname == null + ? srcDir + : new File(srcDir, pkgname.replace(".", File.separator)); + File outFile = new File(outDir, clsname + ".java"); + outDir.mkdirs(); + List scratch = new ArrayList<>(Arrays.asList(contents)); + switch (order) { + case SHUFFLE: + Collections.shuffle(scratch); + break; + case REVERSE: + Collections.reverse(scratch); + break; + default: + // leave list as-is + } + // insert the header + scratch.add(0, "public class " + clsname + " {"); + if (pkgname != null) { + scratch.add(0, "package " + pkgname + ";"); + } + // append the footer + scratch.add("}"); + Files.write(outFile.toPath(), scratch, CREATE, TRUNCATE_EXISTING); + } + + String pathToPackage(String in) { + return in.replace("/", "."); } + + final String expectedMethodOrdering[] = { + "Add.html#add--", + "Add.html#add-double-", + "Add.html#add-java.lang.Double-", + "Add.html#add-double-byte-", + "Add.html#add-double-double-", + "Add.html#add-double-java.lang.Double-", + "Add.html#add-float-", + "Add.html#add-float-int-", + "Add.html#add-int-", + "Add.html#add-int-float-", + "Add.html#add-java.lang.Integer-" + }; + final String expectedEnumOrdering[] = { + "Add.add.html\" title=\"enum in REPLACE_ME\"", + "Add.ADD.html\" title=\"enum in REPLACE_ME\"" + }; + final String expectedFieldOrdering[] = { + "Add.html#addadd\"", + "add0/add/add/add/Add.html#addadd\"", + "add0/add/add/Add.html#addadd\"", + "add0/add/Add.html#addadd\"", + "add0/Add.html#addadd\"", + "add1/add/add/add/Add.html#addadd\"", + "add1/add/add/Add.html#addadd\"", + "add1/add/Add.html#addadd\"", + "add1/Add.html#addadd\"", + "add2/add/add/add/Add.html#addadd\"", + "add2/add/add/Add.html#addadd\"", + "add2/add/Add.html#addadd\"", + "add2/Add.html#addadd\"", + "add3/add/add/add/Add.html#addadd\"", + "add3/add/add/Add.html#addadd\"", + "add3/add/Add.html#addadd\"", + "add3/Add.html#addadd\"", + "Add.html#AddAdd\"", + "add0/add/add/add/Add.html#AddAdd\"", + "add0/add/add/Add.html#AddAdd\"", + "add0/add/Add.html#AddAdd\"", + "add0/Add.html#AddAdd\"", + "add1/add/add/add/Add.html#AddAdd\"", + "add1/add/add/Add.html#AddAdd\"", + "add1/add/Add.html#AddAdd\"", + "add1/Add.html#AddAdd\"", + "add2/add/add/add/Add.html#AddAdd\"", + "add2/add/add/Add.html#AddAdd\"", + "add2/add/Add.html#AddAdd\"", + "add2/Add.html#AddAdd\"", + "add3/add/add/add/Add.html#AddAdd\"", + "add3/add/add/Add.html#AddAdd\"", + "add3/add/Add.html#AddAdd\"", + "add3/Add.html#AddAdd\"", + "Add.html#ADDADD\"", + "add0/add/add/add/Add.html#ADDADD\"", + "add0/add/add/Add.html#ADDADD\"", + "add0/add/Add.html#ADDADD\"", + "add0/Add.html#ADDADD\"", + "add1/add/add/add/Add.html#ADDADD\"", + "add1/add/add/Add.html#ADDADD\"", + "add1/add/Add.html#ADDADD\"", + "add1/Add.html#ADDADD\"", + "add2/add/add/add/Add.html#ADDADD\"", + "add2/add/add/Add.html#ADDADD\"", + "add2/add/Add.html#ADDADD\"", + "add2/Add.html#ADDADD\"", + "add3/add/add/add/Add.html#ADDADD\"", + "add3/add/add/Add.html#ADDADD\"", + "add3/add/Add.html#ADDADD\"", + "add3/Add.html#ADDADD\"" + }; } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java --- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java Wed Jul 05 19:46:40 2017 +0200 @@ -23,72 +23,6 @@ package pkg1; /** - * For index and class-use testing + * For class-use testing */ -public class UsedClass { - - /** - * just an empty param method. - */ - public void add(){} - - /** - * @param d param - */ - public void add(double d){} - - /** - * @param i param - * @param f param - */ - public void add(int i, float f){} - - /** - * @param f param - * @param i param - */ - public void add(float f, int i){} - - /** - * @param d param - * @param b param - */ - public void add(double d, byte b){} - - /** - * @param d param - * @return Double - */ - public Double add(Double d) {return (double) 22/7;} - - /** - * @param d1 param - * @param d2 param - * @return double - */ - public double add(double d1, double d2) {return d1 + d2;} - - /** - * @param d1 param - * @param d2 param - * @return double - */ - public double add(double d1, Double d2) {return d1 + d2;} - - /** - * @param f param - * @return Float - */ - public Float add(float f) {return (float) 22/7;} - - /** - * @param i param - */ - public void add(int i){} - - /** - * @param i param - * @return double - */ - public int add(Integer i) {return 0;} -} +public class UsedClass {} diff -r 53fd25d388da -r 89731ae72a76 langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java --- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2014, 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. - * - * 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. - */ - -package pkg1; -/** - * For index testing only - */ -public class ZZTop { - - /** - * just an empty param method. - */ - public void add(){} - - /** - * @param d param - */ - public void add(double d){} - - /** - * @param i param - * @param f param - */ - public void add(int i, float f){} - - /** - * @param f param - * @param i param - */ - public void add(float f, int i){} - - /** - * @param d param - * @param b param - */ - public void add(double d, byte b){} - - /** - * @param d param - * @return Double - */ - public Double add(Double d) {return (double) 22/7;} - - /** - * @param d1 param - * @param d2 param - * @return double - */ - public double add(double d1, double d2) {return d1 + d2;} - - /** - * @param d1 param - * @param d2 param - * @return double - */ - public double add(double d1, Double d2) {return d1 + d2;} - - /** - * @param f param - * @return Float - */ - public Float add(float f) {return (float) 22/7;} - - /** - * @param i param - */ - public void add(int i){} - - /** - * @param i param - * @return double - */ - public int add(Integer i) {return 0;} -} diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/T8038975/AccessTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T8038975/AccessTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +/* + * @test + * @bug 8038975 + * @summary Access control in enhanced for + * @compile AccessTest.java + */ + +import a.*; +public class AccessTest { + private static class Impl extends B { + public void method(Inner inner) { + for (A a : inner) + System.out.println(a); + } + } +} diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/T8038975/a/A.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T8038975/a/A.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +package a; +public class A { } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/T8038975/a/B.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T8038975/a/B.java Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +package a; +public class B { + protected abstract class Inner implements Iterable { } +} diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/options/xprefer/XPreferTest.java --- a/langtools/test/tools/javac/options/xprefer/XPreferTest.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/tools/javac/options/xprefer/XPreferTest.java Wed Jul 05 19:46:40 2017 +0200 @@ -26,7 +26,6 @@ * @summary Tests which path is used to represent an implicit type given * various xprefer arguments and multiple .class / .java files involved. * @bug 8028196 - * @ignore 8042839 XPreferTest fails on Windows */ import java.io.File; @@ -42,6 +41,7 @@ import java.util.ListIterator; import java.util.NoSuchElementException; import java.util.Scanner; +import java.util.regex.Pattern; import javax.tools.JavaCompiler; import javax.tools.JavaCompiler.CompilationTask; @@ -180,10 +180,16 @@ Scanner s = new Scanner(compilerOutput); while (s.hasNextLine()) { String line = s.nextLine(); - if (line.matches("\\[loading .*\\]")) - for (Dir dir : Dir.values()) - if (line.contains(dir.file.getName() + "/" + classId)) + if (line.matches("\\[loading .*\\]")) { + for (Dir dir : Dir.values()) { + // On Windows all paths are printed with '/' except + // paths inside zip-files, which are printed with '\'. + // For this reason we accept both '/' and '\' below. + String regex = dir.file.getName() + "[\\\\/]" + classId; + if (Pattern.compile(regex).matcher(line).find()) return dir; + } + } } return null; } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java --- a/langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2014, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 8011027 + * @bug 8011027 8046916 * @library /tools/javac/lib * @build JavacTestingAbstractProcessor TestTypeParameterAnnotations * @compile -processor TestTypeParameterAnnotations -proc:only TestTypeParameterAnnotations.java @@ -33,10 +33,16 @@ import java.lang.annotation.*; import javax.annotation.processing.*; import javax.lang.model.element.*; -import javax.lang.model.util.*; import javax.tools.*; -public class TestTypeParameterAnnotations<@Foo @Bar @Baz T> extends JavacTestingAbstractProcessor { +@ExpectedTypeParameterAnnotations(typeParameterName="T1", + annotations={"Foo1", "Bar1", "Baz1"}) +@ExpectedTypeParameterAnnotations(typeParameterName="T2", annotations={}) +@ExpectedTypeParameterAnnotations(typeParameterName="T3", + annotations={"Foo2", "Bar2", "Baz2"}) +@ExpectedTypeParameterAnnotations(typeParameterName="T4", annotations={}) +public class TestTypeParameterAnnotations<@Foo1 @Bar1 @Baz1 T1, T2, @Foo2 @Bar2 @Baz2 T3, T4> extends + JavacTestingAbstractProcessor { int round = 0; public boolean process(Set annotations, RoundEnvironment roundEnv) { @@ -74,82 +80,69 @@ int check(Element e, List typarams) { if (typarams.isEmpty()) return 0; - if (typarams.size() != 1) - return 0; - for (TypeParameterElement tpe: typarams) { - boolean b1 = checkAnnotationMirrors(tpe, tpe.getAnnotationMirrors()); - boolean b2 = checkAnnotationMirrors(tpe, elements.getAllAnnotationMirrors(tpe)); - boolean b3 = checkGetAnnotation(tpe); - boolean b4 = checkGetAnnotations(tpe); - return b1 && b2 && b3 && b4 ? 1 : 0; - } - return 0; - } - - boolean checkAnnotationMirrors(TypeParameterElement tpe, List l) { - if (l.size() != 3) { - error("To few annotations, got " + l.size() + - ", should be 3", tpe); - return false; + for (TypeParameterElement tpe : typarams) { + ExpectedTypeParameterAnnotations expected = null; + for (ExpectedTypeParameterAnnotations a : e.getAnnotationsByType(ExpectedTypeParameterAnnotations.class)) { + if (tpe.getSimpleName().contentEquals(a.typeParameterName())) { + expected = a; + break; + } + } + if (expected == null) { + throw new IllegalStateException("Does not have expected values annotation."); + } + checkAnnotationMirrors(tpe, tpe.getAnnotationMirrors(), expected); + checkAnnotationMirrors(tpe, elements.getAllAnnotationMirrors(tpe), expected); + checkGetAnnotation(tpe, expected); + checkGetAnnotations(tpe, expected); } - AnnotationMirror m = l.get(0); - if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Foo"))) { - error("Wrong type of annotation, was expecting @Foo", m.getAnnotationType().asElement()); - return false; - } - m = l.get(1); - if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Bar"))) { - error("Wrong type of annotation, was expecting @Bar", m.getAnnotationType().asElement()); - return false; - } - m = l.get(2); - if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Baz"))) { - error("Wrong type of annotation, was expecting @Baz", m.getAnnotationType().asElement()); - return false; - } - return true; + return typarams.size(); } - boolean checkGetAnnotation(TypeParameterElement tpe) { - Foo f = tpe.getAnnotation(Foo.class); - if (f == null) - error("Expecting @Foo to be present in getAnnotation()", tpe); + void checkAnnotationMirrors(TypeParameterElement tpe, List l, ExpectedTypeParameterAnnotations expected) { + String[] expectedAnnotations = expected.annotations(); - Bar b = tpe.getAnnotation(Bar.class); - if (b == null) - error("Expecting @Bar to be present in getAnnotation()", tpe); + if (l.size() != expectedAnnotations.length) { + error("Incorrect number of annotations, got " + l.size() + + ", should be " + expectedAnnotations.length, tpe); + return ; + } - Baz z = tpe.getAnnotation(Baz.class); - if (z == null) - error("Expecting @Baz to be present in getAnnotation()", tpe); - - return f != null && - b != null && - z != null; + for (int i = 0; i < expectedAnnotations.length; i++) { + AnnotationMirror m = l.get(i); + if (!m.getAnnotationType().asElement().equals(elements.getTypeElement(expectedAnnotations[i]))) { + error("Wrong type of annotation, was expecting @Foo", m.getAnnotationType().asElement()); + return ; + } + } } - boolean checkGetAnnotations(TypeParameterElement tpe) { - Foo[] f = tpe.getAnnotationsByType(Foo.class); - if (f.length != 1) { - error("Expecting 1 @Foo to be present in getAnnotationsByType()", tpe); - return false; - } + void checkGetAnnotation(TypeParameterElement tpe, ExpectedTypeParameterAnnotations expected) { + List expectedAnnotations = Arrays.asList(expected.annotations()); + + for (Class c : ALL_ANNOTATIONS) { + Object a = tpe.getAnnotation(c); - Bar[] b = tpe.getAnnotationsByType(Bar.class); - if (b.length != 1) { - error("Expecting 1 @Bar to be present in getAnnotationsByType()", tpe); - return false; + if (a != null ^ expectedAnnotations.indexOf(c.getName()) != (-1)) { + error("Unexpected behavior for " + c.getName(), tpe); + return ; + } } + } - Baz[] z = tpe.getAnnotationsByType(Baz.class); - if (z.length != 1) { - error("Expecting 1 @Baz to be present in getAnnotationsByType()", tpe); - return false; + void checkGetAnnotations(TypeParameterElement tpe, ExpectedTypeParameterAnnotations expected) { + List expectedAnnotations = Arrays.asList(expected.annotations()); + + for (Class c : ALL_ANNOTATIONS) { + Object[] a = tpe.getAnnotationsByType(c); + + if (a.length > 0 ^ expectedAnnotations.indexOf(c.getName()) != (-1)) { + error("Unexpected behavior for " + c.getName(), tpe); + return ; + } } - - return true; } void note(String msg) { @@ -168,23 +161,71 @@ messager.printMessage(Diagnostic.Kind.ERROR, msg); } + Class[] ALL_ANNOTATIONS = new Class[] { + Foo1.class, Bar1.class, Baz1.class, + Foo2.class, Bar2.class, Baz2.class, + }; + // additional generic elements to test - <@Foo @Bar @Baz X> X m(X x) { return x; } + @ExpectedTypeParameterAnnotations(typeParameterName="W", + annotations={"Foo1", "Bar1", "Baz1"}) + @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) + @ExpectedTypeParameterAnnotations(typeParameterName="Y", + annotations={"Foo2", "Bar2", "Baz2"}) + @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) + <@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> X m(X x) { return x; } - interface Intf<@Foo @Bar @Baz X> { X m() ; } + @ExpectedTypeParameterAnnotations(typeParameterName="W", + annotations={"Foo1", "Bar1", "Baz1"}) + @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) + @ExpectedTypeParameterAnnotations(typeParameterName="Y", + annotations={"Foo2", "Bar2", "Baz2"}) + @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) + interface Intf<@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> { X m() ; } - class Class<@Foo @Bar @Baz X> { - <@Foo @Bar @Baz Y> Class() { } + @ExpectedTypeParameterAnnotations(typeParameterName="W", + annotations={"Foo1", "Bar1", "Baz1"}) + @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) + @ExpectedTypeParameterAnnotations(typeParameterName="Y", + annotations={"Foo2", "Bar2", "Baz2"}) + @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) + class Clazz<@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> { + @ExpectedTypeParameterAnnotations(typeParameterName="W", + annotations={"Foo1", "Bar1", "Baz1"}) + @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) + @ExpectedTypeParameterAnnotations(typeParameterName="Y", + annotations={"Foo2", "Bar2", "Baz2"}) + @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) + <@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> Clazz() { } } - final int expect = 5; // top level class, plus preceding examples + final int expect = 5 * 4; // top level class, plus preceding examples, 4 type variables each } @Target(ElementType.TYPE_PARAMETER) -@interface Foo {} +@interface Foo1 {} + +@Target(ElementType.TYPE_PARAMETER) +@interface Bar1 {} + +@Target(ElementType.TYPE_PARAMETER) +@interface Baz1 {} + +@Target(ElementType.TYPE_PARAMETER) +@interface Foo2 {} @Target(ElementType.TYPE_PARAMETER) -@interface Bar {} +@interface Bar2 {} @Target(ElementType.TYPE_PARAMETER) -@interface Baz {} +@interface Baz2 {} + +@Repeatable(ExpectedTypeParameterAnnotationsCollection.class) +@interface ExpectedTypeParameterAnnotations { + public String typeParameterName(); + public String[] annotations(); +} + +@interface ExpectedTypeParameterAnnotationsCollection { + public ExpectedTypeParameterAnnotations[] value(); +} diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/varargs/6313164/T6313164.java --- a/langtools/test/tools/javac/varargs/6313164/T6313164.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/tools/javac/varargs/6313164/T6313164.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,18 +1,26 @@ /* * @test /nodynamiccopyright/ - * @bug 6313164 + * @bug 6313164 8036953 * @author mcimadamore * @summary javac generates code that fails byte code verification for the varargs feature - * @compile/fail/ref=T6313164.out -XDrawDiagnostics T6313164.java + * @compile/fail/ref=T6313164Source7.out -source 7 -XDrawDiagnostics T6313164.java + * @compile/fail/ref=T6313164Source8AndHigher.out -XDrawDiagnostics T6313164.java */ import p1.*; class T6313164 { - { B b = new B(); - b.foo1(new B(), new B()); //error - A not accesible - b.foo2(new B(), new B()); //ok - A not accessible, but foo2(Object...) applicable - b.foo3(null, null); //error - A (inferred) not accesible - b.foo4(null, null); //error - A (inferred in 15.12.2.8 - no resolution backtrack) not accesible - b.foo4(new B(), new C()); //ok - A (inferred in 15.12.2.7) not accessible, but foo4(Object...) applicable + { + B b = new B(); + b.foo1(new B(), new B()); //error - A not accessible + /* 7 : ok - A not accessible, but foo2(Object...) applicable + * 8+ : error - A not accessible + */ + b.foo2(new B(), new B()); + b.foo3(null, null); //error - A (inferred) not accessible + b.foo4(null, null); //error - A not accesible + /* 7 : ok - A not accessible, but foo4(Object...) applicable + * 8+ : error - A not accessible + */ + b.foo4(new B(), new C()); } } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/varargs/6313164/T6313164.out --- a/langtools/test/tools/javac/varargs/6313164/T6313164.out Wed Jul 05 19:45:37 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -T6313164.java:12:8: compiler.err.cant.apply.symbol: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) -T6313164.java:14:13: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) -T6313164.java:15:13: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) -- compiler.note.unchecked.filename: B.java -- compiler.note.unchecked.recompile -3 errors diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/varargs/6313164/T6313164Source7.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/varargs/6313164/T6313164Source7.out Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,6 @@ +- compiler.warn.source.no.bootclasspath: 1.7 +T6313164.java:14:10: compiler.err.cant.apply.symbol: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +T6313164.java:19:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +T6313164.java:20:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +3 errors +1 warning diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/varargs/6313164/T6313164Source8AndHigher.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/varargs/6313164/T6313164Source8AndHigher.out Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,6 @@ +T6313164.java:14:15: compiler.err.cant.apply.symbol: kindname.method, foo1, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +T6313164.java:18:15: compiler.err.cant.apply.symbol: kindname.method, foo2, p1.A[], p1.B,p1.B, kindname.class, p1.B, (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +T6313164.java:19:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +T6313164.java:20:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +T6313164.java:24:15: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: p1.A, kindname.class, T6313164) +5 errors diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/varargs/6313164/T7175433.java --- a/langtools/test/tools/javac/varargs/6313164/T7175433.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/tools/javac/varargs/6313164/T7175433.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,31 +1,8 @@ /* - * Copyright (c) 2012, 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. - * - * 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. - */ - -/* - * @test + * @test /nodynamiccopyright/ * @bug 7175433 6313164 * @summary Inference cleanup: add helper class to handle inference variables - * + * @compile/fail/ref=T7175433.out -XDrawDiagnostics T7175433.java */ import java.util.List; @@ -34,26 +11,16 @@ private class Foo { } - List m(Object... o) { T7175433.assertTrue(true); return null; } - List m(Foo... o) { T7175433.assertTrue(false); return null; } + List m(Object... o) { return null; } + List m(Foo... o) { return null; } Foo getFoo() { return null; } } public class T7175433 { - static int assertionCount; - - static void assertTrue(boolean b) { - assertionCount++; - if (!b) { - throw new AssertionError(); - } - } - public static void main(String[] args) { Bar b = new Bar(); b.m(b.getFoo()); - assertTrue(assertionCount == 1); } } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/varargs/6313164/T7175433.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/varargs/6313164/T7175433.out Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,2 @@ +T7175433.java:24:12: compiler.err.prob.found.req: (compiler.misc.inaccessible.varargs.type: Bar.Foo, kindname.class, T7175433) +1 error diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/javac/varargs/6313164/p1/B.java --- a/langtools/test/tools/javac/varargs/6313164/p1/B.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/tools/javac/varargs/6313164/p1/B.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, 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 @@ -23,13 +23,12 @@ package p1; +@SuppressWarnings("unchecked") public class B extends A { - public B() {} public void foo1(A... args) { } public void foo2(A... args) { } public void foo2(Object... args) { } public void foo3(X... args) { } public void foo4(X... args) { } public void foo4(Object... args) { } - } diff -r 53fd25d388da -r 89731ae72a76 langtools/test/tools/sjavac/SJavac.java --- a/langtools/test/tools/sjavac/SJavac.java Wed Jul 05 19:45:37 2017 +0200 +++ b/langtools/test/tools/sjavac/SJavac.java Wed Jul 05 19:46:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2014, 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 @@ -34,8 +34,12 @@ class SJavac { public static void main(String... args) throws Exception { - SJavac s = new SJavac(); - s.test(); + try { + SJavac s = new SJavac(); + s.test(); + } finally { + System.out.println("\ntest complete\n"); + } } FileSystem defaultfs = FileSystems.getDefault(); @@ -412,7 +416,7 @@ } void incrementalCompileTestFullyQualifiedRef() throws Exception { - System.out.println("Verify that \"alfa.omega.A a;\" does create a proper dependency."); + System.out.println("\nVerify that \"alfa.omega.A a;\" does create a proper dependency."); System.out.println("----------------------------------------------------------------"); populate(gensrc, @@ -517,8 +521,7 @@ if (rc == 0) throw new Exception("Expected error during compile! Did not fail!"); } - Map collectState(Path dir) throws IOException - { + Map collectState(Path dir) throws IOException { final Map files = new HashMap<>(); Files.walkFileTree(dir, new SimpleFileVisitor() { @Override diff -r 53fd25d388da -r 89731ae72a76 nashorn/.hgtags --- a/nashorn/.hgtags Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/.hgtags Wed Jul 05 19:46:40 2017 +0200 @@ -252,3 +252,4 @@ fed8c83dfba4dce94d2ae1cb82f026634ff2a3e4 jdk9-b16 4a47b7cfecdf2a865811ab08a7ef49c942801d7c jdk9-b17 893c337bc95fef3885baa3e4ffc30d68f62a829f jdk9-b18 +46e36a92e37c06dea50f8c829549d9d0bfed4e3c jdk9-b19 diff -r 53fd25d388da -r 89731ae72a76 nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java --- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Wed Jul 05 19:46:40 2017 +0200 @@ -412,6 +412,10 @@ } } } + break; + + default: + break; } } @@ -450,7 +454,7 @@ if (type.getSort() == Type.OBJECT) { try { - final Class clazz = Class.forName(type.getClassName(), false, myLoader); + final Class clazz = Class.forName(type.getClassName(), false, myLoader); return ScriptObject.class.isAssignableFrom(clazz); } catch (final ClassNotFoundException cnfe) { return false; diff -r 53fd25d388da -r 89731ae72a76 nashorn/make/project.properties --- a/nashorn/make/project.properties Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/make/project.properties Wed Jul 05 19:46:40 2017 +0200 @@ -283,7 +283,7 @@ -XX:+HeapDumpOnOutOfMemoryError # turn on assertions for tests -run.test.jvmargs.main=${run.test.jvmargs.common} -ea -Dnashorn.lazy +run.test.jvmargs.main=${run.test.jvmargs.common} -ea # extra jvmargs that might be useful for debugging # @@ -305,7 +305,7 @@ # -XX:+PrintNMethods # Use best known performance options for octane -run.test.jvmargs.octane.main=${run.test.jvmargs.common} -Dnashorn.lazy -XX:+UnlockDiagnosticVMOptions -XX:+UseNewCode -XX:TypeProfileLevel=222 +run.test.jvmargs.octane.main=${run.test.jvmargs.common} -XX:+UnlockDiagnosticVMOptions -XX:+UseNewCode -XX:TypeProfileLevel=222 # Security manager args - make sure that we run with the nashorn.policy that the build creates run.test.jvmsecurityargs=-Xverify:all -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/codegen/Compiler.java --- a/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Wed Jul 05 19:46:40 2017 +0200 @@ -47,7 +47,9 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import java.util.logging.Level; + import jdk.internal.dynalink.support.NameCodec; import jdk.nashorn.internal.codegen.ClassEmitter.Flag; import jdk.nashorn.internal.codegen.types.Type; @@ -421,7 +423,14 @@ @Override public DebugLogger initLogger(final Context ctxt) { - return ctxt.getLogger(this.getClass()); + return ctxt.getLogger(this.getClass(), new Consumer() { + @Override + public void accept(final DebugLogger newLogger) { + if (!Compiler.this.getScriptEnvironment()._lazy_compilation) { + newLogger.warning("WARNING: Running with lazy compilation switched off. This is not a default setting."); + } + } + }); } ScriptEnvironment getScriptEnvironment() { diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java --- a/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/ir/BinaryNode.java Wed Jul 05 19:46:40 2017 +0200 @@ -45,7 +45,7 @@ public final class BinaryNode extends Expression implements Assignment, Optimistic { // Placeholder for "undecided optimistic ADD type". Unfortunately, we can't decide the type of ADD during optimistic // type calculation as it can have local variables as its operands that will decide its ultimate type. - private static final Type OPTIMISTIC_UNDECIDED_TYPE = Type.typeFor(new Object(){}.getClass()); + private static final Type OPTIMISTIC_UNDECIDED_TYPE = Type.typeFor(new Object(){/*empty*/}.getClass()); /** Left hand side argument. */ private final Expression lhs; diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java --- a/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java Wed Jul 05 19:46:40 2017 +0200 @@ -99,7 +99,7 @@ BYTECODE_GENERATED, /** method has been installed */ BYTECODE_INSTALLED - }; + } /** Source of entity. */ private final Source source; @@ -388,10 +388,11 @@ } /** - * static source name getter + * Static source name getter + * * @param source * @param sourceURL - * @return + * @return source name */ public static String getSourceName(final Source source, final String sourceURL) { return sourceURL != null ? sourceURL : source.getName(); diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/objects/NativeObject.java --- a/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Wed Jul 05 19:46:40 2017 +0200 @@ -75,7 +75,10 @@ */ @ScriptClass("Object") public final class NativeObject { + /** Methodhandle to proto getter */ public static final MethodHandle GET__PROTO__ = findOwnMH("get__proto__", ScriptObject.class, Object.class); + + /** Methodhandle to proto setter */ public static final MethodHandle SET__PROTO__ = findOwnMH("set__proto__", Object.class, Object.class, Object.class); private static final Object TO_STRING = new Object(); diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/parser/Parser.java --- a/nashorn/src/jdk/nashorn/internal/parser/Parser.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/parser/Parser.java Wed Jul 05 19:46:40 2017 +0200 @@ -680,7 +680,7 @@ */ private FunctionNode program(final String scriptName, final boolean allowPropertyFunction) { // Make a pseudo-token for the script holding its start and length. - final long functionToken = Token.toDesc(FUNCTION, getProgramStartPosition(token), source.getLength()); + final long functionToken = Token.toDesc(FUNCTION, Token.descPosition(Token.withDelimiter(token)), source.getLength()); final int functionLine = line; // Set up the script to append elements. @@ -711,20 +711,6 @@ } /** - * Returns the start position of the program based on its first token. Normally returns the position of the token - * itself, except in case of string tokens which report their position past their opening delimiter and thus need - * to have one subtracted from their position. - * @param firstToken the first token of the program - * @return the start position of the program - */ - private static int getProgramStartPosition(final long firstToken) { - final int start = Token.descPosition(firstToken); - switch(Token.descType(firstToken)) { - case STRING: case ESCSTRING: case EXECSTRING: return start - 1; - default: return start; - } - } - /** * Directive value or null if statement is not a directive. * * @param stmt Statement to be checked diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/parser/Token.java --- a/nashorn/src/jdk/nashorn/internal/parser/Token.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/parser/Token.java Wed Jul 05 19:46:40 2017 +0200 @@ -61,6 +61,28 @@ } /** + * Normally returns the token itself, except in case of string tokens + * which report their position past their opening delimiter and thus + * need to have position and length adjusted. + * + * @param token Token descriptor. + * @return same or adjusted token. + */ + public static long withDelimiter(final long token) { + final TokenType tokenType = Token.descType(token); + switch(tokenType) { + case STRING: case ESCSTRING: case EXECSTRING: { + final int start = Token.descPosition(token) - 1; + final int len = Token.descLength(token) + 2; + return toDesc(tokenType, start, len); + } + default: { + return token; + } + } + } + + /** * Extract token length from a token descriptor. * @param token Token descriptor. * @return Length of the token. diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/Context.java --- a/nashorn/src/jdk/nashorn/internal/runtime/Context.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/Context.java Wed Jul 05 19:46:40 2017 +0200 @@ -1236,6 +1236,16 @@ * @return debuglogger associated with that class */ public DebugLogger getLogger(final Class clazz) { + return getLogger(clazz, null); + } + + /** + * Get a logger, given a loggable class + * @param clazz a Loggable class + * @param initHook an init hook - if this is the first time the logger is created in the context, run the init hook + * @return debuglogger associated with that class + */ + public DebugLogger getLogger(final Class clazz, final Consumer initHook) { final String name = getLoggerName(clazz); DebugLogger logger = loggers.get(name); if (logger == null) { @@ -1244,6 +1254,9 @@ } final LoggerInfo info = env._loggers.get(name); logger = new DebugLogger(name, info.getLevel(), info.isQuiet()); + if (initHook != null) { + initHook.accept(logger); + } loggers.put(name, logger); } return logger; diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java --- a/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java Wed Jul 05 19:46:40 2017 +0200 @@ -34,6 +34,8 @@ */ final class FinalScriptFunctionData extends ScriptFunctionData { + private static final long serialVersionUID = -930632846167768864L; + /** * Constructor - used for bind * diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java --- a/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java Wed Jul 05 19:46:40 2017 +0200 @@ -185,6 +185,7 @@ * properties with keys that are valid array indices.

    * * @param properties Collection of initial properties. + * @param className class name * @param fieldCount Number of fields in use. * @param fieldMaximum Number of fields available. * @param spillLength Number of used spill slots. diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java --- a/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java Wed Jul 05 19:46:40 2017 +0200 @@ -54,7 +54,6 @@ import jdk.nashorn.internal.runtime.logging.DebugLogger; import jdk.nashorn.internal.runtime.logging.Loggable; import jdk.nashorn.internal.runtime.logging.Logger; -import jdk.nashorn.internal.runtime.options.Options; import jdk.nashorn.internal.scripts.JS; /** @@ -65,9 +64,6 @@ */ @Logger(name="recompile") public final class RecompilableScriptFunctionData extends ScriptFunctionData implements Loggable { - /** Is lazy compilation enabled? TODO: this should be the default */ - public static final boolean LAZY_COMPILATION = Options.getBooleanProperty("nashorn.lazy"); - /** Prefix used for all recompiled script classes */ public static final String RECOMPILATION_PREFIX = "Recompilation$"; @@ -240,6 +236,12 @@ return "function " + (name == null ? "" : name) + "() { [native code] }"; } + /** + * Setter for code and source + * + * @param code map of code, class name to class + * @param source source + */ public void setCodeAndSource(final Map> code, final Source source) { this.source = source; if (methodLocator != null) { @@ -292,7 +294,7 @@ private static long tokenFor(final FunctionNode fn) { final int position = Token.descPosition(fn.getFirstToken()); - final long lastToken = fn.getLastToken(); + final long lastToken = Token.withDelimiter(fn.getLastToken()); // EOL uses length field to store the line number final int length = Token.descPosition(lastToken) - position + (Token.descType(lastToken) == TokenType.EOL ? 0 : Token.descLength(lastToken)); diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java --- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Wed Jul 05 19:46:40 2017 +0200 @@ -2267,7 +2267,7 @@ if (mh != null) { assert func != null; - if (scopeAccess && func != null && func.isStrict()) { + if (scopeAccess && func.isStrict()) { mh = bindTo(mh, UNDEFINED); } return new GuardedInvocation( diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/Source.java --- a/nashorn/src/jdk/nashorn/internal/runtime/Source.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/Source.java Wed Jul 05 19:46:40 2017 +0200 @@ -99,12 +99,13 @@ // Force any access errors data.checkPermissionAndClose(); return existingSource; - } else { - // All sources in cache must be fully loaded - data.load(); - CACHE.put(newSource, newSource); - return newSource; } + + // All sources in cache must be fully loaded + data.load(); + CACHE.put(newSource, newSource); + + return newSource; } catch (final RuntimeException e) { final Throwable cause = e.getCause(); if (cause instanceof IOException) { @@ -291,7 +292,9 @@ } protected void checkPermissionAndClose() throws IOException { - try (InputStream in = url.openStream()) {} + try (InputStream in = url.openStream()) { + // empty + } debug("permission checked for ", url); } @@ -366,20 +369,24 @@ } /** - * Returns an instance + * Returns a Source instance * * @param name source name * @param content contents as char array + * + * @return source instance */ public static Source sourceFor(final String name, final char[] content) { return new Source(name, baseName(name), new RawData(content)); } /** - * Returns an instance + * Returns a Source instance * * @param name source name * @param content contents as string + * + * @return source instance */ public static Source sourceFor(final String name, final String content) { return new Source(name, baseName(name), new RawData(content)); @@ -391,6 +398,8 @@ * @param name source name * @param url url from which source can be loaded * + * @return source instance + * * @throws IOException if source cannot be loaded */ public static Source sourceFor(final String name, final URL url) throws IOException { @@ -404,6 +413,8 @@ * @param url url from which source can be loaded * @param cs Charset used to convert bytes to chars * + * @return source instance + * * @throws IOException if source cannot be loaded */ public static Source sourceFor(final String name, final URL url, final Charset cs) throws IOException { @@ -416,6 +427,8 @@ * @param name source name * @param file file from which source can be loaded * + * @return source instance + * * @throws IOException if source cannot be loaded */ public static Source sourceFor(final String name, final File file) throws IOException { @@ -429,6 +442,8 @@ * @param file file from which source can be loaded * @param cs Charset used to convert bytes to chars * + * @return source instance + * * @throws IOException if source cannot be loaded */ public static Source sourceFor(final String name, final File file, final Charset cs) throws IOException { @@ -441,6 +456,9 @@ * * @param name source name * @param reader reader from which source can be loaded + * + * @return source instance + * * @throws IOException if source cannot be loaded */ public static Source sourceFor(final String name, final Reader reader) throws IOException { @@ -542,9 +560,9 @@ * @return Index of first character of line. */ private int findBOLN(final int position) { - final char[] data = data(); + final char[] d = data(); for (int i = position - 1; i > 0; i--) { - final char ch = data[i]; + final char ch = d[i]; if (ch == '\n' || ch == '\r') { return i + 1; @@ -560,10 +578,10 @@ * @return Index of last character of line. */ private int findEOLN(final int position) { - final char[] data = data(); - final int length = data.length; + final char[] d = data(); + final int length = d.length; for (int i = position; i < length; i++) { - final char ch = data[i]; + final char ch = d[i]; if (ch == '\n' || ch == '\r') { return i - 1; @@ -583,12 +601,12 @@ * @return Line number. */ public int getLine(final int position) { - final char[] data = data(); + final char[] d = data(); // Line count starts at 1. int line = 1; for (int i = 0; i < position; i++) { - final char ch = data[i]; + final char ch = d[i]; // Works for both \n and \r\n. if (ch == '\n') { line++; diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java --- a/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayFilter.java Wed Jul 05 19:46:40 2017 +0200 @@ -141,21 +141,6 @@ return this; } - private static void printTrace(final Throwable t, final String msg) { - final java.io.StringWriter sw = new java.io.StringWriter(); - final java.io.PrintWriter pw = new java.io.PrintWriter(sw, false); - pw.println(msg); - final StackTraceElement[] trace = t.getStackTrace(); - for(final StackTraceElement e: trace) { - pw.println(" at " + e); - if(e.getClassName().startsWith("jdk.nashorn.")) { - break; - } - } - pw.flush(); - System.out.println(sw.toString()); - } - @Override public Type getOptimisticType() { return underlying.getOptimisticType(); diff -r 53fd25d388da -r 89731ae72a76 nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java --- a/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/src/jdk/nashorn/internal/runtime/logging/DebugLogger.java Wed Jul 05 19:46:40 2017 +0200 @@ -540,7 +540,7 @@ /** * Shorthand for outputting a log string as log level - * {@link java.util.logging.Level#FINE} on this logger + * {@link java.util.logging.Level#SEVERE} on this logger * @param objs object array to log - use this to perform lazy concatenation to avoid unconditional toString overhead */ public void severe(final Object... objs) { diff -r 53fd25d388da -r 89731ae72a76 nashorn/test/script/basic/JDK-8047035.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8047035.js Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +/** + * JDK-8047035: (function() "hello")() crashes in Lexer with jdk9 + * + * @test + * @run + */ + +// should not print ")" at the end +print(function() "hello"); +print(function() ''); + +// The following should not crash inside lexer +print((function() '')()); +print((function() "hello")()); diff -r 53fd25d388da -r 89731ae72a76 nashorn/test/script/basic/JDK-8047035.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8047035.js.EXPECTED Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,4 @@ +function() "hello" +function() '' + +hello diff -r 53fd25d388da -r 89731ae72a76 nashorn/test/script/basic/JDK-8047057.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8047057.js Wed Jul 05 19:46:40 2017 +0200 @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2014, 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. + * + * 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. + */ + +/** + * JDK-8047057: Add a regression test for the passing test cases from JDK-8042304 + * + * @test + * @run + */ + +// commented out makeFuncAndCall calls are still result in crash +// Tests commented with //** fail only within test framework. +// Pass fine with standalone "jjs" mode. + +function makeFuncAndCall(code) { + Function(code)(); +} + +function makeFuncExpectError(code, ErrorType) { + try { + makeFuncAndCall(code); + } catch (e) { + if (! (e instanceof ErrorType)) { + fail(ErrorType.name + " expected, got " + e); + } + } +} + +// makeFuncAndCall("switch(0) { default: {break;} return }"); +// makeFuncAndCall("L: { { break L; } return; }"); +makeFuncAndCall("L: { while(0) break L; return; }"); +makeFuncExpectError("L: {while(0) break L; return [](); }", TypeError); +// makeFuncAndCall("do with({}) break ; while(0);"); +makeFuncAndCall("while(0) with({}) continue ;"); +//** makeFuncAndCall("eval([]);"); +//** makeFuncAndCall("try{} finally{[]}"); +makeFuncAndCall("try { } catch(x if 1) { try { } catch(x2) { } }"); +makeFuncAndCall("try { } catch(x if 1) { try { return; } catch(x2) { { } } }"); +makeFuncAndCall("Error() * (false)[-0]--"); +makeFuncAndCall("try { var x = 1, x = null; } finally { }"); +makeFuncAndCall("try { var x = {}, x = []; } catch(x3) { }"); +//** makeFuncAndCall("[delete this]"); +// makeFuncAndCall("if(eval('', eval('', function() {}))) { }"); +// makeFuncAndCall("if(eval('', eval('', function() {}))) { }"); +// makeFuncAndCall("eval(\"[,,];\", [11,12,13,14].some)"); +// makeFuncAndCall("eval(\"1.2e3\", ({})[ /x/ ])"); +// makeFuncAndCall("eval(\"x4\", x3);"); +makeFuncAndCall("with({5.0000000000000000000000: String()}){(false); }"); +makeFuncAndCall("try { var x = undefined, x = 5.0000000000000000000000; } catch(x) { x = undefined; }"); +makeFuncAndCall("(function (x){ x %= this}(false))"); +// makeFuncAndCall("eval.apply.apply(function(){ eval('') })"); +makeFuncAndCall("(false % !this) && 0"); +makeFuncAndCall("with({8: 'fafafa'.replace()}){ }"); +makeFuncAndCall("(function (x) '' )(true)"); +makeFuncExpectError("new eval(function(){})", TypeError); diff -r 53fd25d388da -r 89731ae72a76 nashorn/test/src/UnnamedPackageTestCallback.java --- a/nashorn/test/src/UnnamedPackageTestCallback.java Wed Jul 05 19:45:37 2017 +0200 +++ b/nashorn/test/src/UnnamedPackageTestCallback.java Wed Jul 05 19:46:40 2017 +0200 @@ -23,6 +23,14 @@ * questions. */ +/** + * Interface for callbacks used by the test suite. + */ public interface UnnamedPackageTestCallback { + /** + * Call function + * @param s string argument + * @return string + */ String call(String s); }