This commit is contained in:
Lana Steuck 2012-06-17 21:29:12 -07:00
commit 89add82f07
705 changed files with 22092 additions and 25447 deletions

View File

@ -163,3 +163,5 @@ b3a91113026c99b0da010d41055719ab0d8938f0 jdk8-b37
35a5397278779a2f8f3013f81586dc8f30cb149d jdk8-b39 35a5397278779a2f8f3013f81586dc8f30cb149d jdk8-b39
6e4e654931b976304bf6e7b4d0d6db8f75bac5d9 jdk8-b40 6e4e654931b976304bf6e7b4d0d6db8f75bac5d9 jdk8-b40
c029c972396cea042a0dc67c0f7ccf2fe68007d4 jdk8-b41 c029c972396cea042a0dc67c0f7ccf2fe68007d4 jdk8-b41
5c5a64ec0839df5affe9394b99ff338c363acbca jdk8-b42
69d8a827cdf9236be9694a46d75c710d71dac7d7 jdk8-b43

View File

@ -163,3 +163,5 @@ d939bd0ab13c16647ffa38cc4b64fb31b7d44e10 jdk8-b38
8927dd68aee3fa54a1a698e2980e1b2f6c7c12c1 jdk8-b39 8927dd68aee3fa54a1a698e2980e1b2f6c7c12c1 jdk8-b39
a2b2d435f1d275fa8010774c653197c64e326d3a jdk8-b40 a2b2d435f1d275fa8010774c653197c64e326d3a jdk8-b40
1a8c7c530f8a9b7f5bdb9b0693b2f5435ca5205e jdk8-b41 1a8c7c530f8a9b7f5bdb9b0693b2f5435ca5205e jdk8-b41
1ce5dc16416611c58b7480ca67a2eee5153498a6 jdk8-b42
661c9aae602bbd9766d12590800c90f1edd1d8dd jdk8-b43

View File

@ -108,6 +108,7 @@
<li><a href="#testing">Testing the Build</a> </li> <li><a href="#testing">Testing the Build</a> </li>
<li><a href="#variables">Environment/Make Variables</a></li> <li><a href="#variables">Environment/Make Variables</a></li>
<li><a href="#troubleshooting">Troubleshooting</a></li> <li><a href="#troubleshooting">Troubleshooting</a></li>
<li><a href="#newbuild">The New Build</a></li>
</ul> </ul>
</blockquote> </blockquote>
@ -2120,6 +2121,16 @@
</li> </li>
</ul> </ul>
</blockquote> </blockquote>
<!-- ------------------------------------------------------ -->
<hr>
<h2><a name="newbuild">The New Build</a></h2>
<blockquote>
The <a href="http://openjdk.java.net/projects/build-infra/">
Build Infrastructure project</a> is working on a new
build. For information on how to try it out, please see the
<a href="http://openjdk.java.net/projects/build-infra/guide.html">
Build Infra User Guide</a>
</blockquote>
<hr> <hr>
</body> </body>
</html> </html>

View File

@ -22,5 +22,5 @@
# questions. # questions.
# #
autoconf configure.ac > configure autoconf -W all configure.ac > configure
rm -rf config.status config.log autom4te.cache rm -rf config.status config.log autom4te.cache

View File

@ -34,7 +34,7 @@ AC_DEFUN([BDEPS_SCAN_FOR_BUILDDEPS],
. $builddepsfile . $builddepsfile
AC_MSG_RESULT([loaded!]) AC_MSG_RESULT([loaded!])
else else
AC_ERROR([The given builddeps conf file $with_builddeps_conf could not be loaded!]) AC_MSG_ERROR([The given builddeps conf file $with_builddeps_conf could not be loaded!])
fi fi
else else
AC_MSG_CHECKING([for builddeps.conf files in sources...]) AC_MSG_CHECKING([for builddeps.conf files in sources...])
@ -47,7 +47,7 @@ AC_DEFUN([BDEPS_SCAN_FOR_BUILDDEPS],
. $builddepsfile . $builddepsfile
AC_MSG_RESULT([found at least one!]) AC_MSG_RESULT([found at least one!])
else else
AC_ERROR([Could not find any builddeps.conf at all!]) AC_MSG_ERROR([Could not find any builddeps.conf at all!])
fi fi
fi fi
# Create build and host names that use _ instead of "-" and ".". # Create build and host names that use _ instead of "-" and ".".
@ -117,7 +117,7 @@ AC_DEFUN([BDEPS_FTPGET],
) | ftp -in $FTPSERVER ) | ftp -in $FTPSERVER
fi fi
if test "x$VALID_TOOL" != xyes; then if test "x$VALID_TOOL" != xyes; then
AC_ERROR([I do not know how to use the tool: $BDEPS_FTP]) AC_MSG_ERROR([I do not know how to use the tool: $BDEPS_FTP])
fi fi
]) ])
@ -159,7 +159,7 @@ AC_DEFUN([BDEPS_CHECK_MODULE],
thecflags=${builddep_$2_CFLAGS} thecflags=${builddep_$2_CFLAGS}
thelibs=${builddep_$2_LIBS} thelibs=${builddep_$2_LIBS}
if test "x$depdir" = x; then if test "x$depdir" = x; then
AC_ERROR([Could not download build dependency $2]) AC_MSG_ERROR([Could not download build dependency $2])
fi fi
$1=$depdir $1=$depdir
if test "x$theroot" != x; then if test "x$theroot" != x; then
@ -198,17 +198,17 @@ AC_DEFUN([BDEPS_FETCH],
mkdir -p $installdir mkdir -p $installdir
fi fi
if test ! -d $installdir; then if test ! -d $installdir; then
AC_ERROR([Could not create directory $installdir]) AC_MSG_ERROR([Could not create directory $installdir])
fi fi
tmpfile=`mktemp $installdir/$1.XXXXXXXXX` tmpfile=`mktemp $installdir/$1.XXXXXXXXX`
touch $tmpfile touch $tmpfile
if test ! -f $tmpfile; then if test ! -f $tmpfile; then
AC_ERROR([Could not create files in directory $installdir]) AC_MSG_ERROR([Could not create files in directory $installdir])
fi fi
BDEPS_FTPGET([$3/$2] , [$tmpfile]) BDEPS_FTPGET([$3/$2] , [$tmpfile])
mv $tmpfile $installdir/$filename mv $tmpfile $installdir/$filename
if test ! -s $installdir/$filename; then if test ! -s $installdir/$filename; then
AC_ERROR([Could not download $3/$2]) AC_MSG_ERROR([Could not download $3/$2])
fi fi
case "$extension" in case "$extension" in
zip) echo "Unzipping $installdir/$filename..." zip) echo "Unzipping $installdir/$filename..."
@ -220,7 +220,7 @@ AC_DEFUN([BDEPS_FETCH],
tgz) echo "Untaring $installdir/$filename..." tgz) echo "Untaring $installdir/$filename..."
(cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked) (cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked)
;; ;;
*) AC_ERROR([Cannot handle build depency archive with extension $extension]) *) AC_MSG_ERROR([Cannot handle build depency archive with extension $extension])
;; ;;
esac esac
fi fi
@ -228,4 +228,3 @@ AC_DEFUN([BDEPS_FETCH],
$5=$installdir $5=$installdir
fi fi
]) ])

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,18 +23,20 @@
# questions. # questions.
# #
function prepare_help_system {
AC_CHECK_PROGS(PKGHANDLER, apt-get yum port pkgutil pkgadd)
}
function help_on_build_dependency { function help_on_build_dependency {
# Print a helpful message on how to acquire the necessary build dependency. # Print a helpful message on how to acquire the necessary build dependency.
# $1 is the help tag: freetyp2, cups, pulse, alsa etc # $1 is the help tag: freetyp2, cups, pulse, alsa etc
MISSING_DEPENDENCY=$1 MISSING_DEPENDENCY=$1
PKGHANDLER_COMMAND= PKGHANDLER_COMMAND=
AC_CHECK_PROGS(PKGHANDLER, apt-get yum port pkgutil pkgadd)
case $PKGHANDLER in case $PKGHANDLER in
apt-get) apt-get)
apt_help $MISSING_DEPENDENCY ;; apt_help $MISSING_DEPENDENCY ;;
yum) yum)
yum_help $MISSING_DEPENDENCY ;; yum_help $MISSING_DEPENDENCY ;;
port) port)
port_help $MISSING_DEPENDENCY ;; port_help $MISSING_DEPENDENCY ;;
@ -47,7 +49,7 @@ function help_on_build_dependency {
esac esac
if test "x$PKGHANDLER_COMMAND" != x; then if test "x$PKGHANDLER_COMMAND" != x; then
HELP_MSG="Try running '$PKGHANDLER_COMMAND'." HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'."
fi fi
} }

View File

@ -48,7 +48,7 @@ AC_DEFUN([CHECK_FIND_DELETE],
AC_DEFUN([CHECK_NONEMPTY], AC_DEFUN([CHECK_NONEMPTY],
[ [
# Test that variable $1 is not empty. # Test that variable $1 is not empty.
if test "" = "[$]$1"; then AC_ERROR(Could not find translit($1,A-Z,a-z) !); fi if test "" = "[$]$1"; then AC_MSG_ERROR(Could not find translit($1,A-Z,a-z) !); fi
]) ])
AC_DEFUN([ADD_JVM_ARG_IF_OK], AC_DEFUN([ADD_JVM_ARG_IF_OK],
@ -97,7 +97,7 @@ AC_DEFUN([SPACESAFE],
$1=`$CYGPATH -s -m -a "[$]$1"` $1=`$CYGPATH -s -m -a "[$]$1"`
$1=`$CYGPATH -u "[$]$1"` $1=`$CYGPATH -u "[$]$1"`
else else
AC_ERROR([You cannot have spaces in $2! "[$]$1"]) AC_MSG_ERROR([You cannot have spaces in $2! "[$]$1"])
fi fi
fi fi
]) ])
@ -215,7 +215,7 @@ AC_DEFUN([SETUP_CCACHE_USAGE],
AC_MSG_CHECKING([if C-compiler supports ccache precompiled headers]) AC_MSG_CHECKING([if C-compiler supports ccache precompiled headers])
PUSHED_FLAGS="$CXXFLAGS" PUSHED_FLAGS="$CXXFLAGS"
CXXFLAGS="-fpch-preprocess $CXXFLAGS" CXXFLAGS="-fpch-preprocess $CXXFLAGS"
AC_TRY_COMPILE([], [], [CC_KNOWS_CCACHE_TRICK=yes], [CC_KNOWS_CCACHE_TRICK=no]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [CC_KNOWS_CCACHE_TRICK=yes], [CC_KNOWS_CCACHE_TRICK=no])
CXXFLAGS="$PUSHED_FLAGS" CXXFLAGS="$PUSHED_FLAGS"
if test "x$CC_KNOWS_CCACHE_TRICK" = xyes; then if test "x$CC_KNOWS_CCACHE_TRICK" = xyes; then
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -257,7 +257,7 @@ AC_DEFUN([EXTRACT_HOST_AND_BUILD_AND_LEGACY_VARS],
# The same values are setup for BUILD_... # The same values are setup for BUILD_...
# #
# And the legacy variables, for controlling the old makefiles. # And the legacy variables, for controlling the old makefiles.
# LEGACY_HOST_CPU1=i586,amd64,sparc,sparcv9,arm,arm64... # LEGACY_HOST_CPU1=i586,amd64/x86_64,sparc,sparcv9,arm,arm64...
# LEGACY_HOST_CPU2=i386,amd64,sparc,sparcv9,arm,arm64... # LEGACY_HOST_CPU2=i386,amd64,sparc,sparcv9,arm,arm64...
# LEGACY_HOST_CPU3=sparcv9,amd64 (but only on solaris) # LEGACY_HOST_CPU3=sparcv9,amd64 (but only on solaris)
# LEGACY_HOST_OS_API=solaris,windows # LEGACY_HOST_OS_API=solaris,windows
@ -277,6 +277,13 @@ AC_DEFUN([EXTRACT_HOST_AND_BUILD_AND_LEGACY_VARS],
LEGACY_HOST_CPU3="" LEGACY_HOST_CPU3=""
LEGACY_BUILD_CPU3="" LEGACY_BUILD_CPU3=""
fi fi
# On MacOSX and MacOSX only, we have a different name for the x64 CPU in ARCH (LEGACY_HOST_CPU1) ...
if test "x$HOST_OS" = xmacosx && test "x$HOST_CPU" = xx64; then
LEGACY_HOST_CPU1="x86_64"
fi
SET_RELEASE_FILE_OS_VALUES()
]) ])
AC_DEFUN([EXTRACT_VARS_FROM_OS_TO], AC_DEFUN([EXTRACT_VARS_FROM_OS_TO],
@ -427,7 +434,7 @@ AC_DEFUN([EXTRACT_VARS_FROM_CPU],
VAR_LEGACY_CPU=s390x VAR_LEGACY_CPU=s390x
;; ;;
*) *)
AC_ERROR([unsupported cpu $1]) AC_MSG_ERROR([unsupported cpu $1])
;; ;;
esac esac
@ -515,3 +522,26 @@ AC_DEFUN([WIN_FIX_PATH],
$1="$tmp" $1="$tmp"
fi fi
]) ])
AC_DEFUN([SET_RELEASE_FILE_OS_VALUES],
[
if test "x$HOST_OS" = "xsolaris"; then
REQUIRED_OS_NAME=SunOS
REQUIRED_OS_VERSION=5.10
fi
if test "x$HOST_OS" = "xlinux"; then
REQUIRED_OS_NAME=Linux
REQUIRED_OS_VERSION=2.6
fi
if test "x$HOST_OS" = "xwindows"; then
REQUIRED_OS_NAME=Windows
REQUIRED_OS_VERSION=5.1
fi
if test "x$HOST_OS" = "xmacosx"; then
REQUIRED_OS_NAME=Darwin
REQUIRED_OS_VERSION=11.2
fi
AC_SUBST(REQUIRED_OS_NAME)
AC_SUBST(REQUIRED_OS_VERSION)
])

View File

@ -64,6 +64,9 @@ endif
# A self-referential reference to this file. # A self-referential reference to this file.
SPEC:=@SPEC@ SPEC:=@SPEC@
# The "human readable" name of this configuration
CONF_NAME:=@CONF_NAME@
# The built jdk will run in this host system. # The built jdk will run in this host system.
HOST:=@HOST@ HOST:=@HOST@
HOST_OS:=@HOST_OS@ HOST_OS:=@HOST_OS@
@ -87,6 +90,10 @@ BUILD_CPU_ARCH:=@BUILD_CPU_ARCH@
BUILD_CPU_BITS:=@BUILD_CPU_BITS@ BUILD_CPU_BITS:=@BUILD_CPU_BITS@
BUILD_CPU_ENDIAN:=@BUILD_CPU_ENDIAN@ BUILD_CPU_ENDIAN:=@BUILD_CPU_ENDIAN@
# Legacy OS values for use in release file.
REQUIRED_OS_NAME:=@REQUIRED_OS_NAME@
REQUIRED_OS_VERSION:=@REQUIRED_OS_VERSION@
# Old name for HOST_OS (aix,bsd,hpux,linux,macosx,solaris,windows etc) # Old name for HOST_OS (aix,bsd,hpux,linux,macosx,solaris,windows etc)
PLATFORM:=@HOST_OS@ PLATFORM:=@HOST_OS@
# Old name for HOST_CPU, uses i586 and amd64, instead of ia32 and x64. # Old name for HOST_CPU, uses i586 and amd64, instead of ia32 and x64.
@ -105,6 +112,7 @@ ENDIAN:=@HOST_CPU_ENDIAN@
@SET_OPENJDK@ @SET_OPENJDK@
JIGSAW:=@JIGSAW@ JIGSAW:=@JIGSAW@
LIBM:=-lm LIBM:=-lm
LIBDL:=@LIBDL@
# colon or semicolon # colon or semicolon
PATH_SEP:=@PATH_SEP@ PATH_SEP:=@PATH_SEP@
@ -287,8 +295,8 @@ CUPS_CFLAGS:=@CUPS_CFLAGS@
PACKAGE_PATH=@PACKAGE_PATH@ PACKAGE_PATH=@PACKAGE_PATH@
CACERTS_FILE:=$(SRC_ROOT)/jdk/src/share/lib/security/cacerts # Source file for cacerts
#CACERTS_INT=$(CLOSED_SHARE_SRC)/lib/security/cacerts.internal CACERTS_FILE=@CACERTS_FILE@
#MOZILLA_HEADERS_PATH:= #MOZILLA_HEADERS_PATH:=
@ -308,13 +316,18 @@ LD_OUT_OPTION:=@LD_OUT_OPTION@
AR_OUT_OPTION:=@AR_OUT_OPTION@ AR_OUT_OPTION:=@AR_OUT_OPTION@
# Flags used for overriding the default opt setting for a C/C++ source file. # Flags used for overriding the default opt setting for a C/C++ source file.
C_O_FLAG_HIGHEST:=@C_O_FLAG_HIGHEST@
C_O_FLAG_HI:=@C_O_FLAG_HI@ C_O_FLAG_HI:=@C_O_FLAG_HI@
C_O_FLAG_NORM:=@C_O_FLAG_NORM@ C_O_FLAG_NORM:=@C_O_FLAG_NORM@
C_O_FLAG_NONE:=@C_O_FLAG_NONE@ C_O_FLAG_NONE:=@C_O_FLAG_NONE@
CXX_O_FLAG_HIGHEST:=@CXX_O_FLAG_HIGHEST@
CXX_O_FLAG_HI:=@CXX_O_FLAG_HI@ CXX_O_FLAG_HI:=@CXX_O_FLAG_HI@
CXX_O_FLAG_NORM:=@CXX_O_FLAG_NORM@ CXX_O_FLAG_NORM:=@CXX_O_FLAG_NORM@
CXX_O_FLAG_NONE:=@CXX_O_FLAG_NONE@ CXX_O_FLAG_NONE:=@CXX_O_FLAG_NONE@
C_FLAG_DEPS:=@C_FLAG_DEPS@
CXX_FLAG_DEPS:=@CXX_FLAG_DEPS@
# Tools that potentially need to be cross compilation aware. # Tools that potentially need to be cross compilation aware.
CC:=@UNCYGDRIVE@ @CCACHE@ @CC@ CC:=@UNCYGDRIVE@ @CCACHE@ @CC@
@ -386,6 +399,11 @@ SHARED_LIBRARY_FLAGS:=@SHARED_LIBRARY_FLAGS@
# (Note absence of := assignment, because we do not want to evaluate the macro body here) # (Note absence of := assignment, because we do not want to evaluate the macro body here)
SET_SHARED_LIBRARY_MAPFILE=@SET_SHARED_LIBRARY_MAPFILE@ SET_SHARED_LIBRARY_MAPFILE=@SET_SHARED_LIBRARY_MAPFILE@
# Options for C/CXX compiler to be used if linking is performed
# using reorder file
C_FLAG_REORDER:=@C_FLAG_REORDER@
CXX_FLAG_REORDER:=@CXX_FLAG_REORDER@
# Options to linker to specify the library name. # Options to linker to specify the library name.
# (Note absence of := assignment, because we do not want to evaluate the macro body here) # (Note absence of := assignment, because we do not want to evaluate the macro body here)
SET_SHARED_LIBRARY_NAME=@SET_SHARED_LIBRARY_NAME@ SET_SHARED_LIBRARY_NAME=@SET_SHARED_LIBRARY_NAME@
@ -406,6 +424,9 @@ STATIC_LIBRARY_SUFFIX:=@STATIC_LIBRARY_SUFFIX@
EXE_SUFFIX:=@EXE_SUFFIX@ EXE_SUFFIX:=@EXE_SUFFIX@
OBJ_SUFFIX:=@OBJ_SUFFIX@ OBJ_SUFFIX:=@OBJ_SUFFIX@
POST_STRIP_CMD:=@POST_STRIP_CMD@
POST_MCS_CMD:=@POST_MCS_CMD@
JAVA_FLAGS:=@BOOT_JDK_JVMARGS@ JAVA_FLAGS:=@BOOT_JDK_JVMARGS@
JAVA=@UNCYGDRIVE@ @JAVA@ $(JAVA_FLAGS) JAVA=@UNCYGDRIVE@ @JAVA@ $(JAVA_FLAGS)
@ -419,6 +440,8 @@ JAR:=@UNCYGDRIVE@ @JAR@
RMIC:=@UNCYGDRIVE@ @RMIC@ RMIC:=@UNCYGDRIVE@ @RMIC@
NATIVE2ASCII:=@UNCYGDRIVE@ @NATIVE2ASCII@
BOOT_JAR_CMD:=@UNCYGDRIVE@ @JAR@ BOOT_JAR_CMD:=@UNCYGDRIVE@ @JAR@
BOOT_JAR_JFLAGS:= BOOT_JAR_JFLAGS:=
@ -483,6 +506,7 @@ OTOOL:=@OTOOL@
READELF:=@READELF@ READELF:=@READELF@
EXPR:=@EXPR@ EXPR:=@EXPR@
FILE:=@FILE@ FILE:=@FILE@
HG:=@HG@
UNCYGDRIVE:=@UNCYGDRIVE@ UNCYGDRIVE:=@UNCYGDRIVE@
@ -584,5 +608,13 @@ INSTALL_SYSCONFDIR=@sysconfdir@
# Misc # Misc
# #
# Name of Service Agent library
SALIB_NAME=@SALIB_NAME@
# Control wether Hotspot runs Queens test after building # Control wether Hotspot runs Queens test after building
TEST_IN_BUILD=@TEST_IN_BUILD@ TEST_IN_BUILD=@TEST_IN_BUILD@
OS_VERSION_MAJOR:=@OS_VERSION_MAJOR@
OS_VERSION_MINOR:=@OS_VERSION_MINOR@
OS_VERSION_MICRO:=@OS_VERSION_MICRO@

View File

@ -45,7 +45,7 @@
# #
if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then
echo "./common/bin/compareimages.sh old_jdk_image new_jdk_image" echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image"
echo "" echo ""
echo "Compare the directory structure." echo "Compare the directory structure."
echo "Compare the filenames in the directories." echo "Compare the filenames in the directories."
@ -55,11 +55,11 @@ if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then
echo "Compare the native executables" echo "Compare the native executables"
echo "Compare the remaining files" echo "Compare the remaining files"
echo "" echo ""
echo "./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other]" echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other]"
echo "" echo ""
echo "Compare only the selected subset of the images." echo "Compare only the selected subset of the images."
echo "" echo ""
echo "./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar" echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar"
echo "" echo ""
echo "Compare only the CodePointIM.jar file" echo "Compare only the CodePointIM.jar file"
echo "Can be used to compare zips, libraries and executables." echo "Can be used to compare zips, libraries and executables."
@ -114,10 +114,10 @@ else
CMP_OTHER=true CMP_OTHER=true
fi fi
DIFFJARZIP=`dirname $0`/diffjarzip.sh DIFFJARZIP="/bin/bash `dirname $0`/diffjarzip.sh"
DIFFLIB=`dirname $0`/difflib.sh DIFFLIB="/bin/bash `dirname $0`/difflib.sh"
DIFFEXEC=`dirname $0`/diffexec.sh DIFFEXEC="/bin/bash `dirname $0`/diffexec.sh"
export COMPARE_ROOT=/tmp/cimages export COMPARE_ROOT=/tmp/cimages.$USER
mkdir -p $COMPARE_ROOT mkdir -p $COMPARE_ROOT
# Load the correct exception list. # Load the correct exception list.
@ -167,16 +167,64 @@ else
ONLY_OLD=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '<') ONLY_OLD=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '<')
if [ "$ONLY_OLD" ]; then if [ "$ONLY_OLD" ]; then
echo Only in $OLD echo Only in $OLD
echo $ONLY_OLD | sed 's|< ./|\t|g' | sed 's/ /\n/g' echo "$ONLY_OLD" | sed 's|< ./| |g'
fi fi
# Differences in directories found. # Differences in directories found.
ONLY_NEW=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '>') ONLY_NEW=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '>')
if [ "$ONLY_NEW" ]; then if [ "$ONLY_NEW" ]; then
echo Only in $NEW echo Only in $NEW
echo $ONLY_NEW | sed 's|> ./|\t|g' | sed 's/ /\n/g' echo "$ONLY_NEW" | sed 's|> ./| |g'
fi fi
fi fi
if [ "`uname`" == "SunOS" ]; then
PERM="gstat -c%a"
elif [ $OSTYPE == "cygwin" ]; then
PERM=
elif [ "`uname`" == "Darwin" ]; then
PERM="stat -f%p"
elif [ "`uname`" == "Linux" ]; then
PERM="stat -c%A"
else
PERM="stat -c%a"
fi
if [ "${PERM}" ]
then
echo -n Permissions...
found=""
for f in `cd $OLD && find . -type f`
do
if [ ! -f ${OLD}/$f ]; then continue; fi
if [ ! -f ${NEW}/$f ]; then continue; fi
OP=`${PERM} ${OLD}/$f`
NP=`${PERM} ${NEW}/$f`
if [ "$OP" != "$NP" ]
then
if [ -z "$found" ]; then echo ; found="yes"; fi
printf "\told: ${OP} new: ${NP}\t$f\n"
fi
done
if [ -z "$found" ]; then echo ; found="yes"; fi
fi
GENERAL_FILES=$(cd $OLD && find . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \
! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \
! -name "ct.sym" \
| grep -v "./bin/" | sort | $FILTER)
echo General files...
for f in $GENERAL_FILES
do
if [ -e $NEW/$f ]; then
DIFF_OUT=$(diff $OLD/$f $NEW/$f 2>&1)
if [ -n "$DIFF_OUT" ]; then
echo $f
echo "$DIFF_OUT"
fi
fi
done
if [ "x$CMP_ZIPS" == "xtrue" ]; then if [ "x$CMP_ZIPS" == "xtrue" ]; then
ZIPS=$(cd $OLD && find . -type f -name "*.zip" | sort | $FILTER) ZIPS=$(cd $OLD && find . -type f -name "*.zip" | sort | $FILTER)
@ -194,7 +242,7 @@ if [ "x$CMP_ZIPS" == "xtrue" ]; then
fi fi
if [ "x$CMP_JARS" == "xtrue" ]; then if [ "x$CMP_JARS" == "xtrue" ]; then
JARS=$(cd $OLD && find . -type f -name "*.jar" | sort | $FILTER) JARS=$(cd $OLD && find . -type f -name "*.jar" -o -name "ct.sym" | sort | $FILTER)
if [ -n "$JARS" ]; then if [ -n "$JARS" ]; then
echo Jar files... echo Jar files...

View File

@ -50,14 +50,21 @@ fi
if [ "`uname`" == "SunOS" ]; then if [ "`uname`" == "SunOS" ]; then
NM=gnm NM=gnm
STAT=gstat STAT="gstat -c%s"
LDD=ldd
elif [ $OSTYPE == "cygwin" ]; then elif [ $OSTYPE == "cygwin" ]; then
NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe" NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe"
NM_ARGS=/exports NM_ARGS=/exports
STAT=stat STAT="stat -c%s"
LDD=
elif [ "`uname`" == "Darwin" ]; then
NM=nm
STAT="stat -f%z"
LDD="otool -L"
else else
NM=nm NM=nm
STAT=stat STAT="stat -c%s"
LDD=ldd
fi fi
# Should the differences be viewed? # Should the differences be viewed?
@ -72,8 +79,8 @@ fi
OLD=$(cd $(dirname $1) && pwd)/$(basename $1) OLD=$(cd $(dirname $1) && pwd)/$(basename $1)
NEW=$(cd $(dirname $2) && pwd)/$(basename $2) NEW=$(cd $(dirname $2) && pwd)/$(basename $2)
OLD_SIZE=$($STAT -c%s "$OLD") OLD_SIZE=$($STAT "$OLD")
NEW_SIZE=$($STAT -c%s "$NEW") NEW_SIZE=$($STAT "$NEW")
if [ $# -gt 3 ] if [ $# -gt 3 ]
then then
@ -119,15 +126,41 @@ fi
DIFFS=$(LANG=C diff $OLD_SYMBOLS $NEW_SYMBOLS) DIFFS=$(LANG=C diff $OLD_SYMBOLS $NEW_SYMBOLS)
if [ "${LDD}" ]
then
NAME=`basename $OLD`
TMP=$COMPARE_ROOT/ldd/ldd.${NAME}
rm -rf "${TMP}"
mkdir -p "${TMP}"
(cd "${TMP}" && cp $OLD . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.old | uniq > dep.uniq.old)
(cd "${TMP}" && cp $NEW . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.new | uniq > dep.uniq.new)
(cd "${TMP}" && rm -f ${NAME})
DIFFS_DEP=$(LANG=C diff "${TMP}/dep.old" "${TMP}/dep.new")
DIFFS_UNIQ_DEP=$(LANG=C diff "${TMP}/dep.uniq.old" "${TMP}/dep.uniq.new")
DEP_MSG=
if [ -z "${DIFFS_UNIQ_DEP}" -a -z "${DIFFS_DEP}" ]; then
DEP_MSG="Identical dependencies"
elif [ -z "${DIFFS_UNIQ_DEP}" ]; then
DEP_MSG="Redundant duplicate dependencies added"
RES=1
else
DEP_MSG="DIFFERENT dependencies"
RES=1
fi
fi
RESULT=0 RESULT=0
if [ -n "$DIFFS" ]; then if [ -n "$DIFFS" ]; then
if [ $OLD_SIZE -ne $NEW_SIZE ] if [ $OLD_SIZE -ne $NEW_SIZE ]
then then
echo Differences, content AND size : $OLD_NAME echo Differences, content AND size : $DEP_MSG : $OLD_NAME
RESULT=4 RESULT=4
else else
echo Differences, content BUT SAME size: $OLD_NAME echo Differences, content BUT SAME size: $DEP_MSG : $OLD_NAME
RESULT=3 RESULT=3
fi fi
if [ "x$VIEW" == "xview" ]; then if [ "x$VIEW" == "xview" ]; then
@ -136,10 +169,10 @@ if [ -n "$DIFFS" ]; then
else else
if [ $OLD_SIZE -ne $NEW_SIZE ] if [ $OLD_SIZE -ne $NEW_SIZE ]
then then
echo Identical symbols BUT NEW size : $OLD_NAME echo Identical symbols BUT NEW size : $DEP_MSG : $OLD_NAME
RESULT=2 RESULT=2
else else
echo Identical symbols AND size, BUT not bytewise identical: $OLD_NAME echo Identical symbols AND size, BUT not bytewise identical: $DEP_MSG : $OLD_NAME
RESULT=1 RESULT=1
fi fi
fi fi

View File

@ -84,8 +84,8 @@ if [ "$OLD_SUFFIX" != "$NEW_SUFFIX" ]; then
exit 2 exit 2
fi fi
if [ "$OLD_SUFFIX" != "zip" ] && [ "$OLD_SUFFIX" != "jar" ]; then if [ "$OLD_SUFFIX" != "zip" ] && [ "$OLD_SUFFIX" != "jar" ] && [ "$OLD_SUFFIX" != "sym" ]; then
echo The files have to be zip or jar! They are $OLD_SUFFIX echo The files have to be zip, jar or sym! They are $OLD_SUFFIX
exit 2 exit 2
fi fi
@ -128,7 +128,7 @@ if [ -n "$ONLY2" ]; then
| sed "s|Only in $NEW_TEMPDIR| |"g | sed 's|: |/|g' | sed "s|Only in $NEW_TEMPDIR| |"g | sed 's|: |/|g'
fi fi
DIFFTEXT=`dirname $0`/difftext.sh DIFFTEXT="/bin/bash `dirname $0`/difftext.sh"
LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep differ | cut -f 2,4 -d ' ' | \ LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep differ | cut -f 2,4 -d ' ' | \
awk "{ print \"$DIFFTEXT \"\$1\" \"\$2 }" > $COMPARE_ROOT/diffing awk "{ print \"$DIFFTEXT \"\$1\" \"\$2 }" > $COMPARE_ROOT/diffing

View File

@ -54,14 +54,21 @@ fi
if [ "`uname`" == "SunOS" ]; then if [ "`uname`" == "SunOS" ]; then
NM=gnm NM=gnm
STAT=gstat STAT="gstat -c%s"
LDD=ldd
elif [ $OSTYPE == "cygwin" ]; then elif [ $OSTYPE == "cygwin" ]; then
NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe" NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe"
NM_ARGS=/exports NM_ARGS=/exports
STAT=stat STAT="stat -c%s"
LDD=
elif [ "`uname`" == "Darwin" ]; then
NM=nm
STAT="stat -f%z"
LDD="otool -L"
else else
NM=nm NM=nm
STAT=stat STAT="stat -c%s"
LDD=ldd
fi fi
# Should the differences be viewed? # Should the differences be viewed?
@ -76,8 +83,8 @@ fi
OLD=$(cd $(dirname $1) && pwd)/$(basename $1) OLD=$(cd $(dirname $1) && pwd)/$(basename $1)
NEW=$(cd $(dirname $2) && pwd)/$(basename $2) NEW=$(cd $(dirname $2) && pwd)/$(basename $2)
OLD_SIZE=$($STAT -c%s "$OLD") OLD_SIZE=$($STAT "$OLD")
NEW_SIZE=$($STAT -c%s "$NEW") NEW_SIZE=$($STAT "$NEW")
if [ $# -gt 3 ] if [ $# -gt 3 ]
then then
@ -139,13 +146,39 @@ DIFFS=$(LANG=C diff $OLD_SYMBOLS $NEW_SYMBOLS)
RESULT=0 RESULT=0
if [ "${LDD}" ]
then
NAME=`basename $OLD`
TMP=$COMPARE_ROOT/ldd/ldd.${NAME}
rm -rf "${TMP}"
mkdir -p "${TMP}"
(cd "${TMP}" && cp $OLD . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.old | uniq > dep.uniq.old)
(cd "${TMP}" && cp $NEW . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.new | uniq > dep.uniq.new)
(cd "${TMP}" && rm -f ${NAME})
DIFFS_DEP=$(LANG=C diff "${TMP}/dep.old" "${TMP}/dep.new")
DIFFS_UNIQ_DEP=$(LANG=C diff "${TMP}/dep.uniq.old" "${TMP}/dep.uniq.new")
DEP_MSG=
if [ -z "${DIFFS_UNIQ_DEP}" -a -z "${DIFFS_DEP}" ]; then
DEP_MSG="Identical dependencies"
elif [ -z "${DIFFS_UNIQ_DEP}" ]; then
DEP_MSG="Redundant duplicate dependencies added"
RES=1
else
DEP_MSG="DIFFERENT dependencies"
RES=1
fi
fi
if [ -n "$DIFFS" ]; then if [ -n "$DIFFS" ]; then
if [ $OLD_SIZE -ne $NEW_SIZE ] if [ $OLD_SIZE -ne $NEW_SIZE ]
then then
echo Differences, content AND size : $OLD_NAME echo Differences, content AND size : $DEP_MSG : $OLD_NAME
RESULT=4 RESULT=4
else else
echo Differences, content BUT SAME size: $OLD_NAME echo Differences, content BUT SAME size: $DEP_MSG : $OLD_NAME
RESULT=3 RESULT=3
fi fi
if [ "x$VIEW" == "xview" ]; then if [ "x$VIEW" == "xview" ]; then
@ -154,10 +187,10 @@ if [ -n "$DIFFS" ]; then
else else
if [ $OLD_SIZE -ne $NEW_SIZE ] if [ $OLD_SIZE -ne $NEW_SIZE ]
then then
echo Identical symbols BUT NEW size : $OLD_NAME echo Identical symbols BUT NEW size : $DEP_MSG : $OLD_NAME
RESULT=2 RESULT=2
else else
echo Identical symbols AND size, BUT not bytewise identical: $OLD_NAME echo Identical symbols AND size, BUT not bytewise identical: $DEP_MSG : $OLD_NAME
RESULT=1 RESULT=1
fi fi
fi fi

View File

@ -37,10 +37,9 @@
# Create a temporary directory to store the result code from # Create a temporary directory to store the result code from
# the wrapped command. # the wrapped command.
RCDIR=`mktemp -d tmp.XXXXXX` || exit $? RCDIR=`mktemp -dt jdk-build-logger.tmp.XXXXXX` || exit $?
trap "rm -rf '$RCDIR'" EXIT trap "rm -rf \"$RCDIR\"" EXIT
LOGFILE=$1 LOGFILE=$1
shift shift
(exec 3>&1 ; ("$@" 2>&1 1>&3; echo $? > $RCDIR/rc) | tee -a $LOGFILE 1>&2 ; exec 3>&-) | tee -a $LOGFILE (exec 3>&1 ; ("$@" 2>&1 1>&3; echo $? > "$RCDIR/rc") | tee -a $LOGFILE 1>&2 ; exec 3>&-) | tee -a $LOGFILE
exit `cat $RCDIR/rc` exit `cat "$RCDIR/rc"`

View File

@ -126,8 +126,7 @@ define SetupArchive
# JAR:=Jar file to create # JAR:=Jar file to create
# MANIFEST:=Optional manifest file template. # MANIFEST:=Optional manifest file template.
# JARMAIN:=Optional main class to add to manifest # JARMAIN:=Optional main class to add to manifest
# SETUP:=The Java(h) compiler setup, needed to run javah. # JARINDEX :=
# HEADERS:=Directory to put headers in
# SKIP_METAINF:=Set to prevent contents of an META-INF directory to be automatically # SKIP_METAINF:=Set to prevent contents of an META-INF directory to be automatically
# added to the archive. # added to the archive.
# EXTRA_MANIFEST_ATTR:=Extra attribute to add to manifest. # EXTRA_MANIFEST_ATTR:=Extra attribute to add to manifest.
@ -143,9 +142,8 @@ define SetupArchive
$(if $(12),$1_$(strip $(12))) $(if $(12),$1_$(strip $(12)))
$(if $(13),$1_$(strip $(13))) $(if $(13),$1_$(strip $(13)))
$(if $(14),$1_$(strip $(14))) $(if $(14),$1_$(strip $(14)))
$(if $(15),$1_$(strip $(15)))
$1_JVM := $$($$($1_SETUP)_JVM)
$1_JAVAH := $$($$($1_SETUP)_JAVAH)
$1_JARMAIN:=$(strip $$($1_JARMAIN)) $1_JARMAIN:=$(strip $$($1_JARMAIN))
$1_JARNAME:=$$(notdir $$($1_JAR)) $1_JARNAME:=$$(notdir $$($1_JAR))
$1_MANIFEST_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_manifest $1_MANIFEST_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_manifest
@ -155,19 +153,46 @@ define SetupArchive
$1_NATIVEAPI_NOTIFICATIONS_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_native_notifications $1_NATIVEAPI_NOTIFICATIONS_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_native_notifications
$1_NATIVEAPI_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_native $1_NATIVEAPI_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_native
$1_BIN:=$$(dir $$($1_JAR)) $1_BIN:=$$(dir $$($1_JAR))
ifeq (,$$($1_SUFFIXES)) ifeq (,$$($1_SUFFIXES))
# No suffix was set, default to classes. # No suffix was set, default to classes.
$1_SUFFIXES:=.class $1_SUFFIXES:=.class
endif endif
# Convert suffixes to a find expression # Convert suffixes to a find expression
$1_FIND_PATTERNS:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_SUFFIXES)) $1_FIND_PATTERNS:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_SUFFIXES))
# On windows, a lot of includes/excludes risk making the command line too long, so
# writing the grep patterns to files.
ifneq (,$$($1_INCLUDES)) ifneq (,$$($1_INCLUDES))
$1_GREP_INCLUDES:=| $(GREP) $$(foreach src,$$($1_SRCS),$$(addprefix -e$(SPACE)$$(src)/,$$($1_INCLUDES))) $1_GREP_INCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS),\
$$(addprefix $$(src)/,$$($1_INCLUDES)))
$$(eval $$(call ListPathsSafelyNow,$1_GREP_INCLUDE_PATTERNS,\n, \
>> $$($1_BIN)/_the.$$($1_JARNAME)_include))
$1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include
endif endif
ifneq (,$$($1_EXCLUDES)$$($1_EXCLUDE_FILES)) ifneq (,$$($1_EXCLUDES)$$($1_EXCLUDE_FILES))
$1_GREP_EXCLUDES:=| $(GREP) -v $$(foreach src,$$($1_SRCS),$$(addprefix -e$(SPACE)$$(src)/,$$($1_EXCLUDES) $$($1_EXCLUDE_FILES))) $1_GREP_EXCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,\
$$($1_EXCLUDES) $$($1_EXCLUDE_FILES)))
$$(eval $$(call ListPathsSafelyNow,$1_GREP_EXCLUDE_PATTERNS,\n, \
>> $$($1_BIN)/_the.$$($1_JARNAME)_exclude))
$1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude
endif endif
ifneq (,$$($1_JARINDEX))
$1_JARINDEX = (cd $$(dir $$@) && $(JAR) -i $$(notdir $$@))
else
$1_JARINDEX = true
endif
# When this macro is run in the same makefile as the java compilation, dependencies are transfered
# in make variables. When the macro is run in a different makefile than the java compilation, the
# dependencies need to be found in the filesystem.
$1_ALL_SRCS:=$$(foreach src,$$($1_SRCS),$$(shell ($(FIND) $$(src) -type f \
-a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \
$$($1_GREP_EXCLUDES) && $(ECHO) $$($1_EXTRA_FILES))))
ifeq (,$$($1_SKIP_METAINF))
$1_ALL_SRCS+=$$(foreach src,$$($1_SRCS),$$(shell $(FIND) $$(src)/META-INF -type f 2> /dev/null))
endif
# Utility macros, to make the shell script receipt somewhat easier to dechipher. # Utility macros, to make the shell script receipt somewhat easier to dechipher.
# The capture contents macro finds all files (matching the patterns, typically # The capture contents macro finds all files (matching the patterns, typically
@ -187,15 +212,6 @@ define SetupArchive
(cd $$(src) && \ (cd $$(src) && \
$(FIND) . -name _the.package.api.notify -exec dirname \{\} \; >> $$($1_PUBAPI_NOTIFICATIONS_FILE) ; \ $(FIND) . -name _the.package.api.notify -exec dirname \{\} \; >> $$($1_PUBAPI_NOTIFICATIONS_FILE) ; \
true) &&) true) &&)
# The capture nativeapi macro scans for native api change notificiations. If such notifications are
# found, then we will run javah on the changed classes. It also collects all classes with native methods
# to be used to find out which classes no longer has native methods, to trigger deletion of those .h files.
$1_CAPTURE_NATIVEAPI=$$(foreach src,$$($1_SRCS),\
(cd $$(src) && \
$(FIND) . -name _the.package.native.notify | $(SED) 's/package.native.notify/package.native/' | \
$(XARGS) $(CAT) | $(GREP) '^TYPE ' | $(SED) 's/.*TYPE //' >> $$($1_NATIVEAPI_NOTIFICATIONS_FILE) ; \
$(FIND) . -name _the.package.native -exec $(CAT) \{\} \; | $(SED) -n 's/^TYPE //p' >> $$($1_NATIVEAPI_FILE) ; \
true) &&)
# The update contents macro updates the jar file with the previously capture contents. # The update contents macro updates the jar file with the previously capture contents.
$1_UPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\ $1_UPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\
(cd $$(src) && \ (cd $$(src) && \
@ -205,13 +221,18 @@ define SetupArchive
fi) &&) fi) &&)
# The s-variants of the above macros are used when the jar is created from scratch. # The s-variants of the above macros are used when the jar is created from scratch.
$1_SCAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),\ $1_SCAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),\
(($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES) && $(ECHO) $$($1_EXTRA_FILES)) | $(SED) 's|$$(src)/||g' > $$(src)/_the.$$($1_JARNAME)_contents) && ) (($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \
$$($1_GREP_EXCLUDES) && $(ECHO) $$($1_EXTRA_FILES)) | $(SED) 's|$$(src)/||g' > \
$$(src)/_the.$$($1_JARNAME)_contents) && )
ifeq (,$$($1_SKIP_METAINF)) ifeq (,$$($1_SKIP_METAINF))
$1_SCAPTURE_METAINF=$$(foreach src,$$($1_SRCS),\ $1_SCAPTURE_METAINF=$$(foreach src,$$($1_SRCS),\
($(FIND) $$(src)/META-INF -type f 2> /dev/null | $(SED) 's|$$(src)/||g' >> $$(src)/_the.$$($1_JARNAME)_contents) && ) ($(FIND) $$(src)/META-INF -type f 2> /dev/null | $(SED) 's|$$(src)/||g' >> \
$$(src)/_the.$$($1_JARNAME)_contents) && )
endif endif
$1_SUPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\ $1_SUPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\
(cd $$(src) && $(JAR) uf $$@ @$$(src)/_the.$$($1_JARNAME)_contents) &&) (cd $$(src) && $(JAR) uf $$@ @$$(src)/_the.$$($1_JARNAME)_contents) &&)
# The TOUCH macro is used to make sure all timestamps are identical for package files and the pubapi files. # The TOUCH macro is used to make sure all timestamps are identical for package files and the pubapi files.
# If we do not do this, we get random recompilations, the next time we run make, since the order of package building is random, # If we do not do this, we get random recompilations, the next time we run make, since the order of package building is random,
# ie independent of package --dependes on-> public api of another package. This is of course # ie independent of package --dependes on-> public api of another package. This is of course
@ -223,7 +244,7 @@ define SetupArchive
# Use a slightly shorter name for logging, but with enough path to identify this jar. # Use a slightly shorter name for logging, but with enough path to identify this jar.
$1_NAME:=$$(subst $$(OUTPUT_ROOT)/,,$$($1_JAR)) $1_NAME:=$$(subst $$(OUTPUT_ROOT)/,,$$($1_JAR))
# Here is the rule that creates/updates the jar file. # Here is the rule that creates/updates the jar file.
$$($1_JAR) : $2 $$($1_JAR) : $2 $$($1_ALL_SRC)
$(MKDIR) -p $$($1_BIN) $(MKDIR) -p $$($1_BIN)
if [ -n "$$($1_MANIFEST)" ]; then \ if [ -n "$$($1_MANIFEST)" ]; then \
$(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \ $(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \
@ -231,9 +252,11 @@ define SetupArchive
else \ else \
$(RM) $$($1_MANIFEST_FILE) && $(TOUCH) $$($1_MANIFEST_FILE); \ $(RM) $$($1_MANIFEST_FILE) && $(TOUCH) $$($1_MANIFEST_FILE); \
fi fi
$(ECHO) "Main-Class: $$(strip $$($1_JARMAIN))" >> $$($1_MANIFEST_FILE) if [ -n "$$(strip $$($1_JARMAIN))" ]; then \
$(ECHO) "Main-Class: $$(strip $$($1_JARMAIN))" >> $$($1_MANIFEST_FILE); \
fi
if [ -n "$$($1_EXTRA_MANIFEST_ATTR)" ]; then \ if [ -n "$$($1_EXTRA_MANIFEST_ATTR)" ]; then \
$(ECHO) "$$($1_EXTRA_MANIFEST_ATTR)" >> $$($1_MANIFEST_FILE); \ $(PRINTF) "$$($1_EXTRA_MANIFEST_ATTR)\n" >> $$($1_MANIFEST_FILE); \
fi fi
+if [ -s $$@ ]; then \ +if [ -s $$@ ]; then \
$(RM) -r $$($1_PUBAPI_NOTIFICATIONS_FILE) && \ $(RM) -r $$($1_PUBAPI_NOTIFICATIONS_FILE) && \
@ -255,20 +278,8 @@ define SetupArchive
$(ZIP) -q -d $$@ `$(CAT) $$($1_DELETESS_FILE)` ; \ $(ZIP) -q -d $$@ `$(CAT) $$($1_DELETESS_FILE)` ; \
fi && \ fi && \
$$($1_UPDATE_CONTENTS) true && \ $$($1_UPDATE_CONTENTS) true && \
$$($1_JARINDEX) && \
$$($1_TOUCH_API_FILES) true && \ $$($1_TOUCH_API_FILES) true && \
$(RM) -r $$($1_NATIVEAPI_NOTIFICATIONS_FILE) $$($1_NATIVEAPI_FILE) && \
$$($1_CAPTURE_NATIVEAPI) true && \
if [ "x$$($1_JAVAH)" != "x" ] && [ -s $$($1_NATIVEAPI_NOTIFICATIONS_FILE) ]; then \
$(ECHO) Native api change detected in: && $(CAT) $$($1_NATIVEAPI_NOTIFICATIONS_FILE) && \
$$($1_JVM) $$($1_JAVAH) "-Xbootclasspath/p:$$($1_JAR)" -d $$($1_HEADERS) @$$($1_NATIVEAPI_NOTIFICATIONS_FILE) ; \
fi && \
$(TOUCH) $$($1_NATIVEAPI_FILE)_prev ; \
($(GREP) -xvf $$($1_NATIVEAPI_FILE) $$($1_NATIVEAPI_FILE)_prev > $$($1_NATIVEAPI_FILE)_deleted; true) && \
$(CP) $$($1_NATIVEAPI_FILE) $$($1_NATIVEAPI_FILE)_prev && \
if [ -s $$($1_NATIVEAPI_FILE)_deleted ]; then \
$(ECHO) Native methods dropped from classes: && $(CAT) $$($1_NATIVEAPI_FILE)_deleted && \
$(RM) `$(CAT) $$($1_NATIVEAPI_FILE)_deleted | $(SED) -e 's|\.|_|g' -e 's|.*|$$($1_HEADERS)/&.h $$($1_HEADERS)/&_*|'` ; \
fi && \
$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.api.notify $(FIND_DELETE); true) &&) true ; \ $$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.api.notify $(FIND_DELETE); true) &&) true ; \
fi ; \ fi ; \
else \ else \
@ -276,15 +287,9 @@ define SetupArchive
$$($1_SCAPTURE_CONTENTS) \ $$($1_SCAPTURE_CONTENTS) \
$$($1_SCAPTURE_METAINF) \ $$($1_SCAPTURE_METAINF) \
$$($1_SUPDATE_CONTENTS) \ $$($1_SUPDATE_CONTENTS) \
$$($1_JARINDEX) && \
$$($1_TOUCH_API_FILES) true && \ $$($1_TOUCH_API_FILES) true && \
$(RM) -r $$($1_NATIVEAPI_NOTIFICATIONS_FILE) $$($1_NATIVEAPI_FILE) && \ $(RM) -r $$($1_NATIVEAPI_NOTIFICATIONS_FILE) $$($1_NATIVEAPI_FILE) && \
$$($1_CAPTURE_NATIVEAPI) true && \
if [ "x$$($1_JAVAH)" != "x" ] && [ -s $$($1_NATIVEAPI_FILE) ]; then \
$(ECHO) Generating native api headers for `$(CAT) $$($1_NATIVEAPI_FILE) | $(WC) -l` classes && \
$(RM) $$($1_HEADERS)/*.h && \
$$($1_JVM) $$($1_JAVAH) "-Xbootclasspath/p:$$($1_JAR)" -d $$($1_HEADERS) @$$($1_NATIVEAPI_FILE) && \
$(CP) $$($1_NATIVEAPI_FILE) $$($1_NATIVEAPI_FILE)_prev ; \
fi && \
$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name "*.notify" $(FIND_DELETE); true) &&) true ; \ $$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name "*.notify" $(FIND_DELETE); true) &&) true ; \
fi; fi;
@ -297,7 +302,7 @@ endef
define SetupZipArchive define SetupZipArchive
# param 1 is for example ZIP_MYSOURCE # param 1 is for example ZIP_MYSOURCE
# param 2,3,4,5,6,7,8,9 are named args. # param 2,3,4,5,6,7,8,9 are named args.
# SRC,ZIP,INCLUDES,EXCLUDES,EXCLUDE_FILES # SRC,ZIP,INCLUDES,EXCLUDES,EXCLUDE_FILES,SUFFIXES,EXTRA_DEPS
$(if $2,$1_$(strip $2)) $(if $2,$1_$(strip $2))
$(if $3,$1_$(strip $3)) $(if $3,$1_$(strip $3))
$(if $4,$1_$(strip $4)) $(if $4,$1_$(strip $4))
@ -308,11 +313,17 @@ define SetupZipArchive
$(if $9,$1_$(strip $9)) $(if $9,$1_$(strip $9))
# Find all files in the source tree. # Find all files in the source tree.
$1_ALL_SRCS := $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i -type f -a ! -name "_the.*")) $1_SUFFIX_FILTER := $$(patsubst %,-o -name $(DQUOTE)*%$(DQUOTE),$$($1_SUFFIXES))
$1_ALL_SRCS := $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i -type f -a ! -name "_the.*" \( -name FALSE_DUMMY $$($1_SUFFIX_FILTER) \) ))
ifneq ($$($1_INCLUDES),) ifneq ($$($1_INCLUDES),)
$1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES)))) $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
$1_ZIP_INCLUDES := $$(addprefix -i$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_INCLUDES))) ifneq ($$($1_SUFFIXES),)
$1_ZIP_INCLUDES := $$(foreach s,$$($1_SUFFIXES),\
$$(addprefix -i$(SPACE)$(DQUOTE),$$(addsuffix /*$$s$(DQUOTE),$$($1_INCLUDES))))
else
$1_ZIP_INCLUDES := $$(addprefix -i$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_INCLUDES)))
endif
$1_ALL_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_SRCS)) $1_ALL_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_SRCS))
endif endif
ifneq ($$($1_EXCLUDES),) ifneq ($$($1_EXCLUDES),)
@ -329,7 +340,7 @@ define SetupZipArchive
# Explicitly excluded files can be given with absolute path. The patsubst solution # Explicitly excluded files can be given with absolute path. The patsubst solution
# isn't perfect but the likelyhood of an absolute path to match something in a src # isn't perfect but the likelyhood of an absolute path to match something in a src
# dir is very small. # dir is very small.
$$($1_ZIP) : $$($1_ALL_SRCS) $$($1_ZIP) : $$($1_ALL_SRCS) $$($1_EXTRA_DEPS)
$(MKDIR) -p $$(@D) $(MKDIR) -p $$(@D)
$(ECHO) Updating $$($1_NAME) $(ECHO) Updating $$($1_NAME)
$$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$@ . $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* $$(addprefix -x$(SPACE),$$(patsubst $$i/%,%,$$($1_EXCLUDE_FILES)))) ;) true $$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$@ . $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* $$(addprefix -x$(SPACE),$$(patsubst $$i/%,%,$$($1_EXCLUDE_FILES)))) ;) true
@ -472,7 +483,7 @@ define add_file_to_copy_and_clean
| $(SED) -e '/^#/d' -e '/^$$$$/d' \ | $(SED) -e '/^#/d' -e '/^$$$$/d' \
-e :a -e '/\\$$$$/N; s/\\\n//; ta' \ -e :a -e '/\\$$$$/N; s/\\\n//; ta' \
-e 's/^[ \t]*//;s/[ \t]*$$$$//' \ -e 's/^[ \t]*//;s/[ \t]*$$$$//' \
-e 's/\\=/=/' | LANG=C sort > $$@ -e 's/\\=/=/' | LANG=C $(SORT) > $$@
$(CHMOD) -f ug+w $$@ $(CHMOD) -f ug+w $$@
# And do not forget this target # And do not forget this target
@ -623,6 +634,7 @@ define SetupJavaCompilation
# JAVAC_SOURCE_PATH_UGLY_OVERRIDE:=Don't use this. This forces an explicit -sourcepath to javac. # JAVAC_SOURCE_PATH_UGLY_OVERRIDE:=Don't use this. This forces an explicit -sourcepath to javac.
# Its only here until we cleanup some nasty source code pasta in the jdk. # Its only here until we cleanup some nasty source code pasta in the jdk.
# HEADERS:=path to directory where all generated c-headers are written. # HEADERS:=path to directory where all generated c-headers are written.
# DEPENDS:=Extra dependecy
$(if $2,$1_$(strip $2)) $(if $2,$1_$(strip $2))
$(if $3,$1_$(strip $3)) $(if $3,$1_$(strip $3))
$(if $4,$1_$(strip $4)) $(if $4,$1_$(strip $4))
@ -650,9 +662,6 @@ $1_JVM := $$($$($1_SETUP)_JVM)
$1_JAVAC := $$($$($1_SETUP)_JAVAC) $1_JAVAC := $$($$($1_SETUP)_JAVAC)
$1_JAVAH := $$($$($1_SETUP)_JAVAH) $1_JAVAH := $$($$($1_SETUP)_JAVAH)
$1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS) $1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS)
ifeq (,$$($1_HEADERS))
$1_HEADERS := $$($1_BIN)
endif
# Handle addons and overrides. # Handle addons and overrides.
$1_SRC:=$$(call ADD_SRCS,$$($1_SRC)) $1_SRC:=$$(call ADD_SRCS,$$($1_SRC))
@ -776,24 +785,21 @@ ifeq ($$($1_MODE),SINGLE_THREADED_BATCH)
$$(eval $$(call replace_space_with_pathsep,$1_SRCROOTSC,$$($1_SRC))) $$(eval $$(call replace_space_with_pathsep,$1_SRCROOTSC,$$($1_SRC)))
endif endif
ifneq (,$$($1_HEADERS))
$1_HEADERS_ARG := -h $$($1_HEADERS)
endif
# Create a sed expression to remove the source roots and to replace / with . # Create a sed expression to remove the source roots and to replace / with .
# and remove .java at the end. # and remove .java at the end.
$1_REWRITE_INTO_CLASSES:=$$(foreach i,$$($1_SRC),-e 's|$$i/||g') -e 's|/|.|g' -e 's|.java$$$$||g' $1_REWRITE_INTO_CLASSES:=$$(foreach i,$$($1_SRC),-e 's|$$i/||g') -e 's|/|.|g' -e 's|.java$$$$||g'
# Here is the batch rules that depends on all the sources. # Here is the batch rules that depends on all the sources.
$$($1_BIN)/_the.batch: $$($1_SRCS) $$($1_BIN)/_the.batch: $$($1_SRCS) $$($1_DEPENDS)
$(MKDIR) -p $$(@D) $(MKDIR) -p $$(@D)
$(RM) $$($1_BIN)/_the.batch $$($1_BIN)/_the.batch.tmp $(RM) $$($1_BIN)/_the.batch $$($1_BIN)/_the.batch.tmp
$$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.batch.tmp) $$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.batch.tmp)
$(ECHO) Compiling `$(WC) $$($1_BIN)/_the.batch.tmp | $(TR) -s ' ' | $(CUT) -f 2 -d ' '` files in batch $1 $(ECHO) Compiling `$(WC) $$($1_BIN)/_the.batch.tmp | $(TR) -s ' ' | $(CUT) -f 2 -d ' '` files in batch $1
($$($1_JVM) $$($1_JAVAC) $$($1_FLAGS) -implicit:none -sourcepath "$$($1_SRCROOTSC)" -d $$($1_BIN) @$$($1_BIN)/_the.batch.tmp && \ ($$($1_JVM) $$($1_JAVAC) $$($1_FLAGS) -implicit:none -sourcepath "$$($1_SRCROOTSC)" -d $$($1_BIN) $$($1_HEADERS_ARG) @$$($1_BIN)/_the.batch.tmp && \
$$(if $$($1_JAVAH),\
$(CAT) $$($1_BIN)/_the.batch.tmp | $(XARGS) $(GREP) -E "[[:space:]]native[[:space:]]|@GenerateNativeHeader" |\
$(GREP) -v '*' | $(GREP) -v '//' | $(CUT) -f 1 -d ':' | $(SORT) -u |\
$(SED) $$($1_REWRITE_INTO_CLASSES) > $$($1_BIN)/_the.batch.natives && \
if test -s $$($1_BIN)/_the.batch.natives; then \
$$($1_JVM) $$($1_JAVAH) "-Xbootclasspath/p:$$($1_BIN)" -d $$($1_HEADERS) @$$($1_BIN)/_the.batch.natives ; \
fi &&) \
$(MV) $$($1_BIN)/_the.batch.tmp $$($1_BIN)/_the.batch) $(MV) $$($1_BIN)/_the.batch.tmp $$($1_BIN)/_the.batch)
else else
# Ok, we have a modern javac server running! # Ok, we have a modern javac server running!
@ -868,6 +874,7 @@ ifneq (,$$($1_JAR))
JARMAIN:=$$($1_JARMAIN),\ JARMAIN:=$$($1_JARMAIN),\
MANIFEST:=$$($1_MANIFEST),\ MANIFEST:=$$($1_MANIFEST),\
EXTRA_MANIFEST_ATTR:=$$($1_EXTRA_MANIFEST_ATTR),\ EXTRA_MANIFEST_ATTR:=$$($1_EXTRA_MANIFEST_ATTR),\
JARINDEX:=$$($1_JARINDEX),\
HEADERS:=$$($1_HEADERS),\ HEADERS:=$$($1_HEADERS),\
SETUP:=$$($1_SETUP))) SETUP:=$$($1_SETUP)))
endif endif

View File

@ -91,6 +91,15 @@ $(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/b
> $(BUILDTIMESDIR)/build_time_diff_$1 > $(BUILDTIMESDIR)/build_time_diff_$1
endef endef
# Check if the current target is the final target, as specified by
# the user on the command line. If so, call PrintEndMessage.
define CheckIfFinished
$(if $(filter $@,$(MAKECMDGOALS)),$(call PrintEndMessage))
# If no taget is given, "all" is default. Check for that, too.
# At most one of the tests can be true.
$(if $(MAKECMDGOALS),,$(if $(filter $@,all),$(call PrintEndMessage)))
endef
# Indicate that we are done. # Indicate that we are done.
# Record ending time and print out the total time it took to build. # Record ending time and print out the total time it took to build.
define MakeFinish define MakeFinish
@ -101,6 +110,7 @@ $(BUILD_LOG_WRAPPER) $(PRINTF) "%s\n##### %-60.60s #####\n%s\n##### %-60.60s ###
"########################################################################" \ "########################################################################" \
$(if $(REPORT_BUILD_TIMES),"Build time `$(CAT) $(BUILDTIMESDIR)/build_time_diff_$1` for target(s) $2","") \ $(if $(REPORT_BUILD_TIMES),"Build time `$(CAT) $(BUILDTIMESDIR)/build_time_diff_$1` for target(s) $2","") \
"########################################################################" "########################################################################"
$(call CheckIfFinished)
endef endef
# Find all build_time_* files and print their contents in a list sorted # Find all build_time_* files and print their contents in a list sorted
@ -126,6 +136,18 @@ define StopTimer
$(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),) $(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),)
endef endef
# Hook to be called as the very first thing when running a normal build
define AtRootMakeStart
$(call PrintStartMessage)
$(call StartTimer)
endef
# Hook to be called as the very last thing for targets that are "top level" targets
define AtRootMakeEnd
$(call StopTimer)
$(call CheckIfFinished)
endef
# If the variable that you want to send to stdout for piping into a file or otherwise, # If the variable that you want to send to stdout for piping into a file or otherwise,
# is potentially long, for example the a list of file paths, eg a list of all package directories. # is potentially long, for example the a list of file paths, eg a list of all package directories.
# Then you need to use ListPathsSafely, which optimistically splits the output into several shell # Then you need to use ListPathsSafely, which optimistically splits the output into several shell
@ -324,4 +346,51 @@ define ListPathsSafelyNow
endef endef
# The source tips can come from the Mercurial repository, or in the files
# $(HGTIP_FILENAME) which contains the tip but is also positioned in the same
# directory as the original $(HGDIR) directory.
# These should not be := assignments, only used from the root Makefile.
HG_VERSION = $(shell $(HG) version 2> /dev/null)
HG_DIRECTORY=.hg
HGTIP_FILENAME=.hgtip
HG_SEARCH = ./REPO ./*/REPO ./*/*/REPO ./*/*/*/REPO
REPO_LIST = $(patsubst ./%,%,$(patsubst %/,%,$(sort $(dir \
$(shell $(CD) $(SRC_ROOT) ; ( $(LS) -d $(HG_SEARCH:%/REPO=%/$(HG_DIRECTORY)) ; \
$(LS) $(HG_SEARCH:%/REPO=%/$(HGTIP_FILENAME)) ) \
2> /dev/null)))))
# Emit the repo:tip pairs to $@
define GetSourceTips
$(CD) $(SRC_ROOT) ; \
for i in $(REPO_LIST) IGNORE ; do \
if [ "$${i}" = "IGNORE" ] ; then \
continue; \
elif [ -d $${i}/$(HG_DIRECTORY) -a "$(HG_VERSION)" != "" ] ; then \
$(PRINTF) " %s:%s" \
"$${i}" `$(HG) tip --repository $${i} --template '{node|short}\n'` ; \
elif [ -f $${i}/$(HGTIP_FILENAME) ] ; then \
$(PRINTF) " %s:%s" \
"$${i}" `$(CAT) $${i}/$(HGTIP_FILENAME)` ; \
fi; \
done >> $@
$(PRINTF) "\n" >> $@
endef
# Create the HGTIP_FILENAME file. Called from jdk/make/closed/bundles.gmk
define CreateHgTip
$(HG) tip --repository $1 --template '{node|short}\n' > $1/$(HGTIP_FILENAME);\
$(ECHO) $1/$(HGTIP_FILENAME)
endef
define SetupLogging
ifneq ($(findstring $(LOG),debug trace),)
# Shell redefinition trick inspired by http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make
OLD_SHELL:=$$(SHELL)
SHELL = $$(warning Building $$@$$(if $$<, (from $$<))$(if $$?, ($$? newer)))$$(OLD_SHELL) -x
endif
endef
# Make sure logging is setup for everyone that includes MakeBase.gmk.
$(eval $(call SetupLogging))
endif # _MAKEBASE_GMK endif # _MAKEBASE_GMK

View File

@ -23,49 +23,144 @@
# questions. # questions.
# #
# Default to sane output from make. # This must be the first rule
# Override with empty string to get insane amount of output. default: all
# Override with -d to get even more insane amount of debugging output.
# Override with "-d -p" to get it all. # Find out which variables were passed explicitely on the make command line. These
VERBOSE=-s # will be passed on to sub-makes, overriding spec.gmk settings.
MAKE_ARGS=$(foreach var,$(subst =command,,$(filter %=command,$(foreach var,$(.VARIABLES),$(var)=$(firstword $(origin $(var)))))),$(var)=$($(var)))
define fatal-error
# If the user specificed a "global" target (e.g. 'help'), do not exit but continue running
$$(if $$(findstring help,$$(MAKECMDGOALS)),,$$(error Cannot continue))
endef
ifeq ($(origin VERBOSE),undefined)
# Setup logging according to LOG (but only if VERBOSE is not given)
ifeq ($(LOG),)
# Set LOG to "warn" as default if not set (and no VERBOSE given)
LOG=warn
endif
ifeq ($(LOG),warn)
VERBOSE=-s
else ifeq ($(LOG),info)
VERBOSE=
else ifeq ($(LOG),debug)
VERBOSE=
else ifeq ($(LOG),trace)
VERBOSE=-d -p
else
$(info Error: LOG must be one of: warn, info, debug or trace.)
$(eval $(call fatal-error))
endif
else
ifneq ($(LOG),)
# We have both a VERBOSE and a LOG argument. This is OK only if this is a repeated call by ourselves,
# but complain if this is the top-level make call.
ifeq ($(MAKELEVEL),0)
$(info Cannot use LOG=$(LOG) and VERBOSE=$(VERBOSE) at the same time. Choose one.)
$(eval $(call fatal-error))
endif
endif
endif
# TODO: Fix duplication in MakeBase.gmk
define SetupLogging
ifneq ($(findstring $(LOG),debug trace),)
# Shell redefinition trick inspired by http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make
OLD_SHELL:=$$(SHELL)
SHELL = $$(warning Building $$@$$(if $$<, (from $$<))$(if $$?, ($$? newer)))$$(OLD_SHELL) -x
endif
endef
$(eval $(call SetupLogging))
# Find all environment or command line variables that begin with ALT. # Find all environment or command line variables that begin with ALT.
list_alt_overrides_with_origins = $(filter ALT_%=environment ALT_%=command,$(foreach var,$(.VARIABLES),$(var)=$(firstword $(origin $(var))))) list_alt_overrides_with_origins = $(filter ALT_%=environment ALT_%=command,$(foreach var,$(.VARIABLES),$(var)=$(firstword $(origin $(var)))))
list_alt_overrides=$(subst =command,,$(subst =environment,,$(list_alt_overrides_with_origins))) list_alt_overrides=$(subst =command,,$(subst =environment,,$(list_alt_overrides_with_origins)))
ifneq ($(list_alt_overrides),)
$(info You have set the following ALT_ variables:) ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
$(foreach var,$(list_alt_overrides), $(info $(var)=$($(var)))) makefile_path=$(CURDIR)/$(lastword $(MAKEFILE_LIST))
$(error Using ALT_ variables is deprecated! Please clean your environment!) else
makefile_path=$(lastword $(MAKEFILE_LIST))
endif endif
root_dir=$(patsubst %/common/makefiles/Makefile,%,$(makefile_path))
output_dir=$(root_dir)/build
# The spec.gmk file contains the variables extracted by the configure script. ifneq ($(origin SPEC),undefined)
# It is usually set with SPEC=....spec.gmk on the make command line. # We have been given a SPEC, check that it works out properly
# However if you simply type make from the openjdk source root, it will go looking ifeq ($(wildcard $(SPEC)),)
# for a spec file, if only one is found, use it. If more than one is found, $(info Cannot locate spec.gmk, given by SPEC=$(SPEC))
# complain. If none is found, request the user to run configure! $(eval $(call fatal-error))
SPEC ?= $(wildcard $(CURDIR)/../../build/*/spec.gmk) endif
ifneq ($(origin CONF),undefined)
# We also have a CONF argument. This is OK only if this is a repeated call by ourselves,
# but complain if this is the top-level make call.
ifeq ($(MAKELEVEL),0)
$(info Cannot use CONF=$(CONF) and SPEC=$(SPEC) at the same time. Choose one.)
$(eval $(call fatal-error))
endif
endif
# ... OK, we're satisfied, we'll use this SPEC later on
else
# Find all spec.gmk files in the build output directory
all_spec_files=$(wildcard $(output_dir)/*/spec.gmk)
ifeq ($(all_spec_files),)
$(info No configurations found for $(root_dir)! Please run configure to create a configuration.)
$(eval $(call fatal-error))
endif
# Extract the configuration names from the path
all_confs=$(patsubst %/spec.gmk,%,$(patsubst $(output_dir)/%,%,$(all_spec_files)))
ifeq ($(words $(SPEC)),0) ifneq ($(origin CONF),undefined)
$(error You must run configure!) # User have given a CONF= argument.
ifeq ($(CONF),)
# If given CONF=, match all configurations
matching_confs=$(strip $(all_confs))
else
# Otherwise select those that contain the given CONF string
matching_confs=$(strip $(foreach var,$(all_confs),$(if $(findstring $(CONF),$(var)),$(var))))
endif
ifeq ($(matching_confs),)
$(info No configurations found matching CONF=$(CONF))
$(info Available configurations:)
$(foreach var,$(all_confs),$(info * $(var)))
$(eval $(call fatal-error))
else
ifeq ($(words $(matching_confs)),1)
$(info Building '$(matching_confs)' (matching CONF=$(CONF)))
else
$(info Building the following configurations (matching CONF=$(CONF)):)
$(foreach var,$(matching_confs),$(info * $(var)))
endif
endif
# Create a SPEC definition. This will contain the path to one or more spec.gmk files.
SPEC=$(addsuffix /spec.gmk,$(addprefix $(output_dir)/,$(matching_confs)))
else
# No CONF or SPEC given, check the available configurations
ifneq ($(words $(all_spec_files)),1)
$(info No CONF or SPEC given, but more than one spec.gmk found in $(output_dir).)
$(info Available configurations:)
$(foreach var,$(all_confs),$(info * $(var)))
$(info Please retry building with CONF=<config> or SPEC=<specfile>)
$(eval $(call fatal-error))
endif
# We found exactly one configuration, use it
SPEC=$(strip $(all_spec_files))
endif
endif endif
ifneq ($(words $(SPEC)),1) ifneq ($(words $(SPEC)),1)
ifeq ($(MAKECMDGOALS),all-conf) # We have multiple configurations to build, call make repeatedly
SPECS:=$(shell echo $(SPEC) | sed -e 's|$(CURDIR)/build/||g' -e 's|/spec.gmk|\\n|g' -e 's| ||g') all jdk hotspot jaxws jaxp corba langtools install images packages clean dist-clean:
allconf: @$(foreach spec,$(SPEC),($(MAKE) -f $(makefile_path) SPEC=$(spec) $(VERBOSE) VERBOSE=$(VERBOSE) $@ $(MAKE_ARGS)) &&) true
@echo Building configurations:
@printf "$(SPECS)" .PHONY: all jdk hotspot jaxws jaxp corba langtools install images packages clean dist-clean
@$(foreach s,$(SPEC),($(MAKE) SPEC=$s $(VERBOSE) VERBOSE=$(VERBOSE) images) &&) true
@echo Done building configurations:
@printf "$(SPECS)"
.PHONY: all-conf
else
$(error Since you have more than one output dir configured under build, \
you have to either run make from the output dir of your choice \
or specify run "make SPEC=build/.../spec.gmk" or run all the build configurations \
using "make all-conf")
endif
else else
# This is the main part of the Makefile, for the normal case with SPEC specifying a single existing spec.gmk file.
# Now load the spec # Now load the spec
-include $(SPEC) -include $(SPEC)
@ -88,51 +183,101 @@ $(eval $(call ResetTimers))
# Clean out any notifications from the previous build. # Clean out any notifications from the previous build.
$(shell find $(OUTPUT_ROOT) -name "_the.*.notify" $(FIND_DELETE)) $(shell find $(OUTPUT_ROOT) -name "_the.*.notify" $(FIND_DELETE))
all: jdk # If make was called explicitely with -j, don't add a -j ourself to sub-makes, since
@$(call StopTimer) # this will be inherited automatically by make. Otherwise use our default for sub-makes.
@$(if $(JAVAC_SERVERS),rm -rf $(JAVAC_SERVERS)/*.port) # The -j in MAKEFLAGS is only visible when executing a recipe, hence this macro.
define GetMakeJobFlag
$(if $(findstring -j,$(MAKEFLAGS)),,-j$(NUM_CORES))
endef
langtools: start-timer define CheckEnvironment
$(if $(list_alt_overrides),
@$(PRINTF) "\nWARNING: You have the following ALT_ variables set:\n"
@$(PRINTF) "$(foreach var,$(list_alt_overrides),$(var)=$$$(var))\n"
@$(PRINTF) "ALT_ variables are deprecated and will be ignored. Please clean your environment.\n"
)
endef
define PrintStartMessage
$(if $(VERBOSE),,@$(ECHO) Running make as $(MAKE) $(MFLAGS) $(MAKE_ARGS))
$(call CheckEnvironment)
@$(ECHO) "Building OpenJDK for target $(if $(MAKECMDGOALS),'$(MAKECMDGOALS)','all') in configuration '$(CONF_NAME)'"
endef
define PrintEndMessage
@$(ECHO) "Finished building OpenJDK for target '$@'"
$(call CheckEnvironment)
endef
all: jdk
@$(if $(JAVAC_SERVERS),rm -rf $(JAVAC_SERVERS)/*.port)
@$(call AtRootMakeEnd)
langtools: start-make
@$(call MakeStart,langtools,all) @$(call MakeStart,langtools,all)
@($(CD) $(LANGTOOLS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) -j$(NUM_CORES) $(LANGTOOLS_MAKE_ARGS)) @($(CD) $(LANGTOOLS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(call GetMakeJobFlag) $(LANGTOOLS_MAKE_ARGS) $(MAKE_ARGS))
@$(call MakeFinish,langtools,all) @$(call MakeFinish,langtools,all)
corba: langtools corba: langtools
@$(call MakeStart,corba,all) @$(call MakeStart,corba,all)
@($(CD) $(CORBA_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) -j$(NUM_CORES) $(CORBA_MAKE_ARGS)) @($(CD) $(CORBA_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(call GetMakeJobFlag) $(CORBA_MAKE_ARGS) $(MAKE_ARGS))
@$(call MakeFinish,corba,all) @$(call MakeFinish,corba,all)
jaxp: langtools jaxp: langtools
@$(call MakeStart,jaxp,all) @$(call MakeStart,jaxp,all)
@($(CD) $(JAXP_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) -j$(NUM_CORES) $(CORBA_MAKE_ARGS)) @($(CD) $(JAXP_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(call GetMakeJobFlag) $(CORBA_MAKE_ARGS) $(MAKE_ARGS))
@$(call MakeFinish,jaxp,all) @$(call MakeFinish,jaxp,all)
jaxws: langtools jaxp jaxws: langtools jaxp
@$(call MakeStart,jaxws,all) @$(call MakeStart,jaxws,all)
@($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) -j$(NUM_CORES) $(CORBA_MAKE_ARGS)) @($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(call GetMakeJobFlag) $(CORBA_MAKE_ARGS) $(MAKE_ARGS))
@$(call MakeFinish,jaxws,all) @$(call MakeFinish,jaxws,all)
hotspot: langtools hotspot: langtools
@$(call MakeStart,hotspot,all) @$(call MakeStart,hotspot,all)
@($(CD) $(HOTSPOT_TOPDIR)/make && $(BUILD_LOG_WRAPPER) $(MAKE) -j1 $(HOTSPOT_MAKE_ARGS)) @($(CD) $(HOTSPOT_TOPDIR)/make && $(BUILD_LOG_WRAPPER) $(MAKE) -j1 $(HOTSPOT_MAKE_ARGS) $(MAKE_ARGS))
@$(call MakeFinish,hotspot,all) @$(call MakeFinish,hotspot,all)
jdk: langtools corba jaxp jaxws hotspot jdk: langtools corba jaxp jaxws hotspot
@$(call MakeStart,jdk,all) @$(call MakeStart,jdk,all)
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) -j$(NUM_CORES) $(JDK_MAKE_ARGS)) @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(call GetMakeJobFlag) $(JDK_MAKE_ARGS) $(MAKE_ARGS))
@$(call MakeFinish,jdk,all) @$(call MakeFinish,jdk,all)
images install packages: start-timer jdk langtools corba jaxp jaxws hotspot images install packages: source-tips start-make jdk langtools corba jaxp jaxws hotspot
@$(call MakeStart,jdk-images,$@) @$(call MakeStart,jdk-images,$@)
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) -j$(NUM_CORES) $(JDK_MAKE_ARGS) $@) @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(call GetMakeJobFlag) $(JDK_MAKE_ARGS) $(MAKE_ARGS) $@)
@$(call MakeFinish,jdk-images,$@) @$(call MakeFinish,jdk-images,$@)
@$(call StopTimer)
@$(if $(JAVAC_SERVERS),rm -rf $(JAVAC_SERVERS)/*.port) @$(if $(JAVAC_SERVERS),rm -rf $(JAVAC_SERVERS)/*.port)
@$(call AtRootMakeEnd)
start-timer: old-images: source-tips start-make jdk langtools corba jaxp jaxws hotspot
@$(call StartTimer) @$(call MakeStart,jdk-old-images,$@)
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(call GetMakeJobFlag) $(JDK_MAKE_ARGS) $(MAKE_ARGS) $@)
@$(call MakeFinish,old-jdk-images,$@)
@$(if $(JAVAC_SERVERS),rm -rf $(JAVAC_SERVERS)/*.port)
@$(call AtRootMakeEnd)
start-make:
@$(call AtRootMakeStart)
.PHONY: jdk hotspot jaxws jaxp corba langtools install images packages start-make
test: start-make
@$(call MakeStart,test,$(if $(TEST),$(TEST),all))
@($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) MAKEFLAGS= -j1 PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true
@$(call MakeFinish,test,$(if $(TEST),$(TEST),all))
@$(call AtRootMakeEnd)
.PHONY: test
# Stores the tips for each repository. This file is be used when constructing the jdk image and can be
# used to track the exact sources used to build that image.
source-tips: $(OUTPUT_ROOT)/source_tips
$(OUTPUT_ROOT)/source_tips: FRC
@$(MKDIR) -p $(@D)
@$(RM) $@
@$(call GetSourceTips)
.PHONY: jdk hotspot jaxws jaxp corba langtools install images packages start-timer
# Remove everything, except the output from configure. # Remove everything, except the output from configure.
clean: clean:
@ -152,25 +297,35 @@ clean-jdk:
@$(ECHO) "Cleaned jdk build artifacts (but not langtools,corba,jaxp,jaxws,hotspot nor the build configuration)" @$(ECHO) "Cleaned jdk build artifacts (but not langtools,corba,jaxp,jaxws,hotspot nor the build configuration)"
.PHONY: clean .PHONY: clean
help:
$(info )
$(info Typical make commands:)
$(info make)
$(info make VERBOSE= # print all commands)
$(info make VERBOSE="-d -p" # debug make as well)
$(info make all-conf # build images for all configurations)
$(info make clean # remove build artifacts)
$(info make dist-clean # you have to rerun configure)
# $(info make test # run tests)
$(info make images # create the jdk and jre images)
$(info make install # install the jdk image)
# $(info make modules # EXPERIMENTAL: Migrate JDK into a modularized form!)
$(info make packages # create zips and other packages)
# $(info make eclipse_workspace # Create an Eclipse workspace)
# $(info make netbeans_workspace # Create a NetBeans workspace)
# $(info make vs_workspace # Create a Visual Studio workspace)
.PHONY: help
endif endif
# Here are "global" targets, i.e. targets that can be executed without specifying a single configuration.
# If you addd more global targets, please update the fatal-error macro.
help:
$(info )
$(info OpenJDK Makefile help)
$(info =====================)
$(info )
$(info Common make targets)
$(info . make [all] # Compile all code but do not create images)
$(info . make images # Create complete j2sdk and j2re images)
$(info . make install # Install the generated images locally)
$(info . make clean # Remove all files generated by make, but not those generated by configure)
$(info . make dist-clean # Remove all files generated by both make and configure)
$(info . make help # Give some help on using make)
$(info . make test # Run tests, default is all tests (see TEST below))
$(info )
$(info Useful make variables)
$(info . make CONF= # Build all configurations (note, assignment is empty))
$(info . make CONF=<substring> # Build the configuration(s) with a name matching the given substring)
$(info )
$(info . make LOG=<loglevel> # Change loglevel from warn (default) to the given loglevel)
$(info . # Available loglevels are: warn, info, debug and trace)
$(info . # To see executed command lines, use LOG=info)
$(info )
$(info . make test TEST=<test> # Only run the given test or tests, e.g.)
$(info . # make test TEST="jdk_lang jdk_net")
$(info )
.PHONY: help
FRC: # Force target

View File

@ -28,7 +28,7 @@
# desired whenever sort is used below! # desired whenever sort is used below!
ifeq (,$(_MAKEBASE_GMK)) ifeq (,$(_MAKEBASE_GMK))
$(error You must include MakeBase.gmk prior to including JavaCompilation.gmk) $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk)
endif endif
ifeq ($(COMPILER_TYPE),CC) ifeq ($(COMPILER_TYPE),CC)
@ -54,15 +54,22 @@ define add_native_source
ifneq (,$$(filter %.c,$2)) ifneq (,$$(filter %.c,$2))
# Compile as a C file # Compile as a C file
$1_$2_FLAGS=$4 $1_$2_FLAGS=$4 $$($1_$(notdir $2)_CFLAGS)
$1_$2_COMP=$5 $1_$2_COMP=$5
$1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
else ifneq (,$$(filter %.m,$2))
# Compile as a objective-c file
$1_$2_FLAGS=-x objective-c $4 $$($1_$(notdir $2)_CFLAGS)
$1_$2_COMP=$5
$1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
else else
# Compile as a C++ file # Compile as a C++ file
$1_$2_FLAGS=$6 $1_$2_FLAGS=$6 $$($1_$(notdir $2)_CXXFLAGS)
$1_$2_COMP=$7 $1_$2_COMP=$7
$1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS)
endif endif
# Generate the .o (.obj) file name and place it in the bin dir. # Generate the .o (.obj) file name and place it in the bin dir.
$1_$2_OBJ:=$3/$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(notdir $2))) $1_$2_OBJ:=$3/$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(notdir $2))))
# Only continue if this object file hasn't been processed already. This lets the first found # Only continue if this object file hasn't been processed already. This lets the first found
# source file override any other with the same name. # source file override any other with the same name.
ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR))) ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR)))
@ -80,7 +87,7 @@ define add_native_source
$$($1_$2_OBJ) : $2 $$($1_$2_OBJ) : $2
ifeq ($(COMPILER_TYPE),CC) ifeq ($(COMPILER_TYPE),CC)
$$(call COMPILING_MSG,$$(notdir $2)) $$(call COMPILING_MSG,$$(notdir $2))
$$($1_$2_COMP) $$($1_$2_FLAGS) -MMD -MF $$($1_$2_DEP) -c $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) -c $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
endif endif
ifeq ($(COMPILER_TYPE),CL) ifeq ($(COMPILER_TYPE),CL)
$$(call COMPILING_MSG,$$(notdir $2)) $$(call COMPILING_MSG,$$(notdir $2))
@ -109,6 +116,8 @@ define SetupNativeCompilation
# EXCLUDE_FILES with these names # EXCLUDE_FILES with these names
# VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run # VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run
# RC_FLAGS flags for RC. # RC_FLAGS flags for RC.
# MAPFILE mapfile
# REORDER reorder file
$(if $2,$1_$(strip $2)) $(if $2,$1_$(strip $2))
$(if $3,$1_$(strip $3)) $(if $3,$1_$(strip $3))
$(if $4,$1_$(strip $4)) $(if $4,$1_$(strip $4))
@ -154,7 +163,7 @@ define SetupNativeCompilation
ifneq ($$($1_EXCLUDE_FILES),) ifneq ($$($1_EXCLUDE_FILES),)
$1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES)) $1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES))
endif endif
$1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter %.c %.cpp,$$($1_ALL_SRCS))) $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter %.c %.cpp %.m,$$($1_ALL_SRCS)))
ifneq (,$$(strip $$($1_INCLUDE_FILES))) ifneq (,$$(strip $$($1_INCLUDE_FILES)))
$1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS)) $1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS))
endif endif
@ -178,7 +187,7 @@ define SetupNativeCompilation
# Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides # Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides
# a reproducable order on the input files to the linker). # a reproducable order on the input files to the linker).
$1_EXPECTED_OBJS:=$$(sort $$(addprefix $$($1_BIN)/,$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(notdir $$($1_SRCS)))))) $1_EXPECTED_OBJS:=$$(sort $$(addprefix $$($1_BIN)/,$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(notdir $$($1_SRCS)))))))
$1 := $$($1_EXPECTED_OBJS) $1 := $$($1_EXPECTED_OBJS)
# Are there too many object files on disk? Perhaps because some source file was removed? # Are there too many object files on disk? Perhaps because some source file was removed?
$1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS))) $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS)))
@ -218,6 +227,11 @@ define SetupNativeCompilation
$1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS) $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
endif endif
ifneq (,$$($1_REORDER))
$1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
$1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER)
endif
# Now create a list of the packages that are about to compile. Used when sending source # Now create a list of the packages that are about to compile. Used when sending source
# in a batch to the compiler. # in a batch to the compiler.
$$(shell $(RM) $$($1_BIN)/_the.list_of_sources) $$(shell $(RM) $$($1_BIN)/_the.list_of_sources)
@ -233,29 +247,53 @@ define SetupNativeCompilation
ifeq ($(HOST_OS_API), winapi) ifeq ($(HOST_OS_API), winapi)
ifneq (,$$($1_VERSIONINFO_RESOURCE)) ifneq (,$$($1_VERSIONINFO_RESOURCE))
ifneq (,$$($1_LIB)) ifneq (,$$($1_LIB))
ifeq (dynamic,$$(patsubst %$(SHARED_LIBRARY_SUFFIX),dynamic,$$($1_LIB))) $1_BASENAME:=$$(basename $$(notdir $$($1_LIB)))
$1_RES:=$$(patsubst %$(SHARED_LIBRARY_SUFFIX),%.res,$$($1_LIB))
else
$1_RES:=$$(patsubst %$(STATIC_LIBRARY_SUFFIX),%.res,$$($1_LIB))
endif
endif endif
ifneq (,$$($1_EXE)) ifneq (,$$($1_EXE))
$1_RES:=$$(patsubst %$(EXE_SUFFIX),%.res,$$($1_EXE)) $1_BASENAME:=$$(basename $$(notdir $$($1_EXE)))
endif endif
$1_RES:=$$($1_BIN)/$$($1_BASENAME).res
$$($1_RES): $$($1_VERSIONINFO_RESOURCE) $$($1_RES): $$($1_VERSIONINFO_RESOURCE)
$(RC) $$($1_RC_FLAGS) $(CC_OUT_OPTION)$$@ $$($1_VERSIONINFO_RESOURCE) $(RC) $$($1_RC_FLAGS) $(CC_OUT_OPTION)$$@ $$($1_VERSIONINFO_RESOURCE)
endif endif
ifneq (,$$($1_MANIFEST))
$1_PROGRAM:=$$(basename $$(notdir $$($1_EXE)))
$1_GEN_MANIFEST:=$$($1_BIN)/$$($1_PROGRAM).manifest
IMVERSIONVALUE:=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VERSION).$(COOKED_BUILD_NUMBER)
$$($1_GEN_MANIFEST): $$($1_MANIFEST)
$(SED) 's%IMVERSION%$$(IMVERSIONVALUE)%g;s%PROGRAM%$$($1_PROGRAM)%g' $$< > $$@
endif
endif
# mapfile doesnt seem to be implemented on macosx (yet??)
ifneq ($(HOST_OS),macosx)
ifneq ($(HOST_OS),windows)
$1_REAL_MAPFILE := $$($1_MAPFILE)
ifneq (,$$($1_REORDER))
$1_REAL_MAPFILE := $$($1_BIN)/mapfile
$$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
$$(MKDIR) -p $$(@D)
$$(CP) $$($1_MAPFILE) $$@.tmp
$$(SED) -e 's=OUTPUTDIR=$$($1_BIN)=' $$($1_REORDER) >> $$@.tmp
$$(MV) $$@.tmp $$@
endif
endif
endif endif
# Pickup extra HOST_OS_API dependent variables (posix or winapi) and # Pickup extra HOST_OS_API dependent variables (posix or winapi) and
# (linux,solaris,windows,bsd) for LDFLAGS and LDFLAGS_SUFFIX # (linux,solaris,windows,bsd) for LDFLAGS and LDFLAGS_SUFFIX
$1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(HOST_OS_API)) $$($1_LDFLAGS_$(PLATFORM)) $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(HOST_OS_API)) $$($1_LDFLAGS_$(PLATFORM))
$1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(HOST_OS_API)) $$($1_LDFLAGS_SUFFIX_$(PLATFORM)) $1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(HOST_OS_API)) $$($1_LDFLAGS_SUFFIX_$(PLATFORM))
ifneq (,$$($1_REAL_MAPFILE))
$1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
endif
ifneq (,$$($1_LIB)) ifneq (,$$($1_LIB))
ifeq (dynamic,$$(patsubst %$(SHARED_LIBRARY_SUFFIX),dynamic,$$($1_LIB))) ifeq (dynamic,$$(patsubst %$(SHARED_LIBRARY_SUFFIX),dynamic,$$($1_LIB)))
# Generating a dynamic library. # Generating a dynamic library.
$1_EXTRA_LDFLAGS+=$$(call SET_SHARED_LIBRARY_NAME,$$(notdir $$($1_LIB))) $1_EXTRA_LDFLAGS+=$$(call SET_SHARED_LIBRARY_NAME,$$(notdir $$($1_LIB)))
$$($1_LIB) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LIB) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE)
$$(call LINKING_MSG,$$(notdir $$($1_LIB))) $$(call LINKING_MSG,$$(notdir $$($1_LIB)))
$$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$($1_LIB) \ $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$($1_LIB) \
$$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX)
@ -269,9 +307,13 @@ define SetupNativeCompilation
endif endif
ifneq (,$$($1_EXE)) ifneq (,$$($1_EXE))
# A executable binary has been specified, setup the target for it. # A executable binary has been specified, setup the target for it.
$$($1_EXE) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_EXE) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST)
$$(call LINKING_EXE_MSG,$$(notdir $$($1_EXE))) $$(call LINKING_EXE_MSG,$$(notdir $$($1_EXE)))
$$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_EXE) \ $$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_EXE) \
$$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
$$($1_EXTRA_LDFLAGS_SUFFIX)
ifneq (,$$($1_GEN_MANIFEST))
$(MT) -nologo /manifest $$($1_GEN_MANIFEST) /outputresource:$$@;#1
endif
endif endif
endef endef

View File

@ -163,3 +163,5 @@ b8cbfb31139f820e5e094ba71449e58159fbe22e jdk8-b38
785af00e2827990f149b32ec37f523dbca3efdd1 jdk8-b39 785af00e2827990f149b32ec37f523dbca3efdd1 jdk8-b39
56d030e5035fdee5bba6cf318a06287fda5d67ec jdk8-b40 56d030e5035fdee5bba6cf318a06287fda5d67ec jdk8-b40
113f0d5f0a08aa0947b3edf783b603e7f042748a jdk8-b41 113f0d5f0a08aa0947b3edf783b603e7f042748a jdk8-b41
79cc42c9c71bbd6630ede681642e98f5e4a841fa jdk8-b42
cd879aff5d3cc1f58829aab3116880aa19525b78 jdk8-b43

View File

@ -143,7 +143,7 @@ ifeq ($(SYSTEM_UNAME), SunOS)
REQUIRED_FREE_SPACE=1040000 REQUIRED_FREE_SPACE=1040000
endif endif
# How much RAM does this machine have: # How much RAM does this machine have:
MB_OF_MEMORY=$(shell /etc/prtconf | fgrep 'Memory size:' | expand | cut -d' ' -f3) MB_OF_MEMORY:=$(shell /usr/sbin/prtconf 2>/dev/null | fgrep 'Memory size:' | expand | cut -d' ' -f3)
endif endif
# Platform settings specific to Linux # Platform settings specific to Linux

View File

@ -27,13 +27,14 @@
# Makefile for building the corba workspace. # Makefile for building the corba workspace.
# #
# This must be the first rule
default: all
include $(SPEC) include $(SPEC)
include MakeBase.gmk include MakeBase.gmk
include JavaCompilation.gmk include JavaCompilation.gmk
include IdlCompilation.gmk include IdlCompilation.gmk
default: all
JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \
-jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar
# The Corba sources are old and generates a LOT of warnings. # The Corba sources are old and generates a LOT of warnings.
@ -105,9 +106,9 @@ $(eval $(call SetupArchive,ARCHIVE_LOGUTIL,$(BUILD_LOGUTIL),\
$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/%SystemException.java : \ $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/%SystemException.java : \
$(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc \ $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc \
$(CORBA_OUTPUTDIR)/btjars/logutil.jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar
mkdir -p $(@D) $(MKDIR) -p $(@D)
rm -f $(@D)/_the_wrappers.d $(RM) -f $(@D)/_the_wrappers.d
echo Generating class file from $*.mc $(ECHO) Generating class file from $*.mc
$(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-class $< $(@D) $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-class $< $(@D)
# Generate LogWrapper properties file by concatening resource files # Generate LogWrapper properties file by concatening resource files
@ -120,15 +121,15 @@ $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properti
$(CORBA_OUTPUTDIR)/logwrappers/ORBUtilSystemException.resource \ $(CORBA_OUTPUTDIR)/logwrappers/ORBUtilSystemException.resource \
$(CORBA_OUTPUTDIR)/logwrappers/POASystemException.resource \ $(CORBA_OUTPUTDIR)/logwrappers/POASystemException.resource \
$(CORBA_OUTPUTDIR)/logwrappers/UtilSystemException.resource $(CORBA_OUTPUTDIR)/logwrappers/UtilSystemException.resource
mkdir -p $(@D) $(MKDIR) -p $(@D)
echo Concatenating 8 resource files into $(@F) $(ECHO) Concatenating 8 resource files into $(@F)
$(CAT) $^ > $@ $(CAT) $^ > $@
# The resources files are generated from lisp-like .mc files. # The resources files are generated from lisp-like .mc files.
$(CORBA_OUTPUTDIR)/logwrappers/%SystemException.resource : $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc $(CORBA_OUTPUTDIR)/btjars/logutil.jar $(CORBA_OUTPUTDIR)/logwrappers/%SystemException.resource : $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc $(CORBA_OUTPUTDIR)/btjars/logutil.jar
mkdir -p $(@D) $(MKDIR) -p $(@D)
rm -f $(@D)/_the_wrappers.d $(RM) -f $(@D)/_the_wrappers.d
echo Generating resource file from $*.mc $(ECHO) Generating resource file from $*.mc
$(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-resource $< $(@D) $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-resource $< $(@D)
@ -142,8 +143,8 @@ $(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d : $(CORBA_OUTPUTDIR)/btjars/logut
$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/POASystemException.java \ $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/POASystemException.java \
$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/UtilSystemException.java \ $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/UtilSystemException.java \
$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties
mkdir -p $(@D) $(MKDIR) -p $(@D)
echo LOGWRAPPERS_ARE_CREATED=yes > $@ $(ECHO) LOGWRAPPERS_ARE_CREATED=yes > $@
# Trigger the generation of the logwrappers. After the logwrapper classes and # Trigger the generation of the logwrappers. After the logwrapper classes and
# resources have been created, then the makefile will restart and the newly # resources have been created, then the makefile will restart and the newly
@ -167,8 +168,8 @@ ifeq ($(LOGWRAPPERS_ARE_CREATED),yes)
$(BUILD_IDLS) : $(CORBA_OUTPUTDIR)/btjars/idlj.jar $(BUILD_IDLS) : $(CORBA_OUTPUTDIR)/btjars/idlj.jar
$(CORBA_OUTPUTDIR)/gensrc/_the_idls.d : $(BUILD_IDLS) $(CORBA_OUTPUTDIR)/btjars/idlj.jar $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d : $(BUILD_IDLS) $(CORBA_OUTPUTDIR)/btjars/idlj.jar
mkdir -p $(@D) $(MKDIR) -p $(@D)
echo IDLS_ARE_CREATED=yes > $@ $(ECHO) IDLS_ARE_CREATED=yes > $@
-include $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d -include $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d
@ -229,15 +230,16 @@ ifeq ($(LOGWRAPPERS_ARE_CREATED),yes)
# The created src.zip now contains .java and .properties files used to create the classes in classes.jar # The created src.zip now contains .java and .properties files used to create the classes in classes.jar
# and is ready for inclusion into the jdk src.zip # and is ready for inclusion into the jdk src.zip
BIN_FILES:=$(CORBA_TOPDIR)/src/share/classes/org/omg/CORBA/orb.idl $(CORBA_TOPDIR)/src/share/classes/org/omg/CORBA/ir.idl BIN_FILES:=$(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/orb.idl \
$(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/ir.idl
$(CORBA_OUTPUTDIR)/dist/lib/bin.zip : $(BIN_FILES) $(CORBA_OUTPUTDIR)/dist/lib/classes.jar $(CORBA_OUTPUTDIR)/dist/lib/bin.zip : $(BIN_FILES) $(CORBA_OUTPUTDIR)/dist/lib/classes.jar
mkdir -p $(CORBA_OUTPUTDIR)/dist/lib $(MKDIR) -p $(CORBA_OUTPUTDIR)/dist/lib
mkdir -p $(CORBA_OUTPUTDIR)/lib $(MKDIR) -p $(CORBA_OUTPUTDIR)/lib
rm -f $@ $(RM) -f $@
echo Creating `basename $@` $(ECHO) Creating `basename $@`
cp $(CORBA_TOPDIR)/src/share/classes/org/omg/CORBA/*.idl $(CORBA_OUTPUTDIR)/lib $(CP) $(BIN_FILES) $(CORBA_OUTPUTDIR)/lib
chmod ug+w $(CORBA_OUTPUTDIR)/lib/* $(CHMOD) ug+w $(CORBA_OUTPUTDIR)/lib/*
(cd $(CORBA_OUTPUTDIR); $(ZIP) -q $@ lib/orb.idl lib/ir.idl) (cd $(CORBA_OUTPUTDIR); $(ZIP) -q $@ lib/orb.idl lib/ir.idl)
# The created bin.zip now contains the corba specific binaries: orb.idl, ir.idl # The created bin.zip now contains the corba specific binaries: orb.idl, ir.idl
@ -252,6 +254,6 @@ ifeq ($(LOGWRAPPERS_ARE_CREATED),yes)
endif endif
clean: clean:
rm -rf $(CORBA_OUTPUTDIR) $(RM) -rf $(CORBA_OUTPUTDIR)
.PHONY: default all clean clobber .PHONY: default all clean clobber

View File

@ -252,3 +252,6 @@ ff9decc8235d5af80ea45fda4ecbe643ea252564 jdk8-b40
785573170238f0eae6dc8e22ecf1050fbc9ea055 hs24-b12 785573170238f0eae6dc8e22ecf1050fbc9ea055 hs24-b12
37add4fa0296705f67481e1fd50e2900cd25e39b jdk8-b41 37add4fa0296705f67481e1fd50e2900cd25e39b jdk8-b41
bd568544be7fcd12a9327e6c448592198d57b043 hs24-b13 bd568544be7fcd12a9327e6c448592198d57b043 hs24-b13
55954061c6e8750ea39a63523fd65d580db6eeb1 jdk8-b42
e77b8e0ed1f84e3e268239e276c7ab64fa573baa jdk8-b43
5ba29a1db46ecb80a321ca873adb56a3fe6ad320 hs24-b14

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -50,8 +50,7 @@ public class ConstMethod extends Oop {
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
Type type = db.lookupType("constMethodOopDesc"); Type type = db.lookupType("constMethodOopDesc");
// Backpointer to non-const methodOop constants = new OopField(type.getOopField("_constants"), 0);
method = new OopField(type.getOopField("_method"), 0);
// The exception handler table. 4-tuples of ints [start_pc, end_pc, // The exception handler table. 4-tuples of ints [start_pc, end_pc,
// handler_pc, catch_type index] For methods with no exceptions the // handler_pc, catch_type index] For methods with no exceptions the
// table is pointing to Universe::the_empty_int_array // table is pointing to Universe::the_empty_int_array
@ -69,6 +68,7 @@ public class ConstMethod extends Oop {
nameIndex = new CIntField(type.getCIntegerField("_name_index"), 0); nameIndex = new CIntField(type.getCIntegerField("_name_index"), 0);
signatureIndex = new CIntField(type.getCIntegerField("_signature_index"), 0); signatureIndex = new CIntField(type.getCIntegerField("_signature_index"), 0);
genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"),0); genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"),0);
idnum = new CIntField(type.getCIntegerField("_method_idnum"), 0);
// start of byte code // start of byte code
bytecodeOffset = type.getSize(); bytecodeOffset = type.getSize();
@ -85,7 +85,7 @@ public class ConstMethod extends Oop {
} }
// Fields // Fields
private static OopField method; private static OopField constants;
private static OopField exceptionTable; private static OopField exceptionTable;
private static CIntField constMethodSize; private static CIntField constMethodSize;
private static ByteField flags; private static ByteField flags;
@ -93,6 +93,7 @@ public class ConstMethod extends Oop {
private static CIntField nameIndex; private static CIntField nameIndex;
private static CIntField signatureIndex; private static CIntField signatureIndex;
private static CIntField genericSignatureIndex; private static CIntField genericSignatureIndex;
private static CIntField idnum;
// start of bytecode // start of bytecode
private static long bytecodeOffset; private static long bytecodeOffset;
@ -100,9 +101,15 @@ public class ConstMethod extends Oop {
private static long checkedExceptionElementSize; private static long checkedExceptionElementSize;
private static long localVariableTableElementSize; private static long localVariableTableElementSize;
// Accessors for declared fields
public Method getMethod() { public Method getMethod() {
return (Method) method.getValue(this); InstanceKlass ik = (InstanceKlass)getConstants().getPoolHolder();
ObjArray methods = ik.getMethods();
return (Method)methods.getObjAt(getIdNum());
}
// Accessors for declared fields
public ConstantPool getConstants() {
return (ConstantPool) constants.getValue(this);
} }
public TypeArray getExceptionTable() { public TypeArray getExceptionTable() {
@ -133,6 +140,10 @@ public class ConstMethod extends Oop {
return genericSignatureIndex.getValue(this); return genericSignatureIndex.getValue(this);
} }
public long getIdNum() {
return idnum.getValue(this);
}
public Symbol getName() { public Symbol getName() {
return getMethod().getName(); return getMethod().getName();
} }
@ -223,7 +234,7 @@ public class ConstMethod extends Oop {
public void iterateFields(OopVisitor visitor, boolean doVMFields) { public void iterateFields(OopVisitor visitor, boolean doVMFields) {
super.iterateFields(visitor, doVMFields); super.iterateFields(visitor, doVMFields);
if (doVMFields) { if (doVMFields) {
visitor.doOop(method, true); visitor.doOop(constants, true);
visitor.doOop(exceptionTable, true); visitor.doOop(exceptionTable, true);
visitor.doCInt(constMethodSize, true); visitor.doCInt(constMethodSize, true);
visitor.doByte(flags, true); visitor.doByte(flags, true);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -48,7 +48,6 @@ public class Method extends Oop {
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
Type type = db.lookupType("methodOopDesc"); Type type = db.lookupType("methodOopDesc");
constMethod = new OopField(type.getOopField("_constMethod"), 0); constMethod = new OopField(type.getOopField("_constMethod"), 0);
constants = new OopField(type.getOopField("_constants"), 0);
methodData = new OopField(type.getOopField("_method_data"), 0); methodData = new OopField(type.getOopField("_method_data"), 0);
methodSize = new CIntField(type.getCIntegerField("_method_size"), 0); methodSize = new CIntField(type.getCIntegerField("_method_size"), 0);
maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0); maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0);
@ -83,7 +82,6 @@ public class Method extends Oop {
// Fields // Fields
private static OopField constMethod; private static OopField constMethod;
private static OopField constants;
private static OopField methodData; private static OopField methodData;
private static CIntField methodSize; private static CIntField methodSize;
private static CIntField maxStack; private static CIntField maxStack;
@ -125,7 +123,9 @@ public class Method extends Oop {
// Accessors for declared fields // Accessors for declared fields
public ConstMethod getConstMethod() { return (ConstMethod) constMethod.getValue(this); } public ConstMethod getConstMethod() { return (ConstMethod) constMethod.getValue(this); }
public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); } public ConstantPool getConstants() {
return getConstMethod().getConstants();
}
public MethodData getMethodData() { return (MethodData) methodData.getValue(this); } public MethodData getMethodData() { return (MethodData) methodData.getValue(this); }
public TypeArray getExceptionTable() { return getConstMethod().getExceptionTable(); } public TypeArray getExceptionTable() { return getConstMethod().getExceptionTable(); }
/** WARNING: this is in words, not useful in this system; use getObjectSize() instead */ /** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
@ -281,7 +281,6 @@ public class Method extends Oop {
super.iterateFields(visitor, doVMFields); super.iterateFields(visitor, doVMFields);
if (doVMFields) { if (doVMFields) {
visitor.doOop(constMethod, true); visitor.doOop(constMethod, true);
visitor.doOop(constants, true);
visitor.doCInt(methodSize, true); visitor.doCInt(methodSize, true);
visitor.doCInt(maxStack, true); visitor.doCInt(maxStack, true);
visitor.doCInt(maxLocals, true); visitor.doCInt(maxLocals, true);

View File

@ -214,7 +214,7 @@ endif
# Flags for generating make dependency flags. # Flags for generating make dependency flags.
ifneq ("${CC_VER_MAJOR}", "2") ifneq ("${CC_VER_MAJOR}", "2")
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
endif endif
# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp. # -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.

View File

@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2012
HS_MAJOR_VER=24 HS_MAJOR_VER=24
HS_MINOR_VER=0 HS_MINOR_VER=0
HS_BUILD_NUMBER=13 HS_BUILD_NUMBER=14
JDK_MAJOR_VER=1 JDK_MAJOR_VER=1
JDK_MINOR_VER=8 JDK_MINOR_VER=8

View File

@ -54,72 +54,72 @@ jprt.sync.push=false
# Define the Solaris platforms we want for the various releases # Define the Solaris platforms we want for the various releases
jprt.my.solaris.sparc.jdk8=solaris_sparc_5.10 jprt.my.solaris.sparc.jdk8=solaris_sparc_5.10
jprt.my.solaris.sparc.jdk7=solaris_sparc_5.10 jprt.my.solaris.sparc.jdk7=solaris_sparc_5.10
jprt.my.solaris.sparc.jdk7u4=${jprt.my.solaris.sparc.jdk7} jprt.my.solaris.sparc.jdk7u6=${jprt.my.solaris.sparc.jdk7}
jprt.my.solaris.sparc=${jprt.my.solaris.sparc.${jprt.tools.default.release}} jprt.my.solaris.sparc=${jprt.my.solaris.sparc.${jprt.tools.default.release}}
jprt.my.solaris.sparcv9.jdk8=solaris_sparcv9_5.10 jprt.my.solaris.sparcv9.jdk8=solaris_sparcv9_5.10
jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10 jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10
jprt.my.solaris.sparcv9.jdk7u4=${jprt.my.solaris.sparcv9.jdk7} jprt.my.solaris.sparcv9.jdk7u6=${jprt.my.solaris.sparcv9.jdk7}
jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}} jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}}
jprt.my.solaris.i586.jdk8=solaris_i586_5.10 jprt.my.solaris.i586.jdk8=solaris_i586_5.10
jprt.my.solaris.i586.jdk7=solaris_i586_5.10 jprt.my.solaris.i586.jdk7=solaris_i586_5.10
jprt.my.solaris.i586.jdk7u4=${jprt.my.solaris.i586.jdk7} jprt.my.solaris.i586.jdk7u6=${jprt.my.solaris.i586.jdk7}
jprt.my.solaris.i586=${jprt.my.solaris.i586.${jprt.tools.default.release}} jprt.my.solaris.i586=${jprt.my.solaris.i586.${jprt.tools.default.release}}
jprt.my.solaris.x64.jdk8=solaris_x64_5.10 jprt.my.solaris.x64.jdk8=solaris_x64_5.10
jprt.my.solaris.x64.jdk7=solaris_x64_5.10 jprt.my.solaris.x64.jdk7=solaris_x64_5.10
jprt.my.solaris.x64.jdk7u4=${jprt.my.solaris.x64.jdk7} jprt.my.solaris.x64.jdk7u6=${jprt.my.solaris.x64.jdk7}
jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}} jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}}
jprt.my.linux.i586.jdk8=linux_i586_2.6 jprt.my.linux.i586.jdk8=linux_i586_2.6
jprt.my.linux.i586.jdk7=linux_i586_2.6 jprt.my.linux.i586.jdk7=linux_i586_2.6
jprt.my.linux.i586.jdk7u4=${jprt.my.linux.i586.jdk7} jprt.my.linux.i586.jdk7u6=${jprt.my.linux.i586.jdk7}
jprt.my.linux.i586=${jprt.my.linux.i586.${jprt.tools.default.release}} jprt.my.linux.i586=${jprt.my.linux.i586.${jprt.tools.default.release}}
jprt.my.linux.x64.jdk8=linux_x64_2.6 jprt.my.linux.x64.jdk8=linux_x64_2.6
jprt.my.linux.x64.jdk7=linux_x64_2.6 jprt.my.linux.x64.jdk7=linux_x64_2.6
jprt.my.linux.x64.jdk7u4=${jprt.my.linux.x64.jdk7} jprt.my.linux.x64.jdk7u6=${jprt.my.linux.x64.jdk7}
jprt.my.linux.x64=${jprt.my.linux.x64.${jprt.tools.default.release}} jprt.my.linux.x64=${jprt.my.linux.x64.${jprt.tools.default.release}}
jprt.my.linux.ppc.jdk8=linux_ppc_2.6 jprt.my.linux.ppc.jdk8=linux_ppc_2.6
jprt.my.linux.ppc.jdk7=linux_ppc_2.6 jprt.my.linux.ppc.jdk7=linux_ppc_2.6
jprt.my.linux.ppc.jdk7u4=${jprt.my.linux.ppc.jdk7} jprt.my.linux.ppc.jdk7u6=${jprt.my.linux.ppc.jdk7}
jprt.my.linux.ppc=${jprt.my.linux.ppc.${jprt.tools.default.release}} jprt.my.linux.ppc=${jprt.my.linux.ppc.${jprt.tools.default.release}}
jprt.my.linux.ppcv2.jdk8=linux_ppcv2_2.6 jprt.my.linux.ppcv2.jdk8=linux_ppcv2_2.6
jprt.my.linux.ppcv2.jdk7=linux_ppcv2_2.6 jprt.my.linux.ppcv2.jdk7=linux_ppcv2_2.6
jprt.my.linux.ppcv2.jdk7u4=${jprt.my.linux.ppcv2.jdk7} jprt.my.linux.ppcv2.jdk7u6=${jprt.my.linux.ppcv2.jdk7}
jprt.my.linux.ppcv2=${jprt.my.linux.ppcv2.${jprt.tools.default.release}} jprt.my.linux.ppcv2=${jprt.my.linux.ppcv2.${jprt.tools.default.release}}
jprt.my.linux.ppcsflt.jdk8=linux_ppcsflt_2.6 jprt.my.linux.ppcsflt.jdk8=linux_ppcsflt_2.6
jprt.my.linux.ppcsflt.jdk7=linux_ppcsflt_2.6 jprt.my.linux.ppcsflt.jdk7=linux_ppcsflt_2.6
jprt.my.linux.ppcsflt.jdk7u4=${jprt.my.linux.ppcsflt.jdk7} jprt.my.linux.ppcsflt.jdk7u6=${jprt.my.linux.ppcsflt.jdk7}
jprt.my.linux.ppcsflt=${jprt.my.linux.ppcsflt.${jprt.tools.default.release}} jprt.my.linux.ppcsflt=${jprt.my.linux.ppcsflt.${jprt.tools.default.release}}
jprt.my.linux.armvfp.jdk8=linux_armvfp_2.6 jprt.my.linux.armvfp.jdk8=linux_armvfp_2.6
jprt.my.linux.armvfp.jdk7=linux_armvfp_2.6 jprt.my.linux.armvfp.jdk7=linux_armvfp_2.6
jprt.my.linux.armvfp.jdk7u4=${jprt.my.linux.armvfp.jdk7} jprt.my.linux.armvfp.jdk7u6=${jprt.my.linux.armvfp.jdk7}
jprt.my.linux.armvfp=${jprt.my.linux.armvfp.${jprt.tools.default.release}} jprt.my.linux.armvfp=${jprt.my.linux.armvfp.${jprt.tools.default.release}}
jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6 jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6
jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6 jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6
jprt.my.linux.armsflt.jdk7u4=${jprt.my.linux.armsflt.jdk7} jprt.my.linux.armsflt.jdk7u6=${jprt.my.linux.armsflt.jdk7}
jprt.my.linux.armsflt=${jprt.my.linux.armsflt.${jprt.tools.default.release}} jprt.my.linux.armsflt=${jprt.my.linux.armsflt.${jprt.tools.default.release}}
jprt.my.macosx.x64.jdk8=macosx_x64_10.7 jprt.my.macosx.x64.jdk8=macosx_x64_10.7
jprt.my.macosx.x64.jdk7=macosx_x64_10.7 jprt.my.macosx.x64.jdk7=macosx_x64_10.7
jprt.my.macosx.x64.jdk7u4=${jprt.my.macosx.x64.jdk7} jprt.my.macosx.x64.jdk7u6=${jprt.my.macosx.x64.jdk7}
jprt.my.macosx.x64=${jprt.my.macosx.x64.${jprt.tools.default.release}} jprt.my.macosx.x64=${jprt.my.macosx.x64.${jprt.tools.default.release}}
jprt.my.windows.i586.jdk8=windows_i586_5.1 jprt.my.windows.i586.jdk8=windows_i586_5.1
jprt.my.windows.i586.jdk7=windows_i586_5.1 jprt.my.windows.i586.jdk7=windows_i586_5.1
jprt.my.windows.i586.jdk7u4=${jprt.my.windows.i586.jdk7} jprt.my.windows.i586.jdk7u6=${jprt.my.windows.i586.jdk7}
jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}} jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}}
jprt.my.windows.x64.jdk8=windows_x64_5.2 jprt.my.windows.x64.jdk8=windows_x64_5.2
jprt.my.windows.x64.jdk7=windows_x64_5.2 jprt.my.windows.x64.jdk7=windows_x64_5.2
jprt.my.windows.x64.jdk7u4=${jprt.my.windows.x64.jdk7} jprt.my.windows.x64.jdk7u6=${jprt.my.windows.x64.jdk7}
jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}} jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}}
# Standard list of jprt build targets for this source tree # Standard list of jprt build targets for this source tree
@ -154,7 +154,7 @@ jprt.build.targets.all=${jprt.build.targets.standard}, \
jprt.build.targets.jdk8=${jprt.build.targets.all} jprt.build.targets.jdk8=${jprt.build.targets.all}
jprt.build.targets.jdk7=${jprt.build.targets.all} jprt.build.targets.jdk7=${jprt.build.targets.all}
jprt.build.targets.jdk7u4=${jprt.build.targets.all} jprt.build.targets.jdk7u6=${jprt.build.targets.all}
jprt.build.targets=${jprt.build.targets.${jprt.tools.default.release}} jprt.build.targets=${jprt.build.targets.${jprt.tools.default.release}}
# Subset lists of test targets for this source tree # Subset lists of test targets for this source tree
@ -346,12 +346,12 @@ jprt.my.macosx.x64.test.targets = \
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_CMS, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_CMS, \
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_G1, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_G1, \
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParOldGC ${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \
# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default, \
# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default_tiered, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \
# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \
# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_G1, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_G1, \
# ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParOldGC ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParOldGC
jprt.my.windows.i586.test.targets = \ jprt.my.windows.i586.test.targets = \
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-jvm98, \ ${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-jvm98, \
@ -447,7 +447,7 @@ jprt.test.targets.embedded= \
jprt.test.targets.jdk8=${jprt.test.targets.standard} jprt.test.targets.jdk8=${jprt.test.targets.standard}
jprt.test.targets.jdk7=${jprt.test.targets.standard} jprt.test.targets.jdk7=${jprt.test.targets.standard}
jprt.test.targets.jdk7u4=${jprt.test.targets.jdk7} jprt.test.targets.jdk7u6=${jprt.test.targets.jdk7}
jprt.test.targets=${jprt.test.targets.${jprt.tools.default.release}} jprt.test.targets=${jprt.test.targets.${jprt.tools.default.release}}
# The default test/Makefile targets that should be run # The default test/Makefile targets that should be run
@ -507,6 +507,9 @@ jprt.make.rule.test.targets.embedded = \
jprt.make.rule.test.targets.jdk8=${jprt.make.rule.test.targets.standard} jprt.make.rule.test.targets.jdk8=${jprt.make.rule.test.targets.standard}
jprt.make.rule.test.targets.jdk7=${jprt.make.rule.test.targets.standard} jprt.make.rule.test.targets.jdk7=${jprt.make.rule.test.targets.standard}
jprt.make.rule.test.targets.jdk7u4=${jprt.make.rule.test.targets.jdk7} jprt.make.rule.test.targets.jdk7u6=${jprt.make.rule.test.targets.jdk7}
jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}} jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}}
# 7155453: Work-around to prevent popups on OSX from blocking test completion
# but the work-around is added to all platforms to be consistent
jprt.jbb.options=-Djava.awt.headless=true

View File

@ -166,7 +166,7 @@ endif
# Flags for generating make dependency flags. # Flags for generating make dependency flags.
ifneq ("${CC_VER_MAJOR}", "2") ifneq ("${CC_VER_MAJOR}", "2")
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
endif endif
# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp. # -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.

View File

@ -141,7 +141,7 @@ OPT_CFLAGS/NOOPT=-O0
# Flags for generating make dependency flags. # Flags for generating make dependency flags.
ifneq ("${CC_VER_MAJOR}", "2") ifneq ("${CC_VER_MAJOR}", "2")
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
endif endif
# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp. # -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.

View File

@ -644,30 +644,6 @@ void LIRGenerator::do_CompareOp(CompareOp* x) {
} }
void LIRGenerator::do_AttemptUpdate(Intrinsic* x) {
assert(x->number_of_arguments() == 3, "wrong type");
LIRItem obj (x->argument_at(0), this); // AtomicLong object
LIRItem cmp_value (x->argument_at(1), this); // value to compare with field
LIRItem new_value (x->argument_at(2), this); // replace field with new_value if it matches cmp_value
obj.load_item();
cmp_value.load_item();
new_value.load_item();
// generate compare-and-swap and produce zero condition if swap occurs
int value_offset = sun_misc_AtomicLongCSImpl::value_offset();
LIR_Opr addr = FrameMap::O7_opr;
__ add(obj.result(), LIR_OprFact::intConst(value_offset), addr);
LIR_Opr t1 = FrameMap::G1_opr; // temp for 64-bit value
LIR_Opr t2 = FrameMap::G3_opr; // temp for 64-bit value
__ cas_long(addr, cmp_value.result(), new_value.result(), t1, t2);
// generate conditional move of boolean result
LIR_Opr result = rlock_result(x);
__ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0), result, T_LONG);
}
void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) { void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) {
assert(x->number_of_arguments() == 4, "wrong type"); assert(x->number_of_arguments() == 4, "wrong type");
LIRItem obj (x->argument_at(0), this); // object LIRItem obj (x->argument_at(0), this); // object
@ -989,10 +965,10 @@ void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
if (!x->klass()->is_loaded() || PatchALot) { if (!x->klass()->is_loaded() || PatchALot) {
patching_info = state_for(x, x->state_before()); patching_info = state_for(x, x->state_before());
// cannot re-use same xhandlers for multiple CodeEmitInfos, so // Cannot re-use same xhandlers for multiple CodeEmitInfos, so
// clone all handlers. This is handled transparently in other // clone all handlers (NOTE: Usually this is handled transparently
// places by the CodeEmitInfo cloning logic but is handled // by the CodeEmitInfo cloning logic in CodeStub constructors but
// specially here because a stub isn't being used. // is done explicitly here because a stub isn't being used).
x->set_exception_handlers(new XHandlers(x->exception_handlers())); x->set_exception_handlers(new XHandlers(x->exception_handlers()));
} }
CodeEmitInfo* info = state_for(x, x->state()); CodeEmitInfo* info = state_for(x, x->state());

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -490,7 +490,8 @@ address InterpreterGenerator::generate_accessor_entry(void) {
ConstantPoolCacheEntry::size()) * BytesPerWord), G1_scratch); ConstantPoolCacheEntry::size()) * BytesPerWord), G1_scratch);
// get constant pool cache // get constant pool cache
__ ld_ptr(G5_method, in_bytes(methodOopDesc::constants_offset()), G3_scratch); __ ld_ptr(G5_method, in_bytes(methodOopDesc::const_offset()), G3_scratch);
__ ld_ptr(G3_scratch, in_bytes(constMethodOopDesc::constants_offset()), G3_scratch);
__ ld_ptr(G3_scratch, constantPoolOopDesc::cache_offset_in_bytes(), G3_scratch); __ ld_ptr(G3_scratch, constantPoolOopDesc::cache_offset_in_bytes(), G3_scratch);
// get specific constant pool cache entry // get specific constant pool cache entry
@ -768,7 +769,8 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
// for static methods insert the mirror argument // for static methods insert the mirror argument
const int mirror_offset = in_bytes(Klass::java_mirror_offset()); const int mirror_offset = in_bytes(Klass::java_mirror_offset());
__ ld_ptr(Address(G5_method, 0, in_bytes(methodOopDesc:: constants_offset())), O1); __ ld_ptr(Address(G5_method, 0, in_bytes(methodOopDesc:: const_offset())), O1);
__ ld_ptr(Address(O1, 0, in_bytes(constMethodOopDesc::constants_offset())), O1);
__ ld_ptr(Address(O1, 0, constantPoolOopDesc::pool_holder_offset_in_bytes()), O1); __ ld_ptr(Address(O1, 0, constantPoolOopDesc::pool_holder_offset_in_bytes()), O1);
__ ld_ptr(O1, mirror_offset, O1); __ ld_ptr(O1, mirror_offset, O1);
// where the mirror handle body is allocated: // where the mirror handle body is allocated:
@ -1047,7 +1049,7 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
assert_different_registers(state, prev_state); assert_different_registers(state, prev_state);
assert_different_registers(prev_state, G3_scratch); assert_different_registers(prev_state, G3_scratch);
const Register Gtmp = G3_scratch; const Register Gtmp = G3_scratch;
const Address constants (G5_method, 0, in_bytes(methodOopDesc::constants_offset())); const Address constMethod (G5_method, 0, in_bytes(methodOopDesc::const_offset()));
const Address access_flags (G5_method, 0, in_bytes(methodOopDesc::access_flags_offset())); const Address access_flags (G5_method, 0, in_bytes(methodOopDesc::access_flags_offset()));
const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset())); const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset()));
const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset())); const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset()));
@ -1155,7 +1157,8 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
__ set((int) BytecodeInterpreter::method_entry, O1); __ set((int) BytecodeInterpreter::method_entry, O1);
__ st(O1, XXX_STATE(_msg)); __ st(O1, XXX_STATE(_msg));
__ ld_ptr(constants, O3); __ ld_ptr(constMethod, O3);
__ ld_ptr(O3, in_bytes(constMethodOopDesc::constants_offset()), O3);
__ ld_ptr(O3, constantPoolOopDesc::cache_offset_in_bytes(), O2); __ ld_ptr(O3, constantPoolOopDesc::cache_offset_in_bytes(), O2);
__ st_ptr(O2, XXX_STATE(_constants)); __ st_ptr(O2, XXX_STATE(_constants));
@ -1178,7 +1181,8 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
__ ld_ptr(XXX_STATE(_locals), O1); __ ld_ptr(XXX_STATE(_locals), O1);
__ br( Assembler::zero, true, Assembler::pt, got_obj); __ br( Assembler::zero, true, Assembler::pt, got_obj);
__ delayed()->ld_ptr(O1, 0, O1); // get receiver for not-static case __ delayed()->ld_ptr(O1, 0, O1); // get receiver for not-static case
__ ld_ptr(constants, O1); __ ld_ptr(constMethod, O1);
__ ld_ptr( O1, in_bytes(constMethodOopDesc::constants_offset()), O1);
__ ld_ptr( O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1); __ ld_ptr( O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1);
// lock the mirror, not the klassOop // lock the mirror, not the klassOop
__ ld_ptr( O1, mirror_offset, O1); __ ld_ptr( O1, mirror_offset, O1);
@ -1536,7 +1540,7 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
const Register Gtmp1 = G3_scratch; const Register Gtmp1 = G3_scratch;
// const Register Lmirror = L1; // native mirror (native calls only) // const Register Lmirror = L1; // native mirror (native calls only)
const Address constants (G5_method, 0, in_bytes(methodOopDesc::constants_offset())); const Address constMethod (G5_method, 0, in_bytes(methodOopDesc::const_offset()));
const Address access_flags (G5_method, 0, in_bytes(methodOopDesc::access_flags_offset())); const Address access_flags (G5_method, 0, in_bytes(methodOopDesc::access_flags_offset()));
const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset())); const Address size_of_parameters(G5_method, 0, in_bytes(methodOopDesc::size_of_parameters_offset()));
const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset())); const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset()));

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -934,8 +934,14 @@ void InterpreterMacroAssembler::index_check(Register array, Register index, int
} }
void InterpreterMacroAssembler::get_const(Register Rdst) {
ld_ptr(Lmethod, in_bytes(methodOopDesc::const_offset()), Rdst);
}
void InterpreterMacroAssembler::get_constant_pool(Register Rdst) { void InterpreterMacroAssembler::get_constant_pool(Register Rdst) {
ld_ptr(Lmethod, in_bytes(methodOopDesc::constants_offset()), Rdst); get_const(Rdst);
ld_ptr(Rdst, in_bytes(constMethodOopDesc::constants_offset()), Rdst);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -205,6 +205,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
void index_check(Register array, Register index, int index_shift, Register tmp, Register res); void index_check(Register array, Register index, int index_shift, Register tmp, Register res);
void index_check_without_pop(Register array, Register index, int index_shift, Register tmp, Register res); void index_check_without_pop(Register array, Register index, int index_shift, Register tmp, Register res);
void get_const(Register Rdst);
void get_constant_pool(Register Rdst); void get_constant_pool(Register Rdst);
void get_constant_pool_cache(Register Rdst); void get_constant_pool_cache(Register Rdst);
void get_cpool_and_tags(Register Rcpool, Register Rtags); void get_cpool_and_tags(Register Rcpool, Register Rtags);

View File

@ -827,7 +827,6 @@ void emit_form3_mem_reg(CodeBuffer &cbuf, const MachNode* n, int primary, int te
// a Load // a Load
// inputs are (0:control, 1:memory, 2:address) // inputs are (0:control, 1:memory, 2:address)
if (!(n->ideal_Opcode()==ld_op) && // Following are special cases if (!(n->ideal_Opcode()==ld_op) && // Following are special cases
!(n->ideal_Opcode()==Op_LoadLLocked && ld_op==Op_LoadI) &&
!(n->ideal_Opcode()==Op_LoadPLocked && ld_op==Op_LoadP) && !(n->ideal_Opcode()==Op_LoadPLocked && ld_op==Op_LoadP) &&
!(n->ideal_Opcode()==Op_LoadI && ld_op==Op_LoadF) && !(n->ideal_Opcode()==Op_LoadI && ld_op==Op_LoadF) &&
!(n->ideal_Opcode()==Op_LoadF && ld_op==Op_LoadI) && !(n->ideal_Opcode()==Op_LoadF && ld_op==Op_LoadI) &&
@ -7306,17 +7305,6 @@ instruct loadPLocked(iRegP dst, memory mem) %{
ins_pipe(iload_mem); ins_pipe(iload_mem);
%} %}
// LoadL-locked. Same as a regular long load when used with a compare-swap
instruct loadLLocked(iRegL dst, memory mem) %{
match(Set dst (LoadLLocked mem));
ins_cost(MEMORY_REF_COST);
size(4);
format %{ "LDX $mem,$dst\t! long" %}
opcode(Assembler::ldx_op3);
ins_encode(simple_form3_mem_reg( mem, dst ) );
ins_pipe(iload_mem);
%}
instruct storePConditional( iRegP heap_top_ptr, iRegP oldval, g3RegP newval, flagsRegP pcc ) %{ instruct storePConditional( iRegP heap_top_ptr, iRegP oldval, g3RegP newval, flagsRegP pcc ) %{
match(Set pcc (StorePConditional heap_top_ptr (Binary oldval newval))); match(Set pcc (StorePConditional heap_top_ptr (Binary oldval newval)));
effect( KILL newval ); effect( KILL newval );

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -371,7 +371,8 @@ void InterpreterGenerator::lock_method(void) {
__ br( Assembler::zero, true, Assembler::pt, done); __ br( Assembler::zero, true, Assembler::pt, done);
__ delayed()->ld_ptr(Llocals, Interpreter::local_offset_in_bytes(0), O0); // get receiver for not-static case __ delayed()->ld_ptr(Llocals, Interpreter::local_offset_in_bytes(0), O0); // get receiver for not-static case
__ ld_ptr( Lmethod, in_bytes(methodOopDesc::constants_offset()), O0); __ ld_ptr( Lmethod, in_bytes(methodOopDesc::const_offset()), O0);
__ ld_ptr( O0, in_bytes(constMethodOopDesc::constants_offset()), O0);
__ ld_ptr( O0, constantPoolOopDesc::pool_holder_offset_in_bytes(), O0); __ ld_ptr( O0, constantPoolOopDesc::pool_holder_offset_in_bytes(), O0);
// lock the mirror, not the klassOop // lock the mirror, not the klassOop
@ -670,7 +671,8 @@ address InterpreterGenerator::generate_accessor_entry(void) {
ConstantPoolCacheEntry::size()) * BytesPerWord), G1_scratch); ConstantPoolCacheEntry::size()) * BytesPerWord), G1_scratch);
// get constant pool cache // get constant pool cache
__ ld_ptr(G5_method, methodOopDesc::constants_offset(), G3_scratch); __ ld_ptr(G5_method, methodOopDesc::const_offset(), G3_scratch);
__ ld_ptr(G3_scratch, constMethodOopDesc::constants_offset(), G3_scratch);
__ ld_ptr(G3_scratch, constantPoolOopDesc::cache_offset_in_bytes(), G3_scratch); __ ld_ptr(G3_scratch, constantPoolOopDesc::cache_offset_in_bytes(), G3_scratch);
// get specific constant pool cache entry // get specific constant pool cache entry
@ -993,7 +995,8 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
// for static methods insert the mirror argument // for static methods insert the mirror argument
const int mirror_offset = in_bytes(Klass::java_mirror_offset()); const int mirror_offset = in_bytes(Klass::java_mirror_offset());
__ ld_ptr(Lmethod, methodOopDesc:: constants_offset(), O1); __ ld_ptr(Lmethod, methodOopDesc:: const_offset(), O1);
__ ld_ptr(O1, constMethodOopDesc::constants_offset(), O1);
__ ld_ptr(O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1); __ ld_ptr(O1, constantPoolOopDesc::pool_holder_offset_in_bytes(), O1);
__ ld_ptr(O1, mirror_offset, O1); __ ld_ptr(O1, mirror_offset, O1);
#ifdef ASSERT #ifdef ASSERT

View File

@ -6927,21 +6927,42 @@ void MacroAssembler::pow_exp_core_encoding() {
addptr(rsp,sizeof(jdouble)); addptr(rsp,sizeof(jdouble));
} }
void MacroAssembler::increase_precision() {
subptr(rsp, BytesPerWord);
fnstcw(Address(rsp, 0));
movl(rax, Address(rsp, 0));
orl(rax, 0x300);
push(rax);
fldcw(Address(rsp, 0));
pop(rax);
}
void MacroAssembler::restore_precision() {
fldcw(Address(rsp, 0));
addptr(rsp, BytesPerWord);
}
void MacroAssembler::fast_pow() { void MacroAssembler::fast_pow() {
// computes X^Y = 2^(Y * log2(X)) // computes X^Y = 2^(Y * log2(X))
// if fast computation is not possible, result is NaN. Requires // if fast computation is not possible, result is NaN. Requires
// fallback from user of this macro. // fallback from user of this macro.
// increase precision for intermediate steps of the computation
increase_precision();
fyl2x(); // Stack: (Y*log2(X)) ... fyl2x(); // Stack: (Y*log2(X)) ...
pow_exp_core_encoding(); // Stack: exp(X) ... pow_exp_core_encoding(); // Stack: exp(X) ...
restore_precision();
} }
void MacroAssembler::fast_exp() { void MacroAssembler::fast_exp() {
// computes exp(X) = 2^(X * log2(e)) // computes exp(X) = 2^(X * log2(e))
// if fast computation is not possible, result is NaN. Requires // if fast computation is not possible, result is NaN. Requires
// fallback from user of this macro. // fallback from user of this macro.
// increase precision for intermediate steps of the computation
increase_precision();
fldl2e(); // Stack: log2(e) X ... fldl2e(); // Stack: log2(e) X ...
fmulp(1); // Stack: (X*log2(e)) ... fmulp(1); // Stack: (X*log2(e)) ...
pow_exp_core_encoding(); // Stack: exp(X) ... pow_exp_core_encoding(); // Stack: exp(X) ...
restore_precision();
} }
void MacroAssembler::pow_or_exp(bool is_exp, int num_fpu_regs_in_use) { void MacroAssembler::pow_or_exp(bool is_exp, int num_fpu_regs_in_use) {

View File

@ -2395,6 +2395,8 @@ class MacroAssembler: public Assembler {
// runtime call. // runtime call.
void fast_pow(); void fast_pow();
void fast_exp(); void fast_exp();
void increase_precision();
void restore_precision();
// computes exp(x). Fallback to runtime call included. // computes exp(x). Fallback to runtime call included.
void exp_with_fallback(int num_fpu_regs_in_use) { pow_or_exp(true, num_fpu_regs_in_use); } void exp_with_fallback(int num_fpu_regs_in_use) { pow_or_exp(true, num_fpu_regs_in_use); }

View File

@ -2673,7 +2673,7 @@ void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2,
#endif // _LP64 #endif // _LP64
} }
} else { } else {
ShouldNotReachHere(); fatal(err_msg("unexpected type: %s", basictype_to_str(c->type())));
} }
// cpu register - address // cpu register - address
} else if (opr2->is_address()) { } else if (opr2->is_address()) {

View File

@ -718,35 +718,6 @@ void LIRGenerator::do_CompareOp(CompareOp* x) {
} }
void LIRGenerator::do_AttemptUpdate(Intrinsic* x) {
assert(x->number_of_arguments() == 3, "wrong type");
LIRItem obj (x->argument_at(0), this); // AtomicLong object
LIRItem cmp_value (x->argument_at(1), this); // value to compare with field
LIRItem new_value (x->argument_at(2), this); // replace field with new_value if it matches cmp_value
// compare value must be in rdx,eax (hi,lo); may be destroyed by cmpxchg8 instruction
cmp_value.load_item_force(FrameMap::long0_opr);
// new value must be in rcx,ebx (hi,lo)
new_value.load_item_force(FrameMap::long1_opr);
// object pointer register is overwritten with field address
obj.load_item();
// generate compare-and-swap; produces zero condition if swap occurs
int value_offset = sun_misc_AtomicLongCSImpl::value_offset();
LIR_Opr addr = new_pointer_register();
__ leal(LIR_OprFact::address(new LIR_Address(obj.result(), value_offset, T_LONG)), addr);
LIR_Opr t1 = LIR_OprFact::illegalOpr; // no temp needed
LIR_Opr t2 = LIR_OprFact::illegalOpr; // no temp needed
__ cas_long(addr, cmp_value.result(), new_value.result(), t1, t2);
// generate conditional move of boolean result
LIR_Opr result = rlock_result(x);
__ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0), result, T_LONG);
}
void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) { void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) {
assert(x->number_of_arguments() == 4, "wrong type"); assert(x->number_of_arguments() == 4, "wrong type");
LIRItem obj (x->argument_at(0), this); // object LIRItem obj (x->argument_at(0), this); // object
@ -1116,10 +1087,10 @@ void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
if (!x->klass()->is_loaded() || PatchALot) { if (!x->klass()->is_loaded() || PatchALot) {
patching_info = state_for(x, x->state_before()); patching_info = state_for(x, x->state_before());
// cannot re-use same xhandlers for multiple CodeEmitInfos, so // Cannot re-use same xhandlers for multiple CodeEmitInfos, so
// clone all handlers. This is handled transparently in other // clone all handlers (NOTE: Usually this is handled transparently
// places by the CodeEmitInfo cloning logic but is handled // by the CodeEmitInfo cloning logic in CodeStub constructors but
// specially here because a stub isn't being used. // is done explicitly here because a stub isn't being used).
x->set_exception_handlers(new XHandlers(x->exception_handlers())); x->set_exception_handlers(new XHandlers(x->exception_handlers()));
} }
CodeEmitInfo* info = state_for(x, x->state()); CodeEmitInfo* info = state_for(x, x->state());

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -481,7 +481,8 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
__ xorptr(rdx, rdx); __ xorptr(rdx, rdx);
__ movptr(STATE(_oop_temp), rdx); // state->_oop_temp = NULL (only really needed for native) __ movptr(STATE(_oop_temp), rdx); // state->_oop_temp = NULL (only really needed for native)
__ movptr(STATE(_mdx), rdx); // state->_mdx = NULL __ movptr(STATE(_mdx), rdx); // state->_mdx = NULL
__ movptr(rdx, Address(rbx, methodOopDesc::constants_offset())); __ movptr(rdx, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rdx, Address(rdx, constMethodOopDesc::constants_offset()));
__ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes())); __ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes()));
__ movptr(STATE(_constants), rdx); // state->_constants = constants() __ movptr(STATE(_constants), rdx); // state->_constants = constants()
@ -516,7 +517,8 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
__ testl(rax, JVM_ACC_STATIC); __ testl(rax, JVM_ACC_STATIC);
__ movptr(rax, Address(locals, 0)); // get receiver (assume this is frequent case) __ movptr(rax, Address(locals, 0)); // get receiver (assume this is frequent case)
__ jcc(Assembler::zero, done); __ jcc(Assembler::zero, done);
__ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); __ movptr(rax, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rax, Address(rax, constMethodOopDesc::constants_offset()));
__ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes()));
__ movptr(rax, Address(rax, mirror_offset)); __ movptr(rax, Address(rax, mirror_offset));
__ bind(done); __ bind(done);
@ -769,7 +771,8 @@ void InterpreterGenerator::lock_method(void) {
__ testl(rax, JVM_ACC_STATIC); __ testl(rax, JVM_ACC_STATIC);
__ movptr(rax, Address(rdi, 0)); // get receiver (assume this is frequent case) __ movptr(rax, Address(rdi, 0)); // get receiver (assume this is frequent case)
__ jcc(Assembler::zero, done); __ jcc(Assembler::zero, done);
__ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); __ movptr(rax, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rax, Address(rax, constMethodOopDesc::constants_offset()));
__ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes()));
__ movptr(rax, Address(rax, mirror_offset)); __ movptr(rax, Address(rax, mirror_offset));
__ bind(done); __ bind(done);
@ -821,9 +824,9 @@ address InterpreterGenerator::generate_accessor_entry(void) {
__ testptr(rax, rax); __ testptr(rax, rax);
__ jcc(Assembler::zero, slow_path); __ jcc(Assembler::zero, slow_path);
__ movptr(rdi, Address(rbx, methodOopDesc::constants_offset()));
// read first instruction word and extract bytecode @ 1 and index @ 2 // read first instruction word and extract bytecode @ 1 and index @ 2
__ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); __ movptr(rdx, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rdi, Address(rdx, constMethodOopDesc::constants_offset()));
__ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset())); __ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset()));
// Shift codes right to get the index on the right. // Shift codes right to get the index on the right.
// The bytecode fetched looks like <index><0xb4><0x2a> // The bytecode fetched looks like <index><0xb4><0x2a>
@ -1185,7 +1188,8 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
__ testl(t, JVM_ACC_STATIC); __ testl(t, JVM_ACC_STATIC);
__ jcc(Assembler::zero, L); __ jcc(Assembler::zero, L);
// get mirror // get mirror
__ movptr(t, Address(method, methodOopDesc:: constants_offset())); __ movptr(t, Address(method, methodOopDesc:: const_offset()));
__ movptr(t, Address(t, constMethodOopDesc::constants_offset()));
__ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes()));
__ movptr(t, Address(t, mirror_offset)); __ movptr(t, Address(t, mirror_offset));
// copy mirror into activation object // copy mirror into activation object

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -77,7 +77,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
// Helpers for runtime call arguments/results // Helpers for runtime call arguments/results
void get_method(Register reg) { movptr(reg, Address(rbp, frame::interpreter_frame_method_offset * wordSize)); } void get_method(Register reg) { movptr(reg, Address(rbp, frame::interpreter_frame_method_offset * wordSize)); }
void get_constant_pool(Register reg) { get_method(reg); movptr(reg, Address(reg, methodOopDesc::constants_offset())); } void get_const(Register reg) { get_method(reg); movptr(reg, Address(reg, methodOopDesc::const_offset())); }
void get_constant_pool(Register reg) { get_const(reg); movptr(reg, Address(reg, constMethodOopDesc::constants_offset())); }
void get_constant_pool_cache(Register reg) { get_constant_pool(reg); movptr(reg, Address(reg, constantPoolOopDesc::cache_offset_in_bytes())); } void get_constant_pool_cache(Register reg) { get_constant_pool(reg); movptr(reg, Address(reg, constantPoolOopDesc::cache_offset_in_bytes())); }
void get_cpool_and_tags(Register cpool, Register tags) { get_constant_pool(cpool); movptr(tags, Address(cpool, constantPoolOopDesc::tags_offset_in_bytes())); void get_cpool_and_tags(Register cpool, Register tags) { get_constant_pool(cpool); movptr(tags, Address(cpool, constantPoolOopDesc::tags_offset_in_bytes()));
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -84,9 +84,14 @@ class InterpreterMacroAssembler: public MacroAssembler {
movptr(reg, Address(rbp, frame::interpreter_frame_method_offset * wordSize)); movptr(reg, Address(rbp, frame::interpreter_frame_method_offset * wordSize));
} }
void get_constant_pool(Register reg) { void get_const(Register reg) {
get_method(reg); get_method(reg);
movptr(reg, Address(reg, methodOopDesc::constants_offset())); movptr(reg, Address(reg, methodOopDesc::const_offset()));
}
void get_constant_pool(Register reg) {
get_const(reg);
movptr(reg, Address(reg, constMethodOopDesc::constants_offset()));
} }
void get_constant_pool_cache(Register reg) { void get_constant_pool_cache(Register reg) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -566,7 +566,8 @@ void InterpreterGenerator::lock_method(void) {
__ testl(rax, JVM_ACC_STATIC); __ testl(rax, JVM_ACC_STATIC);
__ movptr(rax, Address(rdi, Interpreter::local_offset_in_bytes(0))); // get receiver (assume this is frequent case) __ movptr(rax, Address(rdi, Interpreter::local_offset_in_bytes(0))); // get receiver (assume this is frequent case)
__ jcc(Assembler::zero, done); __ jcc(Assembler::zero, done);
__ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); __ movptr(rax, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rax, Address(rax, constMethodOopDesc::constants_offset()));
__ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(rax, Address(rax, constantPoolOopDesc::pool_holder_offset_in_bytes()));
__ movptr(rax, Address(rax, mirror_offset)); __ movptr(rax, Address(rax, mirror_offset));
__ bind(done); __ bind(done);
@ -606,7 +607,8 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
__ push(0); __ push(0);
} }
__ movptr(rdx, Address(rbx, methodOopDesc::constants_offset())); __ movptr(rdx, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rdx, Address(rdx, constMethodOopDesc::constants_offset()));
__ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes())); __ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes()));
__ push(rdx); // set constant pool cache __ push(rdx); // set constant pool cache
__ push(rdi); // set locals pointer __ push(rdi); // set locals pointer
@ -661,9 +663,9 @@ address InterpreterGenerator::generate_accessor_entry(void) {
__ testptr(rax, rax); __ testptr(rax, rax);
__ jcc(Assembler::zero, slow_path); __ jcc(Assembler::zero, slow_path);
__ movptr(rdi, Address(rbx, methodOopDesc::constants_offset()));
// read first instruction word and extract bytecode @ 1 and index @ 2 // read first instruction word and extract bytecode @ 1 and index @ 2
__ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); __ movptr(rdx, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rdi, Address(rdx, constMethodOopDesc::constants_offset()));
__ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset())); __ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset()));
// Shift codes right to get the index on the right. // Shift codes right to get the index on the right.
// The bytecode fetched looks like <index><0xb4><0x2a> // The bytecode fetched looks like <index><0xb4><0x2a>
@ -1026,7 +1028,8 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
__ testl(t, JVM_ACC_STATIC); __ testl(t, JVM_ACC_STATIC);
__ jcc(Assembler::zero, L); __ jcc(Assembler::zero, L);
// get mirror // get mirror
__ movptr(t, Address(method, methodOopDesc:: constants_offset())); __ movptr(t, Address(method, methodOopDesc:: const_offset()));
__ movptr(t, Address(t, constMethodOopDesc::constants_offset()));
__ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes()));
__ movptr(t, Address(t, mirror_offset)); __ movptr(t, Address(t, mirror_offset));
// copy mirror into activation frame // copy mirror into activation frame

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -522,7 +522,8 @@ void InterpreterGenerator::lock_method(void) {
// get receiver (assume this is frequent case) // get receiver (assume this is frequent case)
__ movptr(rax, Address(r14, Interpreter::local_offset_in_bytes(0))); __ movptr(rax, Address(r14, Interpreter::local_offset_in_bytes(0)));
__ jcc(Assembler::zero, done); __ jcc(Assembler::zero, done);
__ movptr(rax, Address(rbx, methodOopDesc::constants_offset())); __ movptr(rax, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rax, Address(rax, constMethodOopDesc::constants_offset()));
__ movptr(rax, Address(rax, __ movptr(rax, Address(rax,
constantPoolOopDesc::pool_holder_offset_in_bytes())); constantPoolOopDesc::pool_holder_offset_in_bytes()));
__ movptr(rax, Address(rax, mirror_offset)); __ movptr(rax, Address(rax, mirror_offset));
@ -579,7 +580,8 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
__ push(0); __ push(0);
} }
__ movptr(rdx, Address(rbx, methodOopDesc::constants_offset())); __ movptr(rdx, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rdx, Address(rdx, constMethodOopDesc::constants_offset()));
__ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes())); __ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes()));
__ push(rdx); // set constant pool cache __ push(rdx); // set constant pool cache
__ push(r14); // set locals pointer __ push(r14); // set locals pointer
@ -629,9 +631,9 @@ address InterpreterGenerator::generate_accessor_entry(void) {
__ testptr(rax, rax); __ testptr(rax, rax);
__ jcc(Assembler::zero, slow_path); __ jcc(Assembler::zero, slow_path);
__ movptr(rdi, Address(rbx, methodOopDesc::constants_offset()));
// read first instruction word and extract bytecode @ 1 and index @ 2 // read first instruction word and extract bytecode @ 1 and index @ 2
__ movptr(rdx, Address(rbx, methodOopDesc::const_offset())); __ movptr(rdx, Address(rbx, methodOopDesc::const_offset()));
__ movptr(rdi, Address(rdx, constMethodOopDesc::constants_offset()));
__ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset())); __ movl(rdx, Address(rdx, constMethodOopDesc::codes_offset()));
// Shift codes right to get the index on the right. // Shift codes right to get the index on the right.
// The bytecode fetched looks like <index><0xb4><0x2a> // The bytecode fetched looks like <index><0xb4><0x2a>
@ -1020,7 +1022,8 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
__ testl(t, JVM_ACC_STATIC); __ testl(t, JVM_ACC_STATIC);
__ jcc(Assembler::zero, L); __ jcc(Assembler::zero, L);
// get mirror // get mirror
__ movptr(t, Address(method, methodOopDesc::constants_offset())); __ movptr(t, Address(method, methodOopDesc::const_offset()));
__ movptr(t, Address(t, constMethodOopDesc::constants_offset()));
__ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes())); __ movptr(t, Address(t, constantPoolOopDesc::pool_holder_offset_in_bytes()));
__ movptr(t, Address(t, mirror_offset)); __ movptr(t, Address(t, mirror_offset));
// copy mirror into activation frame // copy mirror into activation frame

View File

@ -5555,8 +5555,9 @@ instruct bytes_reverse_long(eRegL dst) %{
ins_pipe( ialu_reg_reg); ins_pipe( ialu_reg_reg);
%} %}
instruct bytes_reverse_unsigned_short(eRegI dst) %{ instruct bytes_reverse_unsigned_short(eRegI dst, eFlagsReg cr) %{
match(Set dst (ReverseBytesUS dst)); match(Set dst (ReverseBytesUS dst));
effect(KILL cr);
format %{ "BSWAP $dst\n\t" format %{ "BSWAP $dst\n\t"
"SHR $dst,16\n\t" %} "SHR $dst,16\n\t" %}
@ -5567,8 +5568,9 @@ instruct bytes_reverse_unsigned_short(eRegI dst) %{
ins_pipe( ialu_reg ); ins_pipe( ialu_reg );
%} %}
instruct bytes_reverse_short(eRegI dst) %{ instruct bytes_reverse_short(eRegI dst, eFlagsReg cr) %{
match(Set dst (ReverseBytesS dst)); match(Set dst (ReverseBytesS dst));
effect(KILL cr);
format %{ "BSWAP $dst\n\t" format %{ "BSWAP $dst\n\t"
"SAR $dst,16\n\t" %} "SAR $dst,16\n\t" %}
@ -5729,9 +5731,10 @@ instruct countTrailingZerosL(eRegI dst, eRegL src, eFlagsReg cr) %{
//---------- Population Count Instructions ------------------------------------- //---------- Population Count Instructions -------------------------------------
instruct popCountI(eRegI dst, eRegI src) %{ instruct popCountI(eRegI dst, eRegI src, eFlagsReg cr) %{
predicate(UsePopCountInstruction); predicate(UsePopCountInstruction);
match(Set dst (PopCountI src)); match(Set dst (PopCountI src));
effect(KILL cr);
format %{ "POPCNT $dst, $src" %} format %{ "POPCNT $dst, $src" %}
ins_encode %{ ins_encode %{
@ -5740,9 +5743,10 @@ instruct popCountI(eRegI dst, eRegI src) %{
ins_pipe(ialu_reg); ins_pipe(ialu_reg);
%} %}
instruct popCountI_mem(eRegI dst, memory mem) %{ instruct popCountI_mem(eRegI dst, memory mem, eFlagsReg cr) %{
predicate(UsePopCountInstruction); predicate(UsePopCountInstruction);
match(Set dst (PopCountI (LoadI mem))); match(Set dst (PopCountI (LoadI mem)));
effect(KILL cr);
format %{ "POPCNT $dst, $mem" %} format %{ "POPCNT $dst, $mem" %}
ins_encode %{ ins_encode %{
@ -7796,50 +7800,6 @@ instruct loadPLocked(eRegP dst, memory mem) %{
ins_pipe( ialu_reg_mem ); ins_pipe( ialu_reg_mem );
%} %}
// LoadLong-locked - same as a volatile long load when used with compare-swap
instruct loadLLocked(stackSlotL dst, memory mem) %{
predicate(UseSSE<=1);
match(Set dst (LoadLLocked mem));
ins_cost(200);
format %{ "FILD $mem\t# Atomic volatile long load\n\t"
"FISTp $dst" %}
ins_encode(enc_loadL_volatile(mem,dst));
ins_pipe( fpu_reg_mem );
%}
instruct loadLX_Locked(stackSlotL dst, memory mem, regD tmp) %{
predicate(UseSSE>=2);
match(Set dst (LoadLLocked mem));
effect(TEMP tmp);
ins_cost(180);
format %{ "MOVSD $tmp,$mem\t# Atomic volatile long load\n\t"
"MOVSD $dst,$tmp" %}
ins_encode %{
__ movdbl($tmp$$XMMRegister, $mem$$Address);
__ movdbl(Address(rsp, $dst$$disp), $tmp$$XMMRegister);
%}
ins_pipe( pipe_slow );
%}
instruct loadLX_reg_Locked(eRegL dst, memory mem, regD tmp) %{
predicate(UseSSE>=2);
match(Set dst (LoadLLocked mem));
effect(TEMP tmp);
ins_cost(160);
format %{ "MOVSD $tmp,$mem\t# Atomic volatile long load\n\t"
"MOVD $dst.lo,$tmp\n\t"
"PSRLQ $tmp,32\n\t"
"MOVD $dst.hi,$tmp" %}
ins_encode %{
__ movdbl($tmp$$XMMRegister, $mem$$Address);
__ movdl($dst$$Register, $tmp$$XMMRegister);
__ psrlq($tmp$$XMMRegister, 32);
__ movdl(HIGH_FROM_LOW($dst$$Register), $tmp$$XMMRegister);
%}
ins_pipe( pipe_slow );
%}
// Conditional-store of the updated heap-top. // Conditional-store of the updated heap-top.
// Used during allocation of the shared heap. // Used during allocation of the shared heap.
// Sets flags (EQ) on success. Implemented with a CMPXCHG on Intel. // Sets flags (EQ) on success. Implemented with a CMPXCHG on Intel.

View File

@ -6417,14 +6417,14 @@ instruct bytes_reverse_long(rRegL dst) %{
match(Set dst (ReverseBytesL dst)); match(Set dst (ReverseBytesL dst));
format %{ "bswapq $dst" %} format %{ "bswapq $dst" %}
opcode(0x0F, 0xC8); /* Opcode 0F /C8 */ opcode(0x0F, 0xC8); /* Opcode 0F /C8 */
ins_encode( REX_reg_wide(dst), OpcP, opc2_reg(dst) ); ins_encode( REX_reg_wide(dst), OpcP, opc2_reg(dst) );
ins_pipe( ialu_reg); ins_pipe( ialu_reg);
%} %}
instruct bytes_reverse_unsigned_short(rRegI dst) %{ instruct bytes_reverse_unsigned_short(rRegI dst, rFlagsReg cr) %{
match(Set dst (ReverseBytesUS dst)); match(Set dst (ReverseBytesUS dst));
effect(KILL cr);
format %{ "bswapl $dst\n\t" format %{ "bswapl $dst\n\t"
"shrl $dst,16\n\t" %} "shrl $dst,16\n\t" %}
@ -6435,8 +6435,9 @@ instruct bytes_reverse_unsigned_short(rRegI dst) %{
ins_pipe( ialu_reg ); ins_pipe( ialu_reg );
%} %}
instruct bytes_reverse_short(rRegI dst) %{ instruct bytes_reverse_short(rRegI dst, rFlagsReg cr) %{
match(Set dst (ReverseBytesS dst)); match(Set dst (ReverseBytesS dst));
effect(KILL cr);
format %{ "bswapl $dst\n\t" format %{ "bswapl $dst\n\t"
"sar $dst,16\n\t" %} "sar $dst,16\n\t" %}
@ -6564,9 +6565,10 @@ instruct countTrailingZerosL(rRegI dst, rRegL src, rFlagsReg cr) %{
//---------- Population Count Instructions ------------------------------------- //---------- Population Count Instructions -------------------------------------
instruct popCountI(rRegI dst, rRegI src) %{ instruct popCountI(rRegI dst, rRegI src, rFlagsReg cr) %{
predicate(UsePopCountInstruction); predicate(UsePopCountInstruction);
match(Set dst (PopCountI src)); match(Set dst (PopCountI src));
effect(KILL cr);
format %{ "popcnt $dst, $src" %} format %{ "popcnt $dst, $src" %}
ins_encode %{ ins_encode %{
@ -6575,9 +6577,10 @@ instruct popCountI(rRegI dst, rRegI src) %{
ins_pipe(ialu_reg); ins_pipe(ialu_reg);
%} %}
instruct popCountI_mem(rRegI dst, memory mem) %{ instruct popCountI_mem(rRegI dst, memory mem, rFlagsReg cr) %{
predicate(UsePopCountInstruction); predicate(UsePopCountInstruction);
match(Set dst (PopCountI (LoadI mem))); match(Set dst (PopCountI (LoadI mem)));
effect(KILL cr);
format %{ "popcnt $dst, $mem" %} format %{ "popcnt $dst, $mem" %}
ins_encode %{ ins_encode %{
@ -6587,9 +6590,10 @@ instruct popCountI_mem(rRegI dst, memory mem) %{
%} %}
// Note: Long.bitCount(long) returns an int. // Note: Long.bitCount(long) returns an int.
instruct popCountL(rRegI dst, rRegL src) %{ instruct popCountL(rRegI dst, rRegL src, rFlagsReg cr) %{
predicate(UsePopCountInstruction); predicate(UsePopCountInstruction);
match(Set dst (PopCountL src)); match(Set dst (PopCountL src));
effect(KILL cr);
format %{ "popcnt $dst, $src" %} format %{ "popcnt $dst, $src" %}
ins_encode %{ ins_encode %{
@ -6599,9 +6603,10 @@ instruct popCountL(rRegI dst, rRegL src) %{
%} %}
// Note: Long.bitCount(long) returns an int. // Note: Long.bitCount(long) returns an int.
instruct popCountL_mem(rRegI dst, memory mem) %{ instruct popCountL_mem(rRegI dst, memory mem, rFlagsReg cr) %{
predicate(UsePopCountInstruction); predicate(UsePopCountInstruction);
match(Set dst (PopCountL (LoadL mem))); match(Set dst (PopCountL (LoadL mem)));
effect(KILL cr);
format %{ "popcnt $dst, $mem" %} format %{ "popcnt $dst, $mem" %}
ins_encode %{ ins_encode %{
@ -7492,18 +7497,6 @@ instruct loadPLocked(rRegP dst, memory mem)
ins_pipe(ialu_reg_mem); // XXX ins_pipe(ialu_reg_mem); // XXX
%} %}
// LoadL-locked - same as a regular LoadL when used with compare-swap
instruct loadLLocked(rRegL dst, memory mem)
%{
match(Set dst (LoadLLocked mem));
ins_cost(125); // XXX
format %{ "movq $dst, $mem\t# long locked" %}
opcode(0x8B);
ins_encode(REX_reg_mem_wide(dst, mem), OpcP, reg_mem(dst, mem));
ins_pipe(ialu_reg_mem); // XXX
%}
// Conditional-store of the updated heap-top. // Conditional-store of the updated heap-top.
// Used during allocation of the shared heap. // Used during allocation of the shared heap.
// Sets flags (EQ) on success. Implemented with a CMPXCHG on Intel. // Sets flags (EQ) on success. Implemented with a CMPXCHG on Intel.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -220,10 +220,10 @@ int generateJvmOffsets(GEN_variant gen_variant) {
printf("\n"); printf("\n");
GEN_OFFS(methodOopDesc, _constMethod); GEN_OFFS(methodOopDesc, _constMethod);
GEN_OFFS(methodOopDesc, _constants);
GEN_OFFS(methodOopDesc, _access_flags); GEN_OFFS(methodOopDesc, _access_flags);
printf("\n"); printf("\n");
GEN_OFFS(constMethodOopDesc, _constants);
GEN_OFFS(constMethodOopDesc, _flags); GEN_OFFS(constMethodOopDesc, _flags);
GEN_OFFS(constMethodOopDesc, _code_size); GEN_OFFS(constMethodOopDesc, _code_size);
GEN_OFFS(constMethodOopDesc, _name_index); GEN_OFFS(constMethodOopDesc, _name_index);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -118,7 +118,7 @@ dtrace:helper:ustack:
copyin_offset(OFFSET_Symbol_body); copyin_offset(OFFSET_Symbol_body);
copyin_offset(OFFSET_methodOopDesc_constMethod); copyin_offset(OFFSET_methodOopDesc_constMethod);
copyin_offset(OFFSET_methodOopDesc_constants); copyin_offset(OFFSET_constMethodOopDesc_constants);
copyin_offset(OFFSET_constMethodOopDesc_name_index); copyin_offset(OFFSET_constMethodOopDesc_name_index);
copyin_offset(OFFSET_constMethodOopDesc_signature_index); copyin_offset(OFFSET_constMethodOopDesc_signature_index);
@ -359,8 +359,8 @@ dtrace:helper:ustack:
this->signatureIndex = copyin_uint16(this->constMethod + this->signatureIndex = copyin_uint16(this->constMethod +
OFFSET_constMethodOopDesc_signature_index); OFFSET_constMethodOopDesc_signature_index);
this->constantPool = copyin_ptr(this->methodOopPtr + this->constantPool = copyin_ptr(this->constMethod +
OFFSET_methodOopDesc_constants); OFFSET_constMethodOopDesc_constants);
this->nameSymbol = copyin_ptr(this->constantPool + this->nameSymbol = copyin_ptr(this->constantPool +
this->nameIndex * sizeof (pointer) + SIZE_constantPoolOopDesc); this->nameIndex * sizeof (pointer) + SIZE_constantPoolOopDesc);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -514,10 +514,10 @@ name_for_methodOop(jvm_agent_t* J, uint64_t methodOopPtr, char * result, size_t
char * signatureString = NULL; char * signatureString = NULL;
int err; int err;
err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constants, &constantPool);
CHECK_FAIL(err);
err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constMethod, &constMethod); err = read_pointer(J, methodOopPtr + OFFSET_methodOopDesc_constMethod, &constMethod);
CHECK_FAIL(err); CHECK_FAIL(err);
err = read_pointer(J->P, constMethod + OFFSET_constMethodOopDesc_constants, &constantPool);
CHECK_FAIL(err);
/* To get name string */ /* To get name string */
err = ps_pread(J->P, constMethod + OFFSET_constMethodOopDesc_name_index, &nameIndex, 2); err = ps_pread(J->P, constMethod + OFFSET_constMethodOopDesc_name_index, &nameIndex, 2);

View File

@ -1591,7 +1591,8 @@ void os::win32::print_windows_version(outputStream* st) {
case 5001: st->print(" Windows XP"); break; case 5001: st->print(" Windows XP"); break;
case 5002: case 5002:
case 6000: case 6000:
case 6001: { case 6001:
case 6002: {
// Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
// find out whether we are running on 64 bit processor or not. // find out whether we are running on 64 bit processor or not.
SYSTEM_INFO si; SYSTEM_INFO si;
@ -1623,6 +1624,14 @@ void os::win32::print_windows_version(outputStream* st) {
} }
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
st->print(" , 64 bit"); st->print(" , 64 bit");
} else if (os_vers == 6002) {
if (osvi.wProductType == VER_NT_WORKSTATION) {
st->print(" Windows 8");
} else {
st->print(" Windows Server 2012");
}
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
st->print(" , 64 bit");
} else { // future os } else { // future os
// Unrecognized windows, print out its major and minor versions // Unrecognized windows, print out its major and minor versions
st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion); st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);

View File

@ -261,7 +261,6 @@ Form::DataType Form::is_load_from_memory(const char *opType) const {
if( strcmp(opType,"LoadL")==0 ) return Form::idealL; if( strcmp(opType,"LoadL")==0 ) return Form::idealL;
if( strcmp(opType,"LoadL_unaligned")==0 ) return Form::idealL; if( strcmp(opType,"LoadL_unaligned")==0 ) return Form::idealL;
if( strcmp(opType,"LoadPLocked")==0 ) return Form::idealP; if( strcmp(opType,"LoadPLocked")==0 ) return Form::idealP;
if( strcmp(opType,"LoadLLocked")==0 ) return Form::idealL;
if( strcmp(opType,"LoadP")==0 ) return Form::idealP; if( strcmp(opType,"LoadP")==0 ) return Form::idealP;
if( strcmp(opType,"LoadN")==0 ) return Form::idealN; if( strcmp(opType,"LoadN")==0 ) return Form::idealN;
if( strcmp(opType,"LoadRange")==0 ) return Form::idealI; if( strcmp(opType,"LoadRange")==0 ) return Form::idealI;

View File

@ -3387,7 +3387,7 @@ int MatchNode::needs_ideal_memory_edge(FormDict &globals) const {
"Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" , "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" ,
"Load8B" ,"Load4B" ,"Load8C" ,"Load4C" ,"Load2C" ,"Load8S", "Load4S","Load2S", "Load8B" ,"Load4B" ,"Load8C" ,"Load4C" ,"Load2C" ,"Load8S", "Load4S","Load2S",
"LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned", "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
"LoadPLocked", "LoadLLocked", "LoadPLocked",
"StorePConditional", "StoreIConditional", "StoreLConditional", "StorePConditional", "StoreIConditional", "StoreLConditional",
"CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN",
"StoreCM", "StoreCM",

View File

@ -42,6 +42,11 @@ void Canonicalizer::set_canonical(Value x) {
// the instruction stream (because the instruction list is embedded // the instruction stream (because the instruction list is embedded
// in the instructions). // in the instructions).
if (canonical() != x) { if (canonical() != x) {
#ifndef PRODUCT
if (!x->has_printable_bci()) {
x->set_printable_bci(bci());
}
#endif
if (PrintCanonicalization) { if (PrintCanonicalization) {
PrintValueVisitor do_print_value; PrintValueVisitor do_print_value;
canonical()->input_values_do(&do_print_value); canonical()->input_values_do(&do_print_value);
@ -451,6 +456,28 @@ void Canonicalizer::do_Intrinsic (Intrinsic* x) {
} }
break; break;
} }
case vmIntrinsics::_isInstance : {
assert(x->number_of_arguments() == 2, "wrong type");
InstanceConstant* c = x->argument_at(0)->type()->as_InstanceConstant();
if (c != NULL && !c->value()->is_null_object()) {
// ciInstance::java_mirror_type() returns non-NULL only for Java mirrors
ciType* t = c->value()->as_instance()->java_mirror_type();
if (t->is_klass()) {
// substitute cls.isInstance(obj) of a constant Class into
// an InstantOf instruction
InstanceOf* i = new InstanceOf(t->as_klass(), x->argument_at(1), x->state_before());
set_canonical(i);
// and try to canonicalize even further
do_InstanceOf(i);
} else {
assert(t->is_primitive_type(), "should be a primitive type");
// cls.isInstance(obj) always returns false for primitive classes
set_constant(0);
}
}
break;
}
} }
} }
@ -677,8 +704,8 @@ void Canonicalizer::do_If(If* x) {
return; return;
} }
} }
set_canonical(canon);
set_bci(cmp->state_before()->bci()); set_bci(cmp->state_before()->bci());
set_canonical(canon);
} }
} }
} else if (l->as_InstanceOf() != NULL) { } else if (l->as_InstanceOf() != NULL) {

View File

@ -3170,6 +3170,7 @@ bool GraphBuilder::try_inline_intrinsics(ciMethod* callee) {
break; break;
case vmIntrinsics::_getClass : case vmIntrinsics::_getClass :
case vmIntrinsics::_isInstance :
if (!InlineClassNatives) return false; if (!InlineClassNatives) return false;
preserves_state = true; preserves_state = true;
break; break;
@ -3194,13 +3195,6 @@ bool GraphBuilder::try_inline_intrinsics(ciMethod* callee) {
preserves_state = true; preserves_state = true;
break; break;
// sun/misc/AtomicLong.attemptUpdate
case vmIntrinsics::_attemptUpdate :
if (!VM_Version::supports_cx8()) return false;
if (!InlineAtomicLong) return false;
preserves_state = true;
break;
// Use special nodes for Unsafe instructions so we can more easily // Use special nodes for Unsafe instructions so we can more easily
// perform an address-mode optimization on the raw variants // perform an address-mode optimization on the raw variants
case vmIntrinsics::_getObject : return append_unsafe_get_obj(callee, T_OBJECT, false); case vmIntrinsics::_getObject : return append_unsafe_get_obj(callee, T_OBJECT, false);

View File

@ -302,8 +302,6 @@ class Instruction: public CompilationResourceObj {
void update_exception_state(ValueStack* state); void update_exception_state(ValueStack* state);
bool has_printable_bci() const { return NOT_PRODUCT(_printable_bci != -99) PRODUCT_ONLY(false); }
protected: protected:
void set_type(ValueType* type) { void set_type(ValueType* type) {
assert(type != NULL, "type must exist"); assert(type != NULL, "type must exist");
@ -392,8 +390,9 @@ class Instruction: public CompilationResourceObj {
// accessors // accessors
int id() const { return _id; } int id() const { return _id; }
#ifndef PRODUCT #ifndef PRODUCT
bool has_printable_bci() const { return _printable_bci != -99; }
int printable_bci() const { assert(has_printable_bci(), "_printable_bci should have been set"); return _printable_bci; } int printable_bci() const { assert(has_printable_bci(), "_printable_bci should have been set"); return _printable_bci; }
void set_printable_bci(int bci) { NOT_PRODUCT(_printable_bci = bci;) } void set_printable_bci(int bci) { _printable_bci = bci; }
#endif #endif
int use_count() const { return _use_count; } int use_count() const { return _use_count; }
int pin_state() const { return _pin_state; } int pin_state() const { return _pin_state; }
@ -576,6 +575,7 @@ LEAF(Phi, Instruction)
, _block(b) , _block(b)
, _index(index) , _index(index)
{ {
NOT_PRODUCT(set_printable_bci(Value(b)->printable_bci()));
if (type->is_illegal()) { if (type->is_illegal()) {
make_illegal(); make_illegal();
} }
@ -631,7 +631,9 @@ LEAF(Local, Instruction)
: Instruction(type) : Instruction(type)
, _java_index(index) , _java_index(index)
, _declared_type(declared) , _declared_type(declared)
{} {
NOT_PRODUCT(set_printable_bci(-1));
}
// accessors // accessors
int java_index() const { return _java_index; } int java_index() const { return _java_index; }

View File

@ -1242,6 +1242,36 @@ void LIRGenerator::do_Reference_get(Intrinsic* x) {
NULL /* info */); NULL /* info */);
} }
// Example: clazz.isInstance(object)
void LIRGenerator::do_isInstance(Intrinsic* x) {
assert(x->number_of_arguments() == 2, "wrong type");
// TODO could try to substitute this node with an equivalent InstanceOf
// if clazz is known to be a constant Class. This will pick up newly found
// constants after HIR construction. I'll leave this to a future change.
// as a first cut, make a simple leaf call to runtime to stay platform independent.
// could follow the aastore example in a future change.
LIRItem clazz(x->argument_at(0), this);
LIRItem object(x->argument_at(1), this);
clazz.load_item();
object.load_item();
LIR_Opr result = rlock_result(x);
// need to perform null check on clazz
if (x->needs_null_check()) {
CodeEmitInfo* info = state_for(x);
__ null_check(clazz.result(), info);
}
LIR_Opr call_result = call_runtime(clazz.value(), object.value(),
CAST_FROM_FN_PTR(address, Runtime1::is_instance_of),
x->type(),
NULL); // NULL CodeEmitInfo results in a leaf call
__ move(call_result, result);
}
// Example: object.getClass () // Example: object.getClass ()
void LIRGenerator::do_getClass(Intrinsic* x) { void LIRGenerator::do_getClass(Intrinsic* x) {
assert(x->number_of_arguments() == 1, "wrong type"); assert(x->number_of_arguments() == 1, "wrong type");
@ -2777,31 +2807,29 @@ void LIRGenerator::do_Invoke(Invoke* x) {
int index = bcs.get_method_index(); int index = bcs.get_method_index();
size_t call_site_offset = cpcache->get_f1_offset(index); size_t call_site_offset = cpcache->get_f1_offset(index);
// Load CallSite object from constant pool cache.
LIR_Opr call_site = new_register(objectType);
__ oop2reg(cpcache->constant_encoding(), call_site);
__ move_wide(new LIR_Address(call_site, call_site_offset, T_OBJECT), call_site);
// If this invokedynamic call site hasn't been executed yet in // If this invokedynamic call site hasn't been executed yet in
// the interpreter, the CallSite object in the constant pool // the interpreter, the CallSite object in the constant pool
// cache is still null and we need to deoptimize. // cache is still null and we need to deoptimize.
if (cpcache->is_f1_null_at(index)) { if (cpcache->is_f1_null_at(index)) {
// Cannot re-use same xhandlers for multiple CodeEmitInfos, so // Only deoptimize if the CallSite object is still null; we don't
// clone all handlers. This is handled transparently in other // recompile methods in C1 after deoptimization so this call site
// places by the CodeEmitInfo cloning logic but is handled // might be resolved the next time we execute it after OSR.
// specially here because a stub isn't being used.
x->set_exception_handlers(new XHandlers(x->exception_handlers()));
DeoptimizeStub* deopt_stub = new DeoptimizeStub(deopt_info); DeoptimizeStub* deopt_stub = new DeoptimizeStub(deopt_info);
__ jump(deopt_stub); __ cmp(lir_cond_equal, call_site, LIR_OprFact::oopConst(NULL));
__ branch(lir_cond_equal, T_OBJECT, deopt_stub);
} }
// Use the receiver register for the synthetic MethodHandle // Use the receiver register for the synthetic MethodHandle
// argument. // argument.
receiver = LIR_Assembler::receiverOpr(); receiver = LIR_Assembler::receiverOpr();
LIR_Opr tmp = new_register(objectType);
// Load CallSite object from constant pool cache.
__ oop2reg(cpcache->constant_encoding(), tmp);
__ move_wide(new LIR_Address(tmp, call_site_offset, T_OBJECT), tmp);
// Load target MethodHandle from CallSite object. // Load target MethodHandle from CallSite object.
__ load(new LIR_Address(tmp, java_lang_invoke_CallSite::target_offset_in_bytes(), T_OBJECT), receiver); __ load(new LIR_Address(call_site, java_lang_invoke_CallSite::target_offset_in_bytes(), T_OBJECT), receiver);
__ call_dynamic(target, receiver, result_register, __ call_dynamic(target, receiver, result_register,
SharedRuntime::get_resolve_opt_virtual_call_stub(), SharedRuntime::get_resolve_opt_virtual_call_stub(),
@ -2809,7 +2837,7 @@ void LIRGenerator::do_Invoke(Invoke* x) {
break; break;
} }
default: default:
ShouldNotReachHere(); fatal(err_msg("unexpected bytecode: %s", Bytecodes::name(x->code())));
break; break;
} }
@ -2951,6 +2979,7 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
break; break;
case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break; case vmIntrinsics::_Object_init: do_RegisterFinalizer(x); break;
case vmIntrinsics::_isInstance: do_isInstance(x); break;
case vmIntrinsics::_getClass: do_getClass(x); break; case vmIntrinsics::_getClass: do_getClass(x); break;
case vmIntrinsics::_currentThread: do_currentThread(x); break; case vmIntrinsics::_currentThread: do_currentThread(x); break;
@ -2978,11 +3007,6 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
do_CompareAndSwap(x, longType); do_CompareAndSwap(x, longType);
break; break;
// sun.misc.AtomicLongCSImpl.attemptUpdate
case vmIntrinsics::_attemptUpdate:
do_AttemptUpdate(x);
break;
case vmIntrinsics::_Reference_get: case vmIntrinsics::_Reference_get:
do_Reference_get(x); do_Reference_get(x);
break; break;
@ -3223,4 +3247,3 @@ void LIRGenerator::do_MemBar(MemBar* x) {
} }
} }
} }

View File

@ -238,12 +238,12 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
LIR_Opr getThreadPointer(); LIR_Opr getThreadPointer();
void do_RegisterFinalizer(Intrinsic* x); void do_RegisterFinalizer(Intrinsic* x);
void do_isInstance(Intrinsic* x);
void do_getClass(Intrinsic* x); void do_getClass(Intrinsic* x);
void do_currentThread(Intrinsic* x); void do_currentThread(Intrinsic* x);
void do_MathIntrinsic(Intrinsic* x); void do_MathIntrinsic(Intrinsic* x);
void do_ArrayCopy(Intrinsic* x); void do_ArrayCopy(Intrinsic* x);
void do_CompareAndSwap(Intrinsic* x, ValueType* type); void do_CompareAndSwap(Intrinsic* x, ValueType* type);
void do_AttemptUpdate(Intrinsic* x);
void do_NIOCheckIndex(Intrinsic* x); void do_NIOCheckIndex(Intrinsic* x);
void do_FPIntrinsics(Intrinsic* x); void do_FPIntrinsics(Intrinsic* x);
void do_Reference_get(Intrinsic* x); void do_Reference_get(Intrinsic* x);

View File

@ -294,6 +294,7 @@ const char* Runtime1::name_for_address(address entry) {
FUNCTION_CASE(entry, SharedRuntime::lrem); FUNCTION_CASE(entry, SharedRuntime::lrem);
FUNCTION_CASE(entry, SharedRuntime::dtrace_method_entry); FUNCTION_CASE(entry, SharedRuntime::dtrace_method_entry);
FUNCTION_CASE(entry, SharedRuntime::dtrace_method_exit); FUNCTION_CASE(entry, SharedRuntime::dtrace_method_exit);
FUNCTION_CASE(entry, is_instance_of);
FUNCTION_CASE(entry, trace_block_entry); FUNCTION_CASE(entry, trace_block_entry);
#ifdef TRACE_HAVE_INTRINSICS #ifdef TRACE_HAVE_INTRINSICS
FUNCTION_CASE(entry, TRACE_TIME_METHOD); FUNCTION_CASE(entry, TRACE_TIME_METHOD);
@ -1270,6 +1271,19 @@ JRT_LEAF(void, Runtime1::oop_arraycopy(HeapWord* src, HeapWord* dst, int num))
JRT_END JRT_END
JRT_LEAF(int, Runtime1::is_instance_of(oopDesc* mirror, oopDesc* obj))
// had to return int instead of bool, otherwise there may be a mismatch
// between the C calling convention and the Java one.
// e.g., on x86, GCC may clear only %al when returning a bool false, but
// JVM takes the whole %eax as the return value, which may misinterpret
// the return value as a boolean true.
assert(mirror != NULL, "should null-check on mirror before calling");
klassOop k = java_lang_Class::as_klassOop(mirror);
return (k != NULL && obj != NULL && obj->is_a(k)) ? 1 : 0;
JRT_END
#ifndef PRODUCT #ifndef PRODUCT
void Runtime1::print_statistics() { void Runtime1::print_statistics() {
tty->print_cr("C1 Runtime statistics:"); tty->print_cr("C1 Runtime statistics:");

View File

@ -186,6 +186,7 @@ class Runtime1: public AllStatic {
static int arraycopy(oopDesc* src, int src_pos, oopDesc* dst, int dst_pos, int length); static int arraycopy(oopDesc* src, int src_pos, oopDesc* dst, int dst_pos, int length);
static void primitive_arraycopy(HeapWord* src, HeapWord* dst, int length); static void primitive_arraycopy(HeapWord* src, HeapWord* dst, int length);
static void oop_arraycopy(HeapWord* src, HeapWord* dst, int length); static void oop_arraycopy(HeapWord* src, HeapWord* dst, int length);
static int is_instance_of(oopDesc* mirror, oopDesc* obj);
static void print_statistics() PRODUCT_RETURN; static void print_statistics() PRODUCT_RETURN;
}; };

View File

@ -141,8 +141,11 @@ class ValueNumberingVisitor: public InstructionVisitor {
// visitor functions // visitor functions
void do_StoreField (StoreField* x) { void do_StoreField (StoreField* x) {
if (x->is_init_point()) { if (x->is_init_point() || // putstatic is an initialization point so treat it as a wide kill
// putstatic is an initialization point so treat it as a wide kill // This is actually too strict and the JMM doesn't require
// this in all cases (e.g. load a; volatile store b; load a)
// but possible future optimizations might require this.
x->field()->is_volatile()) {
kill_memory(); kill_memory();
} else { } else {
kill_field(x->field()); kill_field(x->field());
@ -160,8 +163,8 @@ class ValueNumberingVisitor: public InstructionVisitor {
void do_Local (Local* x) { /* nothing to do */ } void do_Local (Local* x) { /* nothing to do */ }
void do_Constant (Constant* x) { /* nothing to do */ } void do_Constant (Constant* x) { /* nothing to do */ }
void do_LoadField (LoadField* x) { void do_LoadField (LoadField* x) {
if (x->is_init_point()) { if (x->is_init_point() || // getstatic is an initialization point so treat it as a wide kill
// getstatic is an initialization point so treat it as a wide kill x->field()->is_volatile()) { // the JMM requires this
kill_memory(); kill_memory();
} }
} }

View File

@ -2919,7 +2919,6 @@ int java_lang_AssertionStatusDirectives::packages_offset;
int java_lang_AssertionStatusDirectives::packageEnabled_offset; int java_lang_AssertionStatusDirectives::packageEnabled_offset;
int java_lang_AssertionStatusDirectives::deflt_offset; int java_lang_AssertionStatusDirectives::deflt_offset;
int java_nio_Buffer::_limit_offset; int java_nio_Buffer::_limit_offset;
int sun_misc_AtomicLongCSImpl::_value_offset;
int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
int sun_reflect_ConstantPool::_cp_oop_offset; int sun_reflect_ConstantPool::_cp_oop_offset;
int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
@ -2979,21 +2978,6 @@ void java_nio_Buffer::compute_offsets() {
compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature()); compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature());
} }
// Support for intrinsification of sun.misc.AtomicLongCSImpl.attemptUpdate
int sun_misc_AtomicLongCSImpl::value_offset() {
assert(SystemDictionary::AtomicLongCSImpl_klass() != NULL, "can't call this");
return _value_offset;
}
void sun_misc_AtomicLongCSImpl::compute_offsets() {
klassOop k = SystemDictionary::AtomicLongCSImpl_klass();
// If this class is not present, its value field offset won't be referenced.
if (k != NULL) {
compute_offset(_value_offset, k, vmSymbols::value_name(), vmSymbols::long_signature());
}
}
void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
if (_owner_offset != 0) return; if (_owner_offset != 0) return;
@ -3098,7 +3082,6 @@ void JavaClasses::compute_offsets() {
sun_reflect_ConstantPool::compute_offsets(); sun_reflect_ConstantPool::compute_offsets();
sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets(); sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
} }
sun_misc_AtomicLongCSImpl::compute_offsets();
// generated interpreter code wants to know about the offsets we just computed: // generated interpreter code wants to know about the offsets we just computed:
AbstractAssembler::update_delayed_values(); AbstractAssembler::update_delayed_values();

View File

@ -1383,15 +1383,6 @@ class java_nio_Buffer: AllStatic {
static void compute_offsets(); static void compute_offsets();
}; };
class sun_misc_AtomicLongCSImpl: AllStatic {
private:
static int _value_offset;
public:
static int value_offset();
static void compute_offsets();
};
class java_util_concurrent_locks_AbstractOwnableSynchronizer : AllStatic { class java_util_concurrent_locks_AbstractOwnableSynchronizer : AllStatic {
private: private:
static int _owner_offset; static int _owner_offset;

View File

@ -170,9 +170,6 @@ class SymbolPropertyTable;
/* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
template(nio_Buffer_klass, java_nio_Buffer, Opt) \ template(nio_Buffer_klass, java_nio_Buffer, Opt) \
\ \
/* If this class isn't present, it won't be referenced. */ \
template(AtomicLongCSImpl_klass, sun_misc_AtomicLongCSImpl, Opt) \
\
template(DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel) \ template(DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel) \
\ \
template(PostVMInitHook_klass, sun_misc_PostVMInitHook, Opt) \ template(PostVMInitHook_klass, sun_misc_PostVMInitHook, Opt) \

View File

@ -1738,10 +1738,14 @@ void ClassVerifier::verify_switch(
int target = bci + default_offset; int target = bci + default_offset;
stackmap_table->check_jump_target(current_frame, target, CHECK_VERIFY(this)); stackmap_table->check_jump_target(current_frame, target, CHECK_VERIFY(this));
for (int i = 0; i < keys; i++) { for (int i = 0; i < keys; i++) {
// Because check_jump_target() may safepoint, the bytecode could have
// moved, which means 'aligned_bcp' is no good and needs to be recalculated.
aligned_bcp = (address)round_to((intptr_t)(bcs->bcp() + 1), jintSize);
target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize); target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize);
stackmap_table->check_jump_target( stackmap_table->check_jump_target(
current_frame, target, CHECK_VERIFY(this)); current_frame, target, CHECK_VERIFY(this));
} }
NOT_PRODUCT(aligned_bcp = NULL); // no longer valid at this point
} }
bool ClassVerifier::name_in_supers( bool ClassVerifier::name_in_supers(

View File

@ -722,15 +722,6 @@
/* java/lang/ref/Reference */ \ /* java/lang/ref/Reference */ \
do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \ do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \
\ \
\
do_class(sun_misc_AtomicLongCSImpl, "sun/misc/AtomicLongCSImpl") \
do_intrinsic(_get_AtomicLong, sun_misc_AtomicLongCSImpl, get_name, void_long_signature, F_R) \
/* (symbols get_name and void_long_signature defined above) */ \
\
do_intrinsic(_attemptUpdate, sun_misc_AtomicLongCSImpl, attemptUpdate_name, attemptUpdate_signature, F_R) \
do_name( attemptUpdate_name, "attemptUpdate") \
do_signature(attemptUpdate_signature, "(JJ)Z") \
\
/* support for sun.misc.Unsafe */ \ /* support for sun.misc.Unsafe */ \
do_class(sun_misc_Unsafe, "sun/misc/Unsafe") \ do_class(sun_misc_Unsafe, "sun/misc/Unsafe") \
\ \

View File

@ -293,7 +293,7 @@ void ConcurrentMarkThread::run() {
// Java thread is waiting for a full GC to happen (e.g., it // Java thread is waiting for a full GC to happen (e.g., it
// called System.gc() with +ExplicitGCInvokesConcurrent). // called System.gc() with +ExplicitGCInvokesConcurrent).
_sts.join(); _sts.join();
g1h->increment_full_collections_completed(true /* concurrent */); g1h->increment_old_marking_cycles_completed(true /* concurrent */);
_sts.leave(); _sts.leave();
} }
assert(_should_terminate, "just checking"); assert(_should_terminate, "just checking");

View File

@ -1299,6 +1299,7 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
gc_prologue(true); gc_prologue(true);
increment_total_collections(true /* full gc */); increment_total_collections(true /* full gc */);
increment_old_marking_cycles_started();
size_t g1h_prev_used = used(); size_t g1h_prev_used = used();
assert(used() == recalculate_used(), "Should be equal"); assert(used() == recalculate_used(), "Should be equal");
@ -1492,22 +1493,28 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
JavaThread::dirty_card_queue_set().abandon_logs(); JavaThread::dirty_card_queue_set().abandon_logs();
assert(!G1DeferredRSUpdate assert(!G1DeferredRSUpdate
|| (G1DeferredRSUpdate && (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any"); || (G1DeferredRSUpdate && (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any");
_young_list->reset_sampled_info();
// At this point there should be no regions in the
// entire heap tagged as young.
assert( check_young_list_empty(true /* check_heap */),
"young list should be empty at this point");
// Update the number of full collections that have been completed.
increment_old_marking_cycles_completed(false /* concurrent */);
_hrs.verify_optional();
verify_region_sets_optional();
print_heap_after_gc();
// We must call G1MonitoringSupport::update_sizes() in the same scoping level
// as an active TraceMemoryManagerStats object (i.e. before the destructor for the
// TraceMemoryManagerStats is called) so that the G1 memory pools are updated
// before any GC notifications are raised.
g1mm()->update_sizes();
} }
_young_list->reset_sampled_info();
// At this point there should be no regions in the
// entire heap tagged as young.
assert( check_young_list_empty(true /* check_heap */),
"young list should be empty at this point");
// Update the number of full collections that have been completed.
increment_full_collections_completed(false /* concurrent */);
_hrs.verify_optional();
verify_region_sets_optional();
print_heap_after_gc();
g1mm()->update_sizes();
post_full_gc_dump(); post_full_gc_dump();
return true; return true;
@ -1888,7 +1895,8 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
_retained_old_gc_alloc_region(NULL), _retained_old_gc_alloc_region(NULL),
_expand_heap_after_alloc_failure(true), _expand_heap_after_alloc_failure(true),
_surviving_young_words(NULL), _surviving_young_words(NULL),
_full_collections_completed(0), _old_marking_cycles_started(0),
_old_marking_cycles_completed(0),
_in_cset_fast_test(NULL), _in_cset_fast_test(NULL),
_in_cset_fast_test_base(NULL), _in_cset_fast_test_base(NULL),
_dirty_cards_region_list(NULL), _dirty_cards_region_list(NULL),
@ -2360,7 +2368,16 @@ void G1CollectedHeap::allocate_dummy_regions() {
} }
#endif // !PRODUCT #endif // !PRODUCT
void G1CollectedHeap::increment_full_collections_completed(bool concurrent) { void G1CollectedHeap::increment_old_marking_cycles_started() {
assert(_old_marking_cycles_started == _old_marking_cycles_completed ||
_old_marking_cycles_started == _old_marking_cycles_completed + 1,
err_msg("Wrong marking cycle count (started: %d, completed: %d)",
_old_marking_cycles_started, _old_marking_cycles_completed));
_old_marking_cycles_started++;
}
void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) {
MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
// We assume that if concurrent == true, then the caller is a // We assume that if concurrent == true, then the caller is a
@ -2368,11 +2385,6 @@ void G1CollectedHeap::increment_full_collections_completed(bool concurrent) {
// Set. If there's ever a cheap way to check this, we should add an // Set. If there's ever a cheap way to check this, we should add an
// assert here. // assert here.
// We have already incremented _total_full_collections at the start
// of the GC, so total_full_collections() represents how many full
// collections have been started.
unsigned int full_collections_started = total_full_collections();
// Given that this method is called at the end of a Full GC or of a // Given that this method is called at the end of a Full GC or of a
// concurrent cycle, and those can be nested (i.e., a Full GC can // concurrent cycle, and those can be nested (i.e., a Full GC can
// interrupt a concurrent cycle), the number of full collections // interrupt a concurrent cycle), the number of full collections
@ -2382,21 +2394,21 @@ void G1CollectedHeap::increment_full_collections_completed(bool concurrent) {
// This is the case for the inner caller, i.e. a Full GC. // This is the case for the inner caller, i.e. a Full GC.
assert(concurrent || assert(concurrent ||
(full_collections_started == _full_collections_completed + 1) || (_old_marking_cycles_started == _old_marking_cycles_completed + 1) ||
(full_collections_started == _full_collections_completed + 2), (_old_marking_cycles_started == _old_marking_cycles_completed + 2),
err_msg("for inner caller (Full GC): full_collections_started = %u " err_msg("for inner caller (Full GC): _old_marking_cycles_started = %u "
"is inconsistent with _full_collections_completed = %u", "is inconsistent with _old_marking_cycles_completed = %u",
full_collections_started, _full_collections_completed)); _old_marking_cycles_started, _old_marking_cycles_completed));
// This is the case for the outer caller, i.e. the concurrent cycle. // This is the case for the outer caller, i.e. the concurrent cycle.
assert(!concurrent || assert(!concurrent ||
(full_collections_started == _full_collections_completed + 1), (_old_marking_cycles_started == _old_marking_cycles_completed + 1),
err_msg("for outer caller (concurrent cycle): " err_msg("for outer caller (concurrent cycle): "
"full_collections_started = %u " "_old_marking_cycles_started = %u "
"is inconsistent with _full_collections_completed = %u", "is inconsistent with _old_marking_cycles_completed = %u",
full_collections_started, _full_collections_completed)); _old_marking_cycles_started, _old_marking_cycles_completed));
_full_collections_completed += 1; _old_marking_cycles_completed += 1;
// We need to clear the "in_progress" flag in the CM thread before // We need to clear the "in_progress" flag in the CM thread before
// we wake up any waiters (especially when ExplicitInvokesConcurrent // we wake up any waiters (especially when ExplicitInvokesConcurrent
@ -2432,7 +2444,7 @@ void G1CollectedHeap::collect(GCCause::Cause cause) {
assert_heap_not_locked(); assert_heap_not_locked();
unsigned int gc_count_before; unsigned int gc_count_before;
unsigned int full_gc_count_before; unsigned int old_marking_count_before;
bool retry_gc; bool retry_gc;
do { do {
@ -2443,7 +2455,7 @@ void G1CollectedHeap::collect(GCCause::Cause cause) {
// Read the GC count while holding the Heap_lock // Read the GC count while holding the Heap_lock
gc_count_before = total_collections(); gc_count_before = total_collections();
full_gc_count_before = total_full_collections(); old_marking_count_before = _old_marking_cycles_started;
} }
if (should_do_concurrent_full_gc(cause)) { if (should_do_concurrent_full_gc(cause)) {
@ -2458,7 +2470,7 @@ void G1CollectedHeap::collect(GCCause::Cause cause) {
VMThread::execute(&op); VMThread::execute(&op);
if (!op.pause_succeeded()) { if (!op.pause_succeeded()) {
if (full_gc_count_before == total_full_collections()) { if (old_marking_count_before == _old_marking_cycles_started) {
retry_gc = op.should_retry_gc(); retry_gc = op.should_retry_gc();
} else { } else {
// A Full GC happened while we were trying to schedule the // A Full GC happened while we were trying to schedule the
@ -2486,7 +2498,7 @@ void G1CollectedHeap::collect(GCCause::Cause cause) {
VMThread::execute(&op); VMThread::execute(&op);
} else { } else {
// Schedule a Full GC. // Schedule a Full GC.
VM_G1CollectFull op(gc_count_before, full_gc_count_before, cause); VM_G1CollectFull op(gc_count_before, old_marking_count_before, cause);
VMThread::execute(&op); VMThread::execute(&op);
} }
} }
@ -3613,7 +3625,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
if (g1_policy()->during_initial_mark_pause()) { if (g1_policy()->during_initial_mark_pause()) {
// We are about to start a marking cycle, so we increment the // We are about to start a marking cycle, so we increment the
// full collection counter. // full collection counter.
increment_total_full_collections(); increment_old_marking_cycles_started();
} }
// if the log level is "finer" is on, we'll print long statistics information // if the log level is "finer" is on, we'll print long statistics information
// in the collector policy code, so let's not print this as the output // in the collector policy code, so let's not print this as the output
@ -3930,26 +3942,31 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
gc_epilogue(false); gc_epilogue(false);
} }
// The closing of the inner scope, immediately above, will complete
// logging at the "fine" level. The record_collection_pause_end() call
// above will complete logging at the "finer" level.
//
// It is not yet to safe, however, to tell the concurrent mark to
// start as we have some optional output below. We don't want the
// output from the concurrent mark thread interfering with this
// logging output either.
_hrs.verify_optional();
verify_region_sets_optional();
TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
print_heap_after_gc();
// We must call G1MonitoringSupport::update_sizes() in the same scoping level
// as an active TraceMemoryManagerStats object (i.e. before the destructor for the
// TraceMemoryManagerStats is called) so that the G1 memory pools are updated
// before any GC notifications are raised.
g1mm()->update_sizes();
} }
// The closing of the inner scope, immediately above, will complete
// logging at the "fine" level. The record_collection_pause_end() call
// above will complete logging at the "finer" level.
//
// It is not yet to safe, however, to tell the concurrent mark to
// start as we have some optional output below. We don't want the
// output from the concurrent mark thread interfering with this
// logging output either.
_hrs.verify_optional();
verify_region_sets_optional();
TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
print_heap_after_gc();
g1mm()->update_sizes();
if (G1SummarizeRSetStats && if (G1SummarizeRSetStats &&
(G1SummarizeRSetStatsPeriod > 0) && (G1SummarizeRSetStatsPeriod > 0) &&
(total_collections() % G1SummarizeRSetStatsPeriod == 0)) { (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {

View File

@ -359,10 +359,13 @@ private:
// (c) cause == _g1_humongous_allocation // (c) cause == _g1_humongous_allocation
bool should_do_concurrent_full_gc(GCCause::Cause cause); bool should_do_concurrent_full_gc(GCCause::Cause cause);
// Keeps track of how many "full collections" (i.e., Full GCs or // Keeps track of how many "old marking cycles" (i.e., Full GCs or
// concurrent cycles) we have completed. The number of them we have // concurrent cycles) we have started.
// started is maintained in _total_full_collections in CollectedHeap. volatile unsigned int _old_marking_cycles_started;
volatile unsigned int _full_collections_completed;
// Keeps track of how many "old marking cycles" (i.e., Full GCs or
// concurrent cycles) we have completed.
volatile unsigned int _old_marking_cycles_completed;
// This is a non-product method that is helpful for testing. It is // This is a non-product method that is helpful for testing. It is
// called at the end of a GC and artificially expands the heap by // called at the end of a GC and artificially expands the heap by
@ -673,8 +676,12 @@ public:
(size_t) _in_cset_fast_test_length * sizeof(bool)); (size_t) _in_cset_fast_test_length * sizeof(bool));
} }
// This is called at the start of either a concurrent cycle or a Full
// GC to update the number of old marking cycles started.
void increment_old_marking_cycles_started();
// This is called at the end of either a concurrent cycle or a Full // This is called at the end of either a concurrent cycle or a Full
// GC to update the number of full collections completed. Those two // GC to update the number of old marking cycles completed. Those two
// can happen in a nested fashion, i.e., we start a concurrent // can happen in a nested fashion, i.e., we start a concurrent
// cycle, a Full GC happens half-way through it which ends first, // cycle, a Full GC happens half-way through it which ends first,
// and then the cycle notices that a Full GC happened and ends // and then the cycle notices that a Full GC happened and ends
@ -683,14 +690,14 @@ public:
// false, the caller is the inner caller in the nesting (i.e., the // false, the caller is the inner caller in the nesting (i.e., the
// Full GC). If concurrent is true, the caller is the outer caller // Full GC). If concurrent is true, the caller is the outer caller
// in this nesting (i.e., the concurrent cycle). Further nesting is // in this nesting (i.e., the concurrent cycle). Further nesting is
// not currently supported. The end of the this call also notifies // not currently supported. The end of this call also notifies
// the FullGCCount_lock in case a Java thread is waiting for a full // the FullGCCount_lock in case a Java thread is waiting for a full
// GC to happen (e.g., it called System.gc() with // GC to happen (e.g., it called System.gc() with
// +ExplicitGCInvokesConcurrent). // +ExplicitGCInvokesConcurrent).
void increment_full_collections_completed(bool concurrent); void increment_old_marking_cycles_completed(bool concurrent);
unsigned int full_collections_completed() { unsigned int old_marking_cycles_completed() {
return _full_collections_completed; return _old_marking_cycles_completed;
} }
G1HRPrinter* hr_printer() { return &_hr_printer; } G1HRPrinter* hr_printer() { return &_hr_printer; }

View File

@ -64,7 +64,7 @@ VM_G1IncCollectionPause::VM_G1IncCollectionPause(
_should_initiate_conc_mark(should_initiate_conc_mark), _should_initiate_conc_mark(should_initiate_conc_mark),
_target_pause_time_ms(target_pause_time_ms), _target_pause_time_ms(target_pause_time_ms),
_should_retry_gc(false), _should_retry_gc(false),
_full_collections_completed_before(0) { _old_marking_cycles_completed_before(0) {
guarantee(target_pause_time_ms > 0.0, guarantee(target_pause_time_ms > 0.0,
err_msg("target_pause_time_ms = %1.6lf should be positive", err_msg("target_pause_time_ms = %1.6lf should be positive",
target_pause_time_ms)); target_pause_time_ms));
@ -112,11 +112,11 @@ void VM_G1IncCollectionPause::doit() {
GCCauseSetter x(g1h, _gc_cause); GCCauseSetter x(g1h, _gc_cause);
if (_should_initiate_conc_mark) { if (_should_initiate_conc_mark) {
// It's safer to read full_collections_completed() here, given // It's safer to read old_marking_cycles_completed() here, given
// that noone else will be updating it concurrently. Since we'll // that noone else will be updating it concurrently. Since we'll
// only need it if we're initiating a marking cycle, no point in // only need it if we're initiating a marking cycle, no point in
// setting it earlier. // setting it earlier.
_full_collections_completed_before = g1h->full_collections_completed(); _old_marking_cycles_completed_before = g1h->old_marking_cycles_completed();
// At this point we are supposed to start a concurrent cycle. We // At this point we are supposed to start a concurrent cycle. We
// will do so if one is not already in progress. // will do so if one is not already in progress.
@ -181,17 +181,17 @@ void VM_G1IncCollectionPause::doit_epilogue() {
G1CollectedHeap* g1h = G1CollectedHeap::heap(); G1CollectedHeap* g1h = G1CollectedHeap::heap();
// In the doit() method we saved g1h->full_collections_completed() // In the doit() method we saved g1h->old_marking_cycles_completed()
// in the _full_collections_completed_before field. We have to // in the _old_marking_cycles_completed_before field. We have to
// wait until we observe that g1h->full_collections_completed() // wait until we observe that g1h->old_marking_cycles_completed()
// has increased by at least one. This can happen if a) we started // has increased by at least one. This can happen if a) we started
// a cycle and it completes, b) a cycle already in progress // a cycle and it completes, b) a cycle already in progress
// completes, or c) a Full GC happens. // completes, or c) a Full GC happens.
// If the condition has already been reached, there's no point in // If the condition has already been reached, there's no point in
// actually taking the lock and doing the wait. // actually taking the lock and doing the wait.
if (g1h->full_collections_completed() <= if (g1h->old_marking_cycles_completed() <=
_full_collections_completed_before) { _old_marking_cycles_completed_before) {
// The following is largely copied from CMS // The following is largely copied from CMS
Thread* thr = Thread::current(); Thread* thr = Thread::current();
@ -200,8 +200,8 @@ void VM_G1IncCollectionPause::doit_epilogue() {
ThreadToNativeFromVM native(jt); ThreadToNativeFromVM native(jt);
MutexLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag); MutexLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
while (g1h->full_collections_completed() <= while (g1h->old_marking_cycles_completed() <=
_full_collections_completed_before) { _old_marking_cycles_completed_before) {
FullGCCount_lock->wait(Mutex::_no_safepoint_check_flag); FullGCCount_lock->wait(Mutex::_no_safepoint_check_flag);
} }
} }

View File

@ -80,7 +80,7 @@ private:
bool _should_initiate_conc_mark; bool _should_initiate_conc_mark;
bool _should_retry_gc; bool _should_retry_gc;
double _target_pause_time_ms; double _target_pause_time_ms;
unsigned int _full_collections_completed_before; unsigned int _old_marking_cycles_completed_before;
public: public:
VM_G1IncCollectionPause(unsigned int gc_count_before, VM_G1IncCollectionPause(unsigned int gc_count_before,
size_t word_size, size_t word_size,

View File

@ -844,6 +844,14 @@ nmethod* InterpreterRuntime::frequency_counter_overflow(JavaThread* thread, addr
int bci = method->bci_from(fr.interpreter_frame_bcp()); int bci = method->bci_from(fr.interpreter_frame_bcp());
nm = method->lookup_osr_nmethod_for(bci, CompLevel_none, false); nm = method->lookup_osr_nmethod_for(bci, CompLevel_none, false);
} }
#ifndef PRODUCT
if (TraceOnStackReplacement) {
if (nm != NULL) {
tty->print("OSR entry @ pc: " INTPTR_FORMAT ": ", nm->osr_entry());
nm->print();
}
}
#endif
return nm; return nm;
} }

View File

@ -230,7 +230,7 @@ void TreeList<Chunk>::return_chunk_at_tail(TreeChunk<Chunk>* chunk) {
link_tail(chunk); link_tail(chunk);
assert(!tail() || size() == tail()->size(), "Wrong sized chunk in list"); assert(!tail() || size() == tail()->size(), "Wrong sized chunk in list");
FreeList<Chunk>::increment_count(); increment_count();
debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));)
assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(head() == NULL || head()->prev() == NULL, "list invariant");
assert(tail() == NULL || tail()->next() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant");
@ -258,7 +258,7 @@ void TreeList<Chunk>::return_chunk_at_head(TreeChunk<Chunk>* chunk) {
} }
head()->link_after(chunk); head()->link_after(chunk);
assert(!head() || size() == head()->size(), "Wrong sized chunk in list"); assert(!head() || size() == head()->size(), "Wrong sized chunk in list");
FreeList<Chunk>::increment_count(); increment_count();
debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));)
assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(head() == NULL || head()->prev() == NULL, "list invariant");
assert(tail() == NULL || tail()->next() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant");
@ -909,6 +909,7 @@ class TreeCensusClosure : public StackObj {
template <class Chunk> template <class Chunk>
class AscendTreeCensusClosure : public TreeCensusClosure<Chunk> { class AscendTreeCensusClosure : public TreeCensusClosure<Chunk> {
using TreeCensusClosure<Chunk>::do_list;
public: public:
void do_tree(TreeList<Chunk>* tl) { void do_tree(TreeList<Chunk>* tl) {
if (tl != NULL) { if (tl != NULL) {
@ -921,6 +922,7 @@ class AscendTreeCensusClosure : public TreeCensusClosure<Chunk> {
template <class Chunk> template <class Chunk>
class DescendTreeCensusClosure : public TreeCensusClosure<Chunk> { class DescendTreeCensusClosure : public TreeCensusClosure<Chunk> {
using TreeCensusClosure<Chunk>::do_list;
public: public:
void do_tree(TreeList<Chunk>* tl) { void do_tree(TreeList<Chunk>* tl) {
if (tl != NULL) { if (tl != NULL) {
@ -987,6 +989,7 @@ class AscendTreeSearchClosure : public TreeSearchClosure {
template <class Chunk> template <class Chunk>
class DescendTreeSearchClosure : public TreeSearchClosure<Chunk> { class DescendTreeSearchClosure : public TreeSearchClosure<Chunk> {
using TreeSearchClosure<Chunk>::do_list;
public: public:
bool do_tree(TreeList<Chunk>* tl) { bool do_tree(TreeList<Chunk>* tl) {
if (tl != NULL) { if (tl != NULL) {

View File

@ -60,13 +60,18 @@ class TreeList: public FreeList<Chunk> {
TreeList<Chunk>* left() const { return _left; } TreeList<Chunk>* left() const { return _left; }
TreeList<Chunk>* right() const { return _right; } TreeList<Chunk>* right() const { return _right; }
// Wrapper on call to base class, to get the template to compile. // Explicitly import these names into our namespace to fix name lookup with templates
Chunk* head() const { return FreeList<Chunk>::head(); } using FreeList<Chunk>::head;
Chunk* tail() const { return FreeList<Chunk>::tail(); } using FreeList<Chunk>::set_head;
void set_head(Chunk* head) { FreeList<Chunk>::set_head(head); }
void set_tail(Chunk* tail) { FreeList<Chunk>::set_tail(tail); }
size_t size() const { return FreeList<Chunk>::size(); } using FreeList<Chunk>::tail;
using FreeList<Chunk>::set_tail;
using FreeList<Chunk>::link_tail;
using FreeList<Chunk>::increment_count;
NOT_PRODUCT(using FreeList<Chunk>::increment_returned_bytes_by;)
using FreeList<Chunk>::verify_chunk_in_free_list;
using FreeList<Chunk>::size;
// Accessors for links in tree. // Accessors for links in tree.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -80,7 +80,7 @@ constMethodOop constMethodKlass::allocate(int byte_code_size,
No_Safepoint_Verifier no_safepoint; No_Safepoint_Verifier no_safepoint;
cm->set_interpreter_kind(Interpreter::invalid); cm->set_interpreter_kind(Interpreter::invalid);
cm->init_fingerprint(); cm->init_fingerprint();
cm->set_method(NULL); cm->set_constants(NULL);
cm->set_stackmap_data(NULL); cm->set_stackmap_data(NULL);
cm->set_exception_table(NULL); cm->set_exception_table(NULL);
cm->set_code_size(byte_code_size); cm->set_code_size(byte_code_size);
@ -98,7 +98,7 @@ constMethodOop constMethodKlass::allocate(int byte_code_size,
void constMethodKlass::oop_follow_contents(oop obj) { void constMethodKlass::oop_follow_contents(oop obj) {
assert (obj->is_constMethod(), "object must be constMethod"); assert (obj->is_constMethod(), "object must be constMethod");
constMethodOop cm = constMethodOop(obj); constMethodOop cm = constMethodOop(obj);
MarkSweep::mark_and_push(cm->adr_method()); MarkSweep::mark_and_push(cm->adr_constants());
MarkSweep::mark_and_push(cm->adr_stackmap_data()); MarkSweep::mark_and_push(cm->adr_stackmap_data());
MarkSweep::mark_and_push(cm->adr_exception_table()); MarkSweep::mark_and_push(cm->adr_exception_table());
// Performance tweak: We skip iterating over the klass pointer since we // Performance tweak: We skip iterating over the klass pointer since we
@ -110,7 +110,7 @@ void constMethodKlass::oop_follow_contents(ParCompactionManager* cm,
oop obj) { oop obj) {
assert (obj->is_constMethod(), "object must be constMethod"); assert (obj->is_constMethod(), "object must be constMethod");
constMethodOop cm_oop = constMethodOop(obj); constMethodOop cm_oop = constMethodOop(obj);
PSParallelCompact::mark_and_push(cm, cm_oop->adr_method()); PSParallelCompact::mark_and_push(cm, cm_oop->adr_constants());
PSParallelCompact::mark_and_push(cm, cm_oop->adr_stackmap_data()); PSParallelCompact::mark_and_push(cm, cm_oop->adr_stackmap_data());
PSParallelCompact::mark_and_push(cm, cm_oop->adr_exception_table()); PSParallelCompact::mark_and_push(cm, cm_oop->adr_exception_table());
// Performance tweak: We skip iterating over the klass pointer since we // Performance tweak: We skip iterating over the klass pointer since we
@ -121,7 +121,7 @@ void constMethodKlass::oop_follow_contents(ParCompactionManager* cm,
int constMethodKlass::oop_oop_iterate(oop obj, OopClosure* blk) { int constMethodKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
assert (obj->is_constMethod(), "object must be constMethod"); assert (obj->is_constMethod(), "object must be constMethod");
constMethodOop cm = constMethodOop(obj); constMethodOop cm = constMethodOop(obj);
blk->do_oop(cm->adr_method()); blk->do_oop(cm->adr_constants());
blk->do_oop(cm->adr_stackmap_data()); blk->do_oop(cm->adr_stackmap_data());
blk->do_oop(cm->adr_exception_table()); blk->do_oop(cm->adr_exception_table());
// Get size before changing pointers. // Get size before changing pointers.
@ -135,7 +135,7 @@ int constMethodKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr)
assert (obj->is_constMethod(), "object must be constMethod"); assert (obj->is_constMethod(), "object must be constMethod");
constMethodOop cm = constMethodOop(obj); constMethodOop cm = constMethodOop(obj);
oop* adr; oop* adr;
adr = cm->adr_method(); adr = cm->adr_constants();
if (mr.contains(adr)) blk->do_oop(adr); if (mr.contains(adr)) blk->do_oop(adr);
adr = cm->adr_stackmap_data(); adr = cm->adr_stackmap_data();
if (mr.contains(adr)) blk->do_oop(adr); if (mr.contains(adr)) blk->do_oop(adr);
@ -153,7 +153,7 @@ int constMethodKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr)
int constMethodKlass::oop_adjust_pointers(oop obj) { int constMethodKlass::oop_adjust_pointers(oop obj) {
assert(obj->is_constMethod(), "should be constMethod"); assert(obj->is_constMethod(), "should be constMethod");
constMethodOop cm = constMethodOop(obj); constMethodOop cm = constMethodOop(obj);
MarkSweep::adjust_pointer(cm->adr_method()); MarkSweep::adjust_pointer(cm->adr_constants());
MarkSweep::adjust_pointer(cm->adr_stackmap_data()); MarkSweep::adjust_pointer(cm->adr_stackmap_data());
MarkSweep::adjust_pointer(cm->adr_exception_table()); MarkSweep::adjust_pointer(cm->adr_exception_table());
// Get size before changing pointers. // Get size before changing pointers.
@ -188,8 +188,8 @@ void constMethodKlass::oop_print_on(oop obj, outputStream* st) {
assert(obj->is_constMethod(), "must be constMethod"); assert(obj->is_constMethod(), "must be constMethod");
Klass::oop_print_on(obj, st); Klass::oop_print_on(obj, st);
constMethodOop m = constMethodOop(obj); constMethodOop m = constMethodOop(obj);
st->print(" - method: " INTPTR_FORMAT " ", (address)m->method()); st->print(" - constants: " INTPTR_FORMAT " ", (address)m->constants());
m->method()->print_value_on(st); st->cr(); m->constants()->print_value_on(st); st->cr();
st->print(" - exceptions: " INTPTR_FORMAT "\n", (address)m->exception_table()); st->print(" - exceptions: " INTPTR_FORMAT "\n", (address)m->exception_table());
if (m->has_stackmap_table()) { if (m->has_stackmap_table()) {
st->print(" - stackmap data: "); st->print(" - stackmap data: ");
@ -223,8 +223,8 @@ void constMethodKlass::oop_verify_on(oop obj, outputStream* st) {
// Verification can occur during oop construction before the method or // Verification can occur during oop construction before the method or
// other fields have been initialized. // other fields have been initialized.
if (!obj->partially_loaded()) { if (!obj->partially_loaded()) {
guarantee(m->method()->is_perm(), "should be in permspace"); guarantee(m->constants()->is_perm(), "should be in permspace");
guarantee(m->method()->is_method(), "should be method"); guarantee(m->constants()->is_constantPool(), "should be constant pool");
typeArrayOop stackmap_data = m->stackmap_data(); typeArrayOop stackmap_data = m->stackmap_data();
guarantee(stackmap_data == NULL || guarantee(stackmap_data == NULL ||
stackmap_data->is_perm(), "should be in permspace"); stackmap_data->is_perm(), "should be in permspace");

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -53,6 +53,10 @@ int constMethodOopDesc::object_size(int code_size,
return align_object_size(header_size() + extra_words); return align_object_size(header_size() + extra_words);
} }
methodOop constMethodOopDesc::method() const {
return instanceKlass::cast(_constants->pool_holder())->method_with_idnum(
_method_idnum);
}
// linenumber table - note that length is unknown until decompression, // linenumber table - note that length is unknown until decompression,
// see class CompressedLineNumberReadStream. // see class CompressedLineNumberReadStream.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -41,7 +41,7 @@
// |------------------------------------------------------| // |------------------------------------------------------|
// | fingerprint 1 | // | fingerprint 1 |
// | fingerprint 2 | // | fingerprint 2 |
// | method (oop) | // | constants (oop) |
// | stackmap_data (oop) | // | stackmap_data (oop) |
// | exception_table (oop) | // | exception_table (oop) |
// | constMethod_size | // | constMethod_size |
@ -113,7 +113,7 @@ private:
volatile bool _is_conc_safe; // if true, safe for concurrent GC processing volatile bool _is_conc_safe; // if true, safe for concurrent GC processing
public: public:
oop* oop_block_beg() const { return adr_method(); } oop* oop_block_beg() const { return adr_constants(); }
oop* oop_block_end() const { return adr_exception_table() + 1; } oop* oop_block_end() const { return adr_exception_table() + 1; }
private: private:
@ -121,8 +121,7 @@ private:
// The oop block. See comment in klass.hpp before making changes. // The oop block. See comment in klass.hpp before making changes.
// //
// Backpointer to non-const methodOop (needed for some JVMTI operations) constantPoolOop _constants; // Constant pool
methodOop _method;
// Raw stackmap data for the method // Raw stackmap data for the method
typeArrayOop _stackmap_data; typeArrayOop _stackmap_data;
@ -167,10 +166,13 @@ public:
void set_interpreter_kind(int kind) { _interpreter_kind = kind; } void set_interpreter_kind(int kind) { _interpreter_kind = kind; }
int interpreter_kind(void) const { return _interpreter_kind; } int interpreter_kind(void) const { return _interpreter_kind; }
// backpointer to non-const methodOop // constant pool
methodOop method() const { return _method; } constantPoolOop constants() const { return _constants; }
void set_method(methodOop m) { oop_store_without_check((oop*)&_method, (oop) m); } void set_constants(constantPoolOop c) {
oop_store_without_check((oop*)&_constants, (oop)c);
}
methodOop method() const;
// stackmap table data // stackmap table data
typeArrayOop stackmap_data() const { return _stackmap_data; } typeArrayOop stackmap_data() const { return _stackmap_data; }
@ -278,11 +280,13 @@ public:
{ return in_ByteSize(sizeof(constMethodOopDesc)); } { return in_ByteSize(sizeof(constMethodOopDesc)); }
// interpreter support // interpreter support
static ByteSize constants_offset()
{ return byte_offset_of(constMethodOopDesc, _constants); }
static ByteSize exception_table_offset() static ByteSize exception_table_offset()
{ return byte_offset_of(constMethodOopDesc, _exception_table); } { return byte_offset_of(constMethodOopDesc, _exception_table); }
// Garbage collection support // Garbage collection support
oop* adr_method() const { return (oop*)&_method; } oop* adr_constants() const { return (oop*)&_constants; }
oop* adr_stackmap_data() const { return (oop*)&_stackmap_data; } oop* adr_stackmap_data() const { return (oop*)&_stackmap_data; }
oop* adr_exception_table() const { return (oop*)&_exception_table; } oop* adr_exception_table() const { return (oop*)&_exception_table; }
bool is_conc_safe() { return _is_conc_safe; } bool is_conc_safe() { return _is_conc_safe; }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -112,11 +112,6 @@ methodOop methodKlass::allocate(constMethodHandle xconst,
assert(m->is_parsable(), "must be parsable here."); assert(m->is_parsable(), "must be parsable here.");
assert(m->size() == size, "wrong size for object"); assert(m->size() == size, "wrong size for object");
// We should not publish an uprasable object's reference
// into one that is parsable, since that presents problems
// for the concurrent parallel marking and precleaning phases
// of concurrent gc (CMS).
xconst->set_method(m);
return m; return m;
} }
@ -127,7 +122,6 @@ void methodKlass::oop_follow_contents(oop obj) {
// Performance tweak: We skip iterating over the klass pointer since we // Performance tweak: We skip iterating over the klass pointer since we
// know that Universe::methodKlassObj never moves. // know that Universe::methodKlassObj never moves.
MarkSweep::mark_and_push(m->adr_constMethod()); MarkSweep::mark_and_push(m->adr_constMethod());
MarkSweep::mark_and_push(m->adr_constants());
if (m->method_data() != NULL) { if (m->method_data() != NULL) {
MarkSweep::mark_and_push(m->adr_method_data()); MarkSweep::mark_and_push(m->adr_method_data());
} }
@ -141,7 +135,6 @@ void methodKlass::oop_follow_contents(ParCompactionManager* cm,
// Performance tweak: We skip iterating over the klass pointer since we // Performance tweak: We skip iterating over the klass pointer since we
// know that Universe::methodKlassObj never moves. // know that Universe::methodKlassObj never moves.
PSParallelCompact::mark_and_push(cm, m->adr_constMethod()); PSParallelCompact::mark_and_push(cm, m->adr_constMethod());
PSParallelCompact::mark_and_push(cm, m->adr_constants());
#ifdef COMPILER2 #ifdef COMPILER2
if (m->method_data() != NULL) { if (m->method_data() != NULL) {
PSParallelCompact::mark_and_push(cm, m->adr_method_data()); PSParallelCompact::mark_and_push(cm, m->adr_method_data());
@ -159,7 +152,6 @@ int methodKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
// Performance tweak: We skip iterating over the klass pointer since we // Performance tweak: We skip iterating over the klass pointer since we
// know that Universe::methodKlassObj never moves // know that Universe::methodKlassObj never moves
blk->do_oop(m->adr_constMethod()); blk->do_oop(m->adr_constMethod());
blk->do_oop(m->adr_constants());
if (m->method_data() != NULL) { if (m->method_data() != NULL) {
blk->do_oop(m->adr_method_data()); blk->do_oop(m->adr_method_data());
} }
@ -178,8 +170,6 @@ int methodKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
oop* adr; oop* adr;
adr = m->adr_constMethod(); adr = m->adr_constMethod();
if (mr.contains(adr)) blk->do_oop(adr); if (mr.contains(adr)) blk->do_oop(adr);
adr = m->adr_constants();
if (mr.contains(adr)) blk->do_oop(adr);
if (m->method_data() != NULL) { if (m->method_data() != NULL) {
adr = m->adr_method_data(); adr = m->adr_method_data();
if (mr.contains(adr)) blk->do_oop(adr); if (mr.contains(adr)) blk->do_oop(adr);
@ -197,7 +187,6 @@ int methodKlass::oop_adjust_pointers(oop obj) {
// Performance tweak: We skip iterating over the klass pointer since we // Performance tweak: We skip iterating over the klass pointer since we
// know that Universe::methodKlassObj never moves. // know that Universe::methodKlassObj never moves.
MarkSweep::adjust_pointer(m->adr_constMethod()); MarkSweep::adjust_pointer(m->adr_constMethod());
MarkSweep::adjust_pointer(m->adr_constants());
if (m->method_data() != NULL) { if (m->method_data() != NULL) {
MarkSweep::adjust_pointer(m->adr_method_data()); MarkSweep::adjust_pointer(m->adr_method_data());
} }
@ -213,7 +202,6 @@ int methodKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
assert(obj->is_method(), "should be method"); assert(obj->is_method(), "should be method");
methodOop m = methodOop(obj); methodOop m = methodOop(obj);
PSParallelCompact::adjust_pointer(m->adr_constMethod()); PSParallelCompact::adjust_pointer(m->adr_constMethod());
PSParallelCompact::adjust_pointer(m->adr_constants());
#ifdef COMPILER2 #ifdef COMPILER2
if (m->method_data() != NULL) { if (m->method_data() != NULL) {
PSParallelCompact::adjust_pointer(m->adr_method_data()); PSParallelCompact::adjust_pointer(m->adr_method_data());
@ -339,8 +327,6 @@ void methodKlass::oop_verify_on(oop obj, outputStream* st) {
if (!obj->partially_loaded()) { if (!obj->partially_loaded()) {
methodOop m = methodOop(obj); methodOop m = methodOop(obj);
guarantee(m->is_perm(), "should be in permspace"); guarantee(m->is_perm(), "should be in permspace");
guarantee(m->constants()->is_perm(), "should be in permspace");
guarantee(m->constants()->is_constantPool(), "should be constant pool");
guarantee(m->constMethod()->is_constMethod(), "should be constMethodOop"); guarantee(m->constMethod()->is_constMethod(), "should be constMethodOop");
guarantee(m->constMethod()->is_perm(), "should be in permspace"); guarantee(m->constMethod()->is_perm(), "should be in permspace");
methodDataOop method_data = m->method_data(); methodDataOop method_data = m->method_data();

View File

@ -70,11 +70,11 @@ address methodOopDesc::get_c2i_unverified_entry() {
return _adapter->get_c2i_unverified_entry(); return _adapter->get_c2i_unverified_entry();
} }
char* methodOopDesc::name_and_sig_as_C_string() { char* methodOopDesc::name_and_sig_as_C_string() const {
return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature()); return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature());
} }
char* methodOopDesc::name_and_sig_as_C_string(char* buf, int size) { char* methodOopDesc::name_and_sig_as_C_string(char* buf, int size) const {
return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature(), buf, size); return name_and_sig_as_C_string(Klass::cast(constants()->pool_holder()), name(), signature(), buf, size);
} }
@ -177,7 +177,8 @@ void methodOopDesc::mask_for(int bci, InterpreterOopMap* mask) {
int methodOopDesc::bci_from(address bcp) const { int methodOopDesc::bci_from(address bcp) const {
assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(), "bcp doesn't belong to this method"); assert(is_native() && bcp == code_base() || contains(bcp) || is_error_reported(),
err_msg("bcp doesn't belong to this method: bcp: " INTPTR_FORMAT ", method: %s", bcp, name_and_sig_as_C_string()));
return bcp - code_base(); return bcp - code_base();
} }
@ -531,9 +532,9 @@ int methodOopDesc::line_number_from_bci(int bci) const {
bool methodOopDesc::is_klass_loaded_by_klass_index(int klass_index) const { bool methodOopDesc::is_klass_loaded_by_klass_index(int klass_index) const {
if( _constants->tag_at(klass_index).is_unresolved_klass() ) { if( constants()->tag_at(klass_index).is_unresolved_klass() ) {
Thread *thread = Thread::current(); Thread *thread = Thread::current();
Symbol* klass_name = _constants->klass_name_at(klass_index); Symbol* klass_name = constants()->klass_name_at(klass_index);
Handle loader(thread, instanceKlass::cast(method_holder())->class_loader()); Handle loader(thread, instanceKlass::cast(method_holder())->class_loader());
Handle prot (thread, Klass::cast(method_holder())->protection_domain()); Handle prot (thread, Klass::cast(method_holder())->protection_domain());
return SystemDictionary::find(klass_name, loader, prot, thread) != NULL; return SystemDictionary::find(klass_name, loader, prot, thread) != NULL;
@ -544,7 +545,7 @@ bool methodOopDesc::is_klass_loaded_by_klass_index(int klass_index) const {
bool methodOopDesc::is_klass_loaded(int refinfo_index, bool must_be_resolved) const { bool methodOopDesc::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
int klass_index = _constants->klass_ref_index_at(refinfo_index); int klass_index = constants()->klass_ref_index_at(refinfo_index);
if (must_be_resolved) { if (must_be_resolved) {
// Make sure klass is resolved in constantpool. // Make sure klass is resolved in constantpool.
if (constants()->tag_at(klass_index).is_unresolved_klass()) return false; if (constants()->tag_at(klass_index).is_unresolved_klass()) return false;
@ -886,11 +887,13 @@ oop methodOopDesc::method_handle_type() const {
} }
jint* methodOopDesc::method_type_offsets_chain() { jint* methodOopDesc::method_type_offsets_chain() {
static jint pchase[] = { -1, -1, -1 }; static jint pchase[] = { -1, -1, -1, -1 };
if (pchase[0] == -1) { if (pchase[0] == -1) {
jint step0 = in_bytes(constants_offset()); jint step0 = in_bytes(const_offset());
jint step1 = (constantPoolOopDesc::header_size() + _imcp_method_type_value) * HeapWordSize; jint step1 = in_bytes(constMethodOopDesc::constants_offset());
jint step2 = (constantPoolOopDesc::header_size() + _imcp_method_type_value) * HeapWordSize;
// do this in reverse to avoid races: // do this in reverse to avoid races:
OrderAccess::release_store(&pchase[2], step2);
OrderAccess::release_store(&pchase[1], step1); OrderAccess::release_store(&pchase[1], step1);
OrderAccess::release_store(&pchase[0], step0); OrderAccess::release_store(&pchase[0], step0);
} }
@ -1076,9 +1079,7 @@ methodHandle methodOopDesc:: clone_with_new_data(methodHandle m, u_char* new_cod
assert(m->constMethod()->is_parsable(), "Should remain parsable"); assert(m->constMethod()->is_parsable(), "Should remain parsable");
// Reset correct method/const method, method size, and parameter info // Reset correct method/const method, method size, and parameter info
newcm->set_method(newm());
newm->set_constMethod(newcm); newm->set_constMethod(newcm);
assert(newcm->method() == newm(), "check");
newm->constMethod()->set_code_size(new_code_length); newm->constMethod()->set_code_size(new_code_length);
newm->constMethod()->set_constMethod_size(new_const_method_size); newm->constMethod()->set_constMethod_size(new_const_method_size);
newm->set_method_size(new_method_size); newm->set_method_size(new_method_size);

View File

@ -64,7 +64,6 @@
// | klass | // | klass |
// |------------------------------------------------------| // |------------------------------------------------------|
// | constMethodOop (oop) | // | constMethodOop (oop) |
// | constants (oop) |
// |------------------------------------------------------| // |------------------------------------------------------|
// | methodData (oop) | // | methodData (oop) |
// | interp_invocation_count | // | interp_invocation_count |
@ -110,7 +109,6 @@ class methodOopDesc : public oopDesc {
friend class VMStructs; friend class VMStructs;
private: private:
constMethodOop _constMethod; // Method read-only data. constMethodOop _constMethod; // Method read-only data.
constantPoolOop _constants; // Constant pool
methodDataOop _method_data; methodDataOop _method_data;
int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered) int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered)
AccessFlags _access_flags; // Access flags AccessFlags _access_flags; // Access flags
@ -170,17 +168,17 @@ class methodOopDesc : public oopDesc {
void set_access_flags(AccessFlags flags) { _access_flags = flags; } void set_access_flags(AccessFlags flags) { _access_flags = flags; }
// name // name
Symbol* name() const { return _constants->symbol_at(name_index()); } Symbol* name() const { return constants()->symbol_at(name_index()); }
int name_index() const { return constMethod()->name_index(); } int name_index() const { return constMethod()->name_index(); }
void set_name_index(int index) { constMethod()->set_name_index(index); } void set_name_index(int index) { constMethod()->set_name_index(index); }
// signature // signature
Symbol* signature() const { return _constants->symbol_at(signature_index()); } Symbol* signature() const { return constants()->symbol_at(signature_index()); }
int signature_index() const { return constMethod()->signature_index(); } int signature_index() const { return constMethod()->signature_index(); }
void set_signature_index(int index) { constMethod()->set_signature_index(index); } void set_signature_index(int index) { constMethod()->set_signature_index(index); }
// generics support // generics support
Symbol* generic_signature() const { int idx = generic_signature_index(); return ((idx != 0) ? _constants->symbol_at(idx) : (Symbol*)NULL); } Symbol* generic_signature() const { int idx = generic_signature_index(); return ((idx != 0) ? constants()->symbol_at(idx) : (Symbol*)NULL); }
int generic_signature_index() const { return constMethod()->generic_signature_index(); } int generic_signature_index() const { return constMethod()->generic_signature_index(); }
void set_generic_signature_index(int index) { constMethod()->set_generic_signature_index(index); } void set_generic_signature_index(int index) { constMethod()->set_generic_signature_index(index); }
@ -198,8 +196,8 @@ class methodOopDesc : public oopDesc {
// C string, for the purpose of providing more useful NoSuchMethodErrors // C string, for the purpose of providing more useful NoSuchMethodErrors
// and fatal error handling. The string is allocated in resource // and fatal error handling. The string is allocated in resource
// area if a buffer is not provided by the caller. // area if a buffer is not provided by the caller.
char* name_and_sig_as_C_string(); char* name_and_sig_as_C_string() const;
char* name_and_sig_as_C_string(char* buf, int size); char* name_and_sig_as_C_string(char* buf, int size) const;
// Static routine in the situations we don't have a methodOop // Static routine in the situations we don't have a methodOop
static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature); static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature);
@ -242,8 +240,8 @@ class methodOopDesc : public oopDesc {
} }
// constant pool for klassOop holding this method // constant pool for klassOop holding this method
constantPoolOop constants() const { return _constants; } constantPoolOop constants() const { return constMethod()->constants(); }
void set_constants(constantPoolOop c) { oop_store_without_check((oop*)&_constants, c); } void set_constants(constantPoolOop c) { constMethod()->set_constants(c); }
// max stack // max stack
int max_stack() const { return _max_stack; } int max_stack() const { return _max_stack; }
@ -453,7 +451,7 @@ class methodOopDesc : public oopDesc {
{ return constMethod()->compressed_linenumber_table(); } { return constMethod()->compressed_linenumber_table(); }
// method holder (the klassOop holding this method) // method holder (the klassOop holding this method)
klassOop method_holder() const { return _constants->pool_holder(); } klassOop method_holder() const { return constants()->pool_holder(); }
void compute_size_of_parameters(Thread *thread); // word size of parameters (receiver if any + arguments) void compute_size_of_parameters(Thread *thread); // word size of parameters (receiver if any + arguments)
Symbol* klass_name() const; // returns the name of the method holder Symbol* klass_name() const; // returns the name of the method holder
@ -544,7 +542,6 @@ class methodOopDesc : public oopDesc {
// interpreter support // interpreter support
static ByteSize const_offset() { return byte_offset_of(methodOopDesc, _constMethod ); } static ByteSize const_offset() { return byte_offset_of(methodOopDesc, _constMethod ); }
static ByteSize constants_offset() { return byte_offset_of(methodOopDesc, _constants ); }
static ByteSize access_flags_offset() { return byte_offset_of(methodOopDesc, _access_flags ); } static ByteSize access_flags_offset() { return byte_offset_of(methodOopDesc, _access_flags ); }
#ifdef CC_INTERP #ifdef CC_INTERP
static ByteSize result_index_offset() { return byte_offset_of(methodOopDesc, _result_index ); } static ByteSize result_index_offset() { return byte_offset_of(methodOopDesc, _result_index ); }
@ -723,7 +720,6 @@ class methodOopDesc : public oopDesc {
// Garbage collection support // Garbage collection support
oop* adr_constMethod() const { return (oop*)&_constMethod; } oop* adr_constMethod() const { return (oop*)&_constMethod; }
oop* adr_constants() const { return (oop*)&_constants; }
oop* adr_method_data() const { return (oop*)&_method_data; } oop* adr_method_data() const { return (oop*)&_method_data; }
}; };

View File

@ -147,7 +147,6 @@ macro(LoadNKlass)
macro(LoadL) macro(LoadL)
macro(LoadL_unaligned) macro(LoadL_unaligned)
macro(LoadPLocked) macro(LoadPLocked)
macro(LoadLLocked)
macro(LoadP) macro(LoadP)
macro(LoadN) macro(LoadN)
macro(LoadRange) macro(LoadRange)

View File

@ -2297,7 +2297,6 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc ) {
case Op_LoadL: case Op_LoadL:
case Op_LoadL_unaligned: case Op_LoadL_unaligned:
case Op_LoadPLocked: case Op_LoadPLocked:
case Op_LoadLLocked:
case Op_LoadP: case Op_LoadP:
case Op_LoadN: case Op_LoadN:
case Op_LoadRange: case Op_LoadRange:

View File

@ -284,9 +284,14 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
const int N = 64; const int N = 64;
// Dummy node to keep intermediate nodes alive during construction
Node* hook = new (phase->C, 4) Node(4);
// u0 = u & 0xFFFFFFFF; u1 = u >> 32; // u0 = u & 0xFFFFFFFF; u1 = u >> 32;
Node* u0 = phase->transform(new (phase->C, 3) AndLNode(dividend, phase->longcon(0xFFFFFFFF))); Node* u0 = phase->transform(new (phase->C, 3) AndLNode(dividend, phase->longcon(0xFFFFFFFF)));
Node* u1 = phase->transform(new (phase->C, 3) RShiftLNode(dividend, phase->intcon(N / 2))); Node* u1 = phase->transform(new (phase->C, 3) RShiftLNode(dividend, phase->intcon(N / 2)));
hook->init_req(0, u0);
hook->init_req(1, u1);
// v0 = v & 0xFFFFFFFF; v1 = v >> 32; // v0 = v & 0xFFFFFFFF; v1 = v >> 32;
Node* v0 = phase->longcon(magic_const & 0xFFFFFFFF); Node* v0 = phase->longcon(magic_const & 0xFFFFFFFF);
@ -299,19 +304,14 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
Node* u1v0 = phase->transform(new (phase->C, 3) MulLNode(u1, v0)); Node* u1v0 = phase->transform(new (phase->C, 3) MulLNode(u1, v0));
Node* temp = phase->transform(new (phase->C, 3) URShiftLNode(w0, phase->intcon(N / 2))); Node* temp = phase->transform(new (phase->C, 3) URShiftLNode(w0, phase->intcon(N / 2)));
Node* t = phase->transform(new (phase->C, 3) AddLNode(u1v0, temp)); Node* t = phase->transform(new (phase->C, 3) AddLNode(u1v0, temp));
hook->init_req(2, t);
// w1 = t & 0xFFFFFFFF; // w1 = t & 0xFFFFFFFF;
Node* w1 = new (phase->C, 3) AndLNode(t, phase->longcon(0xFFFFFFFF)); Node* w1 = phase->transform(new (phase->C, 3) AndLNode(t, phase->longcon(0xFFFFFFFF)));
hook->init_req(3, w1);
// w2 = t >> 32; // w2 = t >> 32;
Node* w2 = new (phase->C, 3) RShiftLNode(t, phase->intcon(N / 2)); Node* w2 = phase->transform(new (phase->C, 3) RShiftLNode(t, phase->intcon(N / 2)));
// 6732154: Construct both w1 and w2 before transforming, so t
// doesn't go dead prematurely.
// 6837011: We need to transform w2 before w1 because the
// transformation of w1 could return t.
w2 = phase->transform(w2);
w1 = phase->transform(w1);
// w1 = u0*v1 + w1; // w1 = u0*v1 + w1;
Node* u0v1 = phase->transform(new (phase->C, 3) MulLNode(u0, v1)); Node* u0v1 = phase->transform(new (phase->C, 3) MulLNode(u0, v1));
@ -322,6 +322,16 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
Node* temp1 = phase->transform(new (phase->C, 3) AddLNode(u1v1, w2)); Node* temp1 = phase->transform(new (phase->C, 3) AddLNode(u1v1, w2));
Node* temp2 = phase->transform(new (phase->C, 3) RShiftLNode(w1, phase->intcon(N / 2))); Node* temp2 = phase->transform(new (phase->C, 3) RShiftLNode(w1, phase->intcon(N / 2)));
// Remove the bogus extra edges used to keep things alive
PhaseIterGVN* igvn = phase->is_IterGVN();
if (igvn != NULL) {
igvn->remove_dead_node(hook);
} else {
for (int i = 0; i < 4; i++) {
hook->set_req(i, NULL);
}
}
return new (phase->C, 3) AddLNode(temp1, temp2); return new (phase->C, 3) AddLNode(temp1, temp2);
} }

View File

@ -465,15 +465,11 @@ void PhaseIdealLoop::Dominators() {
// Kill dead input path // Kill dead input path
assert( !visited.test(whead->in(i)->_idx), assert( !visited.test(whead->in(i)->_idx),
"input with no loop must be dead" ); "input with no loop must be dead" );
_igvn.hash_delete(whead); _igvn.delete_input_of(whead, i);
whead->del_req(i);
_igvn._worklist.push(whead);
for (DUIterator_Fast jmax, j = whead->fast_outs(jmax); j < jmax; j++) { for (DUIterator_Fast jmax, j = whead->fast_outs(jmax); j < jmax; j++) {
Node* p = whead->fast_out(j); Node* p = whead->fast_out(j);
if( p->is_Phi() ) { if( p->is_Phi() ) {
_igvn.hash_delete(p); _igvn.delete_input_of(p, i);
p->del_req(i);
_igvn._worklist.push(p);
} }
} }
i--; // Rerun same iteration i--; // Rerun same iteration

View File

@ -338,8 +338,7 @@ static Node* split_if(IfNode *iff, PhaseIterGVN *igvn) {
Node *phi_f = NULL; // do not construct unless needed Node *phi_f = NULL; // do not construct unless needed
for (DUIterator_Last i2min, i2 = phi->last_outs(i2min); i2 >= i2min; --i2) { for (DUIterator_Last i2min, i2 = phi->last_outs(i2min); i2 >= i2min; --i2) {
Node* v = phi->last_out(i2);// User of the phi Node* v = phi->last_out(i2);// User of the phi
igvn->hash_delete(v); // Have to fixup other Phi users igvn->rehash_node_delayed(v); // Have to fixup other Phi users
igvn->_worklist.push(v);
uint vop = v->Opcode(); uint vop = v->Opcode();
Node *proj = NULL; Node *proj = NULL;
if( vop == Op_Phi ) { // Remote merge point if( vop == Op_Phi ) { // Remote merge point
@ -552,9 +551,8 @@ static void adjust_check(Node* proj, Node* range, Node* index,
if( new_cmp == cmp ) return; if( new_cmp == cmp ) return;
// Else, adjust existing check // Else, adjust existing check
Node *new_bol = gvn->transform( new (gvn->C, 2) BoolNode( new_cmp, bol->as_Bool()->_test._test ) ); Node *new_bol = gvn->transform( new (gvn->C, 2) BoolNode( new_cmp, bol->as_Bool()->_test._test ) );
igvn->hash_delete( iff ); igvn->rehash_node_delayed( iff );
iff->set_req_X( 1, new_bol, igvn ); iff->set_req_X( 1, new_bol, igvn );
igvn->_worklist.push( iff );
} }
//------------------------------up_one_dom------------------------------------- //------------------------------up_one_dom-------------------------------------
@ -732,9 +730,7 @@ Node* IfNode::fold_compares(PhaseGVN* phase) {
Node* adjusted = phase->transform(new (phase->C, 3) SubINode(n, phase->intcon(failtype->_lo))); Node* adjusted = phase->transform(new (phase->C, 3) SubINode(n, phase->intcon(failtype->_lo)));
Node* newcmp = phase->transform(new (phase->C, 3) CmpUNode(adjusted, phase->intcon(bound))); Node* newcmp = phase->transform(new (phase->C, 3) CmpUNode(adjusted, phase->intcon(bound)));
Node* newbool = phase->transform(new (phase->C, 2) BoolNode(newcmp, cond)); Node* newbool = phase->transform(new (phase->C, 2) BoolNode(newcmp, cond));
phase->hash_delete(dom_iff); phase->is_IterGVN()->replace_input_of(dom_iff, 1, phase->intcon(ctrl->as_Proj()->_con));
dom_iff->set_req(1, phase->intcon(ctrl->as_Proj()->_con));
phase->is_IterGVN()->_worklist.push(dom_iff);
phase->hash_delete(this); phase->hash_delete(this);
set_req(1, newbool); set_req(1, newbool);
return this; return this;
@ -1042,17 +1038,15 @@ void IfNode::dominated_by( Node *prev_dom, PhaseIterGVN *igvn ) {
// Loop ends when projection has no more uses. // Loop ends when projection has no more uses.
for (DUIterator_Last jmin, j = ifp->last_outs(jmin); j >= jmin; --j) { for (DUIterator_Last jmin, j = ifp->last_outs(jmin); j >= jmin; --j) {
Node* s = ifp->last_out(j); // Get child of IfTrue/IfFalse Node* s = ifp->last_out(j); // Get child of IfTrue/IfFalse
igvn->hash_delete(s); // Yank from hash table before edge hacking
if( !s->depends_only_on_test() ) { if( !s->depends_only_on_test() ) {
// Find the control input matching this def-use edge. // Find the control input matching this def-use edge.
// For Regions it may not be in slot 0. // For Regions it may not be in slot 0.
uint l; uint l;
for( l = 0; s->in(l) != ifp; l++ ) { } for( l = 0; s->in(l) != ifp; l++ ) { }
s->set_req(l, ctrl_target); igvn->replace_input_of(s, l, ctrl_target);
} else { // Else, for control producers, } else { // Else, for control producers,
s->set_req(0, data_target); // Move child to data-target igvn->replace_input_of(s, 0, data_target); // Move child to data-target
} }
igvn->_worklist.push(s); // Revisit collapsed Phis
} // End for each child of a projection } // End for each child of a projection
igvn->remove_dead_node(ifp); igvn->remove_dead_node(ifp);

View File

@ -192,8 +192,6 @@ class LibraryCallKit : public GraphKit {
void copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, bool is_array, bool card_mark); void copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, bool is_array, bool card_mark);
bool inline_native_clone(bool is_virtual); bool inline_native_clone(bool is_virtual);
bool inline_native_Reflection_getCallerClass(); bool inline_native_Reflection_getCallerClass();
bool inline_native_AtomicLong_get();
bool inline_native_AtomicLong_attemptUpdate();
bool is_method_invoke_or_aux_frame(JVMState* jvms); bool is_method_invoke_or_aux_frame(JVMState* jvms);
// Helper function for inlining native object hash method // Helper function for inlining native object hash method
bool inline_native_hashcode(bool is_virtual, bool is_static); bool inline_native_hashcode(bool is_virtual, bool is_static);
@ -331,11 +329,6 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
// We do not intrinsify this. The optimizer does fine with it. // We do not intrinsify this. The optimizer does fine with it.
return NULL; return NULL;
case vmIntrinsics::_get_AtomicLong:
case vmIntrinsics::_attemptUpdate:
if (!InlineAtomicLong) return NULL;
break;
case vmIntrinsics::_getCallerClass: case vmIntrinsics::_getCallerClass:
if (!UseNewReflection) return NULL; if (!UseNewReflection) return NULL;
if (!InlineReflectionGetCallerClass) return NULL; if (!InlineReflectionGetCallerClass) return NULL;
@ -711,11 +704,6 @@ bool LibraryCallKit::try_to_inline() {
case vmIntrinsics::_reverseBytes_c: case vmIntrinsics::_reverseBytes_c:
return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id()); return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id());
case vmIntrinsics::_get_AtomicLong:
return inline_native_AtomicLong_get();
case vmIntrinsics::_attemptUpdate:
return inline_native_AtomicLong_attemptUpdate();
case vmIntrinsics::_getCallerClass: case vmIntrinsics::_getCallerClass:
return inline_native_Reflection_getCallerClass(); return inline_native_Reflection_getCallerClass();
@ -4006,113 +3994,6 @@ bool LibraryCallKit::is_method_invoke_or_aux_frame(JVMState* jvms) {
return false; return false;
} }
static int value_field_offset = -1; // offset of the "value" field of AtomicLongCSImpl. This is needed by
// inline_native_AtomicLong_attemptUpdate() but it has no way of
// computing it since there is no lookup field by name function in the
// CI interface. This is computed and set by inline_native_AtomicLong_get().
// Using a static variable here is safe even if we have multiple compilation
// threads because the offset is constant. At worst the same offset will be
// computed and stored multiple
bool LibraryCallKit::inline_native_AtomicLong_get() {
// Restore the stack and pop off the argument
_sp+=1;
Node *obj = pop();
// get the offset of the "value" field. Since the CI interfaces
// does not provide a way to look up a field by name, we scan the bytecodes
// to get the field index. We expect the first 2 instructions of the method
// to be:
// 0 aload_0
// 1 getfield "value"
ciMethod* method = callee();
if (value_field_offset == -1)
{
ciField* value_field;
ciBytecodeStream iter(method);
Bytecodes::Code bc = iter.next();
if ((bc != Bytecodes::_aload_0) &&
((bc != Bytecodes::_aload) || (iter.get_index() != 0)))
return false;
bc = iter.next();
if (bc != Bytecodes::_getfield)
return false;
bool ignore;
value_field = iter.get_field(ignore);
value_field_offset = value_field->offset_in_bytes();
}
// Null check without removing any arguments.
_sp++;
obj = do_null_check(obj, T_OBJECT);
_sp--;
// Check for locking null object
if (stopped()) return true;
Node *adr = basic_plus_adr(obj, obj, value_field_offset);
const TypePtr *adr_type = _gvn.type(adr)->is_ptr();
int alias_idx = C->get_alias_index(adr_type);
Node *result = _gvn.transform(new (C, 3) LoadLLockedNode(control(), memory(alias_idx), adr));
push_pair(result);
return true;
}
bool LibraryCallKit::inline_native_AtomicLong_attemptUpdate() {
// Restore the stack and pop off the arguments
_sp+=5;
Node *newVal = pop_pair();
Node *oldVal = pop_pair();
Node *obj = pop();
// we need the offset of the "value" field which was computed when
// inlining the get() method. Give up if we don't have it.
if (value_field_offset == -1)
return false;
// Null check without removing any arguments.
_sp+=5;
obj = do_null_check(obj, T_OBJECT);
_sp-=5;
// Check for locking null object
if (stopped()) return true;
Node *adr = basic_plus_adr(obj, obj, value_field_offset);
const TypePtr *adr_type = _gvn.type(adr)->is_ptr();
int alias_idx = C->get_alias_index(adr_type);
Node *cas = _gvn.transform(new (C, 5) StoreLConditionalNode(control(), memory(alias_idx), adr, newVal, oldVal));
Node *store_proj = _gvn.transform( new (C, 1) SCMemProjNode(cas));
set_memory(store_proj, alias_idx);
Node *bol = _gvn.transform( new (C, 2) BoolNode( cas, BoolTest::eq ) );
Node *result;
// CMove node is not used to be able fold a possible check code
// after attemptUpdate() call. This code could be transformed
// into CMove node by loop optimizations.
{
RegionNode *r = new (C, 3) RegionNode(3);
result = new (C, 3) PhiNode(r, TypeInt::BOOL);
Node *iff = create_and_xform_if(control(), bol, PROB_FAIR, COUNT_UNKNOWN);
Node *iftrue = opt_iff(r, iff);
r->init_req(1, iftrue);
result->init_req(1, intcon(1));
result->init_req(2, intcon(0));
set_control(_gvn.transform(r));
record_for_igvn(r);
C->set_has_split_ifs(true); // Has chance for split-if optimization
}
push(_gvn.transform(result));
return true;
}
bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) { bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
// restore the arguments // restore the arguments
_sp += arg_size(); _sp += arg_size();

View File

@ -212,9 +212,8 @@ ProjNode* PhaseIdealLoop::create_new_if_for_predicate(ProjNode* cont_proj, Node*
Node* use = rgn->fast_out(i); Node* use = rgn->fast_out(i);
if (use->is_Phi() && use->outcnt() > 0) { if (use->is_Phi() && use->outcnt() > 0) {
assert(use->in(0) == rgn, ""); assert(use->in(0) == rgn, "");
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
use->add_req(use->in(proj_index)); use->add_req(use->in(proj_index));
_igvn._worklist.push(use);
has_phi = true; has_phi = true;
} }
} }
@ -284,9 +283,8 @@ ProjNode* PhaseIterGVN::create_new_if_for_predicate(ProjNode* cont_proj, Node* n
for (DUIterator_Fast imax, i = rgn->fast_outs(imax); i < imax; i++) { for (DUIterator_Fast imax, i = rgn->fast_outs(imax); i < imax; i++) {
Node* use = rgn->fast_out(i); Node* use = rgn->fast_out(i);
if (use->is_Phi() && use->outcnt() > 0) { if (use->is_Phi() && use->outcnt() > 0) {
hash_delete(use); rehash_node_delayed(use);
use->add_req(use->in(proj_index)); use->add_req(use->in(proj_index));
_worklist.push(use);
has_phi = true; has_phi = true;
} }
} }

View File

@ -961,9 +961,7 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
set_loop(zer_iff, loop->_parent); set_loop(zer_iff, loop->_parent);
// Plug in the false-path, taken if we need to skip post-loop // Plug in the false-path, taken if we need to skip post-loop
_igvn.hash_delete( main_exit ); _igvn.replace_input_of(main_exit, 0, zer_iff);
main_exit->set_req(0, zer_iff);
_igvn._worklist.push(main_exit);
set_idom(main_exit, zer_iff, dd_main_exit); set_idom(main_exit, zer_iff, dd_main_exit);
set_idom(main_exit->unique_out(), 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 // Make the true-path, must enter the post loop
@ -1956,9 +1954,7 @@ void PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) {
C->set_major_progress(); C->set_major_progress();
Node *kill_con = _igvn.intcon( 1-flip ); Node *kill_con = _igvn.intcon( 1-flip );
set_ctrl(kill_con, C->root()); set_ctrl(kill_con, C->root());
_igvn.hash_delete(iff); _igvn.replace_input_of(iff, 1, kill_con);
iff->set_req(1, kill_con);
_igvn._worklist.push(iff);
// Find surviving projection // Find surviving projection
assert(iff->is_If(), ""); assert(iff->is_If(), "");
ProjNode* dp = ((IfNode*)iff)->proj_out(1-flip); ProjNode* dp = ((IfNode*)iff)->proj_out(1-flip);
@ -1966,11 +1962,9 @@ void PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) {
for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) { for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) {
Node* cd = dp->fast_out(i); // Control-dependent node Node* cd = dp->fast_out(i); // Control-dependent node
if( cd->is_Load() ) { // Loads can now float around in the loop if( cd->is_Load() ) { // Loads can now float around in the loop
_igvn.hash_delete(cd);
// Allow the load to float around in the loop, or before it // Allow the load to float around in the loop, or before it
// but NOT before the pre-loop. // but NOT before the pre-loop.
cd->set_req(0, ctrl); // ctrl, not NULL _igvn.replace_input_of(cd, 0, ctrl); // ctrl, not NULL
_igvn._worklist.push(cd);
--i; --i;
--imax; --imax;
} }
@ -2029,14 +2023,10 @@ void PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) {
main_bol->set_req(1,main_cmp); main_bol->set_req(1,main_cmp);
} }
// Hack the now-private loop bounds // Hack the now-private loop bounds
_igvn.hash_delete(main_cmp); _igvn.replace_input_of(main_cmp, 2, main_limit);
main_cmp->set_req(2, main_limit);
_igvn._worklist.push(main_cmp);
// The OpaqueNode is unshared by design // The OpaqueNode is unshared by design
_igvn.hash_delete(opqzm);
assert( opqzm->outcnt() == 1, "cannot hack shared node" ); assert( opqzm->outcnt() == 1, "cannot hack shared node" );
opqzm->set_req(1,main_limit); _igvn.replace_input_of(opqzm, 1, main_limit);
_igvn._worklist.push(opqzm);
} }
//------------------------------DCE_loop_body---------------------------------- //------------------------------DCE_loop_body----------------------------------
@ -2178,9 +2168,7 @@ bool IdealLoopTree::policy_do_remove_empty_loop( PhaseIdealLoop *phase ) {
Node* cmp = cl->loopexit()->cmp_node(); Node* cmp = cl->loopexit()->cmp_node();
assert(cl->limit() == cmp->in(2), "sanity"); assert(cl->limit() == cmp->in(2), "sanity");
phase->_igvn._worklist.push(cmp->in(2)); // put limit on worklist phase->_igvn._worklist.push(cmp->in(2)); // put limit on worklist
phase->_igvn.hash_delete(cmp); phase->_igvn.replace_input_of(cmp, 2, exact_limit); // put cmp on worklist
cmp->set_req(2, exact_limit);
phase->_igvn._worklist.push(cmp); // put cmp on worklist
} }
// Note: the final value after increment should not overflow since // Note: the final value after increment should not overflow since
// counted loop has limit check predicate. // counted loop has limit check predicate.

View File

@ -174,27 +174,21 @@ void PhaseIdealLoop::do_unswitching (IdealLoopTree *loop, Node_List &old_new) {
Node* use = worklist.pop(); Node* use = worklist.pop();
Node* nuse = use->clone(); Node* nuse = use->clone();
nuse->set_req(0, invar_proj); nuse->set_req(0, invar_proj);
_igvn.hash_delete(use); _igvn.replace_input_of(use, 1, nuse);
use->set_req(1, nuse);
_igvn._worklist.push(use);
register_new_node(nuse, invar_proj); register_new_node(nuse, invar_proj);
// Same for the clone // Same for the clone
Node* use_clone = old_new[use->_idx]; Node* use_clone = old_new[use->_idx];
_igvn.hash_delete(use_clone); _igvn.replace_input_of(use_clone, 1, nuse);
use_clone->set_req(1, nuse);
_igvn._worklist.push(use_clone);
} }
} }
// Hardwire the control paths in the loops into if(true) and if(false) // Hardwire the control paths in the loops into if(true) and if(false)
_igvn.hash_delete(unswitch_iff); _igvn.rehash_node_delayed(unswitch_iff);
short_circuit_if(unswitch_iff, proj_true); short_circuit_if(unswitch_iff, proj_true);
_igvn._worklist.push(unswitch_iff);
IfNode* unswitch_iff_clone = old_new[unswitch_iff->_idx]->as_If(); IfNode* unswitch_iff_clone = old_new[unswitch_iff->_idx]->as_If();
_igvn.hash_delete(unswitch_iff_clone); _igvn.rehash_node_delayed(unswitch_iff_clone);
short_circuit_if(unswitch_iff_clone, proj_false); short_circuit_if(unswitch_iff_clone, proj_false);
_igvn._worklist.push(unswitch_iff_clone);
// Reoptimize loops // Reoptimize loops
loop->record_for_igvn(); loop->record_for_igvn();
@ -224,8 +218,7 @@ ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
LoopNode* head = loop->_head->as_Loop(); LoopNode* head = loop->_head->as_Loop();
bool counted_loop = head->is_CountedLoop(); bool counted_loop = head->is_CountedLoop();
Node* entry = head->in(LoopNode::EntryControl); Node* entry = head->in(LoopNode::EntryControl);
_igvn.hash_delete(entry); _igvn.rehash_node_delayed(entry);
_igvn._worklist.push(entry);
IdealLoopTree* outer_loop = loop->_parent; IdealLoopTree* outer_loop = loop->_parent;
Node *cont = _igvn.intcon(1); Node *cont = _igvn.intcon(1);
@ -249,18 +242,14 @@ ProjNode* PhaseIdealLoop::create_slow_version_of_loop(IdealLoopTree *loop,
// Fast (true) control // Fast (true) control
Node* iffast_pred = clone_loop_predicates(entry, iffast, !counted_loop); Node* iffast_pred = clone_loop_predicates(entry, iffast, !counted_loop);
_igvn.hash_delete(head); _igvn.replace_input_of(head, LoopNode::EntryControl, iffast_pred);
head->set_req(LoopNode::EntryControl, iffast_pred);
set_idom(head, iffast_pred, dom_depth(head)); set_idom(head, iffast_pred, dom_depth(head));
_igvn._worklist.push(head);
// Slow (false) control // Slow (false) control
Node* ifslow_pred = clone_loop_predicates(entry, ifslow, !counted_loop); Node* ifslow_pred = clone_loop_predicates(entry, ifslow, !counted_loop);
LoopNode* slow_head = old_new[head->_idx]->as_Loop(); LoopNode* slow_head = old_new[head->_idx]->as_Loop();
_igvn.hash_delete(slow_head); _igvn.replace_input_of(slow_head, LoopNode::EntryControl, ifslow_pred);
slow_head->set_req(LoopNode::EntryControl, ifslow_pred);
set_idom(slow_head, ifslow_pred, dom_depth(slow_head)); set_idom(slow_head, ifslow_pred, dom_depth(slow_head));
_igvn._worklist.push(slow_head);
recompute_dom_depth(); recompute_dom_depth();

View File

@ -1129,8 +1129,7 @@ void IdealLoopTree::split_fall_in( PhaseIdealLoop *phase, int fall_in_cnt ) {
// I'm mid-iteration over the Region's uses. // I'm mid-iteration over the Region's uses.
for (DUIterator_Last imin, i = old_phi->last_outs(imin); i >= imin; ) { for (DUIterator_Last imin, i = old_phi->last_outs(imin); i >= imin; ) {
Node* use = old_phi->last_out(i); Node* use = old_phi->last_out(i);
igvn.hash_delete(use); igvn.rehash_node_delayed(use);
igvn._worklist.push(use);
uint uses_found = 0; uint uses_found = 0;
for (uint j = 0; j < use->len(); j++) { for (uint j = 0; j < use->len(); j++) {
if (use->in(j) == old_phi) { if (use->in(j) == old_phi) {
@ -1186,10 +1185,8 @@ void IdealLoopTree::split_outer_loop( PhaseIdealLoop *phase ) {
phi->init_req(LoopNode::LoopBackControl, old_phi->in(outer_idx)); phi->init_req(LoopNode::LoopBackControl, old_phi->in(outer_idx));
phi = igvn.register_new_node_with_optimizer(phi, old_phi); phi = igvn.register_new_node_with_optimizer(phi, old_phi);
// Make old Phi point to new Phi on the fall-in path // Make old Phi point to new Phi on the fall-in path
igvn.hash_delete(old_phi); igvn.replace_input_of(old_phi, LoopNode::EntryControl, phi);
old_phi->set_req(LoopNode::EntryControl, phi);
old_phi->del_req(outer_idx); old_phi->del_req(outer_idx);
igvn._worklist.push(old_phi);
} }
} }
@ -1992,9 +1989,7 @@ void PhaseIdealLoop::build_and_optimize(bool do_split_ifs, bool skip_loop_opts)
// we do it here. // we do it here.
for( uint i = 1; i < C->root()->req(); i++ ) { for( uint i = 1; i < C->root()->req(); i++ ) {
if( !_nodes[C->root()->in(i)->_idx] ) { // Dead path into Root? if( !_nodes[C->root()->in(i)->_idx] ) { // Dead path into Root?
_igvn.hash_delete(C->root()); _igvn.delete_input_of(C->root(), i);
C->root()->del_req(i);
_igvn._worklist.push(C->root());
i--; // Rerun same iteration on compressed edges i--; // Rerun same iteration on compressed edges
} }
} }

View File

@ -216,9 +216,7 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc
Node *con = _igvn.makecon(pop == Op_IfTrue ? TypeInt::ONE : TypeInt::ZERO); Node *con = _igvn.makecon(pop == Op_IfTrue ? TypeInt::ONE : TypeInt::ZERO);
set_ctrl(con, C->root()); // Constant gets a new use set_ctrl(con, C->root()); // Constant gets a new use
// Hack the dominated test // Hack the dominated test
_igvn.hash_delete(iff); _igvn.replace_input_of(iff, 1, con);
iff->set_req(1, con);
_igvn._worklist.push(iff);
// If I dont have a reachable TRUE and FALSE path following the IfNode then // If I dont have a reachable TRUE and FALSE path following the IfNode then
// I can assume this path reaches an infinite loop. In this case it's not // I can assume this path reaches an infinite loop. In this case it's not
@ -245,10 +243,8 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc
Node* cd = dp->fast_out(i); // Control-dependent node Node* cd = dp->fast_out(i); // Control-dependent node
if (cd->depends_only_on_test()) { if (cd->depends_only_on_test()) {
assert(cd->in(0) == dp, ""); assert(cd->in(0) == dp, "");
_igvn.hash_delete(cd); _igvn.replace_input_of(cd, 0, prevdom);
cd->set_req(0, prevdom);
set_early_ctrl(cd); set_early_ctrl(cd);
_igvn._worklist.push(cd);
IdealLoopTree *new_loop = get_loop(get_ctrl(cd)); IdealLoopTree *new_loop = get_loop(get_ctrl(cd));
if (old_loop != new_loop) { if (old_loop != new_loop) {
if (!old_loop->_child) old_loop->_body.yank(cd); if (!old_loop->_child) old_loop->_body.yank(cd);
@ -952,8 +948,7 @@ void PhaseIdealLoop::split_if_with_blocks_post( Node *n ) {
if (!n->is_Load() || late_load_ctrl != n_ctrl) { if (!n->is_Load() || late_load_ctrl != n_ctrl) {
for (DUIterator_Last jmin, j = n->last_outs(jmin); j >= jmin; ) { for (DUIterator_Last jmin, j = n->last_outs(jmin); j >= jmin; ) {
Node *u = n->last_out(j); // Clone private computation per use Node *u = n->last_out(j); // Clone private computation per use
_igvn.hash_delete(u); _igvn.rehash_node_delayed(u);
_igvn._worklist.push(u);
Node *x = n->clone(); // Clone computation Node *x = n->clone(); // Clone computation
Node *x_ctrl = NULL; Node *x_ctrl = NULL;
if( u->is_Phi() ) { if( u->is_Phi() ) {
@ -1089,9 +1084,7 @@ BoolNode *PhaseIdealLoop::clone_iff( PhiNode *phi, IdealLoopTree *loop ) {
for( i = 1; i < phi->req(); i++ ) { for( i = 1; i < phi->req(); i++ ) {
Node *b = phi->in(i); Node *b = phi->in(i);
if( b->is_Phi() ) { if( b->is_Phi() ) {
_igvn.hash_delete(phi); _igvn.replace_input_of(phi, i, clone_iff( b->as_Phi(), loop ));
_igvn._worklist.push(phi);
phi->set_req(i, clone_iff( b->as_Phi(), loop ));
} else { } else {
assert( b->is_Bool(), "" ); assert( b->is_Bool(), "" );
} }
@ -1161,9 +1154,7 @@ CmpNode *PhaseIdealLoop::clone_bool( PhiNode *phi, IdealLoopTree *loop ) {
for( i = 1; i < phi->req(); i++ ) { for( i = 1; i < phi->req(); i++ ) {
Node *b = phi->in(i); Node *b = phi->in(i);
if( b->is_Phi() ) { if( b->is_Phi() ) {
_igvn.hash_delete(phi); _igvn.replace_input_of(phi, i, clone_bool( b->as_Phi(), loop ));
_igvn._worklist.push(phi);
phi->set_req(i, clone_bool( b->as_Phi(), loop ));
} else { } else {
assert( b->is_Cmp() || b->is_top(), "inputs are all Cmp or TOP" ); assert( b->is_Cmp() || b->is_top(), "inputs are all Cmp or TOP" );
} }
@ -1347,8 +1338,7 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
// The original user of 'use' uses 'r' instead. // The original user of 'use' uses 'r' instead.
for (DUIterator_Last lmin, l = use->last_outs(lmin); l >= lmin;) { for (DUIterator_Last lmin, l = use->last_outs(lmin); l >= lmin;) {
Node* useuse = use->last_out(l); Node* useuse = use->last_out(l);
_igvn.hash_delete(useuse); _igvn.rehash_node_delayed(useuse);
_igvn._worklist.push(useuse);
uint uses_found = 0; uint uses_found = 0;
if( useuse->in(0) == use ) { if( useuse->in(0) == use ) {
useuse->set_req(0, r); useuse->set_req(0, r);
@ -1435,9 +1425,7 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
if( use->is_Phi() ) // Phi use is in prior block if( use->is_Phi() ) // Phi use is in prior block
cfg = prev->in(idx); // NOT in block of Phi itself cfg = prev->in(idx); // NOT in block of Phi itself
if (cfg->is_top()) { // Use is dead? if (cfg->is_top()) { // Use is dead?
_igvn.hash_delete(use); _igvn.replace_input_of(use, idx, C->top());
_igvn._worklist.push(use);
use->set_req(idx, C->top());
continue; continue;
} }
@ -1487,9 +1475,7 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
set_ctrl(phi, prev); set_ctrl(phi, prev);
} }
// Make 'use' use the Phi instead of the old loop body exit value // Make 'use' use the Phi instead of the old loop body exit value
_igvn.hash_delete(use); _igvn.replace_input_of(use, idx, phi);
_igvn._worklist.push(use);
use->set_req(idx, phi);
if( use->_idx >= new_counter ) { // If updating new phis if( use->_idx >= new_counter ) { // If updating new phis
// Not needed for correctness, but prevents a weak assert // Not needed for correctness, but prevents a weak assert
// in AddPNode from tripping (when we end up with different // in AddPNode from tripping (when we end up with different
@ -1517,9 +1503,7 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
Node *iff = split_if_set->pop(); Node *iff = split_if_set->pop();
if( iff->in(1)->is_Phi() ) { if( iff->in(1)->is_Phi() ) {
BoolNode *b = clone_iff( iff->in(1)->as_Phi(), loop ); BoolNode *b = clone_iff( iff->in(1)->as_Phi(), loop );
_igvn.hash_delete(iff); _igvn.replace_input_of(iff, 1, b);
_igvn._worklist.push(iff);
iff->set_req(1, b);
} }
} }
} }
@ -1529,9 +1513,7 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
Node *phi = b->in(1); Node *phi = b->in(1);
assert( phi->is_Phi(), "" ); assert( phi->is_Phi(), "" );
CmpNode *cmp = clone_bool( (PhiNode*)phi, loop ); CmpNode *cmp = clone_bool( (PhiNode*)phi, loop );
_igvn.hash_delete(b); _igvn.replace_input_of(b, 1, cmp);
_igvn._worklist.push(b);
b->set_req(1, cmp);
} }
} }
if( split_cex_set ) { if( split_cex_set ) {
@ -1686,10 +1668,8 @@ ProjNode* PhaseIdealLoop::insert_if_before_proj(Node* left, bool Signed, BoolTes
ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj(); ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj();
int ddepth = dom_depth(proj); int ddepth = dom_depth(proj);
_igvn.hash_delete(iff); _igvn.rehash_node_delayed(iff);
_igvn._worklist.push(iff); _igvn.rehash_node_delayed(proj);
_igvn.hash_delete(proj);
_igvn._worklist.push(proj);
proj->set_req(0, NULL); // temporary disconnect proj->set_req(0, NULL); // temporary disconnect
ProjNode* proj2 = proj_clone(proj, iff); ProjNode* proj2 = proj_clone(proj, iff);
@ -1745,10 +1725,8 @@ RegionNode* PhaseIdealLoop::insert_region_before_proj(ProjNode* proj) {
ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj(); ProjNode *other_proj = iff->proj_out(!proj->is_IfTrue())->as_Proj();
int ddepth = dom_depth(proj); int ddepth = dom_depth(proj);
_igvn.hash_delete(iff); _igvn.rehash_node_delayed(iff);
_igvn._worklist.push(iff); _igvn.rehash_node_delayed(proj);
_igvn.hash_delete(proj);
_igvn._worklist.push(proj);
proj->set_req(0, NULL); // temporary disconnect proj->set_req(0, NULL); // temporary disconnect
ProjNode* proj2 = proj_clone(proj, iff); ProjNode* proj2 = proj_clone(proj, iff);
@ -1970,9 +1948,7 @@ void PhaseIdealLoop::clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, N
// clone "n" and insert it between the inputs of "n" and the use outside the loop // clone "n" and insert it between the inputs of "n" and the use outside the loop
Node* n_clone = n->clone(); Node* n_clone = n->clone();
_igvn.hash_delete(use); _igvn.replace_input_of(use, j, n_clone);
use->set_req(j, n_clone);
_igvn._worklist.push(use);
Node* use_c; Node* use_c;
if (!use->is_Phi()) { if (!use->is_Phi()) {
use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0); use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0);
@ -2028,8 +2004,7 @@ void PhaseIdealLoop::clone_for_special_use_inside_loop( IdealLoopTree *loop, Nod
#endif #endif
while( worklist.size() ) { while( worklist.size() ) {
Node *use = worklist.pop(); Node *use = worklist.pop();
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
_igvn._worklist.push(use);
for (uint j = 1; j < use->req(); j++) { for (uint j = 1; j < use->req(); j++) {
if (use->in(j) == n) { if (use->in(j) == n) {
use->set_req(j, n_clone); use->set_req(j, n_clone);
@ -2055,9 +2030,7 @@ void PhaseIdealLoop::insert_phi_for_loop( Node* use, uint idx, Node* lp_entry_va
_igvn.remove_dead_node(phi); _igvn.remove_dead_node(phi);
phi = hit; phi = hit;
} }
_igvn.hash_delete(use); _igvn.replace_input_of(use, idx, phi);
_igvn._worklist.push(use);
use->set_req(idx, phi);
} }
#ifdef ASSERT #ifdef ASSERT
@ -2630,9 +2603,7 @@ bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
// use is in loop // use is in loop
if (old_new[use->_idx] != NULL) { // null for dead code if (old_new[use->_idx] != NULL) { // null for dead code
Node* use_clone = old_new[use->_idx]; Node* use_clone = old_new[use->_idx];
_igvn.hash_delete(use); _igvn.replace_input_of(use, j, C->top());
use->set_req(j, C->top());
_igvn._worklist.push(use);
insert_phi_for_loop( use_clone, j, old_new[def->_idx], def, new_head_clone ); insert_phi_for_loop( use_clone, j, old_new[def->_idx], def, new_head_clone );
} }
} else { } else {
@ -2667,46 +2638,35 @@ bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
if (!n->is_CFG() && n->in(0) != NULL && if (!n->is_CFG() && n->in(0) != NULL &&
not_peel.test(n->_idx) && peel.test(n->in(0)->_idx)) { not_peel.test(n->_idx) && peel.test(n->in(0)->_idx)) {
Node* n_clone = old_new[n->_idx]; Node* n_clone = old_new[n->_idx];
_igvn.hash_delete(n_clone); _igvn.replace_input_of(n_clone, 0, new_head_clone);
n_clone->set_req(0, new_head_clone);
_igvn._worklist.push(n_clone);
} }
} }
// Backedge of the surviving new_head (the clone) is original last_peel // Backedge of the surviving new_head (the clone) is original last_peel
_igvn.hash_delete(new_head_clone); _igvn.replace_input_of(new_head_clone, LoopNode::LoopBackControl, last_peel);
new_head_clone->set_req(LoopNode::LoopBackControl, last_peel);
_igvn._worklist.push(new_head_clone);
// Cut first node in original not_peel set // Cut first node in original not_peel set
_igvn.hash_delete(new_head); _igvn.rehash_node_delayed(new_head); // Multiple edge updates:
new_head->set_req(LoopNode::EntryControl, C->top()); new_head->set_req(LoopNode::EntryControl, C->top()); // use rehash_node_delayed / set_req instead of
new_head->set_req(LoopNode::LoopBackControl, C->top()); new_head->set_req(LoopNode::LoopBackControl, C->top()); // multiple replace_input_of calls
_igvn._worklist.push(new_head);
// Copy head_clone back-branch info to original head // Copy head_clone back-branch info to original head
// and remove original head's loop entry and // and remove original head's loop entry and
// clone head's back-branch // clone head's back-branch
_igvn.hash_delete(head); _igvn.rehash_node_delayed(head); // Multiple edge updates
_igvn.hash_delete(head_clone); head->set_req(LoopNode::EntryControl, head_clone->in(LoopNode::LoopBackControl));
head->set_req(LoopNode::EntryControl, head_clone->in(LoopNode::LoopBackControl));
head->set_req(LoopNode::LoopBackControl, C->top()); head->set_req(LoopNode::LoopBackControl, C->top());
head_clone->set_req(LoopNode::LoopBackControl, C->top()); _igvn.replace_input_of(head_clone, LoopNode::LoopBackControl, C->top());
_igvn._worklist.push(head);
_igvn._worklist.push(head_clone);
// Similarly modify the phis // Similarly modify the phis
for (DUIterator_Fast kmax, k = head->fast_outs(kmax); k < kmax; k++) { for (DUIterator_Fast kmax, k = head->fast_outs(kmax); k < kmax; k++) {
Node* use = head->fast_out(k); Node* use = head->fast_out(k);
if (use->is_Phi() && use->outcnt() > 0) { if (use->is_Phi() && use->outcnt() > 0) {
Node* use_clone = old_new[use->_idx]; Node* use_clone = old_new[use->_idx];
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use); // Multiple edge updates
_igvn.hash_delete(use_clone); use->set_req(LoopNode::EntryControl, use_clone->in(LoopNode::LoopBackControl));
use->set_req(LoopNode::EntryControl, use_clone->in(LoopNode::LoopBackControl));
use->set_req(LoopNode::LoopBackControl, C->top()); use->set_req(LoopNode::LoopBackControl, C->top());
use_clone->set_req(LoopNode::LoopBackControl, C->top()); _igvn.replace_input_of(use_clone, LoopNode::LoopBackControl, C->top());
_igvn._worklist.push(use);
_igvn._worklist.push(use_clone);
} }
} }
@ -2792,8 +2752,7 @@ void PhaseIdealLoop::reorg_offsets(IdealLoopTree *loop) {
set_ctrl(neg_stride, C->root()); set_ctrl(neg_stride, C->root());
Node *post = new (C, 3) AddINode( opaq, neg_stride); Node *post = new (C, 3) AddINode( opaq, neg_stride);
register_new_node( post, u_ctrl ); register_new_node( post, u_ctrl );
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
_igvn._worklist.push(use);
for (uint j = 1; j < use->req(); j++) { for (uint j = 1; j < use->req(); j++) {
if (use->in(j) == phi) if (use->in(j) == phi)
use->set_req(j, post); use->set_req(j, post);

View File

@ -1447,9 +1447,8 @@ void PhaseMacroExpand::expand_allocate_common(
if (!always_slow && _memproj_fallthrough != NULL) { if (!always_slow && _memproj_fallthrough != NULL) {
for (DUIterator_Fast imax, i = _memproj_fallthrough->fast_outs(imax); i < imax; i++) { for (DUIterator_Fast imax, i = _memproj_fallthrough->fast_outs(imax); i < imax; i++) {
Node *use = _memproj_fallthrough->fast_out(i); Node *use = _memproj_fallthrough->fast_out(i);
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
imax -= replace_input(use, _memproj_fallthrough, result_phi_rawmem); imax -= replace_input(use, _memproj_fallthrough, result_phi_rawmem);
_igvn._worklist.push(use);
// back up iterator // back up iterator
--i; --i;
} }
@ -1463,9 +1462,8 @@ void PhaseMacroExpand::expand_allocate_common(
} }
for (DUIterator_Fast imax, i = _memproj_catchall->fast_outs(imax); i < imax; i++) { for (DUIterator_Fast imax, i = _memproj_catchall->fast_outs(imax); i < imax; i++) {
Node *use = _memproj_catchall->fast_out(i); Node *use = _memproj_catchall->fast_out(i);
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
imax -= replace_input(use, _memproj_catchall, _memproj_fallthrough); imax -= replace_input(use, _memproj_catchall, _memproj_fallthrough);
_igvn._worklist.push(use);
// back up iterator // back up iterator
--i; --i;
} }
@ -1481,9 +1479,8 @@ void PhaseMacroExpand::expand_allocate_common(
if (_ioproj_fallthrough != NULL) { if (_ioproj_fallthrough != NULL) {
for (DUIterator_Fast imax, i = _ioproj_fallthrough->fast_outs(imax); i < imax; i++) { for (DUIterator_Fast imax, i = _ioproj_fallthrough->fast_outs(imax); i < imax; i++) {
Node *use = _ioproj_fallthrough->fast_out(i); Node *use = _ioproj_fallthrough->fast_out(i);
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
imax -= replace_input(use, _ioproj_fallthrough, result_phi_i_o); imax -= replace_input(use, _ioproj_fallthrough, result_phi_i_o);
_igvn._worklist.push(use);
// back up iterator // back up iterator
--i; --i;
} }
@ -1497,9 +1494,8 @@ void PhaseMacroExpand::expand_allocate_common(
} }
for (DUIterator_Fast imax, i = _ioproj_catchall->fast_outs(imax); i < imax; i++) { for (DUIterator_Fast imax, i = _ioproj_catchall->fast_outs(imax); i < imax; i++) {
Node *use = _ioproj_catchall->fast_out(i); Node *use = _ioproj_catchall->fast_out(i);
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
imax -= replace_input(use, _ioproj_catchall, _ioproj_fallthrough); imax -= replace_input(use, _ioproj_catchall, _ioproj_fallthrough);
_igvn._worklist.push(use);
// back up iterator // back up iterator
--i; --i;
} }
@ -1857,18 +1853,16 @@ void PhaseMacroExpand::mark_eliminated_box(Node* oldbox, Node* obj) {
if (alock->box_node() == oldbox && alock->obj_node()->eqv_uncast(obj)) { if (alock->box_node() == oldbox && alock->obj_node()->eqv_uncast(obj)) {
// Replace Box and mark eliminated all related locks and unlocks. // Replace Box and mark eliminated all related locks and unlocks.
alock->set_non_esc_obj(); alock->set_non_esc_obj();
_igvn.hash_delete(alock); _igvn.rehash_node_delayed(alock);
alock->set_box_node(newbox); alock->set_box_node(newbox);
_igvn._worklist.push(alock);
next_edge = false; next_edge = false;
} }
} }
if (u->is_FastLock() && u->as_FastLock()->obj_node()->eqv_uncast(obj)) { if (u->is_FastLock() && u->as_FastLock()->obj_node()->eqv_uncast(obj)) {
FastLockNode* flock = u->as_FastLock(); FastLockNode* flock = u->as_FastLock();
assert(flock->box_node() == oldbox, "sanity"); assert(flock->box_node() == oldbox, "sanity");
_igvn.hash_delete(flock); _igvn.rehash_node_delayed(flock);
flock->set_box_node(newbox); flock->set_box_node(newbox);
_igvn._worklist.push(flock);
next_edge = false; next_edge = false;
} }
@ -1886,9 +1880,7 @@ void PhaseMacroExpand::mark_eliminated_box(Node* oldbox, Node* obj) {
Node* box_node = sfn->monitor_box(jvms, idx); Node* box_node = sfn->monitor_box(jvms, idx);
if (box_node == oldbox && obj_node->eqv_uncast(obj)) { if (box_node == oldbox && obj_node->eqv_uncast(obj)) {
int j = jvms->monitor_box_offset(idx); int j = jvms->monitor_box_offset(idx);
_igvn.hash_delete(u); _igvn.replace_input_of(u, j, newbox);
u->set_req(j, newbox);
_igvn._worklist.push(u);
next_edge = false; next_edge = false;
} }
} }

View File

@ -717,6 +717,22 @@ Node *MemNode::Ideal_common_DU_postCCP( PhaseCCP *ccp, Node* n, Node* adr ) {
adr = adr->in(1); adr = adr->in(1);
continue; continue;
case Op_EncodeP:
// EncodeP node's control edge could be set by this method
// when EncodeP node depends on CastPP node.
//
// Use its control edge for memory op because EncodeP may go away
// later when it is folded with following or preceding DecodeN node.
if (adr->in(0) == NULL) {
// Keep looking for cast nodes.
adr = adr->in(1);
continue;
}
ccp->hash_delete(n);
n->set_req(MemNode::Control, adr->in(0));
ccp->hash_insert(n);
return n;
case Op_CastPP: case Op_CastPP:
// If the CastPP is useless, just peek on through it. // If the CastPP is useless, just peek on through it.
if( ccp->type(adr) == ccp->type(adr->in(1)) ) { if( ccp->type(adr) == ccp->type(adr->in(1)) ) {

View File

@ -636,17 +636,6 @@ public:
virtual bool depends_only_on_test() const { return true; } virtual bool depends_only_on_test() const { return true; }
}; };
//------------------------------LoadLLockedNode---------------------------------
// Load-locked a pointer from memory (either object or array).
// On Sparc & Intel this is implemented as a normal long load.
class LoadLLockedNode : public LoadLNode {
public:
LoadLLockedNode( Node *c, Node *mem, Node *adr )
: LoadLNode(c,mem,adr,TypeRawPtr::BOTTOM, TypeLong::LONG) {}
virtual int Opcode() const;
virtual int store_Opcode() const { return Op_StoreLConditional; }
};
//------------------------------SCMemProjNode--------------------------------------- //------------------------------SCMemProjNode---------------------------------------
// This class defines a projection of the memory state of a store conditional node. // This class defines a projection of the memory state of a store conditional node.
// These nodes return a value, but also update memory. // These nodes return a value, but also update memory.

View File

@ -527,6 +527,9 @@ class Parse : public GraphKit {
int repush_if_args(); int repush_if_args();
void adjust_map_after_if(BoolTest::mask btest, Node* c, float prob, void adjust_map_after_if(BoolTest::mask btest, Node* c, float prob,
Block* path, Block* other_path); Block* path, Block* other_path);
void sharpen_type_after_if(BoolTest::mask btest,
Node* con, const Type* tcon,
Node* val, const Type* tval);
IfNode* jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask); IfNode* jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask);
Node* jump_if_join(Node* iffalse, Node* iftrue); Node* jump_if_join(Node* iffalse, Node* iftrue);
void jump_if_true_fork(IfNode *ifNode, int dest_bci_if_true, int prof_table_index); void jump_if_true_fork(IfNode *ifNode, int dest_bci_if_true, int prof_table_index);

View File

@ -1233,6 +1233,71 @@ void Parse::adjust_map_after_if(BoolTest::mask btest, Node* c, float prob,
if (!have_con) // remaining adjustments need a con if (!have_con) // remaining adjustments need a con
return; return;
sharpen_type_after_if(btest, con, tcon, val, tval);
}
static Node* extract_obj_from_klass_load(PhaseGVN* gvn, Node* n) {
Node* ldk;
if (n->is_DecodeN()) {
if (n->in(1)->Opcode() != Op_LoadNKlass) {
return NULL;
} else {
ldk = n->in(1);
}
} else if (n->Opcode() != Op_LoadKlass) {
return NULL;
} else {
ldk = n;
}
assert(ldk != NULL && ldk->is_Load(), "should have found a LoadKlass or LoadNKlass node");
Node* adr = ldk->in(MemNode::Address);
intptr_t off = 0;
Node* obj = AddPNode::Ideal_base_and_offset(adr, gvn, off);
if (obj == NULL || off != oopDesc::klass_offset_in_bytes()) // loading oopDesc::_klass?
return NULL;
const TypePtr* tp = gvn->type(obj)->is_ptr();
if (tp == NULL || !(tp->isa_instptr() || tp->isa_aryptr())) // is obj a Java object ptr?
return NULL;
return obj;
}
void Parse::sharpen_type_after_if(BoolTest::mask btest,
Node* con, const Type* tcon,
Node* val, const Type* tval) {
// Look for opportunities to sharpen the type of a node
// whose klass is compared with a constant klass.
if (btest == BoolTest::eq && tcon->isa_klassptr()) {
Node* obj = extract_obj_from_klass_load(&_gvn, val);
const TypeOopPtr* con_type = tcon->isa_klassptr()->as_instance_type();
if (obj != NULL && (con_type->isa_instptr() || con_type->isa_aryptr())) {
// Found:
// Bool(CmpP(LoadKlass(obj._klass), ConP(Foo.klass)), [eq])
// or the narrowOop equivalent.
const Type* obj_type = _gvn.type(obj);
const TypeOopPtr* tboth = obj_type->join(con_type)->isa_oopptr();
if (tboth != NULL && tboth != obj_type && tboth->higher_equal(obj_type)) {
// obj has to be of the exact type Foo if the CmpP succeeds.
assert(tboth->klass_is_exact(), "klass should be exact");
int obj_in_map = map()->find_edge(obj);
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, 2) 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
// at the control merge.
_gvn.set_type_bottom(ccast);
record_for_igvn(ccast);
// Here's the payoff.
replace_in_map(obj, ccast);
}
}
}
}
int val_in_map = map()->find_edge(val); int val_in_map = map()->find_edge(val);
if (val_in_map < 0) return; // replace_in_map would be useless if (val_in_map < 0) return; // replace_in_map would be useless
@ -1265,6 +1330,7 @@ void Parse::adjust_map_after_if(BoolTest::mask btest, Node* c, float prob,
// Exclude tests vs float/double 0 as these could be // Exclude tests vs float/double 0 as these could be
// either +0 or -0. Just because you are equal to +0 // either +0 or -0. Just because you are equal to +0
// doesn't mean you ARE +0! // doesn't mean you ARE +0!
// Note, following code also replaces Long and Oop values.
if ((!tf || tf->_f != 0.0) && if ((!tf || tf->_f != 0.0) &&
(!td || td->_d != 0.0)) (!td || td->_d != 0.0))
cast = con; // Replace non-constant val by con. cast = con; // Replace non-constant val by con.

View File

@ -460,6 +460,25 @@ public:
subsume_node(old, nn); subsume_node(old, nn);
} }
// Delayed node rehash: remove a node from the hash table and rehash it during
// next optimizing pass
void rehash_node_delayed(Node* n) {
hash_delete(n);
_worklist.push(n);
}
// Replace ith edge of "n" with "in"
void replace_input_of(Node* n, int i, Node* in) {
rehash_node_delayed(n);
n->set_req(i, in);
}
// Delete ith edge of "n"
void delete_input_of(Node* n, int i) {
rehash_node_delayed(n);
n->del_req(i);
}
bool delay_transform() const { return _delay_transform; } bool delay_transform() const { return _delay_transform; }
void set_delay_transform(bool delay) { void set_delay_transform(bool delay) {

View File

@ -137,9 +137,7 @@ bool PhaseIdealLoop::split_up( Node *n, Node *blk1, Node *blk2 ) {
Node *iff_ctrl = iff->is_If() ? iff->in(0) : get_ctrl(iff); Node *iff_ctrl = iff->is_If() ? iff->in(0) : get_ctrl(iff);
Node *x = bol->clone(); Node *x = bol->clone();
register_new_node(x, iff_ctrl); register_new_node(x, iff_ctrl);
_igvn.hash_delete(iff); _igvn.replace_input_of(iff, 1, x);
iff->set_req(1, x);
_igvn._worklist.push(iff);
} }
_igvn.remove_dead_node( bol ); _igvn.remove_dead_node( bol );
--i; --i;
@ -151,9 +149,7 @@ bool PhaseIdealLoop::split_up( Node *n, Node *blk1, Node *blk2 ) {
assert( bol->in(1) == n, "" ); assert( bol->in(1) == n, "" );
Node *x = n->clone(); Node *x = n->clone();
register_new_node(x, get_ctrl(bol)); register_new_node(x, get_ctrl(bol));
_igvn.hash_delete(bol); _igvn.replace_input_of(bol, 1, x);
bol->set_req(1, x);
_igvn._worklist.push(bol);
} }
_igvn.remove_dead_node( n ); _igvn.remove_dead_node( n );
@ -387,9 +383,7 @@ void PhaseIdealLoop::handle_use( Node *use, Node *def, small_cache *cache, Node
if( use->in(i) == def ) if( use->in(i) == def )
break; break;
assert( i < use->req(), "def should be among use's inputs" ); assert( i < use->req(), "def should be among use's inputs" );
_igvn.hash_delete(use); _igvn.replace_input_of(use, i, new_def);
use->set_req(i, new_def);
_igvn._worklist.push(use);
} }
//------------------------------do_split_if------------------------------------ //------------------------------do_split_if------------------------------------

View File

@ -702,12 +702,84 @@ const Type *CmpPNode::sub( const Type *t1, const Type *t2 ) const {
return TypeInt::CC; return TypeInt::CC;
} }
static inline Node* isa_java_mirror_load(PhaseGVN* phase, Node* n) {
// Return the klass node for
// LoadP(AddP(foo:Klass, #java_mirror))
// or NULL if not matching.
if (n->Opcode() != Op_LoadP) return NULL;
const TypeInstPtr* tp = phase->type(n)->isa_instptr();
if (!tp || tp->klass() != phase->C->env()->Class_klass()) return NULL;
Node* adr = n->in(MemNode::Address);
intptr_t off = 0;
Node* k = AddPNode::Ideal_base_and_offset(adr, phase, off);
if (k == NULL) return NULL;
const TypeKlassPtr* tkp = phase->type(k)->isa_klassptr();
if (!tkp || off != in_bytes(Klass::java_mirror_offset())) return NULL;
// We've found the klass node of a Java mirror load.
return k;
}
static inline Node* isa_const_java_mirror(PhaseGVN* phase, Node* n) {
// for ConP(Foo.class) return ConP(Foo.klass)
// otherwise return NULL
if (!n->is_Con()) return NULL;
const TypeInstPtr* tp = phase->type(n)->isa_instptr();
if (!tp) return NULL;
ciType* mirror_type = tp->java_mirror_type();
// TypeInstPtr::java_mirror_type() returns non-NULL for compile-
// time Class constants only.
if (!mirror_type) return NULL;
// x.getClass() == int.class can never be true (for all primitive types)
// Return a ConP(NULL) node for this case.
if (mirror_type->is_classless()) {
return phase->makecon(TypePtr::NULL_PTR);
}
// return the ConP(Foo.klass)
assert(mirror_type->is_klass(), "mirror_type should represent a klassOop");
return phase->makecon(TypeKlassPtr::make(mirror_type->as_klass()));
}
//------------------------------Ideal------------------------------------------ //------------------------------Ideal------------------------------------------
// Check for the case of comparing an unknown klass loaded from the primary // Normalize comparisons between Java mirror loads to compare the klass instead.
//
// Also check for the case of comparing an unknown klass loaded from the primary
// super-type array vs a known klass with no subtypes. This amounts to // super-type array vs a known klass with no subtypes. This amounts to
// checking to see an unknown klass subtypes a known klass with no subtypes; // checking to see an unknown klass subtypes a known klass with no subtypes;
// this only happens on an exact match. We can shorten this test by 1 load. // this only happens on an exact match. We can shorten this test by 1 load.
Node *CmpPNode::Ideal( PhaseGVN *phase, bool can_reshape ) { Node *CmpPNode::Ideal( PhaseGVN *phase, bool can_reshape ) {
// Normalize comparisons between Java mirrors into comparisons of the low-
// level klass, where a dependent load could be shortened.
//
// The new pattern has a nice effect of matching the same pattern used in the
// fast path of instanceof/checkcast/Class.isInstance(), which allows
// redundant exact type check be optimized away by GVN.
// For example, in
// if (x.getClass() == Foo.class) {
// Foo foo = (Foo) x;
// // ... use a ...
// }
// a CmpPNode could be shared between if_acmpne and checkcast
{
Node* k1 = isa_java_mirror_load(phase, in(1));
Node* k2 = isa_java_mirror_load(phase, in(2));
Node* conk2 = isa_const_java_mirror(phase, in(2));
if (k1 && (k2 || conk2)) {
Node* lhs = k1;
Node* rhs = (k2 != NULL) ? k2 : conk2;
this->set_req(1, lhs);
this->set_req(2, rhs);
return this;
}
}
// Constant pointer on right? // Constant pointer on right?
const TypeKlassPtr* t2 = phase->type(in(2))->isa_klassptr(); const TypeKlassPtr* t2 = phase->type(in(2))->isa_klassptr();
if (t2 == NULL || !t2->klass_is_exact()) if (t2 == NULL || !t2->klass_is_exact())

View File

@ -944,7 +944,7 @@ void SuperWord::schedule() {
void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip, void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip,
Node *uip, Unique_Node_List &sched_before) { Node *uip, Unique_Node_List &sched_before) {
Node* my_mem = current->in(MemNode::Memory); Node* my_mem = current->in(MemNode::Memory);
_igvn.hash_delete(current); _igvn.rehash_node_delayed(current);
_igvn.hash_delete(my_mem); _igvn.hash_delete(my_mem);
//remove current_store from its current position in the memmory graph //remove current_store from its current position in the memmory graph
@ -952,7 +952,7 @@ void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip,
Node* use = current->out(i); Node* use = current->out(i);
if (use->is_Mem()) { if (use->is_Mem()) {
assert(use->in(MemNode::Memory) == current, "must be"); assert(use->in(MemNode::Memory) == current, "must be");
_igvn.hash_delete(use); _igvn.rehash_node_delayed(use);
if (use == prev) { // connect prev to my_mem if (use == prev) { // connect prev to my_mem
use->set_req(MemNode::Memory, my_mem); use->set_req(MemNode::Memory, my_mem);
} else if (sched_before.member(use)) { } else if (sched_before.member(use)) {
@ -962,7 +962,6 @@ void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip,
_igvn.hash_delete(lip); _igvn.hash_delete(lip);
use->set_req(MemNode::Memory, lip); use->set_req(MemNode::Memory, lip);
} }
_igvn._worklist.push(use);
--i; //deleted this edge; rescan position --i; //deleted this edge; rescan position
} }
} }
@ -976,25 +975,20 @@ void SuperWord::remove_and_insert(MemNode *current, MemNode *prev, MemNode *lip,
Node* use = insert_pt->out(i); Node* use = insert_pt->out(i);
if (use->is_Mem()) { if (use->is_Mem()) {
assert(use->in(MemNode::Memory) == insert_pt, "must be"); assert(use->in(MemNode::Memory) == insert_pt, "must be");
_igvn.hash_delete(use); _igvn.replace_input_of(use, MemNode::Memory, current);
use->set_req(MemNode::Memory, current);
_igvn._worklist.push(use);
--i; //deleted this edge; rescan position --i; //deleted this edge; rescan position
} else if (!sched_up && use->is_Phi() && use->bottom_type() == Type::MEMORY) { } else if (!sched_up && use->is_Phi() && use->bottom_type() == Type::MEMORY) {
uint pos; //lip (lower insert point) must be the last one in the memory slice uint pos; //lip (lower insert point) must be the last one in the memory slice
_igvn.hash_delete(use);
for (pos=1; pos < use->req(); pos++) { for (pos=1; pos < use->req(); pos++) {
if (use->in(pos) == insert_pt) break; if (use->in(pos) == insert_pt) break;
} }
use->set_req(pos, current); _igvn.replace_input_of(use, pos, current);
_igvn._worklist.push(use);
--i; --i;
} }
} }
//connect current to insert_pt //connect current to insert_pt
current->set_req(MemNode::Memory, insert_pt); current->set_req(MemNode::Memory, insert_pt);
_igvn._worklist.push(current);
} }
//------------------------------co_locate_pack---------------------------------- //------------------------------co_locate_pack----------------------------------
@ -1077,15 +1071,13 @@ void SuperWord::co_locate_pack(Node_List* pk) {
Node* use = current->out(i); Node* use = current->out(i);
if (use->is_Mem() && use != previous) { if (use->is_Mem() && use != previous) {
assert(use->in(MemNode::Memory) == current, "must be"); assert(use->in(MemNode::Memory) == current, "must be");
_igvn.hash_delete(use);
if (schedule_before_pack.member(use)) { if (schedule_before_pack.member(use)) {
_igvn.hash_delete(upper_insert_pt); _igvn.hash_delete(upper_insert_pt);
use->set_req(MemNode::Memory, upper_insert_pt); _igvn.replace_input_of(use, MemNode::Memory, upper_insert_pt);
} else { } else {
_igvn.hash_delete(lower_insert_pt); _igvn.hash_delete(lower_insert_pt);
use->set_req(MemNode::Memory, lower_insert_pt); _igvn.replace_input_of(use, MemNode::Memory, lower_insert_pt);
} }
_igvn._worklist.push(use);
--i; // deleted this edge; rescan position --i; // deleted this edge; rescan position
} }
} }
@ -1122,9 +1114,7 @@ void SuperWord::co_locate_pack(Node_List* pk) {
// Give each load the same memory state // Give each load the same memory state
for (uint i = 0; i < pk->size(); i++) { for (uint i = 0; i < pk->size(); i++) {
LoadNode* ld = pk->at(i)->as_Load(); LoadNode* ld = pk->at(i)->as_Load();
_igvn.hash_delete(ld); _igvn.replace_input_of(ld, MemNode::Memory, mem_input);
ld->set_req(MemNode::Memory, mem_input);
_igvn._worklist.push(ld);
} }
} }
} }
@ -1282,16 +1272,14 @@ void SuperWord::insert_extracts(Node_List* p) {
// Insert extract operation // Insert extract operation
_igvn.hash_delete(def); _igvn.hash_delete(def);
_igvn.hash_delete(use);
int def_pos = alignment(def) / data_size(def); int def_pos = alignment(def) / data_size(def);
const Type* def_t = velt_type(def); const Type* def_t = velt_type(def);
Node* ex = ExtractNode::make(_phase->C, def, def_pos, def_t); Node* ex = ExtractNode::make(_phase->C, def, def_pos, def_t);
_phase->_igvn.register_new_node_with_optimizer(ex); _phase->_igvn.register_new_node_with_optimizer(ex);
_phase->set_ctrl(ex, _phase->get_ctrl(def)); _phase->set_ctrl(ex, _phase->get_ctrl(def));
use->set_req(idx, ex); _igvn.replace_input_of(use, idx, ex);
_igvn._worklist.push(def); _igvn._worklist.push(def);
_igvn._worklist.push(use);
bb_insert_after(ex, bb_idx(def)); bb_insert_after(ex, bb_idx(def));
set_velt_type(ex, def_t); set_velt_type(ex, def_t);

Some files were not shown because too many files have changed in this diff Show More