Merge
This commit is contained in:
commit
48b6c6007f
3
.hgtags
3
.hgtags
@ -282,3 +282,6 @@ a137992d750c72f6f944f341aa19b0d0d96afe0c jdk9-b35
|
|||||||
b409bc51bc23cfd51f2bd04ea919ec83535af9d0 jdk9-b37
|
b409bc51bc23cfd51f2bd04ea919ec83535af9d0 jdk9-b37
|
||||||
948cceef81ba4cb34bc233e7cc5952951ff04e88 jdk9-b38
|
948cceef81ba4cb34bc233e7cc5952951ff04e88 jdk9-b38
|
||||||
4e7c4d692e934cb9023af8201e7c2b510e9c4ee1 jdk9-b39
|
4e7c4d692e934cb9023af8201e7c2b510e9c4ee1 jdk9-b39
|
||||||
|
82f4cb44b2d7af2352f48568a64b7b6a5ae960cd jdk9-b40
|
||||||
|
9fffb959eb4197ff806e4ac12244761815b4deee jdk9-b41
|
||||||
|
3107be2ba9c6e208a0b86bc7100a141abbc5b5fb jdk9-b42
|
||||||
|
@ -282,3 +282,6 @@ c173ba994245380fb11ef077d1e59823386840eb jdk9-b35
|
|||||||
723a67b0c442391447b1d8aad8b249d06d1032e8 jdk9-b37
|
723a67b0c442391447b1d8aad8b249d06d1032e8 jdk9-b37
|
||||||
d42c0a90afc3c66ca87543076ec9aafd4b4680de jdk9-b38
|
d42c0a90afc3c66ca87543076ec9aafd4b4680de jdk9-b38
|
||||||
512dbbeb1730edcebfec873fc3f1455660b32000 jdk9-b39
|
512dbbeb1730edcebfec873fc3f1455660b32000 jdk9-b39
|
||||||
|
cf136458ee747e151a27aa9ea0c1492ea55ef3e7 jdk9-b40
|
||||||
|
67395f7ca2db3b52e3a62a84888487de5cb9210a jdk9-b41
|
||||||
|
f7c11da0b0481d49cc7a65a453336c108191e821 jdk9-b42
|
||||||
|
51
Makefile
51
Makefile
@ -33,7 +33,7 @@ default:
|
|||||||
|
|
||||||
# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make.
|
# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make.
|
||||||
# /usr/ccs/bin/make lacks basically every other flow control mechanism.
|
# /usr/ccs/bin/make lacks basically every other flow control mechanism.
|
||||||
TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
|
.TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
|
||||||
|
|
||||||
# Assume we have GNU make, but check version.
|
# Assume we have GNU make, but check version.
|
||||||
ifeq ($(strip $(foreach v, 3.81% 3.82% 4.%, $(filter $v, $(MAKE_VERSION)))), )
|
ifeq ($(strip $(foreach v, 3.81% 3.82% 4.%, $(filter $v, $(MAKE_VERSION)))), )
|
||||||
@ -46,7 +46,17 @@ ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
|
|||||||
else
|
else
|
||||||
makefile_path:=$(lastword $(MAKEFILE_LIST))
|
makefile_path:=$(lastword $(MAKEFILE_LIST))
|
||||||
endif
|
endif
|
||||||
root_dir:=$(dir $(makefile_path))
|
root_dir:=$(patsubst %/,%,$(dir $(makefile_path)))
|
||||||
|
|
||||||
|
ifneq ($(findstring qp,$(MAKEFLAGS)),)
|
||||||
|
# When called with -qp, assume an external part (e.g. bash completion) is trying
|
||||||
|
# to understand our targets.
|
||||||
|
# Duplication of global targets, needed before ParseConfAndSpec in case we have
|
||||||
|
# no configurations.
|
||||||
|
help:
|
||||||
|
# If CONF is not set, look for all available configurations
|
||||||
|
CONF?=
|
||||||
|
endif
|
||||||
|
|
||||||
# ... and then we can include our helper functions
|
# ... and then we can include our helper functions
|
||||||
include $(root_dir)/make/MakeHelpers.gmk
|
include $(root_dir)/make/MakeHelpers.gmk
|
||||||
@ -89,6 +99,7 @@ else
|
|||||||
# The wrapper target was called so we now have a single configuration. Load the spec file
|
# The wrapper target was called so we now have a single configuration. Load the spec file
|
||||||
# and call the real Main.gmk.
|
# and call the real Main.gmk.
|
||||||
include $(SPEC)
|
include $(SPEC)
|
||||||
|
include $(SRC_ROOT)/make/common/MakeBase.gmk
|
||||||
|
|
||||||
### Clean up from previous run
|
### Clean up from previous run
|
||||||
# Remove any build.log from a previous run, if they exist
|
# Remove any build.log from a previous run, if they exist
|
||||||
@ -143,31 +154,37 @@ help:
|
|||||||
$(info . make [default] # Compile all modules in langtools, hotspot, jaxp, jaxws,)
|
$(info . make [default] # Compile all modules in langtools, hotspot, jaxp, jaxws,)
|
||||||
$(info . # corba and jdk and create a runnable "exploded" image)
|
$(info . # corba and jdk and create a runnable "exploded" image)
|
||||||
$(info . make all # Compile everything, all repos, docs and images)
|
$(info . make all # Compile everything, all repos, docs and images)
|
||||||
$(info . make images # Create complete j2sdk and j2re images)
|
$(info . make images # Create complete jdk and jre images)
|
||||||
|
$(info . make <phase> # Compile the specified phase and everything it depends on)
|
||||||
|
$(info . # (gensrc, java, copy, libs, launchers, gendata, rmic))
|
||||||
|
$(info . make *-only # Applies to most targets and disables compling the)
|
||||||
|
$(info . # dependencies for the target. This is faster but may)
|
||||||
|
$(info . # result in incorrect build results!)
|
||||||
$(info . make docs # Create all docs)
|
$(info . make docs # Create all docs)
|
||||||
$(info . make docs-javadoc # Create just javadocs, depends on less than full docs)
|
$(info . make docs-javadoc # Create just javadocs, depends on less than full docs)
|
||||||
$(info . make profiles # Create complete j2re compact profile images)
|
$(info . make profiles # Create complete jre compact profile images)
|
||||||
$(info . make bootcycle-images # Build images twice, second time with newly built JDK)
|
$(info . make bootcycle-images # Build images twice, second time with newly built JDK)
|
||||||
$(info . make install # Install the generated images locally)
|
$(info . make install # Install the generated images locally)
|
||||||
$(info . make reconfigure # Rerun configure with the same arguments as last time)
|
$(info . make reconfigure # Rerun configure with the same arguments as last time)
|
||||||
$(info . make clean # Remove all files generated by make, but not those)
|
|
||||||
$(info . # generated by configure)
|
|
||||||
$(info . make dist-clean # Remove all files, including configuration)
|
|
||||||
$(info . make help # Give some help on using make)
|
$(info . make help # Give some help on using make)
|
||||||
$(info . make test # Run tests, default is all tests (see TEST below))
|
$(info . make test # Run tests, default is all tests (see TEST below))
|
||||||
$(info )
|
$(info )
|
||||||
|
$(info Targets for cleaning)
|
||||||
|
$(info . make clean # Remove all files generated by make, but not those)
|
||||||
|
$(info . # generated by configure)
|
||||||
|
$(info . make dist-clean # Remove all files, including configuration)
|
||||||
|
$(info . make clean-<outputdir> # Remove the subdir in the output dir with the name)
|
||||||
|
$(info . make clean-<phase> # Remove all build results related to a certain build)
|
||||||
|
$(info . # phase (gensrc, java, libs, launchers))
|
||||||
|
$(info . make clean-<module> # Remove all build results related to a certain module)
|
||||||
|
$(info . make clean-<module>-<phase> # Remove all build results related to a certain)
|
||||||
|
$(info . # module and phase)
|
||||||
|
$(info )
|
||||||
$(info Targets for specific modules)
|
$(info Targets for specific modules)
|
||||||
$(info . make <module> # Build <module> and everything it depends on. )
|
$(info . make <module> # Build <module> and everything it depends on. )
|
||||||
$(info . make <module>-only # Build <module> only, without dependencies. This)
|
$(info . make <module>-<phase> # Compile the specified phase for the specified module)
|
||||||
$(info . # is faster but can result in incorrect build results!)
|
$(info . # and everything it depends on)
|
||||||
$(info . make <module>-java # Compile java classes for <module> and everything it)
|
$(info . # (gensrc, java, copy, libs, launchers, gendata, rmic))
|
||||||
$(info . # depends on)
|
|
||||||
$(info . make <module>-libs # Build native libraries for <module> and everything it)
|
|
||||||
$(info . # depends on)
|
|
||||||
$(info . make <module>-launchers# Build native executables for <module> and everything it)
|
|
||||||
$(info . # depends on)
|
|
||||||
$(info . make <module>-gensrc # Execute the gensrc step for <module> and everything it)
|
|
||||||
$(info . # depends on)
|
|
||||||
$(info )
|
$(info )
|
||||||
$(info Useful make variables)
|
$(info Useful make variables)
|
||||||
$(info . make CONF= # Build all configurations (note, assignment is empty))
|
$(info . make CONF= # Build all configurations (note, assignment is empty))
|
||||||
|
@ -69,7 +69,7 @@ AC_DEFUN([BASIC_PREPEND_TO_PATH],
|
|||||||
|
|
||||||
# This will make sure the given variable points to a full and proper
|
# This will make sure the given variable points to a full and proper
|
||||||
# path. This means:
|
# path. This means:
|
||||||
# 1) There will be no spaces in the path. On posix platforms,
|
# 1) There will be no spaces in the path. On unix platforms,
|
||||||
# spaces in the path will result in an error. On Windows,
|
# spaces in the path will result in an error. On Windows,
|
||||||
# the path will be rewritten using short-style to be space-free.
|
# the path will be rewritten using short-style to be space-free.
|
||||||
# 2) The path will be absolute, and it will be in unix-style (on
|
# 2) The path will be absolute, and it will be in unix-style (on
|
||||||
@ -82,7 +82,7 @@ AC_DEFUN([BASIC_FIXUP_PATH],
|
|||||||
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
||||||
BASIC_FIXUP_PATH_MSYS($1)
|
BASIC_FIXUP_PATH_MSYS($1)
|
||||||
else
|
else
|
||||||
# We're on a posix platform. Hooray! :)
|
# We're on a unix platform. Hooray! :)
|
||||||
path="[$]$1"
|
path="[$]$1"
|
||||||
has_space=`$ECHO "$path" | $GREP " "`
|
has_space=`$ECHO "$path" | $GREP " "`
|
||||||
if test "x$has_space" != x; then
|
if test "x$has_space" != x; then
|
||||||
@ -102,7 +102,7 @@ AC_DEFUN([BASIC_FIXUP_PATH],
|
|||||||
|
|
||||||
# This will make sure the given variable points to a executable
|
# This will make sure the given variable points to a executable
|
||||||
# with a full and proper path. This means:
|
# with a full and proper path. This means:
|
||||||
# 1) There will be no spaces in the path. On posix platforms,
|
# 1) There will be no spaces in the path. On unix platforms,
|
||||||
# spaces in the path will result in an error. On Windows,
|
# spaces in the path will result in an error. On Windows,
|
||||||
# the path will be rewritten using short-style to be space-free.
|
# the path will be rewritten using short-style to be space-free.
|
||||||
# 2) The path will be absolute, and it will be in unix-style (on
|
# 2) The path will be absolute, and it will be in unix-style (on
|
||||||
@ -118,7 +118,7 @@ AC_DEFUN([BASIC_FIXUP_EXECUTABLE],
|
|||||||
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
||||||
BASIC_FIXUP_EXECUTABLE_MSYS($1)
|
BASIC_FIXUP_EXECUTABLE_MSYS($1)
|
||||||
else
|
else
|
||||||
# We're on a posix platform. Hooray! :)
|
# We're on a unix platform. Hooray! :)
|
||||||
# First separate the path from the arguments. This will split at the first
|
# First separate the path from the arguments. This will split at the first
|
||||||
# space.
|
# space.
|
||||||
complete="[$]$1"
|
complete="[$]$1"
|
||||||
|
@ -72,11 +72,6 @@ AC_DEFUN([BOOTJDK_DO_CHECK],
|
|||||||
AC_MSG_NOTICE([Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring])
|
AC_MSG_NOTICE([Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring])
|
||||||
AC_MSG_NOTICE([(This might be an JRE instead of an JDK)])
|
AC_MSG_NOTICE([(This might be an JRE instead of an JDK)])
|
||||||
BOOT_JDK_FOUND=no
|
BOOT_JDK_FOUND=no
|
||||||
else
|
|
||||||
# Do we have an rt.jar? (On MacOSX it is called classes.jar)
|
|
||||||
if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then
|
|
||||||
AC_MSG_NOTICE([Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring])
|
|
||||||
BOOT_JDK_FOUND=no
|
|
||||||
else
|
else
|
||||||
# Oh, this is looking good! We probably have found a proper JDK. Is it the correct version?
|
# Oh, this is looking good! We probably have found a proper JDK. Is it the correct version?
|
||||||
BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1`
|
BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1`
|
||||||
@ -97,7 +92,6 @@ AC_DEFUN([BOOTJDK_DO_CHECK],
|
|||||||
BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '`
|
BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '`
|
||||||
AC_MSG_RESULT([$BOOT_JDK_VERSION])
|
AC_MSG_RESULT([$BOOT_JDK_VERSION])
|
||||||
fi # end check jdk version
|
fi # end check jdk version
|
||||||
fi # end check rt.jar
|
|
||||||
fi # end check javac
|
fi # end check javac
|
||||||
fi # end check java
|
fi # end check java
|
||||||
fi # end check boot jdk found
|
fi # end check boot jdk found
|
||||||
@ -305,20 +299,6 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK],
|
|||||||
AC_MSG_ERROR([Cannot continue])
|
AC_MSG_ERROR([Cannot continue])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Setup proper paths for what we found
|
|
||||||
BOOT_RTJAR="$BOOT_JDK/jre/lib/rt.jar"
|
|
||||||
if test ! -f "$BOOT_RTJAR"; then
|
|
||||||
# On MacOSX it is called classes.jar
|
|
||||||
BOOT_RTJAR="$BOOT_JDK/../Classes/classes.jar"
|
|
||||||
if test -f "$BOOT_RTJAR"; then
|
|
||||||
# Remove the ..
|
|
||||||
BOOT_RTJAR="`cd ${BOOT_RTJAR%/*} && pwd`/${BOOT_RTJAR##*/}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
BOOT_TOOLSJAR="$BOOT_JDK/lib/tools.jar"
|
|
||||||
BOOT_JDK="$BOOT_JDK"
|
|
||||||
AC_SUBST(BOOT_RTJAR)
|
|
||||||
AC_SUBST(BOOT_TOOLSJAR)
|
|
||||||
AC_SUBST(BOOT_JDK)
|
AC_SUBST(BOOT_JDK)
|
||||||
|
|
||||||
# Setup tools from the Boot JDK.
|
# Setup tools from the Boot JDK.
|
||||||
|
@ -42,13 +42,12 @@ endif
|
|||||||
|
|
||||||
# Override specific values to do a boot cycle build
|
# Override specific values to do a boot cycle build
|
||||||
|
|
||||||
|
# Use a different Boot JDK
|
||||||
|
BOOT_JDK := $(JDK_IMAGE_DIR)
|
||||||
|
|
||||||
# The bootcycle build has a different output directory
|
# The bootcycle build has a different output directory
|
||||||
BUILD_OUTPUT:=@BUILD_OUTPUT@/bootcycle-build
|
BUILD_OUTPUT:=@BUILD_OUTPUT@/bootcycle-build
|
||||||
|
SJAVAC_SERVER_DIR:=$(subst @BUILD_OUTPUT@,$(BUILD_OUTPUT),$(SJAVAC_SERVER_DIR))
|
||||||
# Use a different Boot JDK
|
|
||||||
OLD_BOOT_JDK:=$(BOOT_JDK)
|
|
||||||
BOOT_JDK:=@BUILD_OUTPUT@/images/j2sdk-image
|
|
||||||
BOOT_RTJAR:=$(BOOT_JDK)/jre/lib/rt.jar
|
|
||||||
|
|
||||||
JAVA_CMD:=$(BOOT_JDK)/bin/java
|
JAVA_CMD:=$(BOOT_JDK)/bin/java
|
||||||
JAVAC_CMD:=$(BOOT_JDK)/bin/javac
|
JAVAC_CMD:=$(BOOT_JDK)/bin/javac
|
||||||
@ -57,4 +56,3 @@ JAR_CMD:=$(BOOT_JDK)/bin/jar
|
|||||||
NATIVE2ASCII_CMD:=$(BOOT_JDK)/bin/native2ascii
|
NATIVE2ASCII_CMD:=$(BOOT_JDK)/bin/native2ascii
|
||||||
JARSIGNER_CMD:=$(BOOT_JDK)/bin/jarsigner
|
JARSIGNER_CMD:=$(BOOT_JDK)/bin/jarsigner
|
||||||
SJAVAC_SERVER_JAVA_CMD:=$(JAVA_CMD)
|
SJAVAC_SERVER_JAVA_CMD:=$(JAVA_CMD)
|
||||||
|
|
||||||
|
@ -46,7 +46,9 @@ FILE="@FILE@"
|
|||||||
FIND="@FIND@"
|
FIND="@FIND@"
|
||||||
GREP="@GREP@"
|
GREP="@GREP@"
|
||||||
JAVAP="@FIXPATH@ @BOOT_JDK@/bin/javap @JAVA_TOOL_FLAGS_SMALL@"
|
JAVAP="@FIXPATH@ @BOOT_JDK@/bin/javap @JAVA_TOOL_FLAGS_SMALL@"
|
||||||
|
JIMAGE="@FIXPATH@ @BUILD_OUTPUT@/jdk/bin/jimage"
|
||||||
LDD="@LDD@"
|
LDD="@LDD@"
|
||||||
|
LN="@LN@"
|
||||||
MKDIR="@MKDIR@"
|
MKDIR="@MKDIR@"
|
||||||
NAWK="@NAWK@"
|
NAWK="@NAWK@"
|
||||||
NM="@GNM@"
|
NM="@GNM@"
|
||||||
|
@ -275,3 +275,4 @@ $CHMOD +x $OUTPUT_ROOT/compare.sh
|
|||||||
# Finally output some useful information to the user
|
# Finally output some useful information to the user
|
||||||
HELP_PRINT_SUMMARY_AND_WARNINGS
|
HELP_PRINT_SUMMARY_AND_WARNINGS
|
||||||
CUSTOM_SUMMARY_AND_WARNINGS_HOOK
|
CUSTOM_SUMMARY_AND_WARNINGS_HOOK
|
||||||
|
HELP_REPEAT_WARNINGS
|
||||||
|
@ -94,9 +94,9 @@ AC_DEFUN_ONCE([FLAGS_SETUP_INIT_FLAGS],
|
|||||||
|
|
||||||
# On Windows, we need to set RC flags.
|
# On Windows, we need to set RC flags.
|
||||||
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
||||||
RC_FLAGS="-nologo -l 0x409 -r"
|
RC_FLAGS="-nologo -l0x409"
|
||||||
if test "x$VARIANT" = xOPT; then
|
if test "x$VARIANT" = xOPT; then
|
||||||
RC_FLAGS="$RC_FLAGS -d NDEBUG"
|
RC_FLAGS="$RC_FLAGS -DNDEBUG"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# The version variables used to create RC_FLAGS may be overridden
|
# The version variables used to create RC_FLAGS may be overridden
|
||||||
@ -105,13 +105,13 @@ AC_DEFUN_ONCE([FLAGS_SETUP_INIT_FLAGS],
|
|||||||
# The \$ are escaped to the shell, and the $(...) variables
|
# The \$ are escaped to the shell, and the $(...) variables
|
||||||
# are evaluated by make.
|
# are evaluated by make.
|
||||||
RC_FLAGS="$RC_FLAGS \
|
RC_FLAGS="$RC_FLAGS \
|
||||||
-d \"JDK_BUILD_ID=\$(FULL_VERSION)\" \
|
-D\"JDK_BUILD_ID=\$(FULL_VERSION)\" \
|
||||||
-d \"JDK_COMPANY=\$(COMPANY_NAME)\" \
|
-D\"JDK_COMPANY=\$(COMPANY_NAME)\" \
|
||||||
-d \"JDK_COMPONENT=\$(PRODUCT_NAME) \$(JDK_RC_PLATFORM_NAME) binary\" \
|
-D\"JDK_COMPONENT=\$(PRODUCT_NAME) \$(JDK_RC_PLATFORM_NAME) binary\" \
|
||||||
-d \"JDK_VER=\$(JDK_MINOR_VERSION).\$(JDK_MICRO_VERSION).\$(if \$(JDK_UPDATE_VERSION),\$(JDK_UPDATE_VERSION),0).\$(COOKED_BUILD_NUMBER)\" \
|
-D\"JDK_VER=\$(JDK_MINOR_VERSION).\$(JDK_MICRO_VERSION).\$(if \$(JDK_UPDATE_VERSION),\$(JDK_UPDATE_VERSION),0).\$(COOKED_BUILD_NUMBER)\" \
|
||||||
-d \"JDK_COPYRIGHT=Copyright \xA9 $COPYRIGHT_YEAR\" \
|
-D\"JDK_COPYRIGHT=Copyright \xA9 $COPYRIGHT_YEAR\" \
|
||||||
-d \"JDK_NAME=\$(PRODUCT_NAME) \$(JDK_RC_PLATFORM_NAME) \$(JDK_MINOR_VERSION) \$(JDK_UPDATE_META_TAG)\" \
|
-D\"JDK_NAME=\$(PRODUCT_NAME) \$(JDK_RC_PLATFORM_NAME) \$(JDK_MINOR_VERSION) \$(JDK_UPDATE_META_TAG)\" \
|
||||||
-d \"JDK_FVER=\$(JDK_MINOR_VERSION),\$(JDK_MICRO_VERSION),\$(if \$(JDK_UPDATE_VERSION),\$(JDK_UPDATE_VERSION),0),\$(COOKED_BUILD_NUMBER)\""
|
-D\"JDK_FVER=\$(JDK_MINOR_VERSION),\$(JDK_MICRO_VERSION),\$(if \$(JDK_UPDATE_VERSION),\$(JDK_UPDATE_VERSION),0),\$(COOKED_BUILD_NUMBER)\""
|
||||||
fi
|
fi
|
||||||
AC_SUBST(RC_FLAGS)
|
AC_SUBST(RC_FLAGS)
|
||||||
|
|
||||||
@ -348,10 +348,6 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION],
|
|||||||
# Add runtime stack smashing and undefined behavior checks
|
# Add runtime stack smashing and undefined behavior checks
|
||||||
CFLAGS_DEBUG_OPTIONS="-fstack-protector-all --param ssp-buffer-size=1"
|
CFLAGS_DEBUG_OPTIONS="-fstack-protector-all --param ssp-buffer-size=1"
|
||||||
CXXFLAGS_DEBUG_OPTIONS="-fstack-protector-all --param ssp-buffer-size=1"
|
CXXFLAGS_DEBUG_OPTIONS="-fstack-protector-all --param ssp-buffer-size=1"
|
||||||
if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
|
|
||||||
CFLAGS_DEBUG_OPTIONS="$CFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG"
|
|
||||||
CXXFLAGS_DEBUG_OPTIONS="$CXXFLAGS_DEBUG_OPTIONS $CFLAG_DETECT_UNDEFINED_BEHAVIsOR_FLAG"
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
@ -668,7 +664,7 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
|
|||||||
COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \
|
COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK \
|
||||||
-I${JDK_TOPDIR}/src/java.base/share/native/include \
|
-I${JDK_TOPDIR}/src/java.base/share/native/include \
|
||||||
-I${JDK_TOPDIR}/src/java.base/$OPENJDK_TARGET_OS/native/include \
|
-I${JDK_TOPDIR}/src/java.base/$OPENJDK_TARGET_OS/native/include \
|
||||||
-I${JDK_TOPDIR}/src/java.base/$OPENJDK_TARGET_OS_API_DIR/native/include"
|
-I${JDK_TOPDIR}/src/java.base/$OPENJDK_TARGET_OS_TYPE/native/include"
|
||||||
|
|
||||||
# The shared libraries are compiled using the picflag.
|
# The shared libraries are compiled using the picflag.
|
||||||
CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
|
CFLAGS_JDKLIB="$COMMON_CCXXFLAGS_JDK $CFLAGS_JDK $PICFLAG $CFLAGS_JDKLIB_EXTRA"
|
||||||
@ -746,25 +742,6 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
|
|||||||
LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
|
LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
|
|
||||||
# If undefined behaviour detection is enabled then we need to tell linker.
|
|
||||||
case $DEBUG_LEVEL in
|
|
||||||
release | fastdebug )
|
|
||||||
;;
|
|
||||||
slowdebug )
|
|
||||||
AC_MSG_WARN([$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR])
|
|
||||||
if test "x$HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR" = "xtrue"; then
|
|
||||||
# enable undefined behaviour checking
|
|
||||||
LDFLAGS_JDK="$LDFLAGS_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`"
|
|
||||||
LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK `$ECHO -n $CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG | sed -e "s/[ ]*\([^ ]\+\)/ -Xlinker \1/g"`"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
* )
|
|
||||||
AC_MSG_ERROR([Unrecognized \$DEBUG_LEVEL: $DEBUG_LEVEL])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Customize LDFLAGS for executables
|
# Customize LDFLAGS for executables
|
||||||
|
|
||||||
LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
|
LDFLAGS_JDKEXE="${LDFLAGS_JDK}"
|
||||||
@ -784,24 +761,24 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
|
|||||||
LDFLAGS_JDKLIB="${LDFLAGS_JDK}"
|
LDFLAGS_JDKLIB="${LDFLAGS_JDK}"
|
||||||
|
|
||||||
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
||||||
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${JDK_OUTPUTDIR}/lib"
|
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -dll -libpath:${OUTPUT_ROOT}/support/modules_libs/java.base"
|
||||||
LDFLAGS_JDKLIB_SUFFIX=""
|
LDFLAGS_JDKLIB_SUFFIX=""
|
||||||
else
|
else
|
||||||
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \
|
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} ${SHARED_LIBRARY_FLAGS} \
|
||||||
-L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}"
|
-L${OUTPUT_ROOT}/support/modules_libs/java.base${OPENJDK_TARGET_CPU_LIBDIR}"
|
||||||
|
|
||||||
# On some platforms (mac) the linker warns about non existing -L dirs.
|
# On some platforms (mac) the linker warns about non existing -L dirs.
|
||||||
# Add server first if available. Linking aginst client does not always produce the same results.
|
# Add server first if available. Linking aginst client does not always produce the same results.
|
||||||
# Only add client dir if client is being built. Add minimal (note not minimal1) if only building minimal1.
|
# Only add client dir if client is being built. Add minimal (note not minimal1) if only building minimal1.
|
||||||
# Default to server for other variants.
|
# Default to server for other variants.
|
||||||
if test "x$JVM_VARIANT_SERVER" = xtrue; then
|
if test "x$JVM_VARIANT_SERVER" = xtrue; then
|
||||||
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/server"
|
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${OUTPUT_ROOT}/support/modules_libs/java.base${OPENJDK_TARGET_CPU_LIBDIR}/server"
|
||||||
elif test "x$JVM_VARIANT_CLIENT" = xtrue; then
|
elif test "x$JVM_VARIANT_CLIENT" = xtrue; then
|
||||||
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/client"
|
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${OUTPUT_ROOT}/support/modules_libs/java.base${OPENJDK_TARGET_CPU_LIBDIR}/client"
|
||||||
elif test "x$JVM_VARIANT_MINIMAL1" = xtrue; then
|
elif test "x$JVM_VARIANT_MINIMAL1" = xtrue; then
|
||||||
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/minimal"
|
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${OUTPUT_ROOT}/support/modules_libs/java.base${OPENJDK_TARGET_CPU_LIBDIR}/minimal"
|
||||||
else
|
else
|
||||||
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/server"
|
LDFLAGS_JDKLIB="${LDFLAGS_JDKLIB} -L${OUTPUT_ROOT}/support/modules_libs/java.base${OPENJDK_TARGET_CPU_LIBDIR}/server"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
LDFLAGS_JDKLIB_SUFFIX="-ljava -ljvm"
|
LDFLAGS_JDKLIB_SUFFIX="-ljava -ljvm"
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -257,3 +257,17 @@ AC_DEFUN_ONCE([HELP_PRINT_SUMMARY_AND_WARNINGS],
|
|||||||
printf "\n"
|
printf "\n"
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AC_DEFUN_ONCE([HELP_REPEAT_WARNINGS],
|
||||||
|
[
|
||||||
|
if test -e "$OUTPUT_ROOT/config.log"; then
|
||||||
|
$GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" > /dev/null 2>&1
|
||||||
|
if test $? -eq 0; then
|
||||||
|
printf "The following warnings were produced. Repeated here for convenience:\n"
|
||||||
|
# We must quote sed expression (using []) to stop m4 from eating the [].
|
||||||
|
$GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" | $SED -e [ 's/^configure:[0-9]*: //' ]
|
||||||
|
printf "\n"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
])
|
||||||
|
@ -549,7 +549,15 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_VERSION_NUMBERS],
|
|||||||
AC_SUBST(MACOSX_BUNDLE_NAME_BASE)
|
AC_SUBST(MACOSX_BUNDLE_NAME_BASE)
|
||||||
AC_SUBST(MACOSX_BUNDLE_ID_BASE)
|
AC_SUBST(MACOSX_BUNDLE_ID_BASE)
|
||||||
|
|
||||||
|
AC_ARG_WITH(copyright-year, [AS_HELP_STRING([--with-copyright-year],
|
||||||
|
[Set copyright year value for build @<:@current year@:>@])])
|
||||||
|
if test "x$with_copyright_year" = xyes; then
|
||||||
|
AC_MSG_ERROR([Copyright year must have a value])
|
||||||
|
elif test "x$with_copyright_year" != x; then
|
||||||
|
COPYRIGHT_YEAR="$with_copyright_year"
|
||||||
|
else
|
||||||
COPYRIGHT_YEAR=`date +'%Y'`
|
COPYRIGHT_YEAR=`date +'%Y'`
|
||||||
|
fi
|
||||||
AC_SUBST(COPYRIGHT_YEAR)
|
AC_SUBST(COPYRIGHT_YEAR)
|
||||||
|
|
||||||
if test "x$JDK_UPDATE_VERSION" != x; then
|
if test "x$JDK_UPDATE_VERSION" != x; then
|
||||||
|
@ -98,44 +98,37 @@ AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_CPU],
|
|||||||
|
|
||||||
# Support macro for PLATFORM_EXTRACT_TARGET_AND_BUILD.
|
# Support macro for PLATFORM_EXTRACT_TARGET_AND_BUILD.
|
||||||
# Converts autoconf style OS name to OpenJDK style, into
|
# Converts autoconf style OS name to OpenJDK style, into
|
||||||
# VAR_OS and VAR_OS_API.
|
# VAR_OS, VAR_OS_TYPE and VAR_OS_ENV.
|
||||||
AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_OS],
|
AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_OS],
|
||||||
[
|
[
|
||||||
case "$1" in
|
case "$1" in
|
||||||
*linux*)
|
*linux*)
|
||||||
VAR_OS=linux
|
VAR_OS=linux
|
||||||
VAR_OS_API=posix
|
VAR_OS_TYPE=unix
|
||||||
VAR_OS_ENV=linux
|
|
||||||
;;
|
;;
|
||||||
*solaris*)
|
*solaris*)
|
||||||
VAR_OS=solaris
|
VAR_OS=solaris
|
||||||
VAR_OS_API=posix
|
VAR_OS_TYPE=unix
|
||||||
VAR_OS_ENV=solaris
|
|
||||||
;;
|
;;
|
||||||
*darwin*)
|
*darwin*)
|
||||||
VAR_OS=macosx
|
VAR_OS=macosx
|
||||||
VAR_OS_API=posix
|
VAR_OS_TYPE=unix
|
||||||
VAR_OS_ENV=macosx
|
|
||||||
;;
|
;;
|
||||||
*bsd*)
|
*bsd*)
|
||||||
VAR_OS=bsd
|
VAR_OS=bsd
|
||||||
VAR_OS_API=posix
|
VAR_OS_TYPE=unix
|
||||||
VAR_OS_ENV=bsd
|
|
||||||
;;
|
;;
|
||||||
*cygwin*)
|
*cygwin*)
|
||||||
VAR_OS=windows
|
VAR_OS=windows
|
||||||
VAR_OS_API=winapi
|
|
||||||
VAR_OS_ENV=windows.cygwin
|
VAR_OS_ENV=windows.cygwin
|
||||||
;;
|
;;
|
||||||
*mingw*)
|
*mingw*)
|
||||||
VAR_OS=windows
|
VAR_OS=windows
|
||||||
VAR_OS_API=winapi
|
|
||||||
VAR_OS_ENV=windows.msys
|
VAR_OS_ENV=windows.msys
|
||||||
;;
|
;;
|
||||||
*aix*)
|
*aix*)
|
||||||
VAR_OS=aix
|
VAR_OS=aix
|
||||||
VAR_OS_API=posix
|
VAR_OS_TYPE=unix
|
||||||
VAR_OS_ENV=aix
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
AC_MSG_ERROR([unsupported operating system $1])
|
AC_MSG_ERROR([unsupported operating system $1])
|
||||||
@ -165,14 +158,22 @@ AC_DEFUN([PLATFORM_EXTRACT_TARGET_AND_BUILD],
|
|||||||
PLATFORM_EXTRACT_VARS_FROM_CPU($build_cpu)
|
PLATFORM_EXTRACT_VARS_FROM_CPU($build_cpu)
|
||||||
# ..and setup our own variables. (Do this explicitely to facilitate searching)
|
# ..and setup our own variables. (Do this explicitely to facilitate searching)
|
||||||
OPENJDK_BUILD_OS="$VAR_OS"
|
OPENJDK_BUILD_OS="$VAR_OS"
|
||||||
OPENJDK_BUILD_OS_API="$VAR_OS_API"
|
if test "x$VAR_OS_TYPE" != x; then
|
||||||
|
OPENJDK_BUILD_OS_TYPE="$VAR_OS_TYPE"
|
||||||
|
else
|
||||||
|
OPENJDK_BUILD_OS_TYPE="$VAR_OS"
|
||||||
|
fi
|
||||||
|
if test "x$VAR_OS_ENV" != x; then
|
||||||
OPENJDK_BUILD_OS_ENV="$VAR_OS_ENV"
|
OPENJDK_BUILD_OS_ENV="$VAR_OS_ENV"
|
||||||
|
else
|
||||||
|
OPENJDK_BUILD_OS_ENV="$VAR_OS"
|
||||||
|
fi
|
||||||
OPENJDK_BUILD_CPU="$VAR_CPU"
|
OPENJDK_BUILD_CPU="$VAR_CPU"
|
||||||
OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH"
|
OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH"
|
||||||
OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS"
|
OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS"
|
||||||
OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN"
|
OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN"
|
||||||
AC_SUBST(OPENJDK_BUILD_OS)
|
AC_SUBST(OPENJDK_BUILD_OS)
|
||||||
AC_SUBST(OPENJDK_BUILD_OS_API)
|
AC_SUBST(OPENJDK_BUILD_OS_TYPE)
|
||||||
AC_SUBST(OPENJDK_BUILD_OS_ENV)
|
AC_SUBST(OPENJDK_BUILD_OS_ENV)
|
||||||
AC_SUBST(OPENJDK_BUILD_CPU)
|
AC_SUBST(OPENJDK_BUILD_CPU)
|
||||||
AC_SUBST(OPENJDK_BUILD_CPU_ARCH)
|
AC_SUBST(OPENJDK_BUILD_CPU_ARCH)
|
||||||
@ -187,14 +188,22 @@ AC_DEFUN([PLATFORM_EXTRACT_TARGET_AND_BUILD],
|
|||||||
PLATFORM_EXTRACT_VARS_FROM_CPU($host_cpu)
|
PLATFORM_EXTRACT_VARS_FROM_CPU($host_cpu)
|
||||||
# ... and setup our own variables. (Do this explicitely to facilitate searching)
|
# ... and setup our own variables. (Do this explicitely to facilitate searching)
|
||||||
OPENJDK_TARGET_OS="$VAR_OS"
|
OPENJDK_TARGET_OS="$VAR_OS"
|
||||||
OPENJDK_TARGET_OS_API="$VAR_OS_API"
|
if test "x$VAR_OS_TYPE" != x; then
|
||||||
|
OPENJDK_TARGET_OS_TYPE="$VAR_OS_TYPE"
|
||||||
|
else
|
||||||
|
OPENJDK_TARGET_OS_TYPE="$VAR_OS"
|
||||||
|
fi
|
||||||
|
if test "x$VAR_OS_ENV" != x; then
|
||||||
OPENJDK_TARGET_OS_ENV="$VAR_OS_ENV"
|
OPENJDK_TARGET_OS_ENV="$VAR_OS_ENV"
|
||||||
|
else
|
||||||
|
OPENJDK_TARGET_OS_ENV="$VAR_OS"
|
||||||
|
fi
|
||||||
OPENJDK_TARGET_CPU="$VAR_CPU"
|
OPENJDK_TARGET_CPU="$VAR_CPU"
|
||||||
OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH"
|
OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH"
|
||||||
OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS"
|
OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS"
|
||||||
OPENJDK_TARGET_CPU_ENDIAN="$VAR_CPU_ENDIAN"
|
OPENJDK_TARGET_CPU_ENDIAN="$VAR_CPU_ENDIAN"
|
||||||
AC_SUBST(OPENJDK_TARGET_OS)
|
AC_SUBST(OPENJDK_TARGET_OS)
|
||||||
AC_SUBST(OPENJDK_TARGET_OS_API)
|
AC_SUBST(OPENJDK_TARGET_OS_TYPE)
|
||||||
AC_SUBST(OPENJDK_TARGET_OS_ENV)
|
AC_SUBST(OPENJDK_TARGET_OS_ENV)
|
||||||
AC_SUBST(OPENJDK_TARGET_CPU)
|
AC_SUBST(OPENJDK_TARGET_CPU)
|
||||||
AC_SUBST(OPENJDK_TARGET_CPU_ARCH)
|
AC_SUBST(OPENJDK_TARGET_CPU_ARCH)
|
||||||
@ -331,19 +340,10 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS],
|
|||||||
fi
|
fi
|
||||||
AC_SUBST(OPENJDK_TARGET_CPU_JLI_CFLAGS)
|
AC_SUBST(OPENJDK_TARGET_CPU_JLI_CFLAGS)
|
||||||
|
|
||||||
# Setup OPENJDK_TARGET_OS_API_DIR, used in source paths.
|
|
||||||
if test "x$OPENJDK_TARGET_OS_API" = xposix; then
|
|
||||||
OPENJDK_TARGET_OS_API_DIR="unix"
|
|
||||||
fi
|
|
||||||
if test "x$OPENJDK_TARGET_OS_API" = xwinapi; then
|
|
||||||
OPENJDK_TARGET_OS_API_DIR="windows"
|
|
||||||
fi
|
|
||||||
AC_SUBST(OPENJDK_TARGET_OS_API_DIR)
|
|
||||||
|
|
||||||
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
||||||
OPENJDK_TARGET_OS_EXPORT_DIR=macosx
|
OPENJDK_TARGET_OS_EXPORT_DIR=macosx
|
||||||
else
|
else
|
||||||
OPENJDK_TARGET_OS_EXPORT_DIR=${OPENJDK_TARGET_OS_API_DIR}
|
OPENJDK_TARGET_OS_EXPORT_DIR=${OPENJDK_TARGET_OS_TYPE}
|
||||||
fi
|
fi
|
||||||
AC_SUBST(OPENJDK_TARGET_OS_EXPORT_DIR)
|
AC_SUBST(OPENJDK_TARGET_OS_EXPORT_DIR)
|
||||||
|
|
||||||
@ -472,8 +472,8 @@ AC_DEFUN_ONCE([PLATFORM_SETUP_OPENJDK_TARGET_BITS],
|
|||||||
# And -q on AIX because otherwise the compiler produces 32-bit objects by default
|
# And -q on AIX because otherwise the compiler produces 32-bit objects by default
|
||||||
PLATFORM_SET_COMPILER_TARGET_BITS_FLAGS
|
PLATFORM_SET_COMPILER_TARGET_BITS_FLAGS
|
||||||
elif test "x$COMPILE_TYPE" = xreduced; then
|
elif test "x$COMPILE_TYPE" = xreduced; then
|
||||||
if test "x$OPENJDK_TARGET_OS" != xwindows; then
|
if test "x$OPENJDK_TARGET_OS_TYPE" = xunix; then
|
||||||
# Specify -m if running reduced on other Posix platforms
|
# Specify -m if running reduced on unix platforms
|
||||||
PLATFORM_SET_COMPILER_TARGET_BITS_FLAGS
|
PLATFORM_SET_COMPILER_TARGET_BITS_FLAGS
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
X:=
|
X:=
|
||||||
SPACE:=$(X) $(X)
|
SPACE:=$(X) $(X)
|
||||||
COMMA:=,
|
COMMA:=,
|
||||||
|
DOLLAR:=$$
|
||||||
HASH:=\#
|
HASH:=\#
|
||||||
LEFT_PAREN:=(
|
LEFT_PAREN:=(
|
||||||
RIGHT_PAREN:=)
|
RIGHT_PAREN:=)
|
||||||
@ -82,7 +83,7 @@ CONF_NAME:=@CONF_NAME@
|
|||||||
|
|
||||||
# The built jdk will run in this target system.
|
# The built jdk will run in this target system.
|
||||||
OPENJDK_TARGET_OS:=@OPENJDK_TARGET_OS@
|
OPENJDK_TARGET_OS:=@OPENJDK_TARGET_OS@
|
||||||
OPENJDK_TARGET_OS_API:=@OPENJDK_TARGET_OS_API@
|
OPENJDK_TARGET_OS_TYPE:=@OPENJDK_TARGET_OS_TYPE@
|
||||||
OPENJDK_TARGET_OS_ENV:=@OPENJDK_TARGET_OS_ENV@
|
OPENJDK_TARGET_OS_ENV:=@OPENJDK_TARGET_OS_ENV@
|
||||||
|
|
||||||
OPENJDK_TARGET_CPU:=@OPENJDK_TARGET_CPU@
|
OPENJDK_TARGET_CPU:=@OPENJDK_TARGET_CPU@
|
||||||
@ -99,13 +100,12 @@ OPENJDK_TARGET_CPU_LEGACY:=@OPENJDK_TARGET_CPU_LEGACY@
|
|||||||
OPENJDK_TARGET_CPU_LEGACY_LIB:=@OPENJDK_TARGET_CPU_LEGACY_LIB@
|
OPENJDK_TARGET_CPU_LEGACY_LIB:=@OPENJDK_TARGET_CPU_LEGACY_LIB@
|
||||||
OPENJDK_TARGET_CPU_OSARCH:=@OPENJDK_TARGET_CPU_OSARCH@
|
OPENJDK_TARGET_CPU_OSARCH:=@OPENJDK_TARGET_CPU_OSARCH@
|
||||||
OPENJDK_TARGET_CPU_JLI_CFLAGS:=@OPENJDK_TARGET_CPU_JLI_CFLAGS@
|
OPENJDK_TARGET_CPU_JLI_CFLAGS:=@OPENJDK_TARGET_CPU_JLI_CFLAGS@
|
||||||
OPENJDK_TARGET_OS_API_DIR:=@OPENJDK_TARGET_OS_API_DIR@
|
|
||||||
OPENJDK_TARGET_OS_EXPORT_DIR:=@OPENJDK_TARGET_OS_EXPORT_DIR@
|
OPENJDK_TARGET_OS_EXPORT_DIR:=@OPENJDK_TARGET_OS_EXPORT_DIR@
|
||||||
|
|
||||||
# We are building on this build system.
|
# We are building on this build system.
|
||||||
# When not cross-compiling, it is the same as the target.
|
# When not cross-compiling, it is the same as the target.
|
||||||
OPENJDK_BUILD_OS:=@OPENJDK_BUILD_OS@
|
OPENJDK_BUILD_OS:=@OPENJDK_BUILD_OS@
|
||||||
OPENJDK_BUILD_OS_API:=@OPENJDK_BUILD_OS_API@
|
OPENJDK_BUILD_OS_TYPE:=@OPENJDK_BUILD_OS_TYPE@
|
||||||
OPENJDK_BUILD_OS_ENV:=@OPENJDK_BUILD_OS_ENV@
|
OPENJDK_BUILD_OS_ENV:=@OPENJDK_BUILD_OS_ENV@
|
||||||
|
|
||||||
OPENJDK_BUILD_CPU:=@OPENJDK_BUILD_CPU@
|
OPENJDK_BUILD_CPU:=@OPENJDK_BUILD_CPU@
|
||||||
@ -236,31 +236,23 @@ BUILD_VARIANT_RELEASE:=@BUILD_VARIANT_RELEASE@
|
|||||||
|
|
||||||
BUILD_OUTPUT:=@BUILD_OUTPUT@
|
BUILD_OUTPUT:=@BUILD_OUTPUT@
|
||||||
# Colon left out to be able to override IMAGES_OUTPUTDIR for bootcycle-images
|
# Colon left out to be able to override IMAGES_OUTPUTDIR for bootcycle-images
|
||||||
LANGTOOLS_OUTPUTDIR=$(BUILD_OUTPUT)/langtools
|
SUPPORT_OUTPUTDIR=$(BUILD_OUTPUT)/support
|
||||||
CORBA_OUTPUTDIR=$(BUILD_OUTPUT)/corba
|
BUILDTOOLS_OUTPUTDIR=$(BUILD_OUTPUT)/buildtools
|
||||||
JAXP_OUTPUTDIR=$(BUILD_OUTPUT)/jaxp
|
MAKESUPPORT_OUTPUTDIR=$(BUILD_OUTPUT)/makesupport
|
||||||
JAXWS_OUTPUTDIR=$(BUILD_OUTPUT)/jaxws
|
|
||||||
HOTSPOT_OUTPUTDIR=$(BUILD_OUTPUT)/hotspot
|
HOTSPOT_OUTPUTDIR=$(BUILD_OUTPUT)/hotspot
|
||||||
JDK_OUTPUTDIR=$(BUILD_OUTPUT)/jdk
|
JDK_OUTPUTDIR=$(BUILD_OUTPUT)/jdk
|
||||||
NASHORN_OUTPUTDIR=$(BUILD_OUTPUT)/nashorn
|
|
||||||
IMAGES_OUTPUTDIR=$(BUILD_OUTPUT)/images
|
IMAGES_OUTPUTDIR=$(BUILD_OUTPUT)/images
|
||||||
TESTMAKE_OUTPUTDIR=$(BUILD_OUTPUT)/testmake
|
TESTMAKE_OUTPUTDIR=$(BUILD_OUTPUT)/testmake
|
||||||
MAKESUPPORT_OUTPUTDIR=$(BUILD_OUTPUT)/make-support
|
MAKESUPPORT_OUTPUTDIR=$(BUILD_OUTPUT)/make-support
|
||||||
|
|
||||||
LANGTOOLS_DIST=$(LANGTOOLS_OUTPUTDIR)/dist
|
|
||||||
CORBA_DIST=$(CORBA_OUTPUTDIR)/dist
|
|
||||||
JAXP_DIST=$(JAXP_OUTPUTDIR)/dist
|
|
||||||
JAXWS_DIST=$(JAXWS_OUTPUTDIR)/dist
|
|
||||||
HOTSPOT_DIST=@HOTSPOT_DIST@
|
HOTSPOT_DIST=@HOTSPOT_DIST@
|
||||||
NASHORN_DIST=$(NASHORN_OUTPUTDIR)/dist
|
|
||||||
|
|
||||||
BUILD_HOTSPOT=@BUILD_HOTSPOT@
|
BUILD_HOTSPOT=@BUILD_HOTSPOT@
|
||||||
|
|
||||||
# The boot jdk to use. These are overridden in bootcycle-spec.gmk. Make sure to keep
|
# The boot jdk to use. This is overridden in bootcycle-spec.gmk. Make sure to keep
|
||||||
# them in sync.
|
# it in sync.
|
||||||
BOOT_JDK:=@BOOT_JDK@
|
BOOT_JDK:=@BOOT_JDK@
|
||||||
BOOT_RTJAR:=@BOOT_RTJAR@
|
|
||||||
BOOT_TOOLSJAR=$(BOOT_JDK)/lib/tools.jar
|
|
||||||
|
|
||||||
# When compiling Java source to be run by the boot jdk
|
# When compiling Java source to be run by the boot jdk
|
||||||
# use these extra flags, eg -source 6 -target 6
|
# use these extra flags, eg -source 6 -target 6
|
||||||
@ -351,7 +343,7 @@ OBJC:=@CCACHE@ @OBJC@
|
|||||||
CPP:=@FIXPATH@ @CPP@
|
CPP:=@FIXPATH@ @CPP@
|
||||||
#CPPFLAGS:=@CPPFLAGS@
|
#CPPFLAGS:=@CPPFLAGS@
|
||||||
|
|
||||||
# The linker can be gcc or ld on posix systems, or link.exe on windows systems.
|
# The linker can be gcc or ld on unix systems, or link.exe on windows systems.
|
||||||
LD:=@FIXPATH@ @LD@
|
LD:=@FIXPATH@ @LD@
|
||||||
|
|
||||||
# Xcode SDK path
|
# Xcode SDK path
|
||||||
@ -392,7 +384,7 @@ BUILD_LD:=@FIXPATH@ @BUILD_LD@
|
|||||||
|
|
||||||
AS:=@FIXPATH@ @AS@
|
AS:=@FIXPATH@ @AS@
|
||||||
|
|
||||||
# AR is used to create a static library (is ar in posix, lib.exe in windows)
|
# AR is used to create a static library (is ar in unix, lib.exe in windows)
|
||||||
AR:=@FIXPATH@ @AR@
|
AR:=@FIXPATH@ @AR@
|
||||||
ARFLAGS:=@ARFLAGS@
|
ARFLAGS:=@ARFLAGS@
|
||||||
|
|
||||||
@ -484,13 +476,14 @@ SJAVAC_SERVER_JAVA=@FIXPATH@ $(SJAVAC_SERVER_JAVA_CMD) $(SJAVAC_SERVER_JAVA_FLAG
|
|||||||
JAVAC_FLAGS?=@JAVAC_FLAGS@
|
JAVAC_FLAGS?=@JAVAC_FLAGS@
|
||||||
|
|
||||||
# You run the new javac using the boot jdk with $(BOOT_JDK)/bin/java $(NEW_JAVAC) ...
|
# You run the new javac using the boot jdk with $(BOOT_JDK)/bin/java $(NEW_JAVAC) ...
|
||||||
INTERIM_LANGTOOLS_JAR := $(LANGTOOLS_OUTPUTDIR)/dist/interim_langtools.jar
|
# Use = assignment to be able to override in bootcycle-spec.gmk
|
||||||
INTERIM_LANGTOOLS_ARGS := "-Xbootclasspath/p:$(INTERIM_LANGTOOLS_JAR)" -cp $(INTERIM_LANGTOOLS_JAR)
|
INTERIM_LANGTOOLS_JAR = $(BUILDTOOLS_OUTPUTDIR)/interim_langtools.jar
|
||||||
|
INTERIM_LANGTOOLS_ARGS = "-Xbootclasspath/p:$(INTERIM_LANGTOOLS_JAR)" -cp $(INTERIM_LANGTOOLS_JAR)
|
||||||
NEW_JAVAC = $(INTERIM_LANGTOOLS_ARGS) com.sun.tools.javac.Main
|
NEW_JAVAC = $(INTERIM_LANGTOOLS_ARGS) com.sun.tools.javac.Main
|
||||||
NEW_JAVADOC = $(INTERIM_LANGTOOLS_ARGS) com.sun.tools.javadoc.Main
|
NEW_JAVADOC = $(INTERIM_LANGTOOLS_ARGS) com.sun.tools.javadoc.Main
|
||||||
|
|
||||||
# The interim corba jar is needed for running rmic
|
# The interim corba jar is needed for running rmic
|
||||||
INTERIM_CORBA_JAR := $(CORBA_OUTPUTDIR)/dist/interim_corba.jar
|
INTERIM_CORBA_JAR = $(BUILDTOOLS_OUTPUTDIR)/interim_corba.jar
|
||||||
|
|
||||||
# Base flags for RC
|
# Base flags for RC
|
||||||
# Guarding this against resetting value. Legacy make files include spec multiple
|
# Guarding this against resetting value. Legacy make files include spec multiple
|
||||||
@ -569,10 +562,10 @@ FIXPATH:=@FIXPATH@
|
|||||||
# Where the build output is stored for your convenience.
|
# Where the build output is stored for your convenience.
|
||||||
BUILD_LOG:=@BUILD_LOG@
|
BUILD_LOG:=@BUILD_LOG@
|
||||||
BUILD_LOG_PREVIOUS:=@BUILD_LOG_PREVIOUS@
|
BUILD_LOG_PREVIOUS:=@BUILD_LOG_PREVIOUS@
|
||||||
# Disable the build log wrapper on sjavac+winapi until
|
# Disable the build log wrapper on sjavac+windows until
|
||||||
# we have solved how to prevent the log wrapper to wait
|
# we have solved how to prevent the log wrapper to wait
|
||||||
# for the background sjavac server process.
|
# for the background sjavac server process.
|
||||||
ifeq (@ENABLE_SJAVAC@X@OPENJDK_BUILD_OS_API@,yesXwinapi)
|
ifeq (@ENABLE_SJAVAC@X@OPENJDK_BUILD_OS@,yesXwindows)
|
||||||
BUILD_LOG_WRAPPER:=
|
BUILD_LOG_WRAPPER:=
|
||||||
else
|
else
|
||||||
BUILD_LOG_WRAPPER:=@BUILD_LOG_WRAPPER@
|
BUILD_LOG_WRAPPER:=@BUILD_LOG_WRAPPER@
|
||||||
@ -695,19 +688,15 @@ OS_VERSION_MINOR:=@OS_VERSION_MINOR@
|
|||||||
OS_VERSION_MICRO:=@OS_VERSION_MICRO@
|
OS_VERSION_MICRO:=@OS_VERSION_MICRO@
|
||||||
|
|
||||||
# Images directory definitions
|
# Images directory definitions
|
||||||
JDK_IMAGE_SUBDIR:=j2sdk-image
|
JDK_IMAGE_SUBDIR:=jdk
|
||||||
JRE_IMAGE_SUBDIR:=j2re-image
|
JRE_IMAGE_SUBDIR:=jre
|
||||||
JDK_OVERLAY_IMAGE_SUBDIR:=j2sdk-overlay-image
|
|
||||||
JRE_OVERLAY_IMAGE_SUBDIR:=j2re-overlay-image
|
|
||||||
# Colon left out to be able to override output dir for bootcycle-images
|
# Colon left out to be able to override output dir for bootcycle-images
|
||||||
JDK_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JDK_IMAGE_SUBDIR)
|
JDK_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JDK_IMAGE_SUBDIR)
|
||||||
JRE_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JRE_IMAGE_SUBDIR)
|
JRE_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JRE_IMAGE_SUBDIR)
|
||||||
JDK_OVERLAY_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JDK_OVERLAY_IMAGE_SUBDIR)
|
|
||||||
JRE_OVERLAY_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JRE_OVERLAY_IMAGE_SUBDIR)
|
|
||||||
|
|
||||||
# Macosx bundles directory definitions
|
# Macosx bundles directory definitions
|
||||||
JDK_BUNDLE_SUBDIR=j2sdk-bundle/jdk$(JDK_VERSION).jdk/Contents
|
JDK_BUNDLE_SUBDIR=jdk-bundle/jdk$(JDK_VERSION).jdk/Contents
|
||||||
JRE_BUNDLE_SUBDIR=j2re-bundle/jre$(JDK_VERSION).jre/Contents
|
JRE_BUNDLE_SUBDIR=jre-bundle/jre$(JDK_VERSION).jre/Contents
|
||||||
JDK_BUNDLE_DIR=$(IMAGES_OUTPUTDIR)/$(JDK_BUNDLE_SUBDIR)
|
JDK_BUNDLE_DIR=$(IMAGES_OUTPUTDIR)/$(JDK_BUNDLE_SUBDIR)
|
||||||
JRE_BUNDLE_DIR=$(IMAGES_OUTPUTDIR)/$(JRE_BUNDLE_SUBDIR)
|
JRE_BUNDLE_DIR=$(IMAGES_OUTPUTDIR)/$(JRE_BUNDLE_SUBDIR)
|
||||||
|
|
||||||
|
@ -712,12 +712,6 @@ AC_DEFUN_ONCE([TOOLCHAIN_MISC_CHECKS],
|
|||||||
[HAS_CFLAG_OPTIMIZE_DEBUG=true],
|
[HAS_CFLAG_OPTIMIZE_DEBUG=true],
|
||||||
[HAS_CFLAG_OPTIMIZE_DEBUG=false])
|
[HAS_CFLAG_OPTIMIZE_DEBUG=false])
|
||||||
|
|
||||||
# "-fsanitize=undefined" supported for GCC 4.9 and later
|
|
||||||
CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG="-fsanitize=undefined -fsanitize-recover"
|
|
||||||
FLAGS_COMPILER_CHECK_ARGUMENTS([$CFLAG_DETECT_UNDEFINED_BEHAVIOR_FLAG],
|
|
||||||
[HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=true],
|
|
||||||
[HAS_CFLAG_DETECT_UNDEFINED_BEHAVIOR=false])
|
|
||||||
|
|
||||||
# "-z relro" supported in GNU binutils 2.17 and later
|
# "-z relro" supported in GNU binutils 2.17 and later
|
||||||
LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro"
|
LINKER_RELRO_FLAG="-Xlinker -z -Xlinker relro"
|
||||||
FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_RELRO_FLAG],
|
FLAGS_LINKER_CHECK_ARGUMENTS([$LINKER_RELRO_FLAG],
|
||||||
|
@ -103,8 +103,8 @@ diff_text() {
|
|||||||
-e '[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}' \
|
-e '[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}' \
|
||||||
-e thePoint -e aPoint -e setItemsPtr \
|
-e thePoint -e aPoint -e setItemsPtr \
|
||||||
-e 'lambda\$[a-zA-Z0-9]*\$[0-9]' ${THIS_FILE} > /dev/null; then
|
-e 'lambda\$[a-zA-Z0-9]*\$[0-9]' ${THIS_FILE} > /dev/null; then
|
||||||
$JAVAP -c -constants -l -p ${OTHER_FILE} > ${OTHER_FILE}.javap
|
$JAVAP -c -constants -l -p "${OTHER_FILE}" > ${OTHER_FILE}.javap
|
||||||
$JAVAP -c -constants -l -p ${THIS_FILE} > ${THIS_FILE}.javap
|
$JAVAP -c -constants -l -p "${THIS_FILE}" > ${THIS_FILE}.javap
|
||||||
TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \
|
TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \
|
||||||
$GREP '^[<>]' | \
|
$GREP '^[<>]' | \
|
||||||
$SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
|
$SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
|
||||||
@ -298,7 +298,7 @@ compare_general_files() {
|
|||||||
WORK_DIR=$3
|
WORK_DIR=$3
|
||||||
|
|
||||||
GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \
|
GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \
|
||||||
! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \
|
! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" ! -name "*.jimage" \
|
||||||
! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \
|
! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \
|
||||||
! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \
|
! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \
|
||||||
! -name "*.lib" ! -name "*.war" ! -name "JavaControlPanel" \
|
! -name "*.lib" ! -name "*.war" ! -name "JavaControlPanel" \
|
||||||
@ -395,8 +395,14 @@ compare_zip_file() {
|
|||||||
$RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR
|
$RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR
|
||||||
$MKDIR -p $THIS_UNZIPDIR
|
$MKDIR -p $THIS_UNZIPDIR
|
||||||
$MKDIR -p $OTHER_UNZIPDIR
|
$MKDIR -p $OTHER_UNZIPDIR
|
||||||
|
if [ "$TYPE" = "jimage" ]
|
||||||
|
then
|
||||||
|
(cd $THIS_UNZIPDIR && $JIMAGE extract $THIS_ZIP)
|
||||||
|
(cd $OTHER_UNZIPDIR && $JIMAGE extract $OTHER_ZIP)
|
||||||
|
else
|
||||||
(cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP)
|
(cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP)
|
||||||
(cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
|
(cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
|
||||||
|
fi
|
||||||
|
|
||||||
# Find all archives inside and unzip them as well to compare the contents rather than
|
# Find all archives inside and unzip them as well to compare the contents rather than
|
||||||
# the archives. pie.jar.pack.gz i app3.war is corrupt, skip it.
|
# the archives. pie.jar.pack.gz i app3.war is corrupt, skip it.
|
||||||
@ -525,7 +531,7 @@ compare_all_jar_files() {
|
|||||||
|
|
||||||
# TODO filter?
|
# TODO filter?
|
||||||
ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" -o -name "*.war" \
|
ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" -o -name "*.war" \
|
||||||
| $SORT | $FILTER)
|
-o -name "*.jimage" | $SORT | $FILTER)
|
||||||
|
|
||||||
if [ -n "$ZIPS" ]; then
|
if [ -n "$ZIPS" ]; then
|
||||||
echo Jar files...
|
echo Jar files...
|
||||||
@ -633,7 +639,7 @@ compare_bin_file() {
|
|||||||
if cmp $OTHER_FILE $THIS_FILE > /dev/null; then
|
if cmp $OTHER_FILE $THIS_FILE > /dev/null; then
|
||||||
# The files were bytewise identical.
|
# The files were bytewise identical.
|
||||||
if [ -n "$VERBOSE" ]; then
|
if [ -n "$VERBOSE" ]; then
|
||||||
echo " : : : : : $BIN_FILE"
|
echo " : : : : : : $BIN_FILE"
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
@ -1136,17 +1142,8 @@ fi
|
|||||||
|
|
||||||
if [ "$SKIP_DEFAULT" != "true" ]; then
|
if [ "$SKIP_DEFAULT" != "true" ]; then
|
||||||
if [ -z "$OTHER" ]; then
|
if [ -z "$OTHER" ]; then
|
||||||
OTHER="$THIS/../$LEGACY_BUILD_DIR"
|
echo "Nothing to compare to, set with -o"
|
||||||
if [ -d "$OTHER" ]; then
|
|
||||||
OTHER="$( cd "$OTHER" && pwd )"
|
|
||||||
else
|
|
||||||
echo "Default old build directory does not exist:"
|
|
||||||
echo "$OTHER"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
|
||||||
echo "Comparing to default old build:"
|
|
||||||
echo "$OTHER"
|
|
||||||
echo
|
|
||||||
else
|
else
|
||||||
if [ ! -d "$OTHER" ]; then
|
if [ ! -d "$OTHER" ]; then
|
||||||
echo "Other build directory does not exist:"
|
echo "Other build directory does not exist:"
|
||||||
@ -1160,90 +1157,36 @@ if [ "$SKIP_DEFAULT" != "true" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Figure out the layout of the this build. Which kinds of images have been produced
|
# Find the common images to compare, prioritizing later build stages
|
||||||
if [ -d "$THIS/install/j2sdk-image" ]; then
|
if [ -d "$THIS/install/jdk" ] && [ -d "$OTHER/install/jdk" ]; then
|
||||||
THIS_J2SDK="$THIS/install/j2sdk-image"
|
THIS_J2SDK="$THIS/install/jdk"
|
||||||
THIS_J2RE="$THIS/install/j2re-image"
|
THIS_J2RE="$THIS/install/jre"
|
||||||
echo "Selecting install images in this build"
|
OTHER_J2SDK="$OTHER/install/jdk"
|
||||||
elif [ -d "$THIS/deploy/j2sdk-image" ]; then
|
OTHER_J2RE="$OTHER/install/jre"
|
||||||
THIS_J2SDK="$THIS/deploy/j2sdk-image"
|
echo "Selecting install images for compare"
|
||||||
THIS_J2RE="$THIS/deploy/j2re-image"
|
elif [ -d "$THIS/deploy/jdk" ] && [ -d "$OTHER/deploy/jdk" ]; then
|
||||||
echo "Selecting deploy images in this build"
|
THIS_J2SDK="$THIS/deploy/jdk"
|
||||||
elif [ -d "$THIS/images/j2sdk-image" ]; then
|
THIS_J2RE="$THIS/deploy/jre"
|
||||||
THIS_J2SDK="$THIS/images/j2sdk-image"
|
OTHER_J2SDK="$OTHER/deploy/jdk"
|
||||||
THIS_J2RE="$THIS/images/j2re-image"
|
OTHER_J2RE="$OTHER/deploy/jre"
|
||||||
echo "Selecting jdk images in this build"
|
echo "Selecting deploy images for compare"
|
||||||
fi
|
elif [ -d "$THIS/images/jdk" ] && [ -d "$OTHER/images/jdk" ]; then
|
||||||
|
THIS_J2SDK="$THIS/images/jdk"
|
||||||
if [ -d "$THIS/images/j2sdk-overlay-image" ]; then
|
THIS_J2RE="$THIS/images/jre"
|
||||||
if [ -d "$THIS/install/j2sdk-image" ]; then
|
OTHER_J2SDK="$OTHER/images/jdk"
|
||||||
# If there is an install image, prefer that, it's also overlay
|
OTHER_J2RE="$OTHER/images/jre"
|
||||||
THIS_J2SDK_OVERLAY="$THIS/install/j2sdk-image"
|
echo "Selecting jdk images for compare"
|
||||||
THIS_J2RE_OVERLAY="$THIS/install/j2re-image"
|
|
||||||
echo "Selecting install overlay images in this build"
|
|
||||||
else
|
else
|
||||||
THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image"
|
echo "No common images found."
|
||||||
THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image"
|
|
||||||
echo "Selecting jdk overlay images in this build"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "$THIS/images/j2sdk-bundle" ]; then
|
|
||||||
THIS_J2SDK_BUNDLE="$THIS/images/j2sdk-bundle"
|
|
||||||
THIS_J2RE_BUNDLE="$THIS/images/j2re-bundle"
|
|
||||||
echo "Selecting bundles in this build"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Figure out the layout of the other build (old or new, normal or overlay image)
|
|
||||||
if [ -d "$OTHER/j2sdk-image" ]; then
|
|
||||||
if [ -f "$OTHER/j2sdk-image/LICENSE" ]; then
|
|
||||||
OTHER_J2SDK="$OTHER/j2sdk-image"
|
|
||||||
OTHER_J2RE="$OTHER/j2re-image"
|
|
||||||
echo "Selecting old-style images in other build"
|
|
||||||
else
|
|
||||||
OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image"
|
|
||||||
OTHER_J2RE_OVERLAY="$OTHER/j2re-image"
|
|
||||||
echo "Selecting overlay images in other build"
|
|
||||||
fi
|
|
||||||
elif [ -d "$OTHER/install/j2sdk-image" ]; then
|
|
||||||
OTHER_J2SDK="$OTHER/install/j2sdk-image"
|
|
||||||
OTHER_J2RE="$OTHER/install/j2re-image"
|
|
||||||
echo "Selecting install images in other build"
|
|
||||||
elif [ -d "$OTHER/deploy/j2sdk-image" ]; then
|
|
||||||
OTHER_J2SDK="$OTHER/deploy/j2sdk-image"
|
|
||||||
OTHER_J2RE="$OTHER/deploy/j2re-image"
|
|
||||||
echo "Selecting deploy images in other build"
|
|
||||||
elif [ -d "$OTHER/images/j2sdk-image" ]; then
|
|
||||||
OTHER_J2SDK="$OTHER/images/j2sdk-image"
|
|
||||||
OTHER_J2RE="$OTHER/images/j2re-image"
|
|
||||||
echo "Selecting jdk images in other build"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "$OTHER/j2sdk-bundle" ]; then
|
|
||||||
OTHER_J2SDK_BUNDLE="$OTHER/j2sdk-bundle"
|
|
||||||
OTHER_J2RE_BUNDLE="$OTHER/j2re-bundle"
|
|
||||||
echo "Selecting bundles in other build"
|
|
||||||
elif [ -d "$OTHER/images/j2sdk-bundle" ]; then
|
|
||||||
OTHER_J2SDK_BUNDLE="$OTHER/images/j2sdk-bundle"
|
|
||||||
OTHER_J2RE_BUNDLE="$OTHER/images/j2re-bundle"
|
|
||||||
echo "Selecting jdk bundles in other build"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$THIS_J2SDK" ] || [ -z "$THIS_J2RE" ]; then
|
|
||||||
if [ -z "$THIS_J2SDK_OVERLAY" ]; then
|
|
||||||
echo "Cannot locate images for this build. Are you sure you have run 'make images'?"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$OTHER_J2SDK" ] && [ -n "$OTHER_J2SDK_OVERLAY" ] && [ -z "$THIS_J2SDK_OVERLAY" ]; then
|
|
||||||
echo "OTHER build only has an overlay image while this build does not. Nothing to compare!"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
if [ -d "$THIS/images/jdk-bundle" ] && [ -d "$OTHER/images/jdk-bundle" ]; then
|
||||||
echo "WARNING! OTHER build has bundles built while this build does not."
|
THIS_J2SDK_BUNDLE="$THIS/images/jdk-bundle"
|
||||||
echo "Skipping bundle compare!"
|
THIS_J2RE_BUNDLE="$THIS/images/jre-bundle"
|
||||||
|
OTHER_J2SDK_BUNDLE="$OTHER/images/jdk-bundle"
|
||||||
|
OTHER_J2RE_BUNDLE="$OTHER/images/jre-bundle"
|
||||||
|
echo "Also comparing macosx bundles"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "$OTHER/images" ]; then
|
if [ -d "$OTHER/images" ]; then
|
||||||
@ -1266,22 +1209,13 @@ if [ "$SKIP_DEFAULT" != "true" ]; then
|
|||||||
THIS_JGSS_WINDOWS_BIN="$THIS_SEC_DIR/$JGSS_WINDOWS_BIN"
|
THIS_JGSS_WINDOWS_BIN="$THIS_SEC_DIR/$JGSS_WINDOWS_BIN"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "$THIS/docs" ]; then
|
if [ -d "$THIS/docs" ] && [ -d "$OTHER/docs" ]; then
|
||||||
THIS_DOCS="$THIS/docs"
|
THIS_DOCS="$THIS/docs"
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "$OTHER/docs" ]; then
|
|
||||||
OTHER_DOCS="$OTHER/docs"
|
OTHER_DOCS="$OTHER/docs"
|
||||||
fi
|
echo "Also comparing docs"
|
||||||
|
else
|
||||||
if [ -z "$THIS_DOCS" ]; then
|
|
||||||
echo "WARNING! Docs haven't been built and won't be compared."
|
echo "WARNING! Docs haven't been built and won't be compared."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$OTHER_DOCS" ]; then
|
|
||||||
echo "WARNING! Other build doesn't contain docs, skipping doc compare."
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
##########################################################################################
|
##########################################################################################
|
||||||
@ -1299,27 +1233,16 @@ if [ "$CMP_NAMES" = "true" ]; then
|
|||||||
echo -n "J2RE "
|
echo -n "J2RE "
|
||||||
compare_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
compare_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then
|
|
||||||
echo -n "J2SDK Overlay "
|
|
||||||
compare_dirs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay
|
|
||||||
echo -n "J2RE Overlay "
|
|
||||||
compare_dirs $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay
|
|
||||||
|
|
||||||
echo -n "J2SDK Overlay "
|
|
||||||
compare_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay
|
|
||||||
echo -n "J2RE Overlay "
|
|
||||||
compare_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay
|
|
||||||
fi
|
|
||||||
if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
||||||
echo -n "J2SDK Bundle "
|
echo -n "J2SDK Bundle "
|
||||||
compare_dirs $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle
|
compare_dirs $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/jdk-bundle
|
||||||
echo -n "J2RE Bundle "
|
echo -n "J2RE Bundle "
|
||||||
compare_dirs $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle
|
compare_dirs $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/jre-bundle
|
||||||
|
|
||||||
echo -n "J2SDK Bundle "
|
echo -n "J2SDK Bundle "
|
||||||
compare_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle
|
compare_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/jdk-bundle
|
||||||
echo -n "J2RE Bundle "
|
echo -n "J2RE Bundle "
|
||||||
compare_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle
|
compare_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/jre-bundle
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
|
if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
|
||||||
echo -n "Docs "
|
echo -n "Docs "
|
||||||
@ -1340,18 +1263,6 @@ if [ "$CMP_PERMS" = "true" ]; then
|
|||||||
echo -n "J2RE "
|
echo -n "J2RE "
|
||||||
compare_permissions $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
compare_permissions $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then
|
|
||||||
echo -n "J2SDK Overlay "
|
|
||||||
compare_permissions $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay
|
|
||||||
echo -n "J2RE Overlay "
|
|
||||||
compare_permissions $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay
|
|
||||||
fi
|
|
||||||
if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
|
||||||
echo -n "J2SDK Bundle "
|
|
||||||
compare_permissions $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle
|
|
||||||
echo -n "J2RE Bundle "
|
|
||||||
compare_permissions $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle
|
|
||||||
fi
|
|
||||||
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
||||||
compare_permissions $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
compare_permissions $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
||||||
fi
|
fi
|
||||||
@ -1364,17 +1275,11 @@ if [ "$CMP_TYPES" = "true" ]; then
|
|||||||
echo -n "J2RE "
|
echo -n "J2RE "
|
||||||
compare_file_types $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
compare_file_types $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then
|
|
||||||
echo -n "J2SDK Overlay "
|
|
||||||
compare_file_types $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay
|
|
||||||
echo -n "J2RE Overlay "
|
|
||||||
compare_file_types $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay
|
|
||||||
fi
|
|
||||||
if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
||||||
echo -n "J2SDK Bundle "
|
echo -n "J2SDK Bundle "
|
||||||
compare_file_types $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle
|
compare_file_types $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/jdk-bundle
|
||||||
echo -n "J2RE Bundle "
|
echo -n "J2RE Bundle "
|
||||||
compare_file_types $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle
|
compare_file_types $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/jre-bundle
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
||||||
compare_file_types $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
compare_file_types $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
||||||
@ -1388,17 +1293,11 @@ if [ "$CMP_GENERAL" = "true" ]; then
|
|||||||
echo -n "J2RE "
|
echo -n "J2RE "
|
||||||
compare_general_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
compare_general_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then
|
|
||||||
echo -n "J2SDK Overlay "
|
|
||||||
compare_general_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay
|
|
||||||
echo -n "J2RE Overlay "
|
|
||||||
compare_general_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay
|
|
||||||
fi
|
|
||||||
if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then
|
||||||
echo -n "J2SDK Bundle "
|
echo -n "J2SDK Bundle "
|
||||||
compare_general_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle
|
compare_general_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/jdk-bundle
|
||||||
echo -n "J2RE Bundle "
|
echo -n "J2RE Bundle "
|
||||||
compare_general_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle
|
compare_general_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/jre-bundle
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
|
if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
|
||||||
echo -n "Docs "
|
echo -n "Docs "
|
||||||
@ -1454,10 +1353,6 @@ if [ "$CMP_LIBS" = "true" ]; then
|
|||||||
compare_all_libs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
compare_all_libs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then
|
|
||||||
echo -n "Bundle "
|
|
||||||
compare_all_libs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay
|
|
||||||
fi
|
|
||||||
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
||||||
compare_all_libs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
compare_all_libs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
||||||
fi
|
fi
|
||||||
@ -1467,10 +1362,6 @@ if [ "$CMP_EXECS" = "true" ]; then
|
|||||||
if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then
|
if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then
|
||||||
compare_all_execs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk
|
compare_all_execs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk
|
||||||
fi
|
fi
|
||||||
if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then
|
|
||||||
echo -n "Overlay "
|
|
||||||
compare_all_execs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay
|
|
||||||
fi
|
|
||||||
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
|
||||||
compare_all_execs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
compare_all_execs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
|
||||||
fi
|
fi
|
||||||
|
@ -84,7 +84,9 @@ ACCEPTED_BIN_DIFF="
|
|||||||
./bin/jconsole
|
./bin/jconsole
|
||||||
./bin/jdb
|
./bin/jdb
|
||||||
./bin/jhat
|
./bin/jhat
|
||||||
|
./bin/jimage
|
||||||
./bin/jinfo
|
./bin/jinfo
|
||||||
|
./bin/jjs
|
||||||
./bin/jmap
|
./bin/jmap
|
||||||
./bin/jps
|
./bin/jps
|
||||||
./bin/jrunscript
|
./bin/jrunscript
|
||||||
@ -108,6 +110,7 @@ ACCEPTED_BIN_DIFF="
|
|||||||
./bin/wsimport
|
./bin/wsimport
|
||||||
./bin/xjc
|
./bin/xjc
|
||||||
./jre/bin/java
|
./jre/bin/java
|
||||||
|
./jre/bin/jjs
|
||||||
./jre/bin/keytool
|
./jre/bin/keytool
|
||||||
./jre/bin/orbd
|
./jre/bin/orbd
|
||||||
./jre/bin/pack200
|
./jre/bin/pack200
|
||||||
@ -171,7 +174,9 @@ ACCEPTED_BIN_DIFF="
|
|||||||
./bin/jconsole
|
./bin/jconsole
|
||||||
./bin/jdb
|
./bin/jdb
|
||||||
./bin/jhat
|
./bin/jhat
|
||||||
|
./bin/jimage
|
||||||
./bin/jinfo
|
./bin/jinfo
|
||||||
|
./bin/jjs
|
||||||
./bin/jmap
|
./bin/jmap
|
||||||
./bin/jps
|
./bin/jps
|
||||||
./bin/jrunscript
|
./bin/jrunscript
|
||||||
@ -195,6 +200,7 @@ ACCEPTED_BIN_DIFF="
|
|||||||
./bin/wsimport
|
./bin/wsimport
|
||||||
./bin/xjc
|
./bin/xjc
|
||||||
./jre/bin/java
|
./jre/bin/java
|
||||||
|
./jre/bin/jjs
|
||||||
./jre/bin/keytool
|
./jre/bin/keytool
|
||||||
./jre/bin/orbd
|
./jre/bin/orbd
|
||||||
./jre/bin/pack200
|
./jre/bin/pack200
|
||||||
@ -314,7 +320,9 @@ ACCEPTED_SMALL_SIZE_DIFF="
|
|||||||
./bin/jconsole
|
./bin/jconsole
|
||||||
./bin/jdb
|
./bin/jdb
|
||||||
./bin/jhat
|
./bin/jhat
|
||||||
|
./bin/jimage
|
||||||
./bin/jinfo
|
./bin/jinfo
|
||||||
|
./bin/jjs
|
||||||
./bin/jmap
|
./bin/jmap
|
||||||
./bin/jps
|
./bin/jps
|
||||||
./bin/jrunscript
|
./bin/jrunscript
|
||||||
@ -453,7 +461,9 @@ ACCEPTED_SMALL_SIZE_DIFF="
|
|||||||
./bin/amd64/jconsole
|
./bin/amd64/jconsole
|
||||||
./bin/amd64/jdb
|
./bin/amd64/jdb
|
||||||
./bin/amd64/jhat
|
./bin/amd64/jhat
|
||||||
|
./bin/amd64/jimage
|
||||||
./bin/amd64/jinfo
|
./bin/amd64/jinfo
|
||||||
|
./bin/amd64/jjs
|
||||||
./bin/amd64/jmap
|
./bin/amd64/jmap
|
||||||
./bin/amd64/jps
|
./bin/amd64/jps
|
||||||
./bin/amd64/jrunscript
|
./bin/amd64/jrunscript
|
||||||
@ -611,7 +621,9 @@ ACCEPTED_SMALL_SIZE_DIFF="
|
|||||||
./bin/jconsole
|
./bin/jconsole
|
||||||
./bin/jdb
|
./bin/jdb
|
||||||
./bin/jhat
|
./bin/jhat
|
||||||
|
./bin/jimage
|
||||||
./bin/jinfo
|
./bin/jinfo
|
||||||
|
./bin/jjs
|
||||||
./bin/jmap
|
./bin/jmap
|
||||||
./bin/jps
|
./bin/jps
|
||||||
./bin/jrunscript
|
./bin/jrunscript
|
||||||
@ -755,7 +767,9 @@ ACCEPTED_SMALL_SIZE_DIFF="
|
|||||||
./bin/sparcv9/jconsole
|
./bin/sparcv9/jconsole
|
||||||
./bin/sparcv9/jdb
|
./bin/sparcv9/jdb
|
||||||
./bin/sparcv9/jhat
|
./bin/sparcv9/jhat
|
||||||
|
./bin/sparcv9/jimage
|
||||||
./bin/sparcv9/jinfo
|
./bin/sparcv9/jinfo
|
||||||
|
./bin/sparcv9/jjs
|
||||||
./bin/sparcv9/jmap
|
./bin/sparcv9/jmap
|
||||||
./bin/sparcv9/jps
|
./bin/sparcv9/jps
|
||||||
./bin/sparcv9/jrunscript
|
./bin/sparcv9/jrunscript
|
||||||
@ -836,7 +850,9 @@ ACCEPTED_SMALL_SIZE_DIFF="
|
|||||||
./bin/jconsole.exe
|
./bin/jconsole.exe
|
||||||
./bin/jdb.exe
|
./bin/jdb.exe
|
||||||
./bin/jhat.exe
|
./bin/jhat.exe
|
||||||
|
./bin/jimage.exe
|
||||||
./bin/jinfo.exe
|
./bin/jinfo.exe
|
||||||
|
./bin/jjs.exe
|
||||||
./bin/jmap.exe
|
./bin/jmap.exe
|
||||||
./bin/jps.exe
|
./bin/jps.exe
|
||||||
./bin/jrunscript.exe
|
./bin/jrunscript.exe
|
||||||
@ -910,11 +926,6 @@ ACCEPTED_JARZIP_CONTENTS="
|
|||||||
/META-INF/INDEX.LIST
|
/META-INF/INDEX.LIST
|
||||||
"
|
"
|
||||||
|
|
||||||
KNOWN_BIN_DIFF="
|
|
||||||
./jre/lib/libJObjC.dylib
|
|
||||||
./lib/libJObjC.dylib
|
|
||||||
"
|
|
||||||
|
|
||||||
ACCEPTED_BIN_DIFF="
|
ACCEPTED_BIN_DIFF="
|
||||||
./bin/appletviewer
|
./bin/appletviewer
|
||||||
./bin/idlj
|
./bin/idlj
|
||||||
@ -930,7 +941,9 @@ ACCEPTED_BIN_DIFF="
|
|||||||
./bin/jconsole
|
./bin/jconsole
|
||||||
./bin/jdb
|
./bin/jdb
|
||||||
./bin/jhat
|
./bin/jhat
|
||||||
|
./bin/jimage
|
||||||
./bin/jinfo
|
./bin/jinfo
|
||||||
|
./bin/jjs
|
||||||
./bin/jmap
|
./bin/jmap
|
||||||
./bin/jps
|
./bin/jps
|
||||||
./bin/jrunscript
|
./bin/jrunscript
|
||||||
@ -964,34 +977,82 @@ ACCEPTED_BIN_DIFF="
|
|||||||
./jre/bin/tnameserv
|
./jre/bin/tnameserv
|
||||||
./jre/lib/libsaproc.dylib
|
./jre/lib/libsaproc.dylib
|
||||||
./jre/lib/server/libjvm.dylib
|
./jre/lib/server/libjvm.dylib
|
||||||
|
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.dylib
|
||||||
|
./demo/jvmti/gctest/lib/libgctest.dylib
|
||||||
|
./demo/jvmti/heapTracker/lib/libheapTracker.dylib
|
||||||
|
./demo/jvmti/heapViewer/lib/libheapViewer.dylib
|
||||||
|
./demo/jvmti/minst/lib/libminst.dylib
|
||||||
|
./demo/jvmti/mtrace/lib/libmtrace.dylib
|
||||||
|
./demo/jvmti/versionCheck/lib/libversionCheck.dylib
|
||||||
|
./demo/jvmti/waiters/lib/libwaiters.dylib
|
||||||
|
./Contents/Home/lib/libAppleScriptEngine.dylib
|
||||||
|
./Contents/Home/lib/libattach.dylib
|
||||||
|
./Contents/Home/lib/libawt_lwawt.dylib
|
||||||
|
./Contents/Home/lib/libdeploy.dylib
|
||||||
|
./Contents/Home/lib/libdt_socket.dylib
|
||||||
|
./Contents/Home/lib/libhprof.dylib
|
||||||
|
./Contents/Home/lib/libinstrument.dylib
|
||||||
|
./Contents/Home/lib/libjava_crw_demo.dylib
|
||||||
|
./Contents/Home/lib/libjdwp.dylib
|
||||||
|
./Contents/Home/lib/libjsdt.dylib
|
||||||
|
./Contents/Home/lib/libjsig.dylib
|
||||||
|
./Contents/Home/lib/libmanagement.dylib
|
||||||
|
./Contents/Home/lib/libnpjp2.dylib
|
||||||
|
./Contents/Home/lib/libosx.dylib
|
||||||
|
./Contents/Home/lib/libosxapp.dylib
|
||||||
|
./Contents/Home/lib/libsaproc.dylib
|
||||||
|
./Contents/Home/lib/libsplashscreen.dylib
|
||||||
|
./Contents/Home/lib/libverify.dylib
|
||||||
|
./Contents/Home/lib/server/libjsig.dylib
|
||||||
|
./Contents/Home/lib/server/libjvm.dylib
|
||||||
|
./jre/lib/libAppleScriptEngine.dylib
|
||||||
|
./jre/lib/libattach.dylib
|
||||||
|
./jre/lib/libawt_lwawt.dylib
|
||||||
|
./jre/lib/libdeploy.dylib
|
||||||
|
./jre/lib/libdt_socket.dylib
|
||||||
|
./jre/lib/libhprof.dylib
|
||||||
|
./jre/lib/libinstrument.dylib
|
||||||
|
./jre/lib/libjava_crw_demo.dylib
|
||||||
|
./jre/lib/libjdwp.dylib
|
||||||
|
./jre/lib/libjsdt.dylib
|
||||||
|
./jre/lib/libjsig.dylib
|
||||||
|
./jre/lib/libmanagement.dylib
|
||||||
|
./jre/lib/libosx.dylib
|
||||||
|
./jre/lib/libosxapp.dylib
|
||||||
|
./jre/lib/libsaproc.dylib
|
||||||
|
./jre/lib/libsplashscreen.dylib
|
||||||
|
./jre/lib/libverify.dylib
|
||||||
|
./jre/lib/server/libjvm.dylib
|
||||||
|
./lib/libAppleScriptEngine.dylib
|
||||||
|
./lib/libattach.dylib
|
||||||
|
./lib/libawt_lwawt.dylib
|
||||||
|
./lib/libdeploy.dylib
|
||||||
|
./lib/libdt_socket.dylib
|
||||||
|
./lib/libhprof.dylib
|
||||||
|
./lib/libinstrument.dylib
|
||||||
|
./lib/libjava_crw_demo.dylib
|
||||||
|
./lib/libjdwp.dylib
|
||||||
|
./lib/libjsdt.dylib
|
||||||
|
./lib/libjsig.dylib
|
||||||
|
./lib/libmanagement.dylib
|
||||||
|
./lib/libnpjp2.dylib
|
||||||
|
./lib/libosx.dylib
|
||||||
|
./lib/libosxapp.dylib
|
||||||
|
./lib/libverify.dylib
|
||||||
./lib/libsaproc.dylib
|
./lib/libsaproc.dylib
|
||||||
|
./lib/libsplashscreen.dylib
|
||||||
./lib/server/libjvm.dylib
|
./lib/server/libjvm.dylib
|
||||||
./lib/deploy/JavaControlPanel.prefPane/Contents/MacOS/JavaControlPanel
|
./lib/deploy/JavaControlPanel.prefPane/Contents/MacOS/JavaControlPanel
|
||||||
"
|
"
|
||||||
|
|
||||||
KNOWN_SIZE_DIFF="
|
|
||||||
./jre/lib/libJObjC.dylib
|
|
||||||
./lib/libJObjC.dylib
|
|
||||||
"
|
|
||||||
|
|
||||||
SORT_SYMBOLS="
|
SORT_SYMBOLS="
|
||||||
./jre/lib/libJObjC.dylib
|
./Contents/Home/lib/libsaproc.dylib
|
||||||
./lib/libJObjC.dylib
|
./jre/lib/libsaproc.dylib
|
||||||
|
./lib/libsaproc.dylib
|
||||||
"
|
"
|
||||||
|
|
||||||
KNOWN_SYM_DIFF="
|
ACCEPTED_SMALL_SIZE_DIFF="
|
||||||
./jre/lib/libJObjC.dylib
|
./bin/javaws
|
||||||
./lib/libJObjC.dylib
|
./Contents/Home/bin/_javaws
|
||||||
"
|
"
|
||||||
|
|
||||||
KNOWN_ELF_DIFF="
|
|
||||||
./jre/lib/libJObjC.dylib
|
|
||||||
./lib/libJObjC.dylib
|
|
||||||
"
|
|
||||||
|
|
||||||
KNOWN_DIS_DIFF="
|
|
||||||
./jre/lib/libJObjC.dylib
|
|
||||||
./lib/libJObjC.dylib
|
|
||||||
"
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
@ -181,4 +181,3 @@ checkErrors
|
|||||||
checkErrors
|
checkErrors
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
|
@ -1212,6 +1212,7 @@ jdk/src/java.rmi/share/classes/sun/rmi/transport/tcp : jdk/src/share/classes/sun
|
|||||||
jdk/src/java.rmi/share/doc/stub/java/rmi/activation : jdk/src/share/doc/stub/java/rmi/activation
|
jdk/src/java.rmi/share/doc/stub/java/rmi/activation : jdk/src/share/doc/stub/java/rmi/activation
|
||||||
jdk/src/java.rmi/unix/bin/java-rmi.cgi.sh : jdk/src/solaris/bin/java-rmi.cgi.sh
|
jdk/src/java.rmi/unix/bin/java-rmi.cgi.sh : jdk/src/solaris/bin/java-rmi.cgi.sh
|
||||||
jdk/src/java.scripting/share/classes/javax/script : jdk/src/share/classes/javax/script
|
jdk/src/java.scripting/share/classes/javax/script : jdk/src/share/classes/javax/script
|
||||||
|
jdk/src/java.scripting/share/classes/com/sun/tools/script/shell : jdk/src/share/classes/com/sun/tools/script/shell
|
||||||
jdk/src/java.security.acl/share/classes/java/security/acl : jdk/src/share/classes/java/security/acl
|
jdk/src/java.security.acl/share/classes/java/security/acl : jdk/src/share/classes/java/security/acl
|
||||||
jdk/src/java.security.acl/share/classes/sun/security/acl : jdk/src/share/classes/sun/security/acl
|
jdk/src/java.security.acl/share/classes/sun/security/acl : jdk/src/share/classes/sun/security/acl
|
||||||
jdk/src/java.security.jgss/macosx/native/libosxkrb5/nativeccache.c : jdk/src/share/native/sun/security/krb5/nativeccache.c
|
jdk/src/java.security.jgss/macosx/native/libosxkrb5/nativeccache.c : jdk/src/share/native/sun/security/krb5/nativeccache.c
|
||||||
@ -1301,7 +1302,6 @@ jdk/src/jdk.deploy.osx/macosx/native/libosx/JavaAppLauncher.m : jdk/src/macosx/n
|
|||||||
jdk/src/jdk.deploy.osx/macosx/native/libosx/KeystoreImpl.m : jdk/src/macosx/native/apple/security/KeystoreImpl.m
|
jdk/src/jdk.deploy.osx/macosx/native/libosx/KeystoreImpl.m : jdk/src/macosx/native/apple/security/KeystoreImpl.m
|
||||||
jdk/src/jdk.dev/share/classes/com/sun/jarsigner : jdk/src/share/classes/com/sun/jarsigner
|
jdk/src/jdk.dev/share/classes/com/sun/jarsigner : jdk/src/share/classes/com/sun/jarsigner
|
||||||
jdk/src/jdk.dev/share/classes/com/sun/tools/hat : jdk/src/share/classes/com/sun/tools/hat
|
jdk/src/jdk.dev/share/classes/com/sun/tools/hat : jdk/src/share/classes/com/sun/tools/hat
|
||||||
jdk/src/jdk.dev/share/classes/com/sun/tools/script/shell : jdk/src/share/classes/com/sun/tools/script/shell
|
|
||||||
jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner : jdk/src/share/classes/sun/security/tools/jarsigner
|
jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner : jdk/src/share/classes/sun/security/tools/jarsigner
|
||||||
jdk/src/jdk.dev/share/classes/sun/tools/jar : jdk/src/share/classes/sun/tools/jar
|
jdk/src/jdk.dev/share/classes/sun/tools/jar : jdk/src/share/classes/sun/tools/jar
|
||||||
jdk/src/jdk.dev/share/classes/sun/tools/native2ascii : jdk/src/share/classes/sun/tools/native2ascii
|
jdk/src/jdk.dev/share/classes/sun/tools/native2ascii : jdk/src/share/classes/sun/tools/native2ascii
|
||||||
|
@ -200,4 +200,3 @@ do
|
|||||||
printf "%s\n" "$line" >> $output
|
printf "%s\n" "$line" >> $output
|
||||||
fi
|
fi
|
||||||
done < "$input"
|
done < "$input"
|
||||||
|
|
||||||
|
@ -282,3 +282,6 @@ ffd90c81d4ef9d94d880fc852e2fc482ecd9b374 jdk9-b36
|
|||||||
7e9add74ad50841fb39dae75db56374aefa1de4c jdk9-b37
|
7e9add74ad50841fb39dae75db56374aefa1de4c jdk9-b37
|
||||||
8acf056126e819cf536eef02aee0f61f207a6b52 jdk9-b38
|
8acf056126e819cf536eef02aee0f61f207a6b52 jdk9-b38
|
||||||
53bf36cb722db50815712258a77cb6bbe25a2f5f jdk9-b39
|
53bf36cb722db50815712258a77cb6bbe25a2f5f jdk9-b39
|
||||||
|
e27c725d6c9d155667b35255f442d4ceb8c3c084 jdk9-b40
|
||||||
|
1908b886ba1eda46fa725cf1160fe5d30fd1a7e5 jdk9-b41
|
||||||
|
078bb11af876fe528d4b516f33ad4dd9bb60549e jdk9-b42
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
#
|
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License version 2 only, as
|
|
||||||
# published by the Free Software Foundation. Oracle designates this
|
|
||||||
# particular file as subject to the "Classpath" exception as provided
|
|
||||||
# by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
#
|
|
||||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
# version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
# accompanied this code).
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License version
|
|
||||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
# or visit www.oracle.com if you need additional information or have any
|
|
||||||
# questions.
|
|
||||||
#
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# The Corba sources are old and generates a LOT of warnings.
|
|
||||||
# Disable these using Xlint, until someone cares to fix them.
|
|
||||||
DISABLE_CORBA_WARNINGS := -Xlint:all,-deprecation,-unchecked,-serial,-fallthrough,-cast,-rawtypes,-static,-dep-ann
|
|
||||||
|
|
||||||
# The "generate old bytecode" javac setup uses the new compiler to compile for the
|
|
||||||
# boot jdk to generate tools that need to be run with the boot jdk.
|
|
||||||
# Thus we force the target bytecode to the boot jdk bytecode.
|
|
||||||
$(eval $(call SetupJavaCompiler,GENERATE_OLDBYTECODE, \
|
|
||||||
JVM := $(JAVA), \
|
|
||||||
JAVAC := $(NEW_JAVAC), \
|
|
||||||
FLAGS := $(BOOT_JDK_SOURCETARGET) \
|
|
||||||
-bootclasspath "$(BOOT_RTJAR)$(PATH_SEP)$(BOOT_TOOLSJAR)" \
|
|
||||||
$(DISABLE_CORBA_WARNINGS), \
|
|
||||||
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
|
|
||||||
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
|
|
||||||
|
|
||||||
# The "generate new bytecode" uses the new compiler to generate bytecode
|
|
||||||
# for the new jdk that is being built. The code compiled by this setup
|
|
||||||
# cannot necessarily be run with the boot jdk.
|
|
||||||
$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE, \
|
|
||||||
JVM := $(JAVA), \
|
|
||||||
JAVAC := $(NEW_JAVAC), \
|
|
||||||
FLAGS := -cp $(BOOT_TOOLSJAR) -XDignore.symbol.file=true $(DISABLE_CORBA_WARNINGS), \
|
|
||||||
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
|
|
||||||
SERVER_JVM := $(SJAVAC_SERVER_JAVA)))
|
|
||||||
|
|
||||||
################################################################################
|
|
@ -29,16 +29,16 @@ default: all
|
|||||||
include $(SPEC)
|
include $(SPEC)
|
||||||
include MakeBase.gmk
|
include MakeBase.gmk
|
||||||
include JavaCompilation.gmk
|
include JavaCompilation.gmk
|
||||||
|
include SetupJavaCompilers.gmk
|
||||||
include CommonCorba.gmk
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
$(eval $(call SetupJavaCompilation,BUILD_INTERIM_CORBA, \
|
$(eval $(call SetupJavaCompilation,BUILD_INTERIM_CORBA, \
|
||||||
SETUP := GENERATE_OLDBYTECODE, \
|
SETUP := GENERATE_OLDBYTECODE, \
|
||||||
SRC := $(CORBA_TOPDIR)/src/java.corba/share/classes \
|
SRC := $(JDK_TOPDIR)/src/jdk.rmic/share/classes \
|
||||||
|
$(CORBA_TOPDIR)/src/java.corba/share/classes \
|
||||||
$(CORBA_TOPDIR)/src/jdk.rmic/share/classes \
|
$(CORBA_TOPDIR)/src/jdk.rmic/share/classes \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba, \
|
$(SUPPORT_OUTPUTDIR)/gensrc/java.corba, \
|
||||||
EXCLUDES := com/sun/corba/se/PortableActivationIDL, \
|
EXCLUDES := com/sun/corba/se/PortableActivationIDL, \
|
||||||
EXCLUDE_FILES := com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java \
|
EXCLUDE_FILES := com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java \
|
||||||
com/sun/corba/se/spi/presentation/rmi/StubWrapper.java \
|
com/sun/corba/se/spi/presentation/rmi/StubWrapper.java \
|
||||||
@ -47,16 +47,9 @@ $(eval $(call SetupJavaCompilation,BUILD_INTERIM_CORBA, \
|
|||||||
com/sun/corba/se/impl/presentation/rmi/jndi.properties, \
|
com/sun/corba/se/impl/presentation/rmi/jndi.properties, \
|
||||||
COPY := .prp, \
|
COPY := .prp, \
|
||||||
CLEAN := .properties, \
|
CLEAN := .properties, \
|
||||||
BIN := $(CORBA_OUTPUTDIR)/interim_classes, \
|
BIN := $(BUILDTOOLS_OUTPUTDIR)/corba_interim_classes, \
|
||||||
JAR := $(INTERIM_CORBA_JAR)))
|
JAR := $(INTERIM_CORBA_JAR)))
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Copy idl files straight to jdk/include.
|
|
||||||
$(JDK_OUTPUTDIR)/include/%: $(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/tools/corba/se/idl/%
|
|
||||||
$(install-file)
|
|
||||||
|
|
||||||
IDL_TARGET_FILES := $(JDK_OUTPUTDIR)/include/orb.idl $(JDK_OUTPUTDIR)/include/ir.idl
|
all: $(BUILD_INTERIM_CORBA)
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
all: $(BUILD_INTERIM_CORBA) $(IDL_TARGET_FILES)
|
|
@ -23,13 +23,12 @@
|
|||||||
# questions.
|
# questions.
|
||||||
#
|
#
|
||||||
|
|
||||||
# The BOOT_JAVAC setup uses the boot jdk compiler to compile the tools
|
################################################################################
|
||||||
# and the interim javac, to be run by the boot jdk.
|
# Copy idl files to jdk/lib.
|
||||||
$(eval $(call SetupJavaCompiler,BOOT_JAVAC, \
|
$(eval $(call SetupCopyFiles,COPY_IDL, \
|
||||||
JAVAC := $(JAVAC), \
|
SRC := $(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/tools/corba/se/idl, \
|
||||||
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
|
DEST := $(SUPPORT_OUTPUTDIR)/modules_include/$(MODULE), \
|
||||||
SERVER_JVM := $(SJAVAC_SERVER_JAVA), \
|
FILES := $(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/tools/corba/se/idl/orb.idl \
|
||||||
FLAGS := -XDignore.symbol.file=true -g -Xlint:all$(COMMA)-deprecation -Werror))
|
$(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/tools/corba/se/idl/ir.idl))
|
||||||
|
|
||||||
# javax.tools.JavaCompilerTool isn't really a suffix but this gets the file copied.
|
TARGETS := $(COPY_IDL)
|
||||||
RESOURCE_SUFFIXES := .gif .xml .css .js javax.tools.JavaCompilerTool
|
|
@ -29,35 +29,37 @@ include $(SPEC)
|
|||||||
include MakeBase.gmk
|
include MakeBase.gmk
|
||||||
include JavaCompilation.gmk
|
include JavaCompilation.gmk
|
||||||
include IdlCompilation.gmk
|
include IdlCompilation.gmk
|
||||||
|
include SetupJavaCompilers.gmk
|
||||||
include CommonCorba.gmk
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
$(eval $(call SetupJavaCompilation,BUILD_TOOLS_CORBA, \
|
$(eval $(call SetupJavaCompilation,BUILD_TOOLS_CORBA, \
|
||||||
SETUP := GENERATE_OLDBYTECODE, \
|
SETUP := GENERATE_OLDBYTECODE, \
|
||||||
SRC := $(CORBA_TOPDIR)/make/src/classes, \
|
SRC := $(CORBA_TOPDIR)/make/src/classes, \
|
||||||
BIN := $(CORBA_OUTPUTDIR)/tools_classes))
|
BIN := $(BUILDTOOLS_OUTPUTDIR)/corba_tools_classes))
|
||||||
|
|
||||||
TOOL_LOGUTIL_CMD := $(JAVA) -cp $(CORBA_OUTPUTDIR)/tools_classes \
|
TOOL_LOGUTIL_CMD := $(JAVA) -cp $(BUILDTOOLS_OUTPUTDIR)/corba_tools_classes \
|
||||||
build.tools.logutil.MC
|
build.tools.logutil.MC
|
||||||
|
|
||||||
$(eval $(call SetupJavaCompilation,BUILD_IDLJ, \
|
$(eval $(call SetupJavaCompilation,BUILD_IDLJ, \
|
||||||
SETUP := GENERATE_OLDBYTECODE, \
|
SETUP := GENERATE_OLDBYTECODE, \
|
||||||
SRC := $(CORBA_TOPDIR)/src/java.corba/share/classes, \
|
SRC := $(CORBA_TOPDIR)/src/java.corba/share/classes, \
|
||||||
BIN := $(CORBA_OUTPUTDIR)/idlj_classes, \
|
BIN := $(BUILDTOOLS_OUTPUTDIR)/idlj_classes, \
|
||||||
COPY := .prp, \
|
COPY := .prp, \
|
||||||
INCLUDES := com/sun/tools/corba/se/idl, \
|
INCLUDES := com/sun/tools/corba/se/idl, \
|
||||||
EXCLUDE_FILES := ResourceBundleUtil.java))
|
EXCLUDE_FILES := ResourceBundleUtil.java))
|
||||||
|
|
||||||
# Force the language to english for predictable source code generation.
|
# Force the language to english for predictable source code generation.
|
||||||
TOOL_IDLJ_CMD := $(JAVA) -cp $(CORBA_OUTPUTDIR)/idlj_classes \
|
TOOL_IDLJ_CMD := $(JAVA) -cp $(BUILDTOOLS_OUTPUTDIR)/idlj_classes \
|
||||||
-Duser.language=en com.sun.tools.corba.se.idl.toJavaPortable.Compile
|
-Duser.language=en com.sun.tools.corba.se.idl.toJavaPortable.Compile
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
EXCEPTION_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging
|
||||||
|
LOGWRAPPER_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/java.corba/_logwrappers
|
||||||
|
|
||||||
# Generate LogWrapper classes
|
# Generate LogWrapper classes
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/%SystemException.java: \
|
$(EXCEPTION_DIR)/%SystemException.java: \
|
||||||
$(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/corba/se/spi/logging/data/%.mc \
|
$(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/corba/se/spi/logging/data/%.mc \
|
||||||
$(BUILD_TOOLS_CORBA)
|
$(BUILD_TOOLS_CORBA)
|
||||||
$(MKDIR) -p $(@D)
|
$(MKDIR) -p $(@D)
|
||||||
@ -66,21 +68,21 @@ $(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/%SystemExcept
|
|||||||
$(TOOL_LOGUTIL_CMD) make-class $< $(@D)
|
$(TOOL_LOGUTIL_CMD) make-class $< $(@D)
|
||||||
|
|
||||||
# Generate LogWrapper properties file by concatening resource files
|
# Generate LogWrapper properties file by concatening resource files
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/LogStrings.properties: \
|
$(EXCEPTION_DIR)/LogStrings.properties: \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/ActivationSystemException.resource \
|
$(LOGWRAPPER_DIR)/ActivationSystemException.resource \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/IORSystemException.resource \
|
$(LOGWRAPPER_DIR)/IORSystemException.resource \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/InterceptorsSystemException.resource \
|
$(LOGWRAPPER_DIR)/InterceptorsSystemException.resource \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/NamingSystemException.resource \
|
$(LOGWRAPPER_DIR)/NamingSystemException.resource \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/OMGSystemException.resource \
|
$(LOGWRAPPER_DIR)/OMGSystemException.resource \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/ORBUtilSystemException.resource \
|
$(LOGWRAPPER_DIR)/ORBUtilSystemException.resource \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/POASystemException.resource \
|
$(LOGWRAPPER_DIR)/POASystemException.resource \
|
||||||
$(CORBA_OUTPUTDIR)/logwrappers/UtilSystemException.resource
|
$(LOGWRAPPER_DIR)/UtilSystemException.resource
|
||||||
$(MKDIR) -p $(@D)
|
$(MKDIR) -p $(@D)
|
||||||
$(ECHO) $(LOG_INFO) Concatenating 8 resource files into $(@F)
|
$(ECHO) $(LOG_INFO) 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: \
|
$(LOGWRAPPER_DIR)/%SystemException.resource: \
|
||||||
$(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/corba/se/spi/logging/data/%.mc \
|
$(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/corba/se/spi/logging/data/%.mc \
|
||||||
$(BUILD_TOOLS_CORBA)
|
$(BUILD_TOOLS_CORBA)
|
||||||
$(MKDIR) -p $(@D)
|
$(MKDIR) -p $(@D)
|
||||||
@ -90,15 +92,15 @@ $(CORBA_OUTPUTDIR)/logwrappers/%SystemException.resource: \
|
|||||||
|
|
||||||
|
|
||||||
LOGWRAPPER_TARGETS := \
|
LOGWRAPPER_TARGETS := \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/ActivationSystemException.java \
|
$(EXCEPTION_DIR)/ActivationSystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/IORSystemException.java \
|
$(EXCEPTION_DIR)/IORSystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/InterceptorsSystemException.java \
|
$(EXCEPTION_DIR)/InterceptorsSystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/NamingSystemException.java \
|
$(EXCEPTION_DIR)/NamingSystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/OMGSystemException.java \
|
$(EXCEPTION_DIR)/OMGSystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/ORBUtilSystemException.java \
|
$(EXCEPTION_DIR)/ORBUtilSystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/POASystemException.java \
|
$(EXCEPTION_DIR)/POASystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/UtilSystemException.java \
|
$(EXCEPTION_DIR)/UtilSystemException.java \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/logging/LogStrings.properties
|
$(EXCEPTION_DIR)/LogStrings.properties
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Build the IDLs.
|
# Build the IDLs.
|
||||||
@ -215,7 +217,7 @@ IDL_DELETES := \
|
|||||||
$(eval $(call SetupIdlCompilation,BUILD_IDLS, \
|
$(eval $(call SetupIdlCompilation,BUILD_IDLS, \
|
||||||
IDLJ := $(TOOL_IDLJ_CMD), \
|
IDLJ := $(TOOL_IDLJ_CMD), \
|
||||||
SRC := $(CORBA_TOPDIR)/src/java.corba/share/classes, \
|
SRC := $(CORBA_TOPDIR)/src/java.corba/share/classes, \
|
||||||
BIN := $(CORBA_OUTPUTDIR)/gensrc/java.corba, \
|
BIN := $(SUPPORT_OUTPUTDIR)/gensrc/java.corba, \
|
||||||
EXCLUDES := com/sun/tools/corba/se/idl/% \
|
EXCLUDES := com/sun/tools/corba/se/idl/% \
|
||||||
org/omg/CORBA/% \
|
org/omg/CORBA/% \
|
||||||
com/sun/corba/se/GiopIDL/% \
|
com/sun/corba/se/GiopIDL/% \
|
||||||
@ -230,12 +232,12 @@ $(BUILD_IDLS): $(BUILD_IDLJ)
|
|||||||
################################################################################
|
################################################################################
|
||||||
# zh_HK is just a copy of zh_TW
|
# zh_HK is just a copy of zh_TW
|
||||||
|
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_HK.properties: \
|
$(SUPPORT_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_HK.properties: \
|
||||||
$(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_TW.properties
|
$(CORBA_TOPDIR)/src/java.corba/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_TW.properties
|
||||||
$(install-file)
|
$(install-file)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
all: $(BUILD_IDLS) $(LOGWRAPPER_TARGETS) \
|
all: $(BUILD_IDLS) $(LOGWRAPPER_TARGETS) \
|
||||||
$(CORBA_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_HK.properties
|
$(SUPPORT_OUTPUTDIR)/gensrc/java.corba/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_HK.properties
|
||||||
|
|
@ -352,7 +352,7 @@ public abstract class Generator implements sun.rmi.rmic.Generator,
|
|||||||
env.output(Main.getText("rmic.generated", file.getPath(), Long.toString(duration)));
|
env.output(Main.getText("rmic.generated", file.getPath(), Long.toString(duration)));
|
||||||
}
|
}
|
||||||
if (sourceFile) {
|
if (sourceFile) {
|
||||||
env.parseFile(new ClassFile(file));
|
env.parseFile(ClassFile.newClassFile(file));
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
env.error(0, "cant.write", file.toString());
|
env.error(0, "cant.write", file.toString());
|
||||||
|
@ -443,3 +443,5 @@ b1c2dd843f247a1db19e1e85eb62ca405f72dc26 jdk9-b37
|
|||||||
c363a8b87e477ee45d6d3cb2a36cb365141bc596 jdk9-b38
|
c363a8b87e477ee45d6d3cb2a36cb365141bc596 jdk9-b38
|
||||||
9cb75e5e394827ccbaf2e15524108a412dc4ddc5 jdk9-b39
|
9cb75e5e394827ccbaf2e15524108a412dc4ddc5 jdk9-b39
|
||||||
6b09b3193d731e3288e2a240c504a20d0a06c766 jdk9-b40
|
6b09b3193d731e3288e2a240c504a20d0a06c766 jdk9-b40
|
||||||
|
1d29b13e8a515a7ea3b882f140576d5d675bc11f jdk9-b41
|
||||||
|
38cb4fbd47e3472bd1b5ebac83bda96fe4869c4f jdk9-b42
|
||||||
|
@ -36,12 +36,9 @@ import sun.jvm.hotspot.runtime.*;
|
|||||||
<li> Generation
|
<li> Generation
|
||||||
<ul>
|
<ul>
|
||||||
<li> CardGeneration
|
<li> CardGeneration
|
||||||
<ul>
|
|
||||||
<li> OneContigSpaceCardGeneration
|
|
||||||
<ul>
|
<ul>
|
||||||
<li> TenuredGeneration
|
<li> TenuredGeneration
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
|
||||||
<li> DefNewGeneration
|
<li> DefNewGeneration
|
||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -1,82 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package sun.jvm.hotspot.memory;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import sun.jvm.hotspot.debugger.*;
|
|
||||||
import sun.jvm.hotspot.runtime.*;
|
|
||||||
import sun.jvm.hotspot.types.*;
|
|
||||||
|
|
||||||
/** <P> OneSpaceOldGeneration models a heap of old objects contained
|
|
||||||
in a single contiguous space. </P>
|
|
||||||
|
|
||||||
<P> Garbage collection is performed using mark-compact. </P> */
|
|
||||||
|
|
||||||
public abstract class OneContigSpaceCardGeneration extends CardGeneration {
|
|
||||||
private static AddressField theSpaceField;
|
|
||||||
|
|
||||||
static {
|
|
||||||
VM.registerVMInitializedObserver(new Observer() {
|
|
||||||
public void update(Observable o, Object data) {
|
|
||||||
initialize(VM.getVM().getTypeDataBase());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static synchronized void initialize(TypeDataBase db) {
|
|
||||||
Type type = db.lookupType("OneContigSpaceCardGeneration");
|
|
||||||
|
|
||||||
theSpaceField = type.getAddressField("_the_space");
|
|
||||||
}
|
|
||||||
|
|
||||||
public OneContigSpaceCardGeneration(Address addr) {
|
|
||||||
super(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ContiguousSpace theSpace() {
|
|
||||||
return (ContiguousSpace) VMObjectFactory.newObject(ContiguousSpace.class, theSpaceField.getValue(addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isIn(Address p) {
|
|
||||||
return theSpace().contains(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Space queries */
|
|
||||||
public long capacity() { return theSpace().capacity(); }
|
|
||||||
public long used() { return theSpace().used(); }
|
|
||||||
public long free() { return theSpace().free(); }
|
|
||||||
public long contiguousAvailable() { return theSpace().free() + virtualSpace().uncommittedSize(); }
|
|
||||||
|
|
||||||
public void spaceIterate(SpaceClosure blk, boolean usedOnly) {
|
|
||||||
blk.doSpace(theSpace());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void printOn(PrintStream tty) {
|
|
||||||
tty.print(" old ");
|
|
||||||
theSpace().printOn(tty);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2014, 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
|
||||||
@ -24,13 +24,62 @@
|
|||||||
|
|
||||||
package sun.jvm.hotspot.memory;
|
package sun.jvm.hotspot.memory;
|
||||||
|
|
||||||
import sun.jvm.hotspot.debugger.*;
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
import sun.jvm.hotspot.types.*;
|
||||||
|
|
||||||
|
/** <P> TenuredGeneration models a heap of old objects contained
|
||||||
|
in a single contiguous space. </P>
|
||||||
|
|
||||||
|
<P> Garbage collection is performed using mark-compact. </P> */
|
||||||
|
|
||||||
|
public class TenuredGeneration extends CardGeneration {
|
||||||
|
private static AddressField theSpaceField;
|
||||||
|
|
||||||
|
static {
|
||||||
|
VM.registerVMInitializedObserver(new Observer() {
|
||||||
|
public void update(Observable o, Object data) {
|
||||||
|
initialize(VM.getVM().getTypeDataBase());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static synchronized void initialize(TypeDataBase db) {
|
||||||
|
Type type = db.lookupType("TenuredGeneration");
|
||||||
|
|
||||||
|
theSpaceField = type.getAddressField("_the_space");
|
||||||
|
}
|
||||||
|
|
||||||
public class TenuredGeneration extends OneContigSpaceCardGeneration {
|
|
||||||
public TenuredGeneration(Address addr) {
|
public TenuredGeneration(Address addr) {
|
||||||
super(addr);
|
super(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ContiguousSpace theSpace() {
|
||||||
|
return (ContiguousSpace) VMObjectFactory.newObject(ContiguousSpace.class, theSpaceField.getValue(addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIn(Address p) {
|
||||||
|
return theSpace().contains(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Space queries */
|
||||||
|
public long capacity() { return theSpace().capacity(); }
|
||||||
|
public long used() { return theSpace().used(); }
|
||||||
|
public long free() { return theSpace().free(); }
|
||||||
|
public long contiguousAvailable() { return theSpace().free() + virtualSpace().uncommittedSize(); }
|
||||||
|
|
||||||
|
public void spaceIterate(SpaceClosure blk, boolean usedOnly) {
|
||||||
|
blk.doSpace(theSpace());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printOn(PrintStream tty) {
|
||||||
|
tty.print(" old ");
|
||||||
|
theSpace().printOn(tty);
|
||||||
|
}
|
||||||
|
|
||||||
public Generation.Name kind() {
|
public Generation.Name kind() {
|
||||||
return Generation.Name.MARK_SWEEP_COMPACT;
|
return Generation.Name.MARK_SWEEP_COMPACT;
|
||||||
}
|
}
|
||||||
|
@ -219,7 +219,7 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
|
|||||||
if (threadNameField == null) {
|
if (threadNameField == null) {
|
||||||
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
|
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
|
||||||
InstanceKlass k = sysDict.getThreadKlass();
|
InstanceKlass k = sysDict.getThreadKlass();
|
||||||
threadNameField = (OopField) k.findField("name", "[C");
|
threadNameField = (OopField) k.findField("name", "Ljava/lang/String;");
|
||||||
threadGroupField = (OopField) k.findField("group", "Ljava/lang/ThreadGroup;");
|
threadGroupField = (OopField) k.findField("group", "Ljava/lang/ThreadGroup;");
|
||||||
threadEETopField = (LongField) k.findField("eetop", "J");
|
threadEETopField = (LongField) k.findField("eetop", "J");
|
||||||
threadTIDField = (LongField) k.findField("tid", "J");
|
threadTIDField = (LongField) k.findField("tid", "J");
|
||||||
@ -258,7 +258,7 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
|
|||||||
|
|
||||||
public static String threadOopGetName(Oop threadOop) {
|
public static String threadOopGetName(Oop threadOop) {
|
||||||
initThreadFields();
|
initThreadFields();
|
||||||
return charArrayToString((TypeArray) threadNameField.getValue(threadOop));
|
return stringOopToString(threadNameField.getValue(threadOop));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** May return null if, e.g., thread was not started */
|
/** May return null if, e.g., thread was not started */
|
||||||
|
@ -40,6 +40,8 @@ AGENT_DIR = $(GAMMADIR)/agent
|
|||||||
|
|
||||||
include $(GAMMADIR)/make/sa.files
|
include $(GAMMADIR)/make/sa.files
|
||||||
|
|
||||||
|
-include $(HS_ALT_MAKE)/bsd/makefiles/sa.make
|
||||||
|
|
||||||
TOPDIR = $(shell echo `pwd`)
|
TOPDIR = $(shell echo `pwd`)
|
||||||
GENERATED = $(TOPDIR)/../generated
|
GENERATED = $(TOPDIR)/../generated
|
||||||
|
|
||||||
@ -63,6 +65,10 @@ else
|
|||||||
SA_CLASSPATH=$(shell test -f $(ALT_SA_CLASSPATH) && echo $(ALT_SA_CLASSPATH))
|
SA_CLASSPATH=$(shell test -f $(ALT_SA_CLASSPATH) && echo $(ALT_SA_CLASSPATH))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(SA_CLASSPATH),)
|
||||||
|
SA_CLASSPATH_ARG := -classpath $(SA_CLASSPATH)
|
||||||
|
endif
|
||||||
|
|
||||||
# TODO: if it's a modules image, check if SA module is installed.
|
# TODO: if it's a modules image, check if SA module is installed.
|
||||||
MODULELIB_PATH= $(BOOT_JAVA_HOME)/lib/modules
|
MODULELIB_PATH= $(BOOT_JAVA_HOME)/lib/modules
|
||||||
|
|
||||||
@ -114,7 +120,7 @@ $(GENERATED)/sa-jdi.jar: $(AGENT_FILES)
|
|||||||
# are in AGENT_FILES, so use the shell to expand them.
|
# are in AGENT_FILES, so use the shell to expand them.
|
||||||
# Be extra carefull to not produce too long command lines in the shell!
|
# Be extra carefull to not produce too long command lines in the shell!
|
||||||
$(foreach file,$(AGENT_FILES),$(shell ls -1 $(file) >> $(AGENT_FILES_LIST)))
|
$(foreach file,$(AGENT_FILES),$(shell ls -1 $(file) >> $(AGENT_FILES_LIST)))
|
||||||
$(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) @$(AGENT_FILES_LIST)
|
$(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) $(SA_CLASSPATH_ARG) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) @$(AGENT_FILES_LIST)
|
||||||
$(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer
|
$(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer
|
||||||
$(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES)
|
$(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES)
|
||||||
$(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js
|
$(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js
|
||||||
|
@ -215,7 +215,7 @@ ifeq ($(USE_CLANG), true)
|
|||||||
WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
|
WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
|
||||||
endif
|
endif
|
||||||
|
|
||||||
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef -Wunused-function -Wunused-value -Wformat=2
|
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef -Wunused-function -Wunused-value -Wformat=2 -Wreturn-type
|
||||||
|
|
||||||
ifeq ($(USE_CLANG),)
|
ifeq ($(USE_CLANG),)
|
||||||
# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
|
# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
#
|
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License version 2 only, as
|
|
||||||
# published by the Free Software Foundation.
|
|
||||||
#
|
|
||||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
# version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
# accompanied this code).
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License version
|
|
||||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
# or visit www.oracle.com if you need additional information or have any
|
|
||||||
# questions.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
# Rules to build add_gnu_debuglink, used by vm.make on Solaris
|
|
||||||
|
|
||||||
# Allow $(ADD_GNU_DEBUGLINK) to be called from any directory.
|
|
||||||
# We don't set or use the GENERATED macro to avoid affecting
|
|
||||||
# other HotSpot Makefiles.
|
|
||||||
TOPDIR = $(shell echo `pwd`)
|
|
||||||
ADD_GNU_DEBUGLINK = $(TOPDIR)/../generated/add_gnu_debuglink
|
|
||||||
|
|
||||||
ADD_GNU_DEBUGLINK_DIR = $(GAMMADIR)/src/os/solaris/add_gnu_debuglink
|
|
||||||
ADD_GNU_DEBUGLINK_SRC = $(ADD_GNU_DEBUGLINK_DIR)/add_gnu_debuglink.c
|
|
||||||
ADD_GNU_DEBUGLINK_FLAGS =
|
|
||||||
LIBS_ADD_GNU_DEBUGLINK += -lelf
|
|
||||||
|
|
||||||
ifeq ("${Platform_compiler}", "sparcWorks")
|
|
||||||
# Enable the following ADD_GNU_DEBUGLINK_FLAGS addition if you need to
|
|
||||||
# compare the built ELF objects.
|
|
||||||
#
|
|
||||||
# The -g option makes static data global and the "-W0,-noglobal"
|
|
||||||
# option tells the compiler to not globalize static data using a unique
|
|
||||||
# globalization prefix. Instead force the use of a static globalization
|
|
||||||
# prefix based on the source filepath so the objects from two identical
|
|
||||||
# compilations are the same.
|
|
||||||
#
|
|
||||||
# Note: The blog says to use "-W0,-xglobalstatic", but that doesn't
|
|
||||||
# seem to work. I got "-W0,-noglobal" from Kelly and that works.
|
|
||||||
#ADD_GNU_DEBUGLINK_FLAGS += -W0,-noglobal
|
|
||||||
endif # Platform_compiler == sparcWorks
|
|
||||||
|
|
||||||
$(ADD_GNU_DEBUGLINK): $(ADD_GNU_DEBUGLINK_SRC)
|
|
||||||
$(CC) -g -o $@ $< $(ADD_GNU_DEBUGLINK_FLAGS) $(LIBS_ADD_GNU_DEBUGLINK)
|
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# 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
|
||||||
@ -138,6 +138,55 @@ ifeq ($(JDK6_OR_EARLIER),0)
|
|||||||
OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY))
|
OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(OBJCOPY),)
|
||||||
|
# OBJCOPY version check:
|
||||||
|
# - version number is last blank separate word on first line
|
||||||
|
# - version number formats that have been seen:
|
||||||
|
# - <major>.<minor>
|
||||||
|
# - <major>.<minor>.<micro>
|
||||||
|
#
|
||||||
|
# Full Debug Symbols on Solaris needs version 2.21.1 or newer.
|
||||||
|
#
|
||||||
|
OBJCOPY_VERS_CHK := $(shell \
|
||||||
|
$(OBJCOPY) --version \
|
||||||
|
| sed -n \
|
||||||
|
-e 's/.* //' \
|
||||||
|
-e '/^[01]\./b bad' \
|
||||||
|
-e '/^2\./{' \
|
||||||
|
-e ' s/^2\.//' \
|
||||||
|
-e ' /^[0-9]$$/b bad' \
|
||||||
|
-e ' /^[0-9]\./b bad' \
|
||||||
|
-e ' /^1[0-9]$$/b bad' \
|
||||||
|
-e ' /^1[0-9]\./b bad' \
|
||||||
|
-e ' /^20\./b bad' \
|
||||||
|
-e ' /^21\.0$$/b bad' \
|
||||||
|
-e ' /^21\.0\./b bad' \
|
||||||
|
-e '}' \
|
||||||
|
-e ':good' \
|
||||||
|
-e 's/.*/VALID_VERSION/p' \
|
||||||
|
-e 'q' \
|
||||||
|
-e ':bad' \
|
||||||
|
-e 's/.*/BAD_VERSION/p' \
|
||||||
|
-e 'q' \
|
||||||
|
)
|
||||||
|
ifeq ($(OBJCOPY_VERS_CHK),BAD_VERSION)
|
||||||
|
_JUNK_ := $(shell \
|
||||||
|
echo >&2 "WARNING: $(OBJCOPY) --version info:"; \
|
||||||
|
$(OBJCOPY) --version | sed -n -e 's/^/WARNING: /p' -e 'q' >&2; \
|
||||||
|
echo >&2 "WARNING: an objcopy version of 2.21.1 or newer" \
|
||||||
|
"is needed to create valid .debuginfo files."; \
|
||||||
|
echo >&2 "WARNING: ignoring above objcopy command."; \
|
||||||
|
echo >&2 "WARNING: patch 149063-01 or newer contains the" \
|
||||||
|
"correct Solaris 10 SPARC version."; \
|
||||||
|
echo >&2 "WARNING: patch 149064-01 or newer contains the" \
|
||||||
|
"correct Solaris 10 X86 version."; \
|
||||||
|
echo >&2 "WARNING: Solaris 11 Update 1 contains the" \
|
||||||
|
"correct version."; \
|
||||||
|
)
|
||||||
|
OBJCOPY=
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(OBJCOPY),)
|
ifeq ($(OBJCOPY),)
|
||||||
$(eval $(call print_info, "no objcopy cmd found so cannot create .debuginfo files."))
|
$(eval $(call print_info, "no objcopy cmd found so cannot create .debuginfo files."))
|
||||||
ENABLE_FULL_DEBUG_SYMBOLS=0
|
ENABLE_FULL_DEBUG_SYMBOLS=0
|
||||||
|
@ -101,25 +101,16 @@ XLIBJVM_DB_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DB_DIZ)
|
|||||||
XLIBJVM_DTRACE_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DEBUGINFO)
|
XLIBJVM_DTRACE_DEBUGINFO = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DEBUGINFO)
|
||||||
XLIBJVM_DTRACE_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DIZ)
|
XLIBJVM_DTRACE_DIZ = $(XLIBJVM_DIR)/$(LIBJVM_DTRACE_DIZ)
|
||||||
|
|
||||||
$(XLIBJVM_DB): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE)
|
$(XLIBJVM_DB): $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS).h $(LIBJVM_DB_MAPFILE)
|
||||||
@echo $(LOG_INFO) Making $@
|
@echo $(LOG_INFO) Making $@
|
||||||
$(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
|
$(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
|
||||||
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. -I$(GENERATED) \
|
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. -I$(GENERATED) \
|
||||||
$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
|
$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
|
|
||||||
# Clear the SHF_ALLOC flag (if set) from empty section headers.
|
|
||||||
# An empty section header has sh_addr == 0 and sh_size == 0.
|
|
||||||
# This problem has only been seen on Solaris X64, but we call this tool
|
|
||||||
# on all Solaris builds just in case.
|
|
||||||
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
|
|
||||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DB_DEBUGINFO)
|
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DB_DEBUGINFO)
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
|
|
||||||
# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
|
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) ;
|
|
||||||
# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
|
# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
|
||||||
# in the link name:
|
# in the link name:
|
||||||
( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) )
|
( cd $(XLIBJVM_DIR) && $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $(LIBJVM_DB) )
|
||||||
ifeq ($(STRIP_POLICY),all_strip)
|
ifeq ($(STRIP_POLICY),all_strip)
|
||||||
$(QUIETLY) $(STRIP) $@
|
$(QUIETLY) $(STRIP) $@
|
||||||
else
|
else
|
||||||
@ -136,20 +127,16 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(XLIBJVM_DTRACE): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
|
$(XLIBJVM_DTRACE): $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
|
||||||
@echo $(LOG_INFO) Making $@
|
@echo $(LOG_INFO) Making $@
|
||||||
$(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
|
$(QUIETLY) mkdir -p $(XLIBJVM_DIR) ; \
|
||||||
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. \
|
$(CC) $(SYMFLAG) $(ARCHFLAG/$(ISA)) -D$(TYPE) -I. \
|
||||||
$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
|
$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
# Clear the SHF_ALLOC flag (if set) from empty section headers.
|
|
||||||
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
|
|
||||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DTRACE_DEBUGINFO)
|
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(XLIBJVM_DTRACE_DEBUGINFO)
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
|
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) ;
|
|
||||||
# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
|
# Do this part in the $(XLIBJVM_DIR) subdir so $(XLIBJVM_DIR) is not
|
||||||
# in the link name:
|
# in the link name:
|
||||||
( cd $(XLIBJVM_DIR) && $(ADD_GNU_DEBUGLINK) $(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) )
|
( cd $(XLIBJVM_DIR) && $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $(LIBJVM_DTRACE) )
|
||||||
ifeq ($(STRIP_POLICY),all_strip)
|
ifeq ($(STRIP_POLICY),all_strip)
|
||||||
$(QUIETLY) $(STRIP) $@
|
$(QUIETLY) $(STRIP) $@
|
||||||
else
|
else
|
||||||
@ -206,17 +193,13 @@ $(JVMOFFS).cpp: $(GENOFFS) $(JVMOFFS).h $(JVMOFFS)Index.h
|
|||||||
$(JVMOFFS.o): $(JVMOFFS).h $(JVMOFFS).cpp
|
$(JVMOFFS.o): $(JVMOFFS).h $(JVMOFFS).cpp
|
||||||
$(QUIETLY) $(CXX) -c -I. -o $@ $(ARCHFLAG) -D$(TYPE) $(JVMOFFS).cpp
|
$(QUIETLY) $(CXX) -c -I. -o $@ $(ARCHFLAG) -D$(TYPE) $(JVMOFFS).cpp
|
||||||
|
|
||||||
$(LIBJVM_DB): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS.o) $(XLIBJVM_DB) $(LIBJVM_DB_MAPFILE)
|
$(LIBJVM_DB): $(DTRACE_SRCDIR)/$(JVM_DB).c $(JVMOFFS.o) $(XLIBJVM_DB) $(LIBJVM_DB_MAPFILE)
|
||||||
@echo $(LOG_INFO) Making $@
|
@echo $(LOG_INFO) Making $@
|
||||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. -I$(GENERATED) \
|
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. -I$(GENERATED) \
|
||||||
$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
|
$(SHARED_FLAG) $(LFLAGS_JVM_DB) -o $@ $(DTRACE_SRCDIR)/$(JVM_DB).c -lc
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
# Clear the SHF_ALLOC flag (if set) from empty section headers.
|
|
||||||
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
|
|
||||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DB_DEBUGINFO)
|
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DB_DEBUGINFO)
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
|
$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $@
|
||||||
# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DB_DEBUGINFO) $@
|
|
||||||
$(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJVM_DB_DEBUGINFO) $@
|
|
||||||
ifeq ($(STRIP_POLICY),all_strip)
|
ifeq ($(STRIP_POLICY),all_strip)
|
||||||
$(QUIETLY) $(STRIP) $@
|
$(QUIETLY) $(STRIP) $@
|
||||||
else
|
else
|
||||||
@ -231,17 +214,13 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(LIBJVM_DTRACE): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(XLIBJVM_DTRACE) $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
|
$(LIBJVM_DTRACE): $(DTRACE_SRCDIR)/$(JVM_DTRACE).c $(XLIBJVM_DTRACE) $(DTRACE_SRCDIR)/$(JVM_DTRACE).h $(LIBJVM_DTRACE_MAPFILE)
|
||||||
@echo $(LOG_INFO) Making $@
|
@echo $(LOG_INFO) Making $@
|
||||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. \
|
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) -D$(TYPE) -I. \
|
||||||
$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
|
$(SHARED_FLAG) $(LFLAGS_JVM_DTRACE) -o $@ $(DTRACE_SRCDIR)/$(JVM_DTRACE).c -lc -lthread -ldoor
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
# Clear the SHF_ALLOC flag (if set) from empty section headers.
|
|
||||||
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
|
|
||||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DTRACE_DEBUGINFO)
|
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DTRACE_DEBUGINFO)
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
|
$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $@
|
||||||
# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DTRACE_DEBUGINFO) $@
|
|
||||||
$(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJVM_DTRACE_DEBUGINFO) $@
|
|
||||||
ifeq ($(STRIP_POLICY),all_strip)
|
ifeq ($(STRIP_POLICY),all_strip)
|
||||||
$(QUIETLY) $(STRIP) $@
|
$(QUIETLY) $(STRIP) $@
|
||||||
else
|
else
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
#
|
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License version 2 only, as
|
|
||||||
# published by the Free Software Foundation.
|
|
||||||
#
|
|
||||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
# version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
# accompanied this code).
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License version
|
|
||||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
# or visit www.oracle.com if you need additional information or have any
|
|
||||||
# questions.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
# Rules to build fix_empty_sec_hdr_flags, used by vm.make on Solaris
|
|
||||||
|
|
||||||
# Allow $(FIX_EMPTY_SEC_HDR_FLAGS) to be called from any directory.
|
|
||||||
# We don't set or use the GENERATED macro to avoid affecting
|
|
||||||
# other HotSpot Makefiles.
|
|
||||||
TOPDIR = $(shell echo `pwd`)
|
|
||||||
FIX_EMPTY_SEC_HDR_FLAGS = $(TOPDIR)/../generated/fix_empty_sec_hdr_flags
|
|
||||||
|
|
||||||
FIX_EMPTY_SEC_HDR_FLAGS_DIR = $(GAMMADIR)/src/os/solaris/fix_empty_sec_hdr_flags
|
|
||||||
FIX_EMPTY_SEC_HDR_FLAGS_SRC = $(FIX_EMPTY_SEC_HDR_FLAGS_DIR)/fix_empty_sec_hdr_flags.c
|
|
||||||
FIX_EMPTY_SEC_HDR_FLAGS_FLAGS =
|
|
||||||
LIBS_FIX_EMPTY_SEC_HDR_FLAGS += -lelf
|
|
||||||
|
|
||||||
ifeq ("${Platform_compiler}", "sparcWorks")
|
|
||||||
# Enable the following FIX_EMPTY_SEC_HDR_FLAGS_FLAGS addition if you need to
|
|
||||||
# compare the built ELF objects.
|
|
||||||
#
|
|
||||||
# The -g option makes static data global and the "-W0,-noglobal"
|
|
||||||
# option tells the compiler to not globalize static data using a unique
|
|
||||||
# globalization prefix. Instead force the use of a static globalization
|
|
||||||
# prefix based on the source filepath so the objects from two identical
|
|
||||||
# compilations are the same.
|
|
||||||
#
|
|
||||||
# Note: The blog says to use "-W0,-xglobalstatic", but that doesn't
|
|
||||||
# seem to work. I got "-W0,-noglobal" from Kelly and that works.
|
|
||||||
#FIX_EMPTY_SEC_HDR_FLAGS_FLAGS += -W0,-noglobal
|
|
||||||
endif # Platform_compiler == sparcWorks
|
|
||||||
|
|
||||||
$(FIX_EMPTY_SEC_HDR_FLAGS): $(FIX_EMPTY_SEC_HDR_FLAGS_SRC)
|
|
||||||
$(CC) -g -o $@ $< $(FIX_EMPTY_SEC_HDR_FLAGS_FLAGS) $(LIBS_FIX_EMPTY_SEC_HDR_FLAGS)
|
|
@ -226,18 +226,8 @@ SHARED_FLAG = -shared
|
|||||||
# Allow no optimizations.
|
# Allow no optimizations.
|
||||||
DEBUG_CFLAGS=-O0
|
DEBUG_CFLAGS=-O0
|
||||||
|
|
||||||
# Use the stabs format for debugging information (this is the default
|
# Enable debug symbols
|
||||||
# on gcc-2.91). It's good enough, has all the information about line
|
DEBUG_CFLAGS += -g
|
||||||
# numbers and local variables, and libjvm.so is only about 16M.
|
|
||||||
# Change this back to "-g" if you want the most expressive format.
|
|
||||||
# (warning: that could easily inflate libjvm.so to 150M!)
|
|
||||||
# Note: The Itanium gcc compiler crashes when using -gstabs.
|
|
||||||
DEBUG_CFLAGS/ia64 = -g
|
|
||||||
DEBUG_CFLAGS/amd64 = -g
|
|
||||||
DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
|
|
||||||
ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
|
|
||||||
DEBUG_CFLAGS += -gstabs
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Enable bounds checking.
|
# Enable bounds checking.
|
||||||
ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
|
ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) )" "1"
|
||||||
|
@ -47,22 +47,13 @@ else
|
|||||||
LFLAGS_JSIG += -mt -xnolib
|
LFLAGS_JSIG += -mt -xnolib
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(LIBJSIG): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
|
$(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
|
||||||
@echo $(LOG_INFO) Making signal interposition lib...
|
@echo $(LOG_INFO) Making signal interposition lib...
|
||||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
|
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
|
||||||
$(LFLAGS_JSIG) -o $@ $(JSIGSRCDIR)/jsig.c -ldl
|
$(LFLAGS_JSIG) -o $@ $(JSIGSRCDIR)/jsig.c -ldl
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
|
|
||||||
# Clear the SHF_ALLOC flag (if set) from empty section headers.
|
|
||||||
# An empty section header has sh_addr == 0 and sh_size == 0.
|
|
||||||
# This problem has only been seen on Solaris X64, but we call this tool
|
|
||||||
# on all Solaris builds just in case.
|
|
||||||
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
|
|
||||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJSIG_DEBUGINFO)
|
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJSIG_DEBUGINFO)
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
|
$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJSIG_DEBUGINFO) $@
|
||||||
# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
|
|
||||||
# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJSIG_DEBUGINFO) $@
|
|
||||||
$(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJSIG_DEBUGINFO) $@
|
|
||||||
ifeq ($(STRIP_POLICY),all_strip)
|
ifeq ($(STRIP_POLICY),all_strip)
|
||||||
$(QUIETLY) $(STRIP) $@
|
$(QUIETLY) $(STRIP) $@
|
||||||
else
|
else
|
||||||
|
@ -90,7 +90,7 @@ $(shell uname -r -v \
|
|||||||
#SOLARIS_11_B159_OR_LATER=-DSOLARIS_11_B159_OR_LATER
|
#SOLARIS_11_B159_OR_LATER=-DSOLARIS_11_B159_OR_LATER
|
||||||
|
|
||||||
|
|
||||||
$(LIBSAPROC): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(SASRCFILES) $(SADISOBJ) $(SAMAPFILE)
|
$(LIBSAPROC): $(SASRCFILES) $(SADISOBJ) $(SAMAPFILE)
|
||||||
$(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \
|
$(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \
|
||||||
echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \
|
echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
@ -121,17 +121,8 @@ $(SADISOBJ): $(SADISSRCFILES)
|
|||||||
-c -o $(SADISOBJ)
|
-c -o $(SADISOBJ)
|
||||||
|
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
|
|
||||||
# Clear the SHF_ALLOC flag (if set) from empty section headers.
|
|
||||||
# An empty section header has sh_addr == 0 and sh_size == 0.
|
|
||||||
# This problem has only been seen on Solaris X64, but we call this tool
|
|
||||||
# on all Solaris builds just in case.
|
|
||||||
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
|
|
||||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBSAPROC_DEBUGINFO)
|
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBSAPROC_DEBUGINFO)
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
|
$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBSAPROC_DEBUGINFO) $@
|
||||||
# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
|
|
||||||
# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBSAPROC_DEBUGINFO) $@
|
|
||||||
$(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBSAPROC_DEBUGINFO) $@
|
|
||||||
ifeq ($(STRIP_POLICY),all_strip)
|
ifeq ($(STRIP_POLICY),all_strip)
|
||||||
$(QUIETLY) $(STRIP) $@
|
$(QUIETLY) $(STRIP) $@
|
||||||
else
|
else
|
||||||
|
@ -496,15 +496,6 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
|||||||
FASTDEBUG_CFLAGS += -xs
|
FASTDEBUG_CFLAGS += -xs
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Special global options for SS12
|
|
||||||
ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1)
|
|
||||||
# There appears to be multiple issues with the new Dwarf2 debug format, so
|
|
||||||
# we tell the compiler to use the older 'stabs' debug format all the time.
|
|
||||||
# Note that this needs to be used in optimized compiles too to be 100%.
|
|
||||||
# This is a workaround for SS12 (5.9) bug 6694600
|
|
||||||
CFLAGS += -xdebugformat=stabs
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Enable the following CFLAGS additions if you need to compare the
|
# Enable the following CFLAGS additions if you need to compare the
|
||||||
# built ELF objects.
|
# built ELF objects.
|
||||||
#
|
#
|
||||||
|
@ -154,14 +154,6 @@ JDK_LIBDIR = $(JAVA_HOME)/jre/lib/$(LIBARCH)
|
|||||||
# jvm_db & dtrace
|
# jvm_db & dtrace
|
||||||
include $(MAKEFILES_DIR)/dtrace.make
|
include $(MAKEFILES_DIR)/dtrace.make
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
# add_gnu_debuglink tool
|
|
||||||
include $(MAKEFILES_DIR)/add_gnu_debuglink.make
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
# fix_empty_sec_hdr_flags tool
|
|
||||||
include $(MAKEFILES_DIR)/fix_empty_sec_hdr_flags.make
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
# JVM
|
# JVM
|
||||||
|
|
||||||
@ -302,7 +294,7 @@ else
|
|||||||
LINK_VM = $(LINK_LIB.CXX)
|
LINK_VM = $(LINK_LIB.CXX)
|
||||||
endif
|
endif
|
||||||
# making the library:
|
# making the library:
|
||||||
$(LIBJVM): $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) $(LIBJVM.o) $(LIBJVM_MAPFILE)
|
$(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE)
|
||||||
ifeq ($(filter -sbfast -xsbfast, $(CFLAGS_BROWSE)),)
|
ifeq ($(filter -sbfast -xsbfast, $(CFLAGS_BROWSE)),)
|
||||||
@echo $(LOG_INFO) Linking vm...
|
@echo $(LOG_INFO) Linking vm...
|
||||||
$(QUIETLY) $(LINK_LIB.CXX/PRE_HOOK)
|
$(QUIETLY) $(LINK_LIB.CXX/PRE_HOOK)
|
||||||
@ -310,17 +302,8 @@ ifeq ($(filter -sbfast -xsbfast, $(CFLAGS_BROWSE)),)
|
|||||||
$(QUIETLY) $(LINK_LIB.CXX/POST_HOOK)
|
$(QUIETLY) $(LINK_LIB.CXX/POST_HOOK)
|
||||||
$(QUIETLY) rm -f $@.1 && ln -s $@ $@.1
|
$(QUIETLY) rm -f $@.1 && ln -s $@ $@.1
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
# gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
|
|
||||||
# Clear the SHF_ALLOC flag (if set) from empty section headers.
|
|
||||||
# An empty section header has sh_addr == 0 and sh_size == 0.
|
|
||||||
# This problem has only been seen on Solaris X64, but we call this tool
|
|
||||||
# on all Solaris builds just in case.
|
|
||||||
$(QUIETLY) $(FIX_EMPTY_SEC_HDR_FLAGS) $@
|
|
||||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DEBUGINFO)
|
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DEBUGINFO)
|
||||||
# $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
|
$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DEBUGINFO) $@
|
||||||
# Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
|
|
||||||
# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DEBUGINFO) $@
|
|
||||||
$(QUIETLY) $(ADD_GNU_DEBUGLINK) $(LIBJVM_DEBUGINFO) $@
|
|
||||||
ifeq ($(STRIP_POLICY),all_strip)
|
ifeq ($(STRIP_POLICY),all_strip)
|
||||||
$(QUIETLY) $(STRIP) $@
|
$(QUIETLY) $(STRIP) $@
|
||||||
else
|
else
|
||||||
|
@ -89,8 +89,10 @@ AGCT_EXPORT=/export:AsyncGetCallTrace
|
|||||||
|
|
||||||
# If you modify exports below please do the corresponding changes in
|
# If you modify exports below please do the corresponding changes in
|
||||||
# src/share/tools/ProjectCreator/WinGammaPlatformVC7.java
|
# src/share/tools/ProjectCreator/WinGammaPlatformVC7.java
|
||||||
LD_FLAGS=$(LD_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \
|
!if "$(BUILDARCH)" == "amd64"
|
||||||
/export:JNI_GetDefaultJavaVMInitArgs \
|
EXPORT_LIST=
|
||||||
|
!else
|
||||||
|
EXPORT_LIST=/export:JNI_GetDefaultJavaVMInitArgs \
|
||||||
/export:JNI_CreateJavaVM \
|
/export:JNI_CreateJavaVM \
|
||||||
/export:JVM_FindClassFromBootLoader \
|
/export:JVM_FindClassFromBootLoader \
|
||||||
/export:JNI_GetCreatedJavaVMs \
|
/export:JNI_GetCreatedJavaVMs \
|
||||||
@ -102,6 +104,9 @@ LD_FLAGS=$(LD_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \
|
|||||||
$(AGCT_EXPORT) \
|
$(AGCT_EXPORT) \
|
||||||
/export:JVM_GetVersionInfo \
|
/export:JVM_GetVersionInfo \
|
||||||
/export:JVM_InitAgentProperties
|
/export:JVM_InitAgentProperties
|
||||||
|
!endif
|
||||||
|
|
||||||
|
LD_FLAGS=$(LD_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 $(EXPORT_LIST)
|
||||||
|
|
||||||
CXX_INCLUDE_DIRS=/I "..\generated"
|
CXX_INCLUDE_DIRS=/I "..\generated"
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#define CPU_PPC_VM_MACROASSEMBLER_PPC_HPP
|
#define CPU_PPC_VM_MACROASSEMBLER_PPC_HPP
|
||||||
|
|
||||||
#include "asm/assembler.hpp"
|
#include "asm/assembler.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
|
|
||||||
// MacroAssembler extends Assembler by a few frequently used macros.
|
// MacroAssembler extends Assembler by a few frequently used macros.
|
||||||
|
|
||||||
|
@ -4813,6 +4813,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubRoutines::_atomic_add_entry = generate_atomic_add();
|
StubRoutines::_atomic_add_entry = generate_atomic_add();
|
||||||
StubRoutines::_atomic_xchg_ptr_entry = StubRoutines::_atomic_xchg_entry;
|
StubRoutines::_atomic_xchg_ptr_entry = StubRoutines::_atomic_xchg_entry;
|
||||||
StubRoutines::_atomic_cmpxchg_ptr_entry = StubRoutines::_atomic_cmpxchg_entry;
|
StubRoutines::_atomic_cmpxchg_ptr_entry = StubRoutines::_atomic_cmpxchg_entry;
|
||||||
|
StubRoutines::_atomic_cmpxchg_byte_entry = ShouldNotCallThisStub();
|
||||||
StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
|
StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
|
||||||
StubRoutines::_atomic_add_ptr_entry = StubRoutines::_atomic_add_entry;
|
StubRoutines::_atomic_add_ptr_entry = StubRoutines::_atomic_add_entry;
|
||||||
#endif // COMPILER2 !=> _LP64
|
#endif // COMPILER2 !=> _LP64
|
||||||
|
@ -1297,6 +1297,17 @@ void Assembler::cmpxchgl(Register reg, Address adr) { // cmpxchg
|
|||||||
emit_operand(reg, adr);
|
emit_operand(reg, adr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The 8-bit cmpxchg compares the value at adr with the contents of rax,
|
||||||
|
// and stores reg into adr if so; otherwise, the value at adr is loaded into rax,.
|
||||||
|
// The ZF is set if the compared values were equal, and cleared otherwise.
|
||||||
|
void Assembler::cmpxchgb(Register reg, Address adr) { // cmpxchg
|
||||||
|
InstructionMark im(this);
|
||||||
|
prefix(adr, reg, true);
|
||||||
|
emit_int8(0x0F);
|
||||||
|
emit_int8((unsigned char)0xB0);
|
||||||
|
emit_operand(reg, adr);
|
||||||
|
}
|
||||||
|
|
||||||
void Assembler::comisd(XMMRegister dst, Address src) {
|
void Assembler::comisd(XMMRegister dst, Address src) {
|
||||||
// NOTE: dbx seems to decode this as comiss even though the
|
// NOTE: dbx seems to decode this as comiss even though the
|
||||||
// 0x66 is there. Strangly ucomisd comes out correct
|
// 0x66 is there. Strangly ucomisd comes out correct
|
||||||
|
@ -1006,6 +1006,7 @@ private:
|
|||||||
|
|
||||||
void cmpxchg8 (Address adr);
|
void cmpxchg8 (Address adr);
|
||||||
|
|
||||||
|
void cmpxchgb(Register reg, Address adr);
|
||||||
void cmpxchgl(Register reg, Address adr);
|
void cmpxchgl(Register reg, Address adr);
|
||||||
|
|
||||||
void cmpxchgq(Register reg, Address adr);
|
void cmpxchgq(Register reg, Address adr);
|
||||||
|
@ -594,7 +594,33 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Support for jint atomic::atomic_cmpxchg_long(jlong exchange_value,
|
// Support for jbyte atomic::atomic_cmpxchg(jbyte exchange_value, volatile jbyte* dest,
|
||||||
|
// jbyte compare_value)
|
||||||
|
//
|
||||||
|
// Arguments :
|
||||||
|
// c_rarg0: exchange_value
|
||||||
|
// c_rarg1: dest
|
||||||
|
// c_rarg2: compare_value
|
||||||
|
//
|
||||||
|
// Result:
|
||||||
|
// if ( compare_value == *dest ) {
|
||||||
|
// *dest = exchange_value
|
||||||
|
// return compare_value;
|
||||||
|
// else
|
||||||
|
// return *dest;
|
||||||
|
address generate_atomic_cmpxchg_byte() {
|
||||||
|
StubCodeMark mark(this, "StubRoutines", "atomic_cmpxchg_byte");
|
||||||
|
address start = __ pc();
|
||||||
|
|
||||||
|
__ movsbq(rax, c_rarg2);
|
||||||
|
if ( os::is_MP() ) __ lock();
|
||||||
|
__ cmpxchgb(c_rarg0, Address(c_rarg1, 0));
|
||||||
|
__ ret(0);
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support for jlong atomic::atomic_cmpxchg(jlong exchange_value,
|
||||||
// volatile jlong* dest,
|
// volatile jlong* dest,
|
||||||
// jlong compare_value)
|
// jlong compare_value)
|
||||||
// Arguments :
|
// Arguments :
|
||||||
@ -3894,6 +3920,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubRoutines::_atomic_xchg_entry = generate_atomic_xchg();
|
StubRoutines::_atomic_xchg_entry = generate_atomic_xchg();
|
||||||
StubRoutines::_atomic_xchg_ptr_entry = generate_atomic_xchg_ptr();
|
StubRoutines::_atomic_xchg_ptr_entry = generate_atomic_xchg_ptr();
|
||||||
StubRoutines::_atomic_cmpxchg_entry = generate_atomic_cmpxchg();
|
StubRoutines::_atomic_cmpxchg_entry = generate_atomic_cmpxchg();
|
||||||
|
StubRoutines::_atomic_cmpxchg_byte_entry = generate_atomic_cmpxchg_byte();
|
||||||
StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
|
StubRoutines::_atomic_cmpxchg_long_entry = generate_atomic_cmpxchg_long();
|
||||||
StubRoutines::_atomic_add_entry = generate_atomic_add();
|
StubRoutines::_atomic_add_entry = generate_atomic_add();
|
||||||
StubRoutines::_atomic_add_ptr_entry = generate_atomic_add_ptr();
|
StubRoutines::_atomic_add_ptr_entry = generate_atomic_add_ptr();
|
||||||
|
@ -570,10 +570,12 @@ public:
|
|||||||
static uint cores_per_cpu() {
|
static uint cores_per_cpu() {
|
||||||
uint result = 1;
|
uint result = 1;
|
||||||
if (is_intel()) {
|
if (is_intel()) {
|
||||||
if (supports_processor_topology()) {
|
bool supports_topology = supports_processor_topology();
|
||||||
|
if (supports_topology) {
|
||||||
result = _cpuid_info.tpl_cpuidB1_ebx.bits.logical_cpus /
|
result = _cpuid_info.tpl_cpuidB1_ebx.bits.logical_cpus /
|
||||||
_cpuid_info.tpl_cpuidB0_ebx.bits.logical_cpus;
|
_cpuid_info.tpl_cpuidB0_ebx.bits.logical_cpus;
|
||||||
} else {
|
}
|
||||||
|
if (!supports_topology || result == 0) {
|
||||||
result = (_cpuid_info.dcp_cpuid4_eax.bits.cores_per_cpu + 1);
|
result = (_cpuid_info.dcp_cpuid4_eax.bits.cores_per_cpu + 1);
|
||||||
}
|
}
|
||||||
} else if (is_amd()) {
|
} else if (is_amd()) {
|
||||||
|
@ -1210,6 +1210,7 @@ uint MachSpillCopyNode::implementation( CodeBuffer *cbuf, PhaseRegAlloc *ra_, bo
|
|||||||
|
|
||||||
|
|
||||||
Unimplemented();
|
Unimplemented();
|
||||||
|
return 0; // Mute compiler
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
|
@ -30,7 +30,9 @@
|
|||||||
|
|
||||||
int ZeroStack::suggest_size(Thread *thread) const {
|
int ZeroStack::suggest_size(Thread *thread) const {
|
||||||
assert(needs_setup(), "already set up");
|
assert(needs_setup(), "already set up");
|
||||||
return align_size_down(abi_stack_available(thread) / 2, wordSize);
|
int abi_available = abi_stack_available(thread);
|
||||||
|
assert(abi_available >= 0, "available abi stack must be >= 0");
|
||||||
|
return align_size_down(abi_available / 2, wordSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZeroStack::handle_overflow(TRAPS) {
|
void ZeroStack::handle_overflow(TRAPS) {
|
||||||
|
@ -48,9 +48,11 @@ inline void ZeroStack::overflow_check(int required_words, TRAPS) {
|
|||||||
// to use under normal circumstances. Note that the returned
|
// to use under normal circumstances. Note that the returned
|
||||||
// value can be negative.
|
// value can be negative.
|
||||||
inline int ZeroStack::abi_stack_available(Thread *thread) const {
|
inline int ZeroStack::abi_stack_available(Thread *thread) const {
|
||||||
int stack_used = thread->stack_base() - (address) &stack_used;
|
guarantee(Thread::current() == thread, "should run in the same thread");
|
||||||
|
int stack_used = thread->stack_base() - (address) &stack_used
|
||||||
|
+ (StackYellowPages+StackRedPages+StackShadowPages) * os::vm_page_size();
|
||||||
int stack_free = thread->stack_size() - stack_used;
|
int stack_free = thread->stack_size() - stack_used;
|
||||||
return stack_free - shadow_pages_size();
|
return stack_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // CPU_ZERO_VM_STACK_ZERO_INLINE_HPP
|
#endif // CPU_ZERO_VM_STACK_ZERO_INLINE_HPP
|
||||||
|
@ -207,6 +207,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubRoutines::_atomic_xchg_ptr_entry = ShouldNotCallThisStub();
|
StubRoutines::_atomic_xchg_ptr_entry = ShouldNotCallThisStub();
|
||||||
StubRoutines::_atomic_cmpxchg_entry = ShouldNotCallThisStub();
|
StubRoutines::_atomic_cmpxchg_entry = ShouldNotCallThisStub();
|
||||||
StubRoutines::_atomic_cmpxchg_ptr_entry = ShouldNotCallThisStub();
|
StubRoutines::_atomic_cmpxchg_ptr_entry = ShouldNotCallThisStub();
|
||||||
|
StubRoutines::_atomic_cmpxchg_byte_entry = ShouldNotCallThisStub();
|
||||||
StubRoutines::_atomic_cmpxchg_long_entry = ShouldNotCallThisStub();
|
StubRoutines::_atomic_cmpxchg_long_entry = ShouldNotCallThisStub();
|
||||||
StubRoutines::_atomic_add_entry = ShouldNotCallThisStub();
|
StubRoutines::_atomic_add_entry = ShouldNotCallThisStub();
|
||||||
StubRoutines::_atomic_add_ptr_entry = ShouldNotCallThisStub();
|
StubRoutines::_atomic_add_ptr_entry = ShouldNotCallThisStub();
|
||||||
|
@ -107,6 +107,12 @@
|
|||||||
#include <sys/vminfo.h>
|
#include <sys/vminfo.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
// If RUSAGE_THREAD for getrusage() has not been defined, do it here. The code calling
|
||||||
|
// getrusage() is prepared to handle the associated failure.
|
||||||
|
#ifndef RUSAGE_THREAD
|
||||||
|
#define RUSAGE_THREAD (1) /* only the calling thread */
|
||||||
|
#endif
|
||||||
|
|
||||||
// Add missing declarations (should be in procinfo.h but isn't until AIX 6.1).
|
// Add missing declarations (should be in procinfo.h but isn't until AIX 6.1).
|
||||||
#if !defined(_AIXVERSION_610)
|
#if !defined(_AIXVERSION_610)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -512,15 +518,13 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
#define DEFAULT_LIBPATH "/usr/lib:/lib"
|
#define DEFAULT_LIBPATH "/usr/lib:/lib"
|
||||||
#define EXTENSIONS_DIR "/lib/ext"
|
#define EXTENSIONS_DIR "/lib/ext"
|
||||||
#define ENDORSED_DIR "/lib/endorsed"
|
|
||||||
|
|
||||||
// Buffer that fits several sprintfs.
|
// Buffer that fits several sprintfs.
|
||||||
// Note that the space for the trailing null is provided
|
// Note that the space for the trailing null is provided
|
||||||
// by the nulls included by the sizeof operator.
|
// by the nulls included by the sizeof operator.
|
||||||
const size_t bufsize =
|
const size_t bufsize =
|
||||||
MAX3((size_t)MAXPATHLEN, // For dll_dir & friends.
|
MAX2((size_t)MAXPATHLEN, // For dll_dir & friends.
|
||||||
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR), // extensions dir
|
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR)); // extensions dir
|
||||||
(size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir
|
|
||||||
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
||||||
|
|
||||||
// sysclasspath, java_home, dll_dir
|
// sysclasspath, java_home, dll_dir
|
||||||
@ -565,21 +569,16 @@ void os::init_system_properties_values() {
|
|||||||
char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal);
|
char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal);
|
||||||
sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon);
|
sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon);
|
||||||
Arguments::set_library_path(ld_library_path);
|
Arguments::set_library_path(ld_library_path);
|
||||||
FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, ld_library_path);
|
||||||
|
|
||||||
// Extensions directories.
|
// Extensions directories.
|
||||||
sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home());
|
sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home());
|
||||||
Arguments::set_ext_dirs(buf);
|
Arguments::set_ext_dirs(buf);
|
||||||
|
|
||||||
// Endorsed standards default directory.
|
FREE_C_HEAP_ARRAY(char, buf);
|
||||||
sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
|
|
||||||
Arguments::set_endorsed_dirs(buf);
|
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
|
||||||
|
|
||||||
#undef DEFAULT_LIBPATH
|
#undef DEFAULT_LIBPATH
|
||||||
#undef EXTENSIONS_DIR
|
#undef EXTENSIONS_DIR
|
||||||
#undef ENDORSED_DIR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1072,16 +1071,20 @@ jlong os::elapsed_frequency() {
|
|||||||
return (1000 * 1000);
|
return (1000 * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// For now, we say that linux does not support vtime. I have no idea
|
bool os::supports_vtime() { return true; }
|
||||||
// whether it can actually be made to (DLD, 9/13/05).
|
|
||||||
|
|
||||||
bool os::supports_vtime() { return false; }
|
|
||||||
bool os::enable_vtime() { return false; }
|
bool os::enable_vtime() { return false; }
|
||||||
bool os::vtime_enabled() { return false; }
|
bool os::vtime_enabled() { return false; }
|
||||||
|
|
||||||
double os::elapsedVTime() {
|
double os::elapsedVTime() {
|
||||||
|
struct rusage usage;
|
||||||
|
int retval = getrusage(RUSAGE_THREAD, &usage);
|
||||||
|
if (retval == 0) {
|
||||||
|
return usage.ru_utime.tv_sec + usage.ru_stime.tv_sec + (usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) / (1000.0 * 1000);
|
||||||
|
} else {
|
||||||
// better than nothing, but not much
|
// better than nothing, but not much
|
||||||
return elapsedTime();
|
return elapsedTime();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
jlong os::javaTimeMillis() {
|
jlong os::javaTimeMillis() {
|
||||||
timeval time;
|
timeval time;
|
||||||
@ -1297,11 +1300,11 @@ bool os::dll_build_name(char* buffer, size_t buflen,
|
|||||||
// release the storage
|
// release the storage
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
if (pelements[i] != NULL) {
|
if (pelements[i] != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
|
FREE_C_HEAP_ARRAY(char, pelements[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pelements != NULL) {
|
if (pelements != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
|
FREE_C_HEAP_ARRAY(char*, pelements);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
|
snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
|
||||||
@ -2778,6 +2781,10 @@ size_t os::read(int fd, void *buf, unsigned int nBytes) {
|
|||||||
return ::read(fd, buf, nBytes);
|
return ::read(fd, buf, nBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
|
||||||
|
return ::pread(fd, buf, nBytes, offset);
|
||||||
|
}
|
||||||
|
|
||||||
void os::naked_short_sleep(jlong ms) {
|
void os::naked_short_sleep(jlong ms) {
|
||||||
struct timespec req;
|
struct timespec req;
|
||||||
|
|
||||||
@ -4137,9 +4144,30 @@ int os::available(int fd, jlong *bytes) {
|
|||||||
char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
|
char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
|
||||||
char *addr, size_t bytes, bool read_only,
|
char *addr, size_t bytes, bool read_only,
|
||||||
bool allow_exec) {
|
bool allow_exec) {
|
||||||
Unimplemented();
|
int prot;
|
||||||
|
int flags = MAP_PRIVATE;
|
||||||
|
|
||||||
|
if (read_only) {
|
||||||
|
prot = PROT_READ;
|
||||||
|
} else {
|
||||||
|
prot = PROT_READ | PROT_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allow_exec) {
|
||||||
|
prot |= PROT_EXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr != NULL) {
|
||||||
|
flags |= MAP_FIXED;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
|
||||||
|
fd, file_offset);
|
||||||
|
if (mapped_address == MAP_FAILED) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
return mapped_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Remap a block of memory.
|
// Remap a block of memory.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2012, 2013 SAP AG. All rights reserved.
|
* Copyright 2012, 2013 SAP AG. 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.
|
||||||
*
|
*
|
||||||
@ -127,7 +127,7 @@ static void save_memory_to_file(char* addr, size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
|
FREE_C_HEAP_ARRAY(char, destfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -279,14 +279,14 @@ static char* get_user_name(uid_t uid) {
|
|||||||
"pw_name zero length");
|
"pw_name zero length");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
||||||
strcpy(user_name, p->pw_name);
|
strcpy(user_name, p->pw_name);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return user_name;
|
return user_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,7 +347,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
DIR* subdirp = os::opendir(usrdir_name);
|
DIR* subdirp = os::opendir(usrdir_name);
|
||||||
|
|
||||||
if (subdirp == NULL) {
|
if (subdirp == NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,7 +358,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// symlink can be exploited.
|
// symlink can be exploited.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(usrdir_name)) {
|
if (!is_directory_secure(usrdir_name)) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -382,13 +382,13 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// don't follow symbolic links for the file
|
// don't follow symbolic links for the file
|
||||||
RESTARTABLE(::lstat(filename, &statbuf), result);
|
RESTARTABLE(::lstat(filename, &statbuf), result);
|
||||||
if (result == OS_ERR) {
|
if (result == OS_ERR) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip over files that are not regular files.
|
// skip over files that are not regular files.
|
||||||
if (!S_ISREG(statbuf.st_mode)) {
|
if (!S_ISREG(statbuf.st_mode)) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,7 +398,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
if (statbuf.st_ctime > oldest_ctime) {
|
if (statbuf.st_ctime > oldest_ctime) {
|
||||||
char* user = strchr(dentry->d_name, '_') + 1;
|
char* user = strchr(dentry->d_name, '_') + 1;
|
||||||
|
|
||||||
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal);
|
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
|
||||||
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
||||||
|
|
||||||
strcpy(oldest_user, user);
|
strcpy(oldest_user, user);
|
||||||
@ -406,15 +406,15 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, udbuf);
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
}
|
}
|
||||||
os::closedir(tmpdirp);
|
os::closedir(tmpdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, tdbuf);
|
||||||
|
|
||||||
return(oldest_user);
|
return(oldest_user);
|
||||||
}
|
}
|
||||||
@ -422,7 +422,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// return the name of the user that owns the JVM indicated by the given vmid.
|
// return the name of the user that owns the JVM indicated by the given vmid.
|
||||||
//
|
//
|
||||||
static char* get_user_name(int vmid, TRAPS) {
|
static char* get_user_name(int vmid, TRAPS) {
|
||||||
return get_user_name_slow(vmid, CHECK_NULL);
|
return get_user_name_slow(vmid, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the file name of the backing store file for the named
|
// return the file name of the backing store file for the named
|
||||||
@ -481,7 +481,7 @@ static void remove_file(const char* dirname, const char* filename) {
|
|||||||
|
|
||||||
remove_file(path);
|
remove_file(path);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -558,7 +558,7 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
|||||||
errno = 0;
|
errno = 0;
|
||||||
}
|
}
|
||||||
os::closedir(dirp);
|
os::closedir(dirp);
|
||||||
FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// make the user specific temporary directory. Returns true if
|
// make the user specific temporary directory. Returns true if
|
||||||
@ -703,11 +703,11 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
|
|
||||||
fd = create_sharedmem_resources(dirname, filename, size);
|
fd = create_sharedmem_resources(dirname, filename, size);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, user_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, user_name);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -723,7 +723,7 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
warning("mmap failed - %s\n", strerror(errno));
|
warning("mmap failed - %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
remove_file(filename);
|
remove_file(filename);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -769,7 +769,7 @@ static void delete_shared_memory(char* addr, size_t size) {
|
|||||||
remove_file(backing_store_file_name);
|
remove_file(backing_store_file_name);
|
||||||
// Don't.. Free heap memory could deadlock os::abort() if it is called
|
// Don't.. Free heap memory could deadlock os::abort() if it is called
|
||||||
// from signal handler. OS will reclaim the heap memory.
|
// from signal handler. OS will reclaim the heap memory.
|
||||||
// FREE_C_HEAP_ARRAY(char, backing_store_file_name, mtInternal);
|
// FREE_C_HEAP_ARRAY(char, backing_store_file_name);
|
||||||
backing_store_file_name = NULL;
|
backing_store_file_name = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -853,9 +853,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
// store file, we don't follow them when attaching either.
|
// store file, we don't follow them when attaching either.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(dirname)) {
|
if (!is_directory_secure(dirname)) {
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
if (luser != user) {
|
if (luser != user) {
|
||||||
FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
FREE_C_HEAP_ARRAY(char, luser);
|
||||||
}
|
}
|
||||||
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
||||||
"Process not found");
|
"Process not found");
|
||||||
@ -871,9 +871,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
strcpy(rfilename, filename);
|
strcpy(rfilename, filename);
|
||||||
|
|
||||||
// free the c heap resources that are no longer needed
|
// free the c heap resources that are no longer needed
|
||||||
if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
|
|
||||||
// open the shared memory file for the give vmid
|
// open the shared memory file for the give vmid
|
||||||
fd = open_sharedmem_file(rfilename, file_flags, CHECK);
|
fd = open_sharedmem_file(rfilename, file_flags, CHECK);
|
||||||
|
@ -353,7 +353,6 @@ void os::init_system_properties_values() {
|
|||||||
// Base path of extensions installed on the system.
|
// Base path of extensions installed on the system.
|
||||||
#define SYS_EXT_DIR "/usr/java/packages"
|
#define SYS_EXT_DIR "/usr/java/packages"
|
||||||
#define EXTENSIONS_DIR "/lib/ext"
|
#define EXTENSIONS_DIR "/lib/ext"
|
||||||
#define ENDORSED_DIR "/lib/endorsed"
|
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
|
|
||||||
@ -361,9 +360,8 @@ void os::init_system_properties_values() {
|
|||||||
// Note that the space for the colon and the trailing null are provided
|
// Note that the space for the colon and the trailing null are provided
|
||||||
// by the nulls included by the sizeof operator.
|
// by the nulls included by the sizeof operator.
|
||||||
const size_t bufsize =
|
const size_t bufsize =
|
||||||
MAX3((size_t)MAXPATHLEN, // For dll_dir & friends.
|
MAX2((size_t)MAXPATHLEN, // For dll_dir & friends.
|
||||||
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR), // extensions dir
|
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR)); // extensions dir
|
||||||
(size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir
|
|
||||||
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
||||||
|
|
||||||
// sysclasspath, java_home, dll_dir
|
// sysclasspath, java_home, dll_dir
|
||||||
@ -418,18 +416,14 @@ void os::init_system_properties_values() {
|
|||||||
mtInternal);
|
mtInternal);
|
||||||
sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch);
|
sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch);
|
||||||
Arguments::set_library_path(ld_library_path);
|
Arguments::set_library_path(ld_library_path);
|
||||||
FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, ld_library_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extensions directories.
|
// Extensions directories.
|
||||||
sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
|
sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
|
||||||
Arguments::set_ext_dirs(buf);
|
Arguments::set_ext_dirs(buf);
|
||||||
|
|
||||||
// Endorsed standards default directory.
|
FREE_C_HEAP_ARRAY(char, buf);
|
||||||
sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
|
|
||||||
Arguments::set_endorsed_dirs(buf);
|
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
|
||||||
|
|
||||||
#else // __APPLE__
|
#else // __APPLE__
|
||||||
|
|
||||||
@ -445,9 +439,8 @@ void os::init_system_properties_values() {
|
|||||||
// Note that the space for the colon and the trailing null are provided
|
// Note that the space for the colon and the trailing null are provided
|
||||||
// by the nulls included by the sizeof operator.
|
// by the nulls included by the sizeof operator.
|
||||||
const size_t bufsize =
|
const size_t bufsize =
|
||||||
MAX3((size_t)MAXPATHLEN, // for dll_dir & friends.
|
MAX2((size_t)MAXPATHLEN, // for dll_dir & friends.
|
||||||
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + system_ext_size, // extensions dir
|
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + system_ext_size); // extensions dir
|
||||||
(size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir
|
|
||||||
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
||||||
|
|
||||||
// sysclasspath, java_home, dll_dir
|
// sysclasspath, java_home, dll_dir
|
||||||
@ -513,7 +506,7 @@ void os::init_system_properties_values() {
|
|||||||
sprintf(ld_library_path, "%s%s%s%s%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS ":.",
|
sprintf(ld_library_path, "%s%s%s%s%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS ":.",
|
||||||
v, v_colon, l, l_colon, user_home_dir);
|
v, v_colon, l, l_colon, user_home_dir);
|
||||||
Arguments::set_library_path(ld_library_path);
|
Arguments::set_library_path(ld_library_path);
|
||||||
FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, ld_library_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extensions directories.
|
// Extensions directories.
|
||||||
@ -525,11 +518,7 @@ void os::init_system_properties_values() {
|
|||||||
user_home_dir, Arguments::get_java_home());
|
user_home_dir, Arguments::get_java_home());
|
||||||
Arguments::set_ext_dirs(buf);
|
Arguments::set_ext_dirs(buf);
|
||||||
|
|
||||||
// Endorsed standards default directory.
|
FREE_C_HEAP_ARRAY(char, buf);
|
||||||
sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
|
|
||||||
Arguments::set_endorsed_dirs(buf);
|
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
|
||||||
|
|
||||||
#undef SYS_EXTENSIONS_DIR
|
#undef SYS_EXTENSIONS_DIR
|
||||||
#undef SYS_EXTENSIONS_DIRS
|
#undef SYS_EXTENSIONS_DIRS
|
||||||
@ -538,7 +527,6 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
#undef SYS_EXT_DIR
|
#undef SYS_EXT_DIR
|
||||||
#undef EXTENSIONS_DIR
|
#undef EXTENSIONS_DIR
|
||||||
#undef ENDORSED_DIR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1315,11 +1303,11 @@ bool os::dll_build_name(char* buffer, size_t buflen,
|
|||||||
// release the storage
|
// release the storage
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
if (pelements[i] != NULL) {
|
if (pelements[i] != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
|
FREE_C_HEAP_ARRAY(char, pelements[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pelements != NULL) {
|
if (pelements != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
|
FREE_C_HEAP_ARRAY(char*, pelements);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
|
snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
|
||||||
@ -2576,6 +2564,10 @@ size_t os::read(int fd, void *buf, unsigned int nBytes) {
|
|||||||
RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
|
RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
|
||||||
|
RESTARTABLE_RETURN_INT(::pread(fd, buf, nBytes, offset));
|
||||||
|
}
|
||||||
|
|
||||||
void os::naked_short_sleep(jlong ms) {
|
void os::naked_short_sleep(jlong ms) {
|
||||||
struct timespec req;
|
struct timespec req;
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ static void save_memory_to_file(char* addr, size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
|
FREE_C_HEAP_ARRAY(char, destfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -279,14 +279,14 @@ static char* get_user_name(uid_t uid) {
|
|||||||
"pw_name zero length");
|
"pw_name zero length");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
||||||
strcpy(user_name, p->pw_name);
|
strcpy(user_name, p->pw_name);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return user_name;
|
return user_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,7 +347,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
DIR* subdirp = os::opendir(usrdir_name);
|
DIR* subdirp = os::opendir(usrdir_name);
|
||||||
|
|
||||||
if (subdirp == NULL) {
|
if (subdirp == NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,7 +358,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// symlink can be exploited.
|
// symlink can be exploited.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(usrdir_name)) {
|
if (!is_directory_secure(usrdir_name)) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -382,13 +382,13 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// don't follow symbolic links for the file
|
// don't follow symbolic links for the file
|
||||||
RESTARTABLE(::lstat(filename, &statbuf), result);
|
RESTARTABLE(::lstat(filename, &statbuf), result);
|
||||||
if (result == OS_ERR) {
|
if (result == OS_ERR) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip over files that are not regular files.
|
// skip over files that are not regular files.
|
||||||
if (!S_ISREG(statbuf.st_mode)) {
|
if (!S_ISREG(statbuf.st_mode)) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,7 +398,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
if (statbuf.st_ctime > oldest_ctime) {
|
if (statbuf.st_ctime > oldest_ctime) {
|
||||||
char* user = strchr(dentry->d_name, '_') + 1;
|
char* user = strchr(dentry->d_name, '_') + 1;
|
||||||
|
|
||||||
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal);
|
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
|
||||||
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
||||||
|
|
||||||
strcpy(oldest_user, user);
|
strcpy(oldest_user, user);
|
||||||
@ -406,15 +406,15 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, udbuf);
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
}
|
}
|
||||||
os::closedir(tmpdirp);
|
os::closedir(tmpdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, tdbuf);
|
||||||
|
|
||||||
return(oldest_user);
|
return(oldest_user);
|
||||||
}
|
}
|
||||||
@ -422,7 +422,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// return the name of the user that owns the JVM indicated by the given vmid.
|
// return the name of the user that owns the JVM indicated by the given vmid.
|
||||||
//
|
//
|
||||||
static char* get_user_name(int vmid, TRAPS) {
|
static char* get_user_name(int vmid, TRAPS) {
|
||||||
return get_user_name_slow(vmid, CHECK_NULL);
|
return get_user_name_slow(vmid, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the file name of the backing store file for the named
|
// return the file name of the backing store file for the named
|
||||||
@ -481,7 +481,7 @@ static void remove_file(const char* dirname, const char* filename) {
|
|||||||
|
|
||||||
remove_file(path);
|
remove_file(path);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -558,7 +558,7 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
|||||||
errno = 0;
|
errno = 0;
|
||||||
}
|
}
|
||||||
os::closedir(dirp);
|
os::closedir(dirp);
|
||||||
FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// make the user specific temporary directory. Returns true if
|
// make the user specific temporary directory. Returns true if
|
||||||
@ -725,11 +725,11 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
|
|
||||||
fd = create_sharedmem_resources(dirname, filename, size);
|
fd = create_sharedmem_resources(dirname, filename, size);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, user_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, user_name);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -743,7 +743,7 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
warning("mmap failed - %s\n", strerror(errno));
|
warning("mmap failed - %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
remove_file(filename);
|
remove_file(filename);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -872,9 +872,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
// store file, we don't follow them when attaching either.
|
// store file, we don't follow them when attaching either.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(dirname)) {
|
if (!is_directory_secure(dirname)) {
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
if (luser != user) {
|
if (luser != user) {
|
||||||
FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
FREE_C_HEAP_ARRAY(char, luser);
|
||||||
}
|
}
|
||||||
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
||||||
"Process not found");
|
"Process not found");
|
||||||
@ -890,9 +890,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
strcpy(rfilename, filename);
|
strcpy(rfilename, filename);
|
||||||
|
|
||||||
// free the c heap resources that are no longer needed
|
// free the c heap resources that are no longer needed
|
||||||
if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
|
|
||||||
// open the shared memory file for the give vmid
|
// open the shared memory file for the give vmid
|
||||||
fd = open_sharedmem_file(rfilename, file_flags, CHECK);
|
fd = open_sharedmem_file(rfilename, file_flags, CHECK);
|
||||||
|
@ -68,6 +68,7 @@
|
|||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/elfFile.hpp"
|
#include "utilities/elfFile.hpp"
|
||||||
#include "utilities/growableArray.hpp"
|
#include "utilities/growableArray.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
// put OS-includes here
|
// put OS-includes here
|
||||||
@ -339,15 +340,13 @@ void os::init_system_properties_values() {
|
|||||||
// Base path of extensions installed on the system.
|
// Base path of extensions installed on the system.
|
||||||
#define SYS_EXT_DIR "/usr/java/packages"
|
#define SYS_EXT_DIR "/usr/java/packages"
|
||||||
#define EXTENSIONS_DIR "/lib/ext"
|
#define EXTENSIONS_DIR "/lib/ext"
|
||||||
#define ENDORSED_DIR "/lib/endorsed"
|
|
||||||
|
|
||||||
// Buffer that fits several sprintfs.
|
// Buffer that fits several sprintfs.
|
||||||
// Note that the space for the colon and the trailing null are provided
|
// Note that the space for the colon and the trailing null are provided
|
||||||
// by the nulls included by the sizeof operator.
|
// by the nulls included by the sizeof operator.
|
||||||
const size_t bufsize =
|
const size_t bufsize =
|
||||||
MAX3((size_t)MAXPATHLEN, // For dll_dir & friends.
|
MAX2((size_t)MAXPATHLEN, // For dll_dir & friends.
|
||||||
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR), // extensions dir
|
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR)); // extensions dir
|
||||||
(size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir
|
|
||||||
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
||||||
|
|
||||||
// sysclasspath, java_home, dll_dir
|
// sysclasspath, java_home, dll_dir
|
||||||
@ -405,23 +404,18 @@ void os::init_system_properties_values() {
|
|||||||
mtInternal);
|
mtInternal);
|
||||||
sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch);
|
sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch);
|
||||||
Arguments::set_library_path(ld_library_path);
|
Arguments::set_library_path(ld_library_path);
|
||||||
FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, ld_library_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extensions directories.
|
// Extensions directories.
|
||||||
sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
|
sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
|
||||||
Arguments::set_ext_dirs(buf);
|
Arguments::set_ext_dirs(buf);
|
||||||
|
|
||||||
// Endorsed standards default directory.
|
FREE_C_HEAP_ARRAY(char, buf);
|
||||||
sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
|
|
||||||
Arguments::set_endorsed_dirs(buf);
|
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
|
||||||
|
|
||||||
#undef DEFAULT_LIBPATH
|
#undef DEFAULT_LIBPATH
|
||||||
#undef SYS_EXT_DIR
|
#undef SYS_EXT_DIR
|
||||||
#undef EXTENSIONS_DIR
|
#undef EXTENSIONS_DIR
|
||||||
#undef ENDORSED_DIR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1622,11 +1616,11 @@ bool os::dll_build_name(char* buffer, size_t buflen,
|
|||||||
// release the storage
|
// release the storage
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
if (pelements[i] != NULL) {
|
if (pelements[i] != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
|
FREE_C_HEAP_ARRAY(char, pelements[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pelements != NULL) {
|
if (pelements != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
|
FREE_C_HEAP_ARRAY(char*, pelements);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
|
snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
|
||||||
@ -2943,7 +2937,7 @@ void os::Linux::rebuild_cpu_to_node_map() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(unsigned long, cpu_map, mtInternal);
|
FREE_C_HEAP_ARRAY(unsigned long, cpu_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
int os::Linux::get_node_by_cpu(int cpu_id) {
|
int os::Linux::get_node_by_cpu(int cpu_id) {
|
||||||
@ -3791,6 +3785,10 @@ size_t os::read(int fd, void *buf, unsigned int nBytes) {
|
|||||||
return ::read(fd, buf, nBytes);
|
return ::read(fd, buf, nBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
|
||||||
|
return ::pread(fd, buf, nBytes, offset);
|
||||||
|
}
|
||||||
|
|
||||||
// Short sleep, direct OS call.
|
// Short sleep, direct OS call.
|
||||||
//
|
//
|
||||||
// Note: certain versions of Linux CFS scheduler (since 2.6.23) do not guarantee
|
// Note: certain versions of Linux CFS scheduler (since 2.6.23) do not guarantee
|
||||||
|
@ -127,7 +127,7 @@ static void save_memory_to_file(char* addr, size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
|
FREE_C_HEAP_ARRAY(char, destfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -279,14 +279,14 @@ static char* get_user_name(uid_t uid) {
|
|||||||
"pw_name zero length");
|
"pw_name zero length");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
||||||
strcpy(user_name, p->pw_name);
|
strcpy(user_name, p->pw_name);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return user_name;
|
return user_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,7 +347,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
DIR* subdirp = os::opendir(usrdir_name);
|
DIR* subdirp = os::opendir(usrdir_name);
|
||||||
|
|
||||||
if (subdirp == NULL) {
|
if (subdirp == NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,7 +358,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// symlink can be exploited.
|
// symlink can be exploited.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(usrdir_name)) {
|
if (!is_directory_secure(usrdir_name)) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -382,13 +382,13 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// don't follow symbolic links for the file
|
// don't follow symbolic links for the file
|
||||||
RESTARTABLE(::lstat(filename, &statbuf), result);
|
RESTARTABLE(::lstat(filename, &statbuf), result);
|
||||||
if (result == OS_ERR) {
|
if (result == OS_ERR) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip over files that are not regular files.
|
// skip over files that are not regular files.
|
||||||
if (!S_ISREG(statbuf.st_mode)) {
|
if (!S_ISREG(statbuf.st_mode)) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,7 +398,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
if (statbuf.st_ctime > oldest_ctime) {
|
if (statbuf.st_ctime > oldest_ctime) {
|
||||||
char* user = strchr(dentry->d_name, '_') + 1;
|
char* user = strchr(dentry->d_name, '_') + 1;
|
||||||
|
|
||||||
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal);
|
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
|
||||||
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
||||||
|
|
||||||
strcpy(oldest_user, user);
|
strcpy(oldest_user, user);
|
||||||
@ -406,15 +406,15 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, udbuf);
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
}
|
}
|
||||||
os::closedir(tmpdirp);
|
os::closedir(tmpdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, tdbuf);
|
||||||
|
|
||||||
return(oldest_user);
|
return(oldest_user);
|
||||||
}
|
}
|
||||||
@ -422,7 +422,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// return the name of the user that owns the JVM indicated by the given vmid.
|
// return the name of the user that owns the JVM indicated by the given vmid.
|
||||||
//
|
//
|
||||||
static char* get_user_name(int vmid, TRAPS) {
|
static char* get_user_name(int vmid, TRAPS) {
|
||||||
return get_user_name_slow(vmid, CHECK_NULL);
|
return get_user_name_slow(vmid, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the file name of the backing store file for the named
|
// return the file name of the backing store file for the named
|
||||||
@ -481,7 +481,7 @@ static void remove_file(const char* dirname, const char* filename) {
|
|||||||
|
|
||||||
remove_file(path);
|
remove_file(path);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -558,7 +558,7 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
|||||||
errno = 0;
|
errno = 0;
|
||||||
}
|
}
|
||||||
os::closedir(dirp);
|
os::closedir(dirp);
|
||||||
FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// make the user specific temporary directory. Returns true if
|
// make the user specific temporary directory. Returns true if
|
||||||
@ -725,11 +725,11 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
|
|
||||||
fd = create_sharedmem_resources(dirname, filename, size);
|
fd = create_sharedmem_resources(dirname, filename, size);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, user_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, user_name);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -743,7 +743,7 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
warning("mmap failed - %s\n", strerror(errno));
|
warning("mmap failed - %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
remove_file(filename);
|
remove_file(filename);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -872,9 +872,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
// store file, we don't follow them when attaching either.
|
// store file, we don't follow them when attaching either.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(dirname)) {
|
if (!is_directory_secure(dirname)) {
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
if (luser != user) {
|
if (luser != user) {
|
||||||
FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
FREE_C_HEAP_ARRAY(char, luser);
|
||||||
}
|
}
|
||||||
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
||||||
"Process not found");
|
"Process not found");
|
||||||
@ -890,9 +890,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
strcpy(rfilename, filename);
|
strcpy(rfilename, filename);
|
||||||
|
|
||||||
// free the c heap resources that are no longer needed
|
// free the c heap resources that are no longer needed
|
||||||
if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
|
|
||||||
// open the shared memory file for the give vmid
|
// open the shared memory file for the give vmid
|
||||||
fd = open_sharedmem_file(rfilename, file_flags, THREAD);
|
fd = open_sharedmem_file(rfilename, file_flags, THREAD);
|
||||||
|
@ -1,285 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Name: add_gnu_debuglink.c
|
|
||||||
*
|
|
||||||
* Description: Add a ".gnu_debuglink" section that refers to the specified
|
|
||||||
* debug_info_path to the specified ELF object.
|
|
||||||
*
|
|
||||||
* This program is adapted from the example program shown on the
|
|
||||||
* elf(3elf) man page and from code from the Solaris compiler
|
|
||||||
* driver.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* needed to define SHF_EXCLUDE
|
|
||||||
*/
|
|
||||||
#define ELF_TARGET_ALL
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <libelf.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static void failure(void);
|
|
||||||
static unsigned int gnu_debuglink_crc32(unsigned int crc, unsigned char *buf,
|
|
||||||
size_t len);
|
|
||||||
|
|
||||||
void
|
|
||||||
main(int argc, char ** argv) {
|
|
||||||
/* new ELF section name */
|
|
||||||
static char SEC_NAME[] = ".gnu_debuglink";
|
|
||||||
|
|
||||||
unsigned char buffer[8 * 1024]; /* I/O buffer */
|
|
||||||
int buffer_len; /* buffer length */
|
|
||||||
char * debug_info_path; /* debug info path */
|
|
||||||
void * ehdr; /* ELF header */
|
|
||||||
Elf * elf; /* ELF descriptor */
|
|
||||||
char * elf_ident; /* ELF identity string */
|
|
||||||
char * elf_obj; /* elf_obj file */
|
|
||||||
int fd; /* descriptor for files */
|
|
||||||
unsigned int file_crc = 0; /* CRC for debug info file */
|
|
||||||
int is_elfclass64; /* is an ELFCLASS64 file? */
|
|
||||||
Elf_Data * link_dat; /* ELF data for new debug info link */
|
|
||||||
Elf_Data * name_dat; /* ELF data for new section name */
|
|
||||||
Elf_Scn * new_scn; /* new ELF section descriptor */
|
|
||||||
void * new_shdr; /* new ELF section header */
|
|
||||||
Elf_Scn * scn; /* ELF section descriptor */
|
|
||||||
void * shdr; /* ELF section header */
|
|
||||||
|
|
||||||
if (argc != 3) {
|
|
||||||
(void) fprintf(stderr, "Usage: %s debug_info_path elf_obj\n", argv[0]);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
debug_info_path = argv[1]; /* save for later */
|
|
||||||
if ((fd = open(debug_info_path, O_RDONLY)) == -1) {
|
|
||||||
(void) fprintf(stderr, "%s: cannot open file.\n", debug_info_path);
|
|
||||||
exit(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) printf("Computing CRC for '%s'\n", debug_info_path);
|
|
||||||
(void) fflush(stdout);
|
|
||||||
/* compute CRC for the debug info file */
|
|
||||||
for (;;) {
|
|
||||||
int len = read(fd, buffer, sizeof buffer);
|
|
||||||
if (len <= 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
file_crc = gnu_debuglink_crc32(file_crc, buffer, len);
|
|
||||||
}
|
|
||||||
(void) close(fd);
|
|
||||||
|
|
||||||
/* open the elf_obj */
|
|
||||||
elf_obj = argv[2];
|
|
||||||
if ((fd = open(elf_obj, O_RDWR)) == -1) {
|
|
||||||
(void) fprintf(stderr, "%s: cannot open file.\n", elf_obj);
|
|
||||||
exit(4);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) printf("Opening '%s' for update\n", elf_obj);
|
|
||||||
(void) fflush(stdout);
|
|
||||||
(void) elf_version(EV_CURRENT); /* coordinate ELF versions */
|
|
||||||
|
|
||||||
/* obtain the ELF descriptors from the input file */
|
|
||||||
if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* determine if ELFCLASS64 or not? */
|
|
||||||
elf_ident = elf_getident(elf, NULL);
|
|
||||||
is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64);
|
|
||||||
|
|
||||||
/* get the ELF header */
|
|
||||||
if (is_elfclass64) {
|
|
||||||
ehdr = elf64_getehdr(elf);
|
|
||||||
} else {
|
|
||||||
ehdr = elf32_getehdr(elf);
|
|
||||||
}
|
|
||||||
if (ehdr == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the ELF section descriptor */
|
|
||||||
if (is_elfclass64) {
|
|
||||||
scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx);
|
|
||||||
} else {
|
|
||||||
scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx);
|
|
||||||
}
|
|
||||||
if (scn == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the section header */
|
|
||||||
if (is_elfclass64) {
|
|
||||||
shdr = elf64_getshdr(scn);
|
|
||||||
} else {
|
|
||||||
shdr = elf32_getshdr(scn);
|
|
||||||
}
|
|
||||||
if (shdr == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) printf("Adding ELF data for new section name\n");
|
|
||||||
(void) fflush(stdout);
|
|
||||||
name_dat = elf_newdata(scn);
|
|
||||||
name_dat->d_buf = (void *) SEC_NAME;
|
|
||||||
if (is_elfclass64) {
|
|
||||||
name_dat->d_off = ((Elf64_Shdr *) shdr)->sh_size + 1;
|
|
||||||
} else {
|
|
||||||
name_dat->d_off = ((Elf32_Shdr *) shdr)->sh_size + 1;
|
|
||||||
}
|
|
||||||
name_dat->d_align = 1;
|
|
||||||
name_dat->d_size = strlen(SEC_NAME) + 1;
|
|
||||||
|
|
||||||
new_scn = elf_newscn(elf);
|
|
||||||
|
|
||||||
if (is_elfclass64) {
|
|
||||||
new_shdr = elf64_getshdr(new_scn);
|
|
||||||
((Elf64_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE;
|
|
||||||
((Elf64_Shdr *) new_shdr)->sh_type = SHT_PROGBITS;
|
|
||||||
((Elf64_Shdr *) new_shdr)->sh_name = ((Elf64_Shdr *) shdr)->sh_size;
|
|
||||||
((Elf64_Shdr *) new_shdr)->sh_addralign = 1;
|
|
||||||
((Elf64_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1);
|
|
||||||
} else {
|
|
||||||
new_shdr = elf32_getshdr(new_scn);
|
|
||||||
((Elf32_Shdr *) new_shdr)->sh_flags = SHF_EXCLUDE;
|
|
||||||
((Elf32_Shdr *) new_shdr)->sh_type = SHT_PROGBITS;
|
|
||||||
((Elf32_Shdr *) new_shdr)->sh_name = ((Elf32_Shdr *) shdr)->sh_size;
|
|
||||||
((Elf32_Shdr *) new_shdr)->sh_addralign = 1;
|
|
||||||
((Elf32_Shdr *) shdr)->sh_size += (strlen(SEC_NAME) + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) printf("Adding ELF data for debug_info_path value\n");
|
|
||||||
(void) fflush(stdout);
|
|
||||||
(void) memset(buffer, 0, sizeof buffer);
|
|
||||||
buffer_len = strlen(debug_info_path) + 1; /* +1 for NUL */
|
|
||||||
(void) strncpy((char *) buffer, debug_info_path, buffer_len);
|
|
||||||
if (buffer_len % 4 != 0) {
|
|
||||||
/* not on a 4 byte boundary so pad to the next one */
|
|
||||||
buffer_len += (4 - buffer_len % 4);
|
|
||||||
}
|
|
||||||
/* save the CRC */
|
|
||||||
(void) memcpy(&buffer[buffer_len], &file_crc, sizeof file_crc);
|
|
||||||
buffer_len += sizeof file_crc;
|
|
||||||
|
|
||||||
link_dat = elf_newdata(new_scn);
|
|
||||||
link_dat->d_type = ELF_T_BYTE;
|
|
||||||
link_dat->d_size = buffer_len;
|
|
||||||
link_dat->d_buf = buffer;
|
|
||||||
link_dat->d_align = 1;
|
|
||||||
|
|
||||||
(void) printf("Saving updates to '%s'\n", elf_obj);
|
|
||||||
(void) fflush(stdout);
|
|
||||||
(void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */
|
|
||||||
(void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */
|
|
||||||
(void) elf_end(elf); /* done with ELF obj */
|
|
||||||
(void) close(fd);
|
|
||||||
|
|
||||||
(void) printf("Done updating '%s'\n", elf_obj);
|
|
||||||
(void) fflush(stdout);
|
|
||||||
exit(0);
|
|
||||||
} /* end main */
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
failure() {
|
|
||||||
(void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno()));
|
|
||||||
exit(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The CRC used in gnu_debuglink, retrieved from
|
|
||||||
* http://sourceware.org/gdb/current/onlinedocs/gdb/Separate-Debug-Files.html#Separate-Debug-Files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static unsigned int
|
|
||||||
gnu_debuglink_crc32(unsigned int crc, unsigned char *buf, size_t len) {
|
|
||||||
static const unsigned int crc32_table[256] = {
|
|
||||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
|
|
||||||
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
|
|
||||||
0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
|
|
||||||
0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
|
|
||||||
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
|
|
||||||
0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
|
|
||||||
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
|
|
||||||
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
|
|
||||||
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
|
|
||||||
0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
|
|
||||||
0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
|
|
||||||
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
|
||||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
|
|
||||||
0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
|
|
||||||
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
|
|
||||||
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
|
|
||||||
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
|
|
||||||
0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
|
|
||||||
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
|
|
||||||
0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
|
|
||||||
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
|
|
||||||
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
|
|
||||||
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
|
|
||||||
0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
|
||||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
|
|
||||||
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
|
|
||||||
0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
|
|
||||||
0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
|
||||||
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
|
|
||||||
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
|
|
||||||
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
|
|
||||||
0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
|
|
||||||
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
|
|
||||||
0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
|
|
||||||
0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
|
|
||||||
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
|
||||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
|
|
||||||
0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
|
|
||||||
0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
|
|
||||||
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
|
|
||||||
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
|
|
||||||
0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
|
|
||||||
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
|
|
||||||
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
|
|
||||||
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
|
|
||||||
0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
|
|
||||||
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
|
|
||||||
0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
|
||||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
|
|
||||||
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
|
|
||||||
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
|
|
||||||
0x2d02ef8d
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned char *end;
|
|
||||||
|
|
||||||
crc = ~crc & 0xffffffff;
|
|
||||||
for (end = buf + len; buf < end; ++buf) {
|
|
||||||
crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
|
|
||||||
}
|
|
||||||
return ~crc & 0xffffffff;
|
|
||||||
}
|
|
@ -1,181 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Name: fix_empty_sec_hdr_flags.c
|
|
||||||
*
|
|
||||||
* Description: Remove the SHF_ALLOC flag from "empty" section headers.
|
|
||||||
* An "empty" section header has sh_addr == 0 and sh_size == 0.
|
|
||||||
*
|
|
||||||
* This program is adapted from the example program shown on the
|
|
||||||
* elf(3elf) man page and from code from the Solaris compiler
|
|
||||||
* driver.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <libelf.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static void failure(void);
|
|
||||||
|
|
||||||
void
|
|
||||||
main(int argc, char ** argv) {
|
|
||||||
void * ehdr; /* ELF header */
|
|
||||||
unsigned int i; /* section counter */
|
|
||||||
int fd; /* descriptor for file */
|
|
||||||
Elf * elf; /* ELF descriptor */
|
|
||||||
char * elf_ident; /* ELF identity string */
|
|
||||||
char * elf_obj; /* elf_obj file */
|
|
||||||
int fix_count; /* number of flags fixed */
|
|
||||||
int is_elfclass64; /* is an ELFCLASS64 file? */
|
|
||||||
Elf_Scn * scn; /* ELF section descriptor */
|
|
||||||
void * shdr; /* ELF section header */
|
|
||||||
Elf_Data * shstrtab; /* ELF section header string table */
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
(void) fprintf(stderr, "Usage: %s elf_obj\n", argv[0]);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* open the elf_obj */
|
|
||||||
elf_obj = argv[1];
|
|
||||||
if ((fd = open(elf_obj, O_RDWR)) == -1) {
|
|
||||||
(void) fprintf(stderr, "%s: cannot open file.\n", elf_obj);
|
|
||||||
exit(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) printf("Opening '%s' for update\n", elf_obj);
|
|
||||||
(void) fflush(stdout);
|
|
||||||
(void) elf_version(EV_CURRENT); /* coordinate ELF versions */
|
|
||||||
|
|
||||||
/* obtain the ELF descriptors from the input file */
|
|
||||||
if ((elf = elf_begin(fd, ELF_C_RDWR, NULL)) == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* determine if ELFCLASS64 or not? */
|
|
||||||
elf_ident = elf_getident(elf, NULL);
|
|
||||||
is_elfclass64 = (elf_ident[EI_CLASS] == ELFCLASS64);
|
|
||||||
|
|
||||||
/* get the ELF header */
|
|
||||||
if (is_elfclass64) {
|
|
||||||
ehdr = elf64_getehdr(elf);
|
|
||||||
} else {
|
|
||||||
ehdr = elf32_getehdr(elf);
|
|
||||||
}
|
|
||||||
if (ehdr == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the ELF section descriptor */
|
|
||||||
if (is_elfclass64) {
|
|
||||||
scn = elf_getscn(elf, ((Elf64_Ehdr *) ehdr)->e_shstrndx);
|
|
||||||
} else {
|
|
||||||
scn = elf_getscn(elf, ((Elf32_Ehdr *) ehdr)->e_shstrndx);
|
|
||||||
}
|
|
||||||
if (scn == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the section header string table */
|
|
||||||
shstrtab = elf_getdata(scn, NULL);
|
|
||||||
if (shstrtab == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
fix_count = 0;
|
|
||||||
|
|
||||||
/* traverse the sections of the input file */
|
|
||||||
for (i = 1, scn = NULL; scn = elf_nextscn(elf, scn); i++) {
|
|
||||||
int has_flag_set; /* is SHF_ALLOC flag set? */
|
|
||||||
int is_empty; /* is section empty? */
|
|
||||||
char * name; /* short hand pointer */
|
|
||||||
|
|
||||||
/* get the section header */
|
|
||||||
if (is_elfclass64) {
|
|
||||||
shdr = elf64_getshdr(scn);
|
|
||||||
} else {
|
|
||||||
shdr = elf32_getshdr(scn);
|
|
||||||
}
|
|
||||||
if (shdr == NULL) {
|
|
||||||
failure();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_elfclass64) {
|
|
||||||
name = (char *)shstrtab->d_buf + ((Elf64_Shdr *) shdr)->sh_name;
|
|
||||||
} else {
|
|
||||||
name = (char *)shstrtab->d_buf + ((Elf32_Shdr *) shdr)->sh_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_elfclass64) {
|
|
||||||
has_flag_set = ((Elf64_Shdr *) shdr)->sh_flags & SHF_ALLOC;
|
|
||||||
is_empty = ((Elf64_Shdr *) shdr)->sh_addr == 0 &&
|
|
||||||
((Elf64_Shdr *) shdr)->sh_size == 0;
|
|
||||||
} else {
|
|
||||||
has_flag_set = ((Elf32_Shdr *) shdr)->sh_flags & SHF_ALLOC;
|
|
||||||
is_empty = ((Elf32_Shdr *) shdr)->sh_addr == 0 &&
|
|
||||||
((Elf32_Shdr *) shdr)->sh_size == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_empty && has_flag_set) {
|
|
||||||
(void) printf("section[%u] '%s' is empty, "
|
|
||||||
"but SHF_ALLOC flag is set.\n", i, name);
|
|
||||||
(void) printf("Clearing the SHF_ALLOC flag.\n");
|
|
||||||
|
|
||||||
if (is_elfclass64) {
|
|
||||||
((Elf64_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC;
|
|
||||||
} else {
|
|
||||||
((Elf32_Shdr *) shdr)->sh_flags &= ~SHF_ALLOC;
|
|
||||||
}
|
|
||||||
fix_count++;
|
|
||||||
}
|
|
||||||
} /* end for each ELF section */
|
|
||||||
|
|
||||||
if (fix_count > 0) {
|
|
||||||
(void) printf("Saving %d updates to '%s'\n", fix_count, elf_obj);
|
|
||||||
(void) fflush(stdout);
|
|
||||||
(void) elf_update(elf, ELF_C_NULL); /* recalc ELF memory structures */
|
|
||||||
(void) elf_update(elf, ELF_C_WRITE); /* write out changes to ELF obj */
|
|
||||||
} else {
|
|
||||||
(void) printf("No SHF_ALLOC flags needed to be cleared.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) elf_end(elf); /* done with ELF obj */
|
|
||||||
(void) close(fd);
|
|
||||||
|
|
||||||
(void) printf("Done %s '%s'\n",
|
|
||||||
(fix_count > 0) ? "updating" : "with", elf_obj);
|
|
||||||
(void) fflush(stdout);
|
|
||||||
exit(0);
|
|
||||||
} /* end main */
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
failure() {
|
|
||||||
(void) fprintf(stderr, "%s\n", elf_errmsg(elf_errno()));
|
|
||||||
exit(6);
|
|
||||||
}
|
|
@ -506,7 +506,7 @@ static bool assign_distribution(processorid_t* id_array,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (available_id != NULL) {
|
if (available_id != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(bool, available_id, mtInternal);
|
FREE_C_HEAP_ARRAY(bool, available_id);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -538,7 +538,7 @@ bool os::distribute_processes(uint length, uint* distribution) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (id_array != NULL) {
|
if (id_array != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(processorid_t, id_array, mtInternal);
|
FREE_C_HEAP_ARRAY(processorid_t, id_array);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -609,17 +609,15 @@ void os::init_system_properties_values() {
|
|||||||
// Base path of extensions installed on the system.
|
// Base path of extensions installed on the system.
|
||||||
#define SYS_EXT_DIR "/usr/jdk/packages"
|
#define SYS_EXT_DIR "/usr/jdk/packages"
|
||||||
#define EXTENSIONS_DIR "/lib/ext"
|
#define EXTENSIONS_DIR "/lib/ext"
|
||||||
#define ENDORSED_DIR "/lib/endorsed"
|
|
||||||
|
|
||||||
char cpu_arch[12];
|
char cpu_arch[12];
|
||||||
// Buffer that fits several sprintfs.
|
// Buffer that fits several sprintfs.
|
||||||
// Note that the space for the colon and the trailing null are provided
|
// Note that the space for the colon and the trailing null are provided
|
||||||
// by the nulls included by the sizeof operator.
|
// by the nulls included by the sizeof operator.
|
||||||
const size_t bufsize =
|
const size_t bufsize =
|
||||||
MAX4((size_t)MAXPATHLEN, // For dll_dir & friends.
|
MAX3((size_t)MAXPATHLEN, // For dll_dir & friends.
|
||||||
sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch), // invariant ld_library_path
|
sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch), // invariant ld_library_path
|
||||||
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR), // extensions dir
|
(size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR)); // extensions dir
|
||||||
(size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir
|
|
||||||
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal);
|
||||||
|
|
||||||
// sysclasspath, java_home, dll_dir
|
// sysclasspath, java_home, dll_dir
|
||||||
@ -675,7 +673,7 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
// Determine search path count and required buffer size.
|
// Determine search path count and required buffer size.
|
||||||
if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) {
|
if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) {
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, buf);
|
||||||
vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror());
|
vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -686,8 +684,8 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
// Obtain search path information.
|
// Obtain search path information.
|
||||||
if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) {
|
if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) {
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, buf);
|
||||||
FREE_C_HEAP_ARRAY(char, info, mtInternal);
|
FREE_C_HEAP_ARRAY(char, info);
|
||||||
vm_exit_during_initialization("dlinfo SERINFO request", dlerror());
|
vm_exit_during_initialization("dlinfo SERINFO request", dlerror());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -757,23 +755,18 @@ void os::init_system_properties_values() {
|
|||||||
// Callee copies into its own buffer.
|
// Callee copies into its own buffer.
|
||||||
Arguments::set_library_path(library_path);
|
Arguments::set_library_path(library_path);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, library_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, library_path);
|
||||||
FREE_C_HEAP_ARRAY(char, info, mtInternal);
|
FREE_C_HEAP_ARRAY(char, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extensions directories.
|
// Extensions directories.
|
||||||
sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
|
sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home());
|
||||||
Arguments::set_ext_dirs(buf);
|
Arguments::set_ext_dirs(buf);
|
||||||
|
|
||||||
// Endorsed standards default directory.
|
FREE_C_HEAP_ARRAY(char, buf);
|
||||||
sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home());
|
|
||||||
Arguments::set_endorsed_dirs(buf);
|
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
|
||||||
|
|
||||||
#undef SYS_EXT_DIR
|
#undef SYS_EXT_DIR
|
||||||
#undef EXTENSIONS_DIR
|
#undef EXTENSIONS_DIR
|
||||||
#undef ENDORSED_DIR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void os::breakpoint() {
|
void os::breakpoint() {
|
||||||
@ -1599,11 +1592,11 @@ bool os::dll_build_name(char* buffer, size_t buflen,
|
|||||||
// release the storage
|
// release the storage
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
if (pelements[i] != NULL) {
|
if (pelements[i] != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
|
FREE_C_HEAP_ARRAY(char, pelements[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pelements != NULL) {
|
if (pelements != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
|
FREE_C_HEAP_ARRAY(char*, pelements);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
|
snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
|
||||||
@ -3167,6 +3160,15 @@ size_t os::read(int fd, void *buf, unsigned int nBytes) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
|
||||||
|
size_t res;
|
||||||
|
JavaThread* thread = (JavaThread*)Thread::current();
|
||||||
|
assert(thread->thread_state() == _thread_in_vm, "Assumed _thread_in_vm");
|
||||||
|
ThreadBlockInVM tbiv(thread);
|
||||||
|
RESTARTABLE(::pread(fd, buf, (size_t) nBytes, offset), res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) {
|
size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) {
|
||||||
size_t res;
|
size_t res;
|
||||||
assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_native,
|
assert(((JavaThread*)Thread::current())->thread_state() == _thread_in_native,
|
||||||
@ -4681,7 +4683,7 @@ jint os::init_2(void) {
|
|||||||
size_t lgrp_limit = os::numa_get_groups_num();
|
size_t lgrp_limit = os::numa_get_groups_num();
|
||||||
int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtInternal);
|
int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit, mtInternal);
|
||||||
size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
|
size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit);
|
||||||
FREE_C_HEAP_ARRAY(int, lgrp_ids, mtInternal);
|
FREE_C_HEAP_ARRAY(int, lgrp_ids);
|
||||||
if (lgrp_num < 2) {
|
if (lgrp_num < 2) {
|
||||||
// There's only one locality group, disable NUMA.
|
// There's only one locality group, disable NUMA.
|
||||||
UseNUMA = false;
|
UseNUMA = false;
|
||||||
|
@ -129,7 +129,7 @@ static void save_memory_to_file(char* addr, size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
|
FREE_C_HEAP_ARRAY(char, destfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -270,14 +270,14 @@ static char* get_user_name(uid_t uid) {
|
|||||||
"pw_name zero length");
|
"pw_name zero length");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal);
|
||||||
strcpy(user_name, p->pw_name);
|
strcpy(user_name, p->pw_name);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pwbuf);
|
||||||
return user_name;
|
return user_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,7 +338,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
DIR* subdirp = os::opendir(usrdir_name);
|
DIR* subdirp = os::opendir(usrdir_name);
|
||||||
|
|
||||||
if (subdirp == NULL) {
|
if (subdirp == NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,7 +349,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// symlink can be exploited.
|
// symlink can be exploited.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(usrdir_name)) {
|
if (!is_directory_secure(usrdir_name)) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -373,13 +373,13 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
// don't follow symbolic links for the file
|
// don't follow symbolic links for the file
|
||||||
RESTARTABLE(::lstat(filename, &statbuf), result);
|
RESTARTABLE(::lstat(filename, &statbuf), result);
|
||||||
if (result == OS_ERR) {
|
if (result == OS_ERR) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip over files that are not regular files.
|
// skip over files that are not regular files.
|
||||||
if (!S_ISREG(statbuf.st_mode)) {
|
if (!S_ISREG(statbuf.st_mode)) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -389,7 +389,7 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
if (statbuf.st_ctime > oldest_ctime) {
|
if (statbuf.st_ctime > oldest_ctime) {
|
||||||
char* user = strchr(dentry->d_name, '_') + 1;
|
char* user = strchr(dentry->d_name, '_') + 1;
|
||||||
|
|
||||||
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal);
|
if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user);
|
||||||
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
||||||
|
|
||||||
strcpy(oldest_user, user);
|
strcpy(oldest_user, user);
|
||||||
@ -397,15 +397,15 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, udbuf);
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
}
|
}
|
||||||
os::closedir(tmpdirp);
|
os::closedir(tmpdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, tdbuf);
|
||||||
|
|
||||||
return(oldest_user);
|
return(oldest_user);
|
||||||
}
|
}
|
||||||
@ -461,7 +461,7 @@ static char* get_user_name(int vmid, TRAPS) {
|
|||||||
// since the structured procfs and old procfs interfaces can't be
|
// since the structured procfs and old procfs interfaces can't be
|
||||||
// mixed, we attempt to find the file through a directory search.
|
// mixed, we attempt to find the file through a directory search.
|
||||||
|
|
||||||
return get_user_name_slow(vmid, CHECK_NULL);
|
return get_user_name_slow(vmid, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the file name of the backing store file for the named
|
// return the file name of the backing store file for the named
|
||||||
@ -520,7 +520,7 @@ static void remove_file(const char* dirname, const char* filename) {
|
|||||||
|
|
||||||
remove_file(path);
|
remove_file(path);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -597,7 +597,7 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
|||||||
errno = 0;
|
errno = 0;
|
||||||
}
|
}
|
||||||
os::closedir(dirp);
|
os::closedir(dirp);
|
||||||
FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// make the user specific temporary directory. Returns true if
|
// make the user specific temporary directory. Returns true if
|
||||||
@ -742,11 +742,11 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
|
|
||||||
fd = create_sharedmem_resources(dirname, filename, size);
|
fd = create_sharedmem_resources(dirname, filename, size);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, user_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, user_name);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -760,7 +760,7 @@ static char* mmap_create_shared(size_t size) {
|
|||||||
warning("mmap failed - %s\n", strerror(errno));
|
warning("mmap failed - %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
remove_file(filename);
|
remove_file(filename);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -890,9 +890,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
// store file, we don't follow them when attaching either.
|
// store file, we don't follow them when attaching either.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(dirname)) {
|
if (!is_directory_secure(dirname)) {
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
if (luser != user) {
|
if (luser != user) {
|
||||||
FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
FREE_C_HEAP_ARRAY(char, luser);
|
||||||
}
|
}
|
||||||
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
||||||
"Process not found");
|
"Process not found");
|
||||||
@ -908,9 +908,9 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
|||||||
strcpy(rfilename, filename);
|
strcpy(rfilename, filename);
|
||||||
|
|
||||||
// free the c heap resources that are no longer needed
|
// free the c heap resources that are no longer needed
|
||||||
if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
|
|
||||||
// open the shared memory file for the give vmid
|
// open the shared memory file for the give vmid
|
||||||
fd = open_sharedmem_file(rfilename, file_flags, THREAD);
|
fd = open_sharedmem_file(rfilename, file_flags, THREAD);
|
||||||
|
@ -211,7 +211,7 @@ void os::init_system_properties_values() {
|
|||||||
}
|
}
|
||||||
strcpy(home_path, home_dir);
|
strcpy(home_path, home_dir);
|
||||||
Arguments::set_java_home(home_path);
|
Arguments::set_java_home(home_path);
|
||||||
FREE_C_HEAP_ARRAY(char, home_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, home_path);
|
||||||
|
|
||||||
dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1,
|
dll_path = NEW_C_HEAP_ARRAY(char, strlen(home_dir) + strlen(bin) + 1,
|
||||||
mtInternal);
|
mtInternal);
|
||||||
@ -221,7 +221,7 @@ void os::init_system_properties_values() {
|
|||||||
strcpy(dll_path, home_dir);
|
strcpy(dll_path, home_dir);
|
||||||
strcat(dll_path, bin);
|
strcat(dll_path, bin);
|
||||||
Arguments::set_dll_dir(dll_path);
|
Arguments::set_dll_dir(dll_path);
|
||||||
FREE_C_HEAP_ARRAY(char, dll_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dll_path);
|
||||||
|
|
||||||
if (!set_boot_path('\\', ';')) {
|
if (!set_boot_path('\\', ';')) {
|
||||||
return;
|
return;
|
||||||
@ -276,7 +276,7 @@ void os::init_system_properties_values() {
|
|||||||
strcat(library_path, ";.");
|
strcat(library_path, ";.");
|
||||||
|
|
||||||
Arguments::set_library_path(library_path);
|
Arguments::set_library_path(library_path);
|
||||||
FREE_C_HEAP_ARRAY(char, library_path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, library_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default extensions directory
|
// Default extensions directory
|
||||||
@ -292,19 +292,6 @@ void os::init_system_properties_values() {
|
|||||||
#undef BIN_DIR
|
#undef BIN_DIR
|
||||||
#undef PACKAGE_DIR
|
#undef PACKAGE_DIR
|
||||||
|
|
||||||
// Default endorsed standards directory.
|
|
||||||
{
|
|
||||||
#define ENDORSED_DIR "\\lib\\endorsed"
|
|
||||||
size_t len = strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR);
|
|
||||||
char * buf = NEW_C_HEAP_ARRAY(char, len, mtInternal);
|
|
||||||
sprintf(buf, "%s%s", Arguments::get_java_home(), ENDORSED_DIR);
|
|
||||||
Arguments::set_endorsed_dirs(buf);
|
|
||||||
// (Arguments::set_endorsed_dirs() calls SystemProperty::set_value(), which
|
|
||||||
// duplicates the input.)
|
|
||||||
FREE_C_HEAP_ARRAY(char, buf, mtInternal);
|
|
||||||
#undef ENDORSED_DIR
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef _WIN64
|
#ifndef _WIN64
|
||||||
// set our UnhandledExceptionFilter and save any previous one
|
// set our UnhandledExceptionFilter and save any previous one
|
||||||
prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception);
|
prev_uef_handler = SetUnhandledExceptionFilter(Handle_FLT_Exception);
|
||||||
@ -1136,7 +1123,7 @@ DIR * os::opendir(const char *dirname) {
|
|||||||
|
|
||||||
dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
|
dirp->path = (char *)malloc(strlen(dirname) + 5, mtInternal);
|
||||||
if (dirp->path == 0) {
|
if (dirp->path == 0) {
|
||||||
free(dirp, mtInternal);
|
free(dirp);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1144,13 +1131,13 @@ DIR * os::opendir(const char *dirname) {
|
|||||||
|
|
||||||
fattr = GetFileAttributes(dirp->path);
|
fattr = GetFileAttributes(dirp->path);
|
||||||
if (fattr == 0xffffffff) {
|
if (fattr == 0xffffffff) {
|
||||||
free(dirp->path, mtInternal);
|
free(dirp->path);
|
||||||
free(dirp, mtInternal);
|
free(dirp);
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
return 0;
|
return 0;
|
||||||
} else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
|
} else if ((fattr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
|
||||||
free(dirp->path, mtInternal);
|
free(dirp->path);
|
||||||
free(dirp, mtInternal);
|
free(dirp);
|
||||||
errno = ENOTDIR;
|
errno = ENOTDIR;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1168,8 +1155,8 @@ DIR * os::opendir(const char *dirname) {
|
|||||||
dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
|
dirp->handle = FindFirstFile(dirp->path, &dirp->find_data);
|
||||||
if (dirp->handle == INVALID_HANDLE_VALUE) {
|
if (dirp->handle == INVALID_HANDLE_VALUE) {
|
||||||
if (GetLastError() != ERROR_FILE_NOT_FOUND) {
|
if (GetLastError() != ERROR_FILE_NOT_FOUND) {
|
||||||
free(dirp->path, mtInternal);
|
free(dirp->path);
|
||||||
free(dirp, mtInternal);
|
free(dirp);
|
||||||
errno = EACCES;
|
errno = EACCES;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1207,8 +1194,8 @@ int os::closedir(DIR *dirp) {
|
|||||||
}
|
}
|
||||||
dirp->handle = INVALID_HANDLE_VALUE;
|
dirp->handle = INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
free(dirp->path, mtInternal);
|
free(dirp->path);
|
||||||
free(dirp, mtInternal);
|
free(dirp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1275,11 +1262,11 @@ bool os::dll_build_name(char *buffer, size_t buflen,
|
|||||||
// release the storage
|
// release the storage
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
if (pelements[i] != NULL) {
|
if (pelements[i] != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
|
FREE_C_HEAP_ARRAY(char, pelements[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pelements != NULL) {
|
if (pelements != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char*, pelements, mtInternal);
|
FREE_C_HEAP_ARRAY(char*, pelements);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
|
jio_snprintf(buffer, buflen, "%s\\%s.dll", pname, fname);
|
||||||
@ -2745,7 +2732,7 @@ class NUMANodeListHolder {
|
|||||||
|
|
||||||
void free_node_list() {
|
void free_node_list() {
|
||||||
if (_numa_used_node_list != NULL) {
|
if (_numa_used_node_list != NULL) {
|
||||||
FREE_C_HEAP_ARRAY(int, _numa_used_node_list, mtInternal);
|
FREE_C_HEAP_ARRAY(int, _numa_used_node_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3781,8 +3768,8 @@ HINSTANCE os::win32::load_Windows_dll(const char* name, char *ebuf,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_EXIT_HANDLES 16
|
#define MAX_EXIT_HANDLES PRODUCT_ONLY(32) NOT_PRODUCT(128)
|
||||||
#define EXIT_TIMEOUT 1000 /* 1 sec */
|
#define EXIT_TIMEOUT PRODUCT_ONLY(1000) NOT_PRODUCT(4000) /* 1 sec in product, 4 sec in debug */
|
||||||
|
|
||||||
static BOOL CALLBACK init_crit_sect_call(PINIT_ONCE, PVOID pcrit_sect, PVOID*) {
|
static BOOL CALLBACK init_crit_sect_call(PINIT_ONCE, PVOID pcrit_sect, PVOID*) {
|
||||||
InitializeCriticalSection((CRITICAL_SECTION*)pcrit_sect);
|
InitializeCriticalSection((CRITICAL_SECTION*)pcrit_sect);
|
||||||
@ -3833,6 +3820,9 @@ int os::win32::exit_process_or_thread(Ept what, int exit_code) {
|
|||||||
// If there's no free slot in the array of the kept handles, we'll have to
|
// If there's no free slot in the array of the kept handles, we'll have to
|
||||||
// wait until at least one thread completes exiting.
|
// wait until at least one thread completes exiting.
|
||||||
if ((handle_count = j) == MAX_EXIT_HANDLES) {
|
if ((handle_count = j) == MAX_EXIT_HANDLES) {
|
||||||
|
// Raise the priority of the oldest exiting thread to increase its chances
|
||||||
|
// to complete sooner.
|
||||||
|
SetThreadPriority(handles[0], THREAD_PRIORITY_ABOVE_NORMAL);
|
||||||
res = WaitForMultipleObjects(MAX_EXIT_HANDLES, handles, FALSE, EXIT_TIMEOUT);
|
res = WaitForMultipleObjects(MAX_EXIT_HANDLES, handles, FALSE, EXIT_TIMEOUT);
|
||||||
if (res >= WAIT_OBJECT_0 && res < (WAIT_OBJECT_0 + MAX_EXIT_HANDLES)) {
|
if (res >= WAIT_OBJECT_0 && res < (WAIT_OBJECT_0 + MAX_EXIT_HANDLES)) {
|
||||||
i = (res - WAIT_OBJECT_0);
|
i = (res - WAIT_OBJECT_0);
|
||||||
@ -3841,7 +3831,8 @@ int os::win32::exit_process_or_thread(Ept what, int exit_code) {
|
|||||||
handles[i] = handles[i + 1];
|
handles[i] = handles[i + 1];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
warning("WaitForMultipleObjects failed in %s: %d\n", __FILE__, __LINE__);
|
warning("WaitForMultipleObjects %s in %s: %d\n",
|
||||||
|
(res == WAIT_FAILED ? "failed" : "timed out"), __FILE__, __LINE__);
|
||||||
// Don't keep handles, if we failed waiting for them.
|
// Don't keep handles, if we failed waiting for them.
|
||||||
for (i = 0; i < MAX_EXIT_HANDLES; ++i) {
|
for (i = 0; i < MAX_EXIT_HANDLES; ++i) {
|
||||||
CloseHandle(handles[i]);
|
CloseHandle(handles[i]);
|
||||||
@ -3867,9 +3858,20 @@ int os::win32::exit_process_or_thread(Ept what, int exit_code) {
|
|||||||
if (handle_count > 0) {
|
if (handle_count > 0) {
|
||||||
// Before ending the process, make sure all the threads that had called
|
// Before ending the process, make sure all the threads that had called
|
||||||
// _endthreadex() completed.
|
// _endthreadex() completed.
|
||||||
|
|
||||||
|
// Set the priority level of the current thread to the same value as
|
||||||
|
// the priority level of exiting threads.
|
||||||
|
// This is to ensure it will be given a fair chance to execute if
|
||||||
|
// the timeout expires.
|
||||||
|
hthr = GetCurrentThread();
|
||||||
|
SetThreadPriority(hthr, THREAD_PRIORITY_ABOVE_NORMAL);
|
||||||
|
for (i = 0; i < handle_count; ++i) {
|
||||||
|
SetThreadPriority(handles[i], THREAD_PRIORITY_ABOVE_NORMAL);
|
||||||
|
}
|
||||||
res = WaitForMultipleObjects(handle_count, handles, TRUE, EXIT_TIMEOUT);
|
res = WaitForMultipleObjects(handle_count, handles, TRUE, EXIT_TIMEOUT);
|
||||||
if (res == WAIT_FAILED) {
|
if (res < WAIT_OBJECT_0 || res >= (WAIT_OBJECT_0 + MAX_EXIT_HANDLES)) {
|
||||||
warning("WaitForMultipleObjects failed in %s: %d\n", __FILE__, __LINE__);
|
warning("WaitForMultipleObjects %s in %s: %d\n",
|
||||||
|
(res == WAIT_FAILED ? "failed" : "timed out"), __FILE__, __LINE__);
|
||||||
}
|
}
|
||||||
for (i = 0; i < handle_count; ++i) {
|
for (i = 0; i < handle_count; ++i) {
|
||||||
CloseHandle(handles[i]);
|
CloseHandle(handles[i]);
|
||||||
@ -4376,6 +4378,23 @@ jlong os::lseek(int fd, jlong offset, int whence) {
|
|||||||
return (jlong) ::_lseeki64(fd, offset, whence);
|
return (jlong) ::_lseeki64(fd, offset, whence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t os::read_at(int fd, void *buf, unsigned int nBytes, jlong offset) {
|
||||||
|
OVERLAPPED ov;
|
||||||
|
DWORD nread;
|
||||||
|
BOOL result;
|
||||||
|
|
||||||
|
ZeroMemory(&ov, sizeof(ov));
|
||||||
|
ov.Offset = (DWORD)offset;
|
||||||
|
ov.OffsetHigh = (DWORD)(offset >> 32);
|
||||||
|
|
||||||
|
HANDLE h = (HANDLE)::_get_osfhandle(fd);
|
||||||
|
|
||||||
|
result = ReadFile(h, (LPVOID)buf, nBytes, &nread, &ov);
|
||||||
|
|
||||||
|
return result ? nread : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// This method is a slightly reworked copy of JDK's sysNativePath
|
// This method is a slightly reworked copy of JDK's sysNativePath
|
||||||
// from src/windows/hpi/src/path_md.c
|
// from src/windows/hpi/src/path_md.c
|
||||||
|
|
||||||
@ -4627,7 +4646,7 @@ static int stdinAvailable(int fd, long *pbytes) {
|
|||||||
|
|
||||||
error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
|
error = ::PeekConsoleInput(han, lpBuffer, numEvents, &numEventsRead);
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
os::free(lpBuffer, mtInternal);
|
os::free(lpBuffer);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4648,7 +4667,7 @@ static int stdinAvailable(int fd, long *pbytes) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lpBuffer != NULL) {
|
if (lpBuffer != NULL) {
|
||||||
os::free(lpBuffer, mtInternal);
|
os::free(lpBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
*pbytes = (long) actualLength;
|
*pbytes = (long) actualLength;
|
||||||
|
@ -122,7 +122,7 @@ static void save_memory_to_file(char* addr, size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, destfile, mtInternal);
|
FREE_C_HEAP_ARRAY(char, destfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shared Memory Implementation Details
|
// Shared Memory Implementation Details
|
||||||
@ -335,7 +335,7 @@ static char* get_user_name_slow(int vmid) {
|
|||||||
DIR* subdirp = os::opendir(usrdir_name);
|
DIR* subdirp = os::opendir(usrdir_name);
|
||||||
|
|
||||||
if (subdirp == NULL) {
|
if (subdirp == NULL) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,7 +346,7 @@ static char* get_user_name_slow(int vmid) {
|
|||||||
// symlink can be exploited.
|
// symlink can be exploited.
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(usrdir_name)) {
|
if (!is_directory_secure(usrdir_name)) {
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -367,13 +367,13 @@ static char* get_user_name_slow(int vmid) {
|
|||||||
strcat(filename, udentry->d_name);
|
strcat(filename, udentry->d_name);
|
||||||
|
|
||||||
if (::stat(filename, &statbuf) == OS_ERR) {
|
if (::stat(filename, &statbuf) == OS_ERR) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip over files that are not regular files.
|
// skip over files that are not regular files.
|
||||||
if ((statbuf.st_mode & S_IFMT) != S_IFREG) {
|
if ((statbuf.st_mode & S_IFMT) != S_IFREG) {
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,22 +395,22 @@ static char* get_user_name_slow(int vmid) {
|
|||||||
if (statbuf.st_ctime > latest_ctime) {
|
if (statbuf.st_ctime > latest_ctime) {
|
||||||
char* user = strchr(dentry->d_name, '_') + 1;
|
char* user = strchr(dentry->d_name, '_') + 1;
|
||||||
|
|
||||||
if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user, mtInternal);
|
if (latest_user != NULL) FREE_C_HEAP_ARRAY(char, latest_user);
|
||||||
latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
latest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal);
|
||||||
|
|
||||||
strcpy(latest_user, user);
|
strcpy(latest_user, user);
|
||||||
latest_ctime = statbuf.st_ctime;
|
latest_ctime = statbuf.st_ctime;
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os::closedir(subdirp);
|
os::closedir(subdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, udbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, udbuf);
|
||||||
FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal);
|
FREE_C_HEAP_ARRAY(char, usrdir_name);
|
||||||
}
|
}
|
||||||
os::closedir(tmpdirp);
|
os::closedir(tmpdirp);
|
||||||
FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, tdbuf);
|
||||||
|
|
||||||
return(latest_user);
|
return(latest_user);
|
||||||
}
|
}
|
||||||
@ -502,7 +502,7 @@ static void remove_file(const char* dirname, const char* filename) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, path, mtInternal);
|
FREE_C_HEAP_ARRAY(char, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns true if the process represented by pid is alive, otherwise
|
// returns true if the process represented by pid is alive, otherwise
|
||||||
@ -683,7 +683,7 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
|||||||
errno = 0;
|
errno = 0;
|
||||||
}
|
}
|
||||||
os::closedir(dirp);
|
os::closedir(dirp);
|
||||||
FREE_C_HEAP_ARRAY(char, dbuf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a file mapping object with the requested name, and size
|
// create a file mapping object with the requested name, and size
|
||||||
@ -749,11 +749,11 @@ static void free_security_desc(PSECURITY_DESCRIPTOR pSD) {
|
|||||||
// be an ACL we enlisted. free the resources.
|
// be an ACL we enlisted. free the resources.
|
||||||
//
|
//
|
||||||
if (success && exists && pACL != NULL && !isdefault) {
|
if (success && exists && pACL != NULL && !isdefault) {
|
||||||
FREE_C_HEAP_ARRAY(char, pACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pACL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// free the security descriptor
|
// free the security descriptor
|
||||||
FREE_C_HEAP_ARRAY(char, pSD, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pSD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -768,7 +768,7 @@ static void free_security_attr(LPSECURITY_ATTRIBUTES lpSA) {
|
|||||||
lpSA->lpSecurityDescriptor = NULL;
|
lpSA->lpSecurityDescriptor = NULL;
|
||||||
|
|
||||||
// free the security attributes structure
|
// free the security attributes structure
|
||||||
FREE_C_HEAP_ARRAY(char, lpSA, mtInternal);
|
FREE_C_HEAP_ARRAY(char, lpSA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -815,7 +815,7 @@ static PSID get_user_sid(HANDLE hProcess) {
|
|||||||
warning("GetTokenInformation failure: lasterror = %d,"
|
warning("GetTokenInformation failure: lasterror = %d,"
|
||||||
" rsize = %d\n", GetLastError(), rsize);
|
" rsize = %d\n", GetLastError(), rsize);
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, token_buf);
|
||||||
CloseHandle(hAccessToken);
|
CloseHandle(hAccessToken);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -828,15 +828,15 @@ static PSID get_user_sid(HANDLE hProcess) {
|
|||||||
warning("GetTokenInformation failure: lasterror = %d,"
|
warning("GetTokenInformation failure: lasterror = %d,"
|
||||||
" rsize = %d\n", GetLastError(), rsize);
|
" rsize = %d\n", GetLastError(), rsize);
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, token_buf);
|
||||||
FREE_C_HEAP_ARRAY(char, pSID, mtInternal);
|
FREE_C_HEAP_ARRAY(char, pSID);
|
||||||
CloseHandle(hAccessToken);
|
CloseHandle(hAccessToken);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// close the access token.
|
// close the access token.
|
||||||
CloseHandle(hAccessToken);
|
CloseHandle(hAccessToken);
|
||||||
FREE_C_HEAP_ARRAY(char, token_buf, mtInternal);
|
FREE_C_HEAP_ARRAY(char, token_buf);
|
||||||
|
|
||||||
return pSID;
|
return pSID;
|
||||||
}
|
}
|
||||||
@ -920,7 +920,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
if (PrintMiscellaneous && Verbose) {
|
if (PrintMiscellaneous && Verbose) {
|
||||||
warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
|
warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,7 +933,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
if (PrintMiscellaneous && Verbose) {
|
if (PrintMiscellaneous && Verbose) {
|
||||||
warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
|
warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (((ACCESS_ALLOWED_ACE *)ace)->Header.AceFlags && INHERITED_ACE) {
|
if (((ACCESS_ALLOWED_ACE *)ace)->Header.AceFlags && INHERITED_ACE) {
|
||||||
@ -960,7 +960,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
if (PrintMiscellaneous && Verbose) {
|
if (PrintMiscellaneous && Verbose) {
|
||||||
warning("AddAce failure: lasterror = %d \n", GetLastError());
|
warning("AddAce failure: lasterror = %d \n", GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -976,7 +976,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
warning("AddAccessAllowedAce failure: lasterror = %d \n",
|
warning("AddAccessAllowedAce failure: lasterror = %d \n",
|
||||||
GetLastError());
|
GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -991,7 +991,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
if (PrintMiscellaneous && Verbose) {
|
if (PrintMiscellaneous && Verbose) {
|
||||||
warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
|
warning("InitializeAcl failure: lasterror = %d \n", GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace,
|
if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace,
|
||||||
@ -999,7 +999,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
if (PrintMiscellaneous && Verbose) {
|
if (PrintMiscellaneous && Verbose) {
|
||||||
warning("AddAce failure: lasterror = %d \n", GetLastError());
|
warning("AddAce failure: lasterror = %d \n", GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ace_index++;
|
ace_index++;
|
||||||
@ -1012,7 +1012,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
warning("SetSecurityDescriptorDacl failure:"
|
warning("SetSecurityDescriptorDacl failure:"
|
||||||
" lasterror = %d \n", GetLastError());
|
" lasterror = %d \n", GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1032,7 +1032,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD,
|
|||||||
warning("SetSecurityDescriptorControl failure:"
|
warning("SetSecurityDescriptorControl failure:"
|
||||||
" lasterror = %d \n", GetLastError());
|
" lasterror = %d \n", GetLastError());
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, newACL, mtInternal);
|
FREE_C_HEAP_ARRAY(char, newACL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1149,7 +1149,7 @@ static LPSECURITY_ATTRIBUTES make_user_everybody_admin_security_attr(
|
|||||||
// create a security attributes structure with access control
|
// create a security attributes structure with access control
|
||||||
// entries as initialized above.
|
// entries as initialized above.
|
||||||
LPSECURITY_ATTRIBUTES lpSA = make_security_attr(aces, 3);
|
LPSECURITY_ATTRIBUTES lpSA = make_security_attr(aces, 3);
|
||||||
FREE_C_HEAP_ARRAY(char, aces[0].pSid, mtInternal);
|
FREE_C_HEAP_ARRAY(char, aces[0].pSid);
|
||||||
FreeSid(everybodySid);
|
FreeSid(everybodySid);
|
||||||
FreeSid(administratorsSid);
|
FreeSid(administratorsSid);
|
||||||
return(lpSA);
|
return(lpSA);
|
||||||
@ -1464,15 +1464,15 @@ static char* mapping_create_shared(size_t size) {
|
|||||||
assert(((size != 0) && (size % os::vm_page_size() == 0)),
|
assert(((size != 0) && (size % os::vm_page_size() == 0)),
|
||||||
"unexpected PerfMemry region size");
|
"unexpected PerfMemry region size");
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, user, mtInternal);
|
FREE_C_HEAP_ARRAY(char, user);
|
||||||
|
|
||||||
// create the shared memory resources
|
// create the shared memory resources
|
||||||
sharedmem_fileMapHandle =
|
sharedmem_fileMapHandle =
|
||||||
create_sharedmem_resources(dirname, filename, objectname, size);
|
create_sharedmem_resources(dirname, filename, objectname, size);
|
||||||
|
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
FREE_C_HEAP_ARRAY(char, objectname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, objectname);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
|
|
||||||
if (sharedmem_fileMapHandle == NULL) {
|
if (sharedmem_fileMapHandle == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1627,7 +1627,7 @@ static void open_file_mapping(const char* user, int vmid,
|
|||||||
// store file, we also don't following them when attaching
|
// store file, we also don't following them when attaching
|
||||||
//
|
//
|
||||||
if (!is_directory_secure(dirname)) {
|
if (!is_directory_secure(dirname)) {
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
|
||||||
"Process not found");
|
"Process not found");
|
||||||
}
|
}
|
||||||
@ -1646,10 +1646,10 @@ static void open_file_mapping(const char* user, int vmid,
|
|||||||
strcpy(robjectname, objectname);
|
strcpy(robjectname, objectname);
|
||||||
|
|
||||||
// free the c heap resources that are no longer needed
|
// free the c heap resources that are no longer needed
|
||||||
if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal);
|
if (luser != user) FREE_C_HEAP_ARRAY(char, luser);
|
||||||
FREE_C_HEAP_ARRAY(char, dirname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, dirname);
|
||||||
FREE_C_HEAP_ARRAY(char, filename, mtInternal);
|
FREE_C_HEAP_ARRAY(char, filename);
|
||||||
FREE_C_HEAP_ARRAY(char, objectname, mtInternal);
|
FREE_C_HEAP_ARRAY(char, objectname);
|
||||||
|
|
||||||
if (*sizep == 0) {
|
if (*sizep == 0) {
|
||||||
size = sharedmem_filesize(rfilename, CHECK);
|
size = sharedmem_filesize(rfilename, CHECK);
|
||||||
|
@ -88,6 +88,15 @@ inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* des
|
|||||||
return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
|
return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
|
||||||
|
inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
||||||
|
int mp = os::is_MP();
|
||||||
|
__asm__ volatile (LOCK_IF_MP(%4) "cmpxchgb %1,(%3)"
|
||||||
|
: "=a" (exchange_value)
|
||||||
|
: "q" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
|
||||||
|
: "cc", "memory");
|
||||||
|
return exchange_value;
|
||||||
|
}
|
||||||
|
|
||||||
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
||||||
int mp = os::is_MP();
|
int mp = os::is_MP();
|
||||||
|
@ -88,6 +88,15 @@ inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* des
|
|||||||
return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
|
return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
|
||||||
|
inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
||||||
|
int mp = os::is_MP();
|
||||||
|
__asm__ volatile (LOCK_IF_MP(%4) "cmpxchgb %1,(%3)"
|
||||||
|
: "=a" (exchange_value)
|
||||||
|
: "q" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
|
||||||
|
: "cc", "memory");
|
||||||
|
return exchange_value;
|
||||||
|
}
|
||||||
|
|
||||||
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
||||||
int mp = os::is_MP();
|
int mp = os::is_MP();
|
||||||
|
@ -542,6 +542,7 @@ JVM_handle_linux_signal(int sig,
|
|||||||
err.report_and_die();
|
err.report_and_die();
|
||||||
|
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
|
return true; // Mute compiler
|
||||||
}
|
}
|
||||||
|
|
||||||
void os::Linux::init_thread_fpu_state(void) {
|
void os::Linux::init_thread_fpu_state(void) {
|
||||||
|
@ -68,6 +68,8 @@ inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest);
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
jint _Atomic_add(jint add_value, volatile jint* dest IS_MP_DECL());
|
jint _Atomic_add(jint add_value, volatile jint* dest IS_MP_DECL());
|
||||||
jint _Atomic_xchg(jint exchange_value, volatile jint* dest);
|
jint _Atomic_xchg(jint exchange_value, volatile jint* dest);
|
||||||
|
jbyte _Atomic_cmpxchg_byte(jbyte exchange_value, volatile jbyte* dest,
|
||||||
|
jbyte compare_value IS_MP_DECL());
|
||||||
jint _Atomic_cmpxchg(jint exchange_value, volatile jint* dest,
|
jint _Atomic_cmpxchg(jint exchange_value, volatile jint* dest,
|
||||||
jint compare_value IS_MP_DECL());
|
jint compare_value IS_MP_DECL());
|
||||||
jlong _Atomic_cmpxchg_long(jlong exchange_value, volatile jlong* dest,
|
jlong _Atomic_cmpxchg_long(jlong exchange_value, volatile jlong* dest,
|
||||||
@ -82,6 +84,11 @@ inline jint Atomic::xchg (jint exchange_value, volatile jint*
|
|||||||
return _Atomic_xchg(exchange_value, dest);
|
return _Atomic_xchg(exchange_value, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
|
||||||
|
inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
||||||
|
return _Atomic_cmpxchg_byte(exchange_value, dest, compare_value IS_MP_ARG());
|
||||||
|
}
|
||||||
|
|
||||||
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
||||||
return _Atomic_cmpxchg(exchange_value, dest, compare_value IS_MP_ARG());
|
return _Atomic_cmpxchg(exchange_value, dest, compare_value IS_MP_ARG());
|
||||||
}
|
}
|
||||||
@ -217,6 +224,15 @@ extern "C" {
|
|||||||
return exchange_value;
|
return exchange_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline jbyte _Atomic_cmpxchg_byte(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value, int mp) {
|
||||||
|
__asm__ volatile (LOCK_IF_MP(%4) "cmpxchgb %1,(%3)"
|
||||||
|
: "=a" (exchange_value)
|
||||||
|
: "q" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
|
||||||
|
: "cc", "memory");
|
||||||
|
return exchange_value;
|
||||||
|
}
|
||||||
|
|
||||||
// This is the interface to the atomic instruction in solaris_i486.s.
|
// This is the interface to the atomic instruction in solaris_i486.s.
|
||||||
jlong _Atomic_cmpxchg_long_gcc(jlong exchange_value, volatile jlong* dest, jlong compare_value, int mp);
|
jlong _Atomic_cmpxchg_long_gcc(jlong exchange_value, volatile jlong* dest, jlong compare_value, int mp);
|
||||||
|
|
||||||
|
@ -76,6 +76,23 @@
|
|||||||
xchgl (%ecx), %eax
|
xchgl (%ecx), %eax
|
||||||
.end
|
.end
|
||||||
|
|
||||||
|
// Support for jbyte Atomic::cmpxchg(jbyte exchange_value,
|
||||||
|
// volatile jbyte *dest,
|
||||||
|
// jbyte compare_value)
|
||||||
|
// An additional bool (os::is_MP()) is passed as the last argument.
|
||||||
|
.inline _Atomic_cmpxchg_byte,4
|
||||||
|
movb 8(%esp), %al // compare_value
|
||||||
|
movb 0(%esp), %cl // exchange_value
|
||||||
|
movl 4(%esp), %edx // dest
|
||||||
|
cmp $0, 12(%esp) // MP test
|
||||||
|
jne 1f
|
||||||
|
cmpxchgb %cl, (%edx)
|
||||||
|
jmp 2f
|
||||||
|
1: lock
|
||||||
|
cmpxchgb %cl, (%edx)
|
||||||
|
2:
|
||||||
|
.end
|
||||||
|
|
||||||
// Support for jint Atomic::cmpxchg(jint exchange_value,
|
// Support for jint Atomic::cmpxchg(jint exchange_value,
|
||||||
// volatile jint *dest,
|
// volatile jint *dest,
|
||||||
// jint compare_value)
|
// jint compare_value)
|
||||||
|
@ -77,6 +77,15 @@
|
|||||||
movq %rdi, %rax
|
movq %rdi, %rax
|
||||||
.end
|
.end
|
||||||
|
|
||||||
|
// Support for jbyte Atomic::cmpxchg(jbyte exchange_value,
|
||||||
|
// volatile jbyte *dest,
|
||||||
|
// jbyte compare_value)
|
||||||
|
.inline _Atomic_cmpxchg_byte,3
|
||||||
|
movb %dl, %al // compare_value
|
||||||
|
lock
|
||||||
|
cmpxchgb %dil, (%rsi)
|
||||||
|
.end
|
||||||
|
|
||||||
// Support for jint Atomic::cmpxchg(jint exchange_value,
|
// Support for jint Atomic::cmpxchg(jint exchange_value,
|
||||||
// volatile jint *dest,
|
// volatile jint *dest,
|
||||||
// jint compare_value)
|
// jint compare_value)
|
||||||
|
@ -123,6 +123,11 @@ inline jint Atomic::cmpxchg (jint exchange_value, volatile jint*
|
|||||||
return (*os::atomic_cmpxchg_func)(exchange_value, dest, compare_value);
|
return (*os::atomic_cmpxchg_func)(exchange_value, dest, compare_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
|
||||||
|
inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
||||||
|
return (*os::atomic_cmpxchg_byte_func)(exchange_value, dest, compare_value);
|
||||||
|
}
|
||||||
|
|
||||||
inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
|
inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
|
||||||
return (*os::atomic_cmpxchg_long_func)(exchange_value, dest, compare_value);
|
return (*os::atomic_cmpxchg_long_func)(exchange_value, dest, compare_value);
|
||||||
}
|
}
|
||||||
@ -212,6 +217,19 @@ inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* des
|
|||||||
return (void*)xchg((jint)exchange_value, (volatile jint*)dest);
|
return (void*)xchg((jint)exchange_value, (volatile jint*)dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
|
||||||
|
inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
||||||
|
// alternative for InterlockedCompareExchange
|
||||||
|
int mp = os::is_MP();
|
||||||
|
__asm {
|
||||||
|
mov edx, dest
|
||||||
|
mov cl, exchange_value
|
||||||
|
mov al, compare_value
|
||||||
|
LOCK_IF_MP(mp)
|
||||||
|
cmpxchg byte ptr [edx], cl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
|
||||||
// alternative for InterlockedCompareExchange
|
// alternative for InterlockedCompareExchange
|
||||||
int mp = os::is_MP();
|
int mp = os::is_MP();
|
||||||
|
@ -220,6 +220,7 @@ void os::initialize_thread(Thread* thr) {
|
|||||||
typedef jint xchg_func_t (jint, volatile jint*);
|
typedef jint xchg_func_t (jint, volatile jint*);
|
||||||
typedef intptr_t xchg_ptr_func_t (intptr_t, volatile intptr_t*);
|
typedef intptr_t xchg_ptr_func_t (intptr_t, volatile intptr_t*);
|
||||||
typedef jint cmpxchg_func_t (jint, volatile jint*, jint);
|
typedef jint cmpxchg_func_t (jint, volatile jint*, jint);
|
||||||
|
typedef jbyte cmpxchg_byte_func_t (jbyte, volatile jbyte*, jbyte);
|
||||||
typedef jlong cmpxchg_long_func_t (jlong, volatile jlong*, jlong);
|
typedef jlong cmpxchg_long_func_t (jlong, volatile jlong*, jlong);
|
||||||
typedef jint add_func_t (jint, volatile jint*);
|
typedef jint add_func_t (jint, volatile jint*);
|
||||||
typedef intptr_t add_ptr_func_t (intptr_t, volatile intptr_t*);
|
typedef intptr_t add_ptr_func_t (intptr_t, volatile intptr_t*);
|
||||||
@ -272,6 +273,23 @@ jint os::atomic_cmpxchg_bootstrap(jint exchange_value, volatile jint* dest, jint
|
|||||||
*dest = exchange_value;
|
*dest = exchange_value;
|
||||||
return old_value;
|
return old_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jbyte os::atomic_cmpxchg_byte_bootstrap(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
|
||||||
|
// try to use the stub:
|
||||||
|
cmpxchg_byte_func_t* func = CAST_TO_FN_PTR(cmpxchg_byte_func_t*, StubRoutines::atomic_cmpxchg_byte_entry());
|
||||||
|
|
||||||
|
if (func != NULL) {
|
||||||
|
os::atomic_cmpxchg_byte_func = func;
|
||||||
|
return (*func)(exchange_value, dest, compare_value);
|
||||||
|
}
|
||||||
|
assert(Threads::number_of_threads() == 0, "for bootstrap only");
|
||||||
|
|
||||||
|
jbyte old_value = *dest;
|
||||||
|
if (old_value == compare_value)
|
||||||
|
*dest = exchange_value;
|
||||||
|
return old_value;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // AMD64
|
#endif // AMD64
|
||||||
|
|
||||||
jlong os::atomic_cmpxchg_long_bootstrap(jlong exchange_value, volatile jlong* dest, jlong compare_value) {
|
jlong os::atomic_cmpxchg_long_bootstrap(jlong exchange_value, volatile jlong* dest, jlong compare_value) {
|
||||||
@ -321,6 +339,7 @@ intptr_t os::atomic_add_ptr_bootstrap(intptr_t add_value, volatile intptr_t* des
|
|||||||
xchg_func_t* os::atomic_xchg_func = os::atomic_xchg_bootstrap;
|
xchg_func_t* os::atomic_xchg_func = os::atomic_xchg_bootstrap;
|
||||||
xchg_ptr_func_t* os::atomic_xchg_ptr_func = os::atomic_xchg_ptr_bootstrap;
|
xchg_ptr_func_t* os::atomic_xchg_ptr_func = os::atomic_xchg_ptr_bootstrap;
|
||||||
cmpxchg_func_t* os::atomic_cmpxchg_func = os::atomic_cmpxchg_bootstrap;
|
cmpxchg_func_t* os::atomic_cmpxchg_func = os::atomic_cmpxchg_bootstrap;
|
||||||
|
cmpxchg_byte_func_t* os::atomic_cmpxchg_byte_func = os::atomic_cmpxchg_byte_bootstrap;
|
||||||
add_func_t* os::atomic_add_func = os::atomic_add_bootstrap;
|
add_func_t* os::atomic_add_func = os::atomic_add_bootstrap;
|
||||||
add_ptr_func_t* os::atomic_add_ptr_func = os::atomic_add_ptr_bootstrap;
|
add_ptr_func_t* os::atomic_add_ptr_func = os::atomic_add_ptr_bootstrap;
|
||||||
|
|
||||||
@ -635,7 +654,11 @@ void os::setup_fpu() {
|
|||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
void os::verify_stack_alignment() {
|
void os::verify_stack_alignment() {
|
||||||
#ifdef AMD64
|
#ifdef AMD64
|
||||||
|
// The current_stack_pointer() calls generated get_previous_sp stub routine.
|
||||||
|
// Only enable the assert after the routine becomes available.
|
||||||
|
if (StubRoutines::code1() != NULL) {
|
||||||
assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
|
assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
static intptr_t (*atomic_xchg_ptr_func) (intptr_t, volatile intptr_t*);
|
static intptr_t (*atomic_xchg_ptr_func) (intptr_t, volatile intptr_t*);
|
||||||
|
|
||||||
static jint (*atomic_cmpxchg_func) (jint, volatile jint*, jint);
|
static jint (*atomic_cmpxchg_func) (jint, volatile jint*, jint);
|
||||||
|
static jbyte (*atomic_cmpxchg_byte_func) (jbyte, volatile jbyte*, jbyte);
|
||||||
static jlong (*atomic_cmpxchg_long_func) (jlong, volatile jlong*, jlong);
|
static jlong (*atomic_cmpxchg_long_func) (jlong, volatile jlong*, jlong);
|
||||||
|
|
||||||
static jint (*atomic_add_func) (jint, volatile jint*);
|
static jint (*atomic_add_func) (jint, volatile jint*);
|
||||||
@ -42,6 +43,7 @@
|
|||||||
static intptr_t atomic_xchg_ptr_bootstrap (intptr_t, volatile intptr_t*);
|
static intptr_t atomic_xchg_ptr_bootstrap (intptr_t, volatile intptr_t*);
|
||||||
|
|
||||||
static jint atomic_cmpxchg_bootstrap (jint, volatile jint*, jint);
|
static jint atomic_cmpxchg_bootstrap (jint, volatile jint*, jint);
|
||||||
|
static jbyte atomic_cmpxchg_byte_bootstrap(jbyte, volatile jbyte*, jbyte);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static jlong (*atomic_cmpxchg_long_func) (jlong, volatile jlong*, jlong);
|
static jlong (*atomic_cmpxchg_long_func) (jlong, volatile jlong*, jlong);
|
||||||
|
@ -512,9 +512,11 @@ abstract class GenericDebugConfig extends BuildConfig {
|
|||||||
abstract class GenericDebugNonKernelConfig extends GenericDebugConfig {
|
abstract class GenericDebugNonKernelConfig extends GenericDebugConfig {
|
||||||
protected void init(Vector includes, Vector defines) {
|
protected void init(Vector includes, Vector defines) {
|
||||||
super.init(includes, defines);
|
super.init(includes, defines);
|
||||||
|
if (get("PlatformName").equals("Win32")) {
|
||||||
getCI().getAdditionalNonKernelLinkerFlags(getV("LinkerFlags"));
|
getCI().getAdditionalNonKernelLinkerFlags(getV("LinkerFlags"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class C1DebugConfig extends GenericDebugNonKernelConfig {
|
class C1DebugConfig extends GenericDebugNonKernelConfig {
|
||||||
String getOptFlag() {
|
String getOptFlag() {
|
||||||
|
@ -401,6 +401,7 @@ class CompilerInterfaceVC10 extends CompilerInterface {
|
|||||||
Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
|
Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
|
||||||
Vector rv = new Vector();
|
Vector rv = new Vector();
|
||||||
|
|
||||||
|
if(platformName.equals("Win32")) {
|
||||||
addAttr(rv, "AdditionalOptions",
|
addAttr(rv, "AdditionalOptions",
|
||||||
"/export:JNI_GetDefaultJavaVMInitArgs " +
|
"/export:JNI_GetDefaultJavaVMInitArgs " +
|
||||||
"/export:JNI_CreateJavaVM " +
|
"/export:JNI_CreateJavaVM " +
|
||||||
@ -411,6 +412,7 @@ class CompilerInterfaceVC10 extends CompilerInterface {
|
|||||||
"/export:jio_vsnprintf "+
|
"/export:jio_vsnprintf "+
|
||||||
"/export:JVM_GetVersionInfo "+
|
"/export:JVM_GetVersionInfo "+
|
||||||
"/export:JVM_InitAgentProperties");
|
"/export:JVM_InitAgentProperties");
|
||||||
|
}
|
||||||
addAttr(rv, "AdditionalDependencies", "kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;Wsock32.lib;winmm.lib;psapi.lib;version.lib");
|
addAttr(rv, "AdditionalDependencies", "kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;Wsock32.lib;winmm.lib;psapi.lib;version.lib");
|
||||||
addAttr(rv, "OutputFile", outDll);
|
addAttr(rv, "OutputFile", outDll);
|
||||||
addAttr(rv, "SuppressStartupBanner", "true");
|
addAttr(rv, "SuppressStartupBanner", "true");
|
||||||
|
@ -1025,7 +1025,7 @@ class CodeString: public CHeapObj<mtCode> {
|
|||||||
|
|
||||||
~CodeString() {
|
~CodeString() {
|
||||||
assert(_next == NULL, "wrong interface for freeing list");
|
assert(_next == NULL, "wrong interface for freeing list");
|
||||||
os::free((void*)_string, mtCode);
|
os::free((void*)_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_comment() const { return _offset >= 0; }
|
bool is_comment() const { return _offset >= 0; }
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
#include "runtime/reflection.hpp"
|
#include "runtime/reflection.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/thread.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
#include "trace/tracing.hpp"
|
||||||
#include "utilities/dtrace.hpp"
|
#include "utilities/dtrace.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
#ifdef COMPILER1
|
#ifdef COMPILER1
|
||||||
@ -1141,6 +1142,16 @@ void ciEnv::record_failure(const char* reason) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ciEnv::report_failure(const char* reason) {
|
||||||
|
// Create and fire JFR event
|
||||||
|
EventCompilerFailure event;
|
||||||
|
if (event.should_commit()) {
|
||||||
|
event.set_compileID(compile_id());
|
||||||
|
event.set_failure(reason);
|
||||||
|
event.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
// ciEnv::record_method_not_compilable()
|
// ciEnv::record_method_not_compilable()
|
||||||
void ciEnv::record_method_not_compilable(const char* reason, bool all_tiers) {
|
void ciEnv::record_method_not_compilable(const char* reason, bool all_tiers) {
|
||||||
|
@ -450,7 +450,8 @@ public:
|
|||||||
// Check for changes to the system dictionary during compilation
|
// Check for changes to the system dictionary during compilation
|
||||||
bool system_dictionary_modification_counter_changed();
|
bool system_dictionary_modification_counter_changed();
|
||||||
|
|
||||||
void record_failure(const char* reason);
|
void record_failure(const char* reason); // Record failure and report later
|
||||||
|
void report_failure(const char* reason); // Report failure immediately
|
||||||
void record_method_not_compilable(const char* reason, bool all_tiers = true);
|
void record_method_not_compilable(const char* reason, bool all_tiers = true);
|
||||||
void record_out_of_memory_failure();
|
void record_out_of_memory_failure();
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include "oops/oop.inline.hpp"
|
#include "oops/oop.inline.hpp"
|
||||||
#include "oops/oop.inline2.hpp"
|
#include "oops/oop.inline2.hpp"
|
||||||
#include "runtime/fieldType.hpp"
|
#include "runtime/fieldType.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
#if INCLUDE_ALL_GCS
|
#if INCLUDE_ALL_GCS
|
||||||
# include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
|
# include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -332,7 +332,7 @@ class CompileReplay : public StackObj {
|
|||||||
// Lookup a klass
|
// Lookup a klass
|
||||||
Klass* resolve_klass(const char* klass, TRAPS) {
|
Klass* resolve_klass(const char* klass, TRAPS) {
|
||||||
Symbol* klass_name = SymbolTable::lookup(klass, (int)strlen(klass), CHECK_NULL);
|
Symbol* klass_name = SymbolTable::lookup(klass, (int)strlen(klass), CHECK_NULL);
|
||||||
return SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, CHECK_NULL);
|
return SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the standard tuple of <klass> <name> <signature>
|
// Parse the standard tuple of <klass> <name> <signature>
|
||||||
|
@ -35,6 +35,8 @@
|
|||||||
#include "interpreter/bytecode.hpp"
|
#include "interpreter/bytecode.hpp"
|
||||||
#include "interpreter/bytecodes.hpp"
|
#include "interpreter/bytecodes.hpp"
|
||||||
#include "memory/allocation.inline.hpp"
|
#include "memory/allocation.inline.hpp"
|
||||||
|
#include "opto/compile.hpp"
|
||||||
|
#include "opto/node.hpp"
|
||||||
#include "runtime/deoptimization.hpp"
|
#include "runtime/deoptimization.hpp"
|
||||||
#include "utilities/growableArray.hpp"
|
#include "utilities/growableArray.hpp"
|
||||||
|
|
||||||
@ -2646,7 +2648,7 @@ void ciTypeFlow::df_flow_types(Block* start,
|
|||||||
assert (!blk->has_pre_order(), "");
|
assert (!blk->has_pre_order(), "");
|
||||||
blk->set_next_pre_order();
|
blk->set_next_pre_order();
|
||||||
|
|
||||||
if (_next_pre_order >= MaxNodeLimit / 2) {
|
if (_next_pre_order >= (int)Compile::current()->max_node_limit() / 2) {
|
||||||
// Too many basic blocks. Bail out.
|
// Too many basic blocks. Bail out.
|
||||||
// This can happen when try/finally constructs are nested to depth N,
|
// This can happen when try/finally constructs are nested to depth N,
|
||||||
// and there is O(2**N) cloning of jsr bodies. See bug 4697245!
|
// and there is O(2**N) cloning of jsr bodies. See bug 4697245!
|
||||||
|
@ -31,9 +31,6 @@
|
|||||||
#include "classfile/javaClasses.hpp"
|
#include "classfile/javaClasses.hpp"
|
||||||
#include "classfile/symbolTable.hpp"
|
#include "classfile/symbolTable.hpp"
|
||||||
#include "classfile/systemDictionary.hpp"
|
#include "classfile/systemDictionary.hpp"
|
||||||
#if INCLUDE_CDS
|
|
||||||
#include "classfile/systemDictionaryShared.hpp"
|
|
||||||
#endif
|
|
||||||
#include "classfile/verificationType.hpp"
|
#include "classfile/verificationType.hpp"
|
||||||
#include "classfile/verifier.hpp"
|
#include "classfile/verifier.hpp"
|
||||||
#include "classfile/vmSymbols.hpp"
|
#include "classfile/vmSymbols.hpp"
|
||||||
@ -63,7 +60,11 @@
|
|||||||
#include "services/threadService.hpp"
|
#include "services/threadService.hpp"
|
||||||
#include "utilities/array.hpp"
|
#include "utilities/array.hpp"
|
||||||
#include "utilities/globalDefinitions.hpp"
|
#include "utilities/globalDefinitions.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
#include "utilities/ostream.hpp"
|
#include "utilities/ostream.hpp"
|
||||||
|
#if INCLUDE_CDS
|
||||||
|
#include "classfile/systemDictionaryShared.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
// We generally try to create the oops directly when parsing, rather than
|
// We generally try to create the oops directly when parsing, rather than
|
||||||
// allocating temporary data structures and copying the bytes twice. A
|
// allocating temporary data structures and copying the bytes twice. A
|
||||||
|
@ -28,11 +28,8 @@
|
|||||||
#include "classfile/classLoader.hpp"
|
#include "classfile/classLoader.hpp"
|
||||||
#include "classfile/classLoaderExt.hpp"
|
#include "classfile/classLoaderExt.hpp"
|
||||||
#include "classfile/classLoaderData.inline.hpp"
|
#include "classfile/classLoaderData.inline.hpp"
|
||||||
|
#include "classfile/imageFile.hpp"
|
||||||
#include "classfile/javaClasses.hpp"
|
#include "classfile/javaClasses.hpp"
|
||||||
#if INCLUDE_CDS
|
|
||||||
#include "classfile/sharedPathsMiscInfo.hpp"
|
|
||||||
#include "classfile/sharedClassUtil.hpp"
|
|
||||||
#endif
|
|
||||||
#include "classfile/systemDictionary.hpp"
|
#include "classfile/systemDictionary.hpp"
|
||||||
#include "classfile/vmSymbols.hpp"
|
#include "classfile/vmSymbols.hpp"
|
||||||
#include "compiler/compileBroker.hpp"
|
#include "compiler/compileBroker.hpp"
|
||||||
@ -64,10 +61,15 @@
|
|||||||
#include "services/management.hpp"
|
#include "services/management.hpp"
|
||||||
#include "services/threadService.hpp"
|
#include "services/threadService.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/hashtable.hpp"
|
|
||||||
#include "utilities/hashtable.inline.hpp"
|
#include "utilities/hashtable.inline.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
|
#if INCLUDE_CDS
|
||||||
|
#include "classfile/sharedPathsMiscInfo.hpp"
|
||||||
|
#include "classfile/sharedClassUtil.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Entry points in zip.dll for loading zip/jar file entries
|
|
||||||
|
// Entry points in zip.dll for loading zip/jar file entries and image file entries
|
||||||
|
|
||||||
typedef void * * (JNICALL *ZipOpen_t)(const char *name, char **pmsg);
|
typedef void * * (JNICALL *ZipOpen_t)(const char *name, char **pmsg);
|
||||||
typedef void (JNICALL *ZipClose_t)(jzfile *zip);
|
typedef void (JNICALL *ZipClose_t)(jzfile *zip);
|
||||||
@ -75,6 +77,7 @@ typedef jzentry* (JNICALL *FindEntry_t)(jzfile *zip, const char *name, jint *siz
|
|||||||
typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf);
|
typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf);
|
||||||
typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsigned char **buf, char *namebuf);
|
typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsigned char **buf, char *namebuf);
|
||||||
typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
|
typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
|
||||||
|
typedef jboolean (JNICALL *ZipInflateFully_t)(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg);
|
||||||
typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len);
|
typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len);
|
||||||
|
|
||||||
static ZipOpen_t ZipOpen = NULL;
|
static ZipOpen_t ZipOpen = NULL;
|
||||||
@ -84,6 +87,7 @@ static ReadEntry_t ReadEntry = NULL;
|
|||||||
static ReadMappedEntry_t ReadMappedEntry = NULL;
|
static ReadMappedEntry_t ReadMappedEntry = NULL;
|
||||||
static GetNextEntry_t GetNextEntry = NULL;
|
static GetNextEntry_t GetNextEntry = NULL;
|
||||||
static canonicalize_fn_t CanonicalizeEntry = NULL;
|
static canonicalize_fn_t CanonicalizeEntry = NULL;
|
||||||
|
static ZipInflateFully_t ZipInflateFully = NULL;
|
||||||
static Crc32_t Crc32 = NULL;
|
static Crc32_t Crc32 = NULL;
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
@ -161,7 +165,7 @@ MetaIndex::MetaIndex(char** meta_package_names, int num_meta_package_names) {
|
|||||||
|
|
||||||
|
|
||||||
MetaIndex::~MetaIndex() {
|
MetaIndex::~MetaIndex() {
|
||||||
FREE_C_HEAP_ARRAY(char*, _meta_package_names, mtClass);
|
FREE_C_HEAP_ARRAY(char*, _meta_package_names);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -247,7 +251,7 @@ ClassPathZipEntry::~ClassPathZipEntry() {
|
|||||||
if (ZipClose != NULL) {
|
if (ZipClose != NULL) {
|
||||||
(*ZipClose)(_zip);
|
(*ZipClose)(_zip);
|
||||||
}
|
}
|
||||||
FREE_C_HEAP_ARRAY(char, _zip_name, mtClass);
|
FREE_C_HEAP_ARRAY(char, _zip_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
|
u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
|
||||||
@ -322,6 +326,8 @@ LazyClassPathEntry::~LazyClassPathEntry() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool LazyClassPathEntry::is_jar_file() {
|
bool LazyClassPathEntry::is_jar_file() {
|
||||||
|
size_t len = strlen(_path);
|
||||||
|
if (len < 4 || strcmp(_path + len - 4, ".jar") != 0) return false;
|
||||||
return ((_st.st_mode & S_IFREG) == S_IFREG);
|
return ((_st.st_mode & S_IFREG) == S_IFREG);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,6 +391,78 @@ u1* LazyClassPathEntry::open_entry(const char* name, jint* filesize, bool nul_te
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClassPathImageEntry::ClassPathImageEntry(char* name) : ClassPathEntry(), _image(new ImageFile(name)) {
|
||||||
|
bool opened = _image->open();
|
||||||
|
if (!opened) {
|
||||||
|
_image = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassPathImageEntry::~ClassPathImageEntry() {
|
||||||
|
if (_image) {
|
||||||
|
_image->close();
|
||||||
|
_image = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* ClassPathImageEntry::name() {
|
||||||
|
return _image ? _image->name() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFileStream* ClassPathImageEntry::open_stream(const char* name, TRAPS) {
|
||||||
|
u1* buffer;
|
||||||
|
u8 size;
|
||||||
|
_image->get_resource(name, buffer, size);
|
||||||
|
|
||||||
|
if (buffer) {
|
||||||
|
if (UsePerfData) {
|
||||||
|
ClassLoader::perf_sys_classfile_bytes_read()->inc(size);
|
||||||
|
}
|
||||||
|
return new ClassFileStream(buffer, (int)size, (char*)name); // Resource allocated
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef PRODUCT
|
||||||
|
void ClassPathImageEntry::compile_the_world(Handle loader, TRAPS) {
|
||||||
|
tty->print_cr("CompileTheWorld : Compiling all classes in %s", name());
|
||||||
|
tty->cr();
|
||||||
|
const ImageStrings strings = _image->get_strings();
|
||||||
|
// Retrieve each path component string.
|
||||||
|
u4 count = _image->get_location_count();
|
||||||
|
for (u4 i = 0; i < count; i++) {
|
||||||
|
u1* location_data = _image->get_location_data(i);
|
||||||
|
|
||||||
|
if (location_data) {
|
||||||
|
ImageLocation location(location_data);
|
||||||
|
const char* parent = location.get_attribute(ImageLocation::ATTRIBUTE_PARENT, strings);
|
||||||
|
const char* base = location.get_attribute(ImageLocation::ATTRIBUTE_BASE, strings);
|
||||||
|
const char* extension = location.get_attribute(ImageLocation::ATTRIBUTE_EXTENSION, strings);
|
||||||
|
assert((strlen(parent) + strlen(base) + strlen(extension)) < JVM_MAXPATHLEN, "path exceeds buffer");
|
||||||
|
char path[JVM_MAXPATHLEN];
|
||||||
|
strcpy(path, parent);
|
||||||
|
strcat(path, base);
|
||||||
|
strcat(path, extension);
|
||||||
|
ClassLoader::compile_the_world_in(path, loader, CHECK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
|
if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
|
||||||
|
CLEAR_PENDING_EXCEPTION;
|
||||||
|
tty->print_cr("\nCompileTheWorld : Ran out of memory\n");
|
||||||
|
tty->print_cr("Increase class metadata storage if a limit was set");
|
||||||
|
} else {
|
||||||
|
tty->print_cr("\nCompileTheWorld : Unexpected exception occurred\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClassPathImageEntry::is_jrt() {
|
||||||
|
return string_ends_with(name(), "bootmodules.jimage");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void print_meta_index(LazyClassPathEntry* entry,
|
static void print_meta_index(LazyClassPathEntry* entry,
|
||||||
GrowableArray<char*>& meta_packages) {
|
GrowableArray<char*>& meta_packages) {
|
||||||
tty->print("[Meta index for %s=", entry->name());
|
tty->print("[Meta index for %s=", entry->name());
|
||||||
@ -634,7 +712,7 @@ ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const str
|
|||||||
}
|
}
|
||||||
ClassPathEntry* new_entry = NULL;
|
ClassPathEntry* new_entry = NULL;
|
||||||
if ((st->st_mode & S_IFREG) == S_IFREG) {
|
if ((st->st_mode & S_IFREG) == S_IFREG) {
|
||||||
// Regular file, should be a zip file
|
// Regular file, should be a zip or image file
|
||||||
// Canonicalized filename
|
// Canonicalized filename
|
||||||
char canonical_path[JVM_MAXPATHLEN];
|
char canonical_path[JVM_MAXPATHLEN];
|
||||||
if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
|
if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
|
||||||
@ -645,6 +723,11 @@ ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const str
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO - add proper criteria for selecting image file
|
||||||
|
ClassPathImageEntry* entry = new ClassPathImageEntry(canonical_path);
|
||||||
|
if (entry->is_open()) {
|
||||||
|
new_entry = entry;
|
||||||
|
} else {
|
||||||
char* error_msg = NULL;
|
char* error_msg = NULL;
|
||||||
jzfile* zip;
|
jzfile* zip;
|
||||||
{
|
{
|
||||||
@ -655,9 +738,6 @@ ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const str
|
|||||||
}
|
}
|
||||||
if (zip != NULL && error_msg == NULL) {
|
if (zip != NULL && error_msg == NULL) {
|
||||||
new_entry = new ClassPathZipEntry(zip, path);
|
new_entry = new ClassPathZipEntry(zip, path);
|
||||||
if (TraceClassLoading || TraceClassPaths) {
|
|
||||||
tty->print_cr("[Opened %s]", path);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ResourceMark rm(thread);
|
ResourceMark rm(thread);
|
||||||
char *msg;
|
char *msg;
|
||||||
@ -675,10 +755,14 @@ ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const str
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (TraceClassLoading || TraceClassPaths) {
|
||||||
|
tty->print_cr("[Opened %s]", path);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Directory
|
// Directory
|
||||||
new_entry = new ClassPathDirEntry(path);
|
new_entry = new ClassPathDirEntry(path);
|
||||||
if (TraceClassLoading || TraceClassPaths) {
|
if (TraceClassLoading) {
|
||||||
tty->print_cr("[Path %s]", path);
|
tty->print_cr("[Path %s]", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -801,6 +885,7 @@ void ClassLoader::load_zip_library() {
|
|||||||
ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry"));
|
ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry"));
|
||||||
ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t, os::dll_lookup(handle, "ZIP_ReadMappedEntry"));
|
ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t, os::dll_lookup(handle, "ZIP_ReadMappedEntry"));
|
||||||
GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
|
GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
|
||||||
|
ZipInflateFully = CAST_TO_FN_PTR(ZipInflateFully_t, os::dll_lookup(handle, "ZIP_InflateFully"));
|
||||||
Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32"));
|
Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32"));
|
||||||
|
|
||||||
// ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
|
// ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
|
||||||
@ -809,12 +894,20 @@ void ClassLoader::load_zip_library() {
|
|||||||
vm_exit_during_initialization("Corrupted ZIP library", path);
|
vm_exit_during_initialization("Corrupted ZIP library", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ZipInflateFully == NULL) {
|
||||||
|
vm_exit_during_initialization("Corrupted ZIP library ZIP_InflateFully missing", path);
|
||||||
|
}
|
||||||
|
|
||||||
// Lookup canonicalize entry in libjava.dll
|
// Lookup canonicalize entry in libjava.dll
|
||||||
void *javalib_handle = os::native_java_library();
|
void *javalib_handle = os::native_java_library();
|
||||||
CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, os::dll_lookup(javalib_handle, "Canonicalize"));
|
CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, os::dll_lookup(javalib_handle, "Canonicalize"));
|
||||||
// This lookup only works on 1.3. Do not check for non-null here
|
// This lookup only works on 1.3. Do not check for non-null here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jboolean ClassLoader::decompress(void *in, u8 inSize, void *out, u8 outSize, char **pmsg) {
|
||||||
|
return (*ZipInflateFully)(in, inSize, out, outSize, pmsg);
|
||||||
|
}
|
||||||
|
|
||||||
int ClassLoader::crc32(int crc, const char* buf, int len) {
|
int ClassLoader::crc32(int crc, const char* buf, int len) {
|
||||||
assert(Crc32 != NULL, "ZIP_CRC32 is not found");
|
assert(Crc32 != NULL, "ZIP_CRC32 is not found");
|
||||||
return (*Crc32)(crc, (const jbyte*)buf, len);
|
return (*Crc32)(crc, (const jbyte*)buf, len);
|
||||||
@ -1367,8 +1460,7 @@ void ClassPathDirEntry::compile_the_world(Handle loader, TRAPS) {
|
|||||||
tty->cr();
|
tty->cr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ClassPathDirEntry::is_jrt() {
|
||||||
bool ClassPathDirEntry::is_rt_jar() {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1393,13 +1485,13 @@ void ClassPathZipEntry::compile_the_world(Handle loader, TRAPS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClassPathZipEntry::is_rt_jar() {
|
bool ClassPathZipEntry::is_jrt() {
|
||||||
real_jzfile* zip = (real_jzfile*) _zip;
|
real_jzfile* zip = (real_jzfile*) _zip;
|
||||||
int len = (int)strlen(zip->name);
|
int len = (int)strlen(zip->name);
|
||||||
// Check whether zip name ends in "rt.jar"
|
// Check whether zip name ends in "rt.jar"
|
||||||
// This will match other archives named rt.jar as well, but this is
|
// This will match other archives named rt.jar as well, but this is
|
||||||
// only used for debugging.
|
// only used for debugging.
|
||||||
return (len >= 6) && (strcasecmp(zip->name + len - 6, "rt.jar") == 0);
|
return string_ends_with(zip->name, "rt.jar");
|
||||||
}
|
}
|
||||||
|
|
||||||
void LazyClassPathEntry::compile_the_world(Handle loader, TRAPS) {
|
void LazyClassPathEntry::compile_the_world(Handle loader, TRAPS) {
|
||||||
@ -1409,7 +1501,7 @@ void LazyClassPathEntry::compile_the_world(Handle loader, TRAPS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LazyClassPathEntry::is_rt_jar() {
|
bool LazyClassPathEntry::is_jrt() {
|
||||||
Thread* THREAD = Thread::current();
|
Thread* THREAD = Thread::current();
|
||||||
ClassPathEntry* cpe = resolve_entry(THREAD);
|
ClassPathEntry* cpe = resolve_entry(THREAD);
|
||||||
return (cpe != NULL) ? cpe->is_jar_file() : false;
|
return (cpe != NULL) ? cpe->is_jar_file() : false;
|
||||||
@ -1428,7 +1520,7 @@ void ClassLoader::compile_the_world() {
|
|||||||
jlong start = os::javaTimeMillis();
|
jlong start = os::javaTimeMillis();
|
||||||
while (e != NULL) {
|
while (e != NULL) {
|
||||||
// We stop at rt.jar, unless it is the first bootstrap path entry
|
// We stop at rt.jar, unless it is the first bootstrap path entry
|
||||||
if (e->is_rt_jar() && e != _first_entry) break;
|
if (e->is_jrt() && e != _first_entry) break;
|
||||||
e->compile_the_world(system_class_loader, CATCH);
|
e->compile_the_world(system_class_loader, CATCH);
|
||||||
e = e->next();
|
e = e->next();
|
||||||
}
|
}
|
||||||
@ -1476,9 +1568,9 @@ static bool can_be_compiled(methodHandle m, int comp_level) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
||||||
int len = (int)strlen(name);
|
if (string_ends_with(name, ".class")) {
|
||||||
if (len > 6 && strcmp(".class", name + len - 6) == 0) {
|
|
||||||
// We have a .class file
|
// We have a .class file
|
||||||
|
int len = (int)strlen(name);
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
strncpy(buffer, name, len - 6);
|
strncpy(buffer, name, len - 6);
|
||||||
buffer[len-6] = 0;
|
buffer[len-6] = 0;
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "classfile/classFileParser.hpp"
|
#include "classfile/classFileParser.hpp"
|
||||||
#include "runtime/perfData.hpp"
|
#include "runtime/perfData.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
|
|
||||||
// The VM class loader.
|
// The VM class loader.
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -66,7 +67,7 @@ class ClassPathEntry: public CHeapObj<mtClass> {
|
|||||||
virtual ClassFileStream* open_stream(const char* name, TRAPS) = 0;
|
virtual ClassFileStream* open_stream(const char* name, TRAPS) = 0;
|
||||||
// Debugging
|
// Debugging
|
||||||
NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;)
|
NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;)
|
||||||
NOT_PRODUCT(virtual bool is_rt_jar() = 0;)
|
NOT_PRODUCT(virtual bool is_jrt() = 0;)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -80,7 +81,7 @@ class ClassPathDirEntry: public ClassPathEntry {
|
|||||||
ClassFileStream* open_stream(const char* name, TRAPS);
|
ClassFileStream* open_stream(const char* name, TRAPS);
|
||||||
// Debugging
|
// Debugging
|
||||||
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
||||||
NOT_PRODUCT(bool is_rt_jar();)
|
NOT_PRODUCT(bool is_jrt();)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -112,7 +113,7 @@ class ClassPathZipEntry: public ClassPathEntry {
|
|||||||
void contents_do(void f(const char* name, void* context), void* context);
|
void contents_do(void f(const char* name, void* context), void* context);
|
||||||
// Debugging
|
// Debugging
|
||||||
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
||||||
NOT_PRODUCT(bool is_rt_jar();)
|
NOT_PRODUCT(bool is_jrt();)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -138,7 +139,25 @@ class LazyClassPathEntry: public ClassPathEntry {
|
|||||||
virtual bool is_lazy();
|
virtual bool is_lazy();
|
||||||
// Debugging
|
// Debugging
|
||||||
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
||||||
NOT_PRODUCT(bool is_rt_jar();)
|
NOT_PRODUCT(bool is_jrt();)
|
||||||
|
};
|
||||||
|
|
||||||
|
// For java image files
|
||||||
|
class ImageFile;
|
||||||
|
class ClassPathImageEntry: public ClassPathEntry {
|
||||||
|
private:
|
||||||
|
ImageFile *_image;
|
||||||
|
public:
|
||||||
|
bool is_jar_file() { return false; }
|
||||||
|
bool is_open() { return _image != NULL; }
|
||||||
|
const char* name();
|
||||||
|
ClassPathImageEntry(char* name);
|
||||||
|
~ClassPathImageEntry();
|
||||||
|
ClassFileStream* open_stream(const char* name, TRAPS);
|
||||||
|
|
||||||
|
// Debugging
|
||||||
|
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
||||||
|
NOT_PRODUCT(bool is_jrt();)
|
||||||
};
|
};
|
||||||
|
|
||||||
class PackageHashtable;
|
class PackageHashtable;
|
||||||
@ -226,6 +245,7 @@ class ClassLoader: AllStatic {
|
|||||||
// to avoid confusing the zip library
|
// to avoid confusing the zip library
|
||||||
static bool get_canonical_path(const char* orig, char* out, int len);
|
static bool get_canonical_path(const char* orig, char* out, int len);
|
||||||
public:
|
public:
|
||||||
|
static jboolean decompress(void *in, u8 inSize, void *out, u8 outSize, char **pmsg);
|
||||||
static int crc32(int crc, const char* buf, int len);
|
static int crc32(int crc, const char* buf, int len);
|
||||||
static bool update_class_path_entry_list(const char *path,
|
static bool update_class_path_entry_list(const char *path,
|
||||||
bool check_for_duplicates,
|
bool check_for_duplicates,
|
||||||
|
@ -65,7 +65,6 @@
|
|||||||
#include "utilities/growableArray.hpp"
|
#include "utilities/growableArray.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
#include "utilities/ostream.hpp"
|
#include "utilities/ostream.hpp"
|
||||||
|
|
||||||
#if INCLUDE_TRACE
|
#if INCLUDE_TRACE
|
||||||
#include "trace/tracing.hpp"
|
#include "trace/tracing.hpp"
|
||||||
#endif
|
#endif
|
||||||
@ -472,7 +471,7 @@ void ClassLoaderData::free_deallocate_list() {
|
|||||||
// These anonymous class loaders are to contain classes used for JSR292
|
// These anonymous class loaders are to contain classes used for JSR292
|
||||||
ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(oop loader, TRAPS) {
|
ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(oop loader, TRAPS) {
|
||||||
// Add a new class loader data to the graph.
|
// Add a new class loader data to the graph.
|
||||||
return ClassLoaderDataGraph::add(loader, true, CHECK_NULL);
|
return ClassLoaderDataGraph::add(loader, true, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* ClassLoaderData::loader_name() {
|
const char* ClassLoaderData::loader_name() {
|
||||||
@ -978,4 +977,4 @@ void ClassLoaderDataGraph::class_unload_event(Klass* const k) {
|
|||||||
event.commit();
|
event.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* INCLUDE_TRACE */
|
#endif // INCLUDE_TRACE
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "memory/metaspaceCounters.hpp"
|
#include "memory/metaspaceCounters.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
#include "utilities/growableArray.hpp"
|
#include "utilities/growableArray.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
#if INCLUDE_TRACE
|
#if INCLUDE_TRACE
|
||||||
#include "utilities/ticks.hpp"
|
#include "utilities/ticks.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -63,6 +63,9 @@ public:
|
|||||||
ClassPathEntry* new_entry) {
|
ClassPathEntry* new_entry) {
|
||||||
ClassLoader::add_to_list(new_entry);
|
ClassLoader::add_to_list(new_entry);
|
||||||
}
|
}
|
||||||
|
static void append_boot_classpath(ClassPathEntry* new_entry) {
|
||||||
|
ClassLoader::add_to_list(new_entry);
|
||||||
|
}
|
||||||
static void setup_search_paths() {}
|
static void setup_search_paths() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -493,7 +493,7 @@ class MethodFamily : public ResourceObj {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Symbol* MethodFamily::generate_no_defaults_message(TRAPS) const {
|
Symbol* MethodFamily::generate_no_defaults_message(TRAPS) const {
|
||||||
return SymbolTable::new_symbol("No qualifying defaults found", CHECK_NULL);
|
return SymbolTable::new_symbol("No qualifying defaults found", THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol* MethodFamily::generate_method_message(Symbol *klass_name, Method* method, TRAPS) const {
|
Symbol* MethodFamily::generate_method_message(Symbol *klass_name, Method* method, TRAPS) const {
|
||||||
@ -506,7 +506,7 @@ Symbol* MethodFamily::generate_method_message(Symbol *klass_name, Method* method
|
|||||||
ss.write((const char*)name->bytes(), name->utf8_length());
|
ss.write((const char*)name->bytes(), name->utf8_length());
|
||||||
ss.write((const char*)signature->bytes(), signature->utf8_length());
|
ss.write((const char*)signature->bytes(), signature->utf8_length());
|
||||||
ss.print(" is abstract");
|
ss.print(" is abstract");
|
||||||
return SymbolTable::new_symbol(ss.base(), (int)ss.size(), CHECK_NULL);
|
return SymbolTable::new_symbol(ss.base(), (int)ss.size(), THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol* MethodFamily::generate_conflicts_message(GrowableArray<Method*>* methods, TRAPS) const {
|
Symbol* MethodFamily::generate_conflicts_message(GrowableArray<Method*>* methods, TRAPS) const {
|
||||||
@ -521,7 +521,7 @@ Symbol* MethodFamily::generate_conflicts_message(GrowableArray<Method*>* methods
|
|||||||
ss.print(".");
|
ss.print(".");
|
||||||
ss.write((const char*)name->bytes(), name->utf8_length());
|
ss.write((const char*)name->bytes(), name->utf8_length());
|
||||||
}
|
}
|
||||||
return SymbolTable::new_symbol(ss.base(), (int)ss.size(), CHECK_NULL);
|
return SymbolTable::new_symbol(ss.base(), (int)ss.size(), THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
286
hotspot/src/share/vm/classfile/imageFile.cpp
Normal file
286
hotspot/src/share/vm/classfile/imageFile.cpp
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
#include "classfile/imageFile.hpp"
|
||||||
|
#include "runtime/os.inline.hpp"
|
||||||
|
#include "utilities/bytes.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
// Compute the Perfect Hashing hash code for the supplied string.
|
||||||
|
u4 ImageStrings::hash_code(const char* string, u4 seed) {
|
||||||
|
u1* bytes = (u1*)string;
|
||||||
|
|
||||||
|
// Compute hash code.
|
||||||
|
for (u1 byte = *bytes++; byte; byte = *bytes++) {
|
||||||
|
seed = (seed * HASH_MULTIPLIER) ^ byte;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the result is unsigned.
|
||||||
|
return seed & 0x7FFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test to see if string begins with start. If so returns remaining portion
|
||||||
|
// of string. Otherwise, NULL.
|
||||||
|
const char* ImageStrings::starts_with(const char* string, const char* start) {
|
||||||
|
char ch1, ch2;
|
||||||
|
|
||||||
|
// Match up the strings the best we can.
|
||||||
|
while ((ch1 = *string) && (ch2 = *start)) {
|
||||||
|
if (ch1 != ch2) {
|
||||||
|
// Mismatch, return NULL.
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
string++, start++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return remainder of string.
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageLocation::ImageLocation(u1* data) {
|
||||||
|
// Deflate the attribute stream into an array of attributes.
|
||||||
|
memset(_attributes, 0, sizeof(_attributes));
|
||||||
|
u1 byte;
|
||||||
|
|
||||||
|
while ((byte = *data) != ATTRIBUTE_END) {
|
||||||
|
u1 kind = attribute_kind(byte);
|
||||||
|
u1 n = attribute_length(byte);
|
||||||
|
assert(kind < ATTRIBUTE_COUNT, "invalid image location attribute");
|
||||||
|
_attributes[kind] = attribute_value(data + 1, n);
|
||||||
|
data += n + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageFile::ImageFile(const char* name) {
|
||||||
|
// Copy the image file name.
|
||||||
|
_name = NEW_C_HEAP_ARRAY(char, strlen(name)+1, mtClass);
|
||||||
|
strcpy(_name, name);
|
||||||
|
|
||||||
|
// Initialize for a closed file.
|
||||||
|
_fd = -1;
|
||||||
|
_memory_mapped = true;
|
||||||
|
_index_data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageFile::~ImageFile() {
|
||||||
|
// Ensure file is closed.
|
||||||
|
close();
|
||||||
|
|
||||||
|
// Free up name.
|
||||||
|
FREE_C_HEAP_ARRAY(char, _name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImageFile::open() {
|
||||||
|
// If file exists open for reading.
|
||||||
|
struct stat st;
|
||||||
|
if (os::stat(_name, &st) != 0 ||
|
||||||
|
(st.st_mode & S_IFREG) != S_IFREG ||
|
||||||
|
(_fd = os::open(_name, 0, O_RDONLY)) == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read image file header and verify.
|
||||||
|
u8 header_size = sizeof(ImageHeader);
|
||||||
|
if (os::read(_fd, &_header, header_size) != header_size ||
|
||||||
|
_header._magic != IMAGE_MAGIC ||
|
||||||
|
_header._major_version != MAJOR_VERSION ||
|
||||||
|
_header._minor_version != MINOR_VERSION) {
|
||||||
|
close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory map index.
|
||||||
|
_index_size = index_size();
|
||||||
|
_index_data = (u1*)os::map_memory(_fd, _name, 0, NULL, _index_size, true, false);
|
||||||
|
|
||||||
|
// Failing that, read index into C memory.
|
||||||
|
if (_index_data == NULL) {
|
||||||
|
_memory_mapped = false;
|
||||||
|
_index_data = NEW_RESOURCE_ARRAY(u1, _index_size);
|
||||||
|
|
||||||
|
if (os::seek_to_file_offset(_fd, 0) == -1) {
|
||||||
|
close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (os::read(_fd, _index_data, _index_size) != _index_size) {
|
||||||
|
close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to advance a pointer, unstructured.
|
||||||
|
#undef nextPtr
|
||||||
|
#define nextPtr(base, fromType, count, toType) (toType*)((fromType*)(base) + (count))
|
||||||
|
// Pull tables out from the index.
|
||||||
|
_redirect_table = nextPtr(_index_data, u1, header_size, s4);
|
||||||
|
_offsets_table = nextPtr(_redirect_table, s4, _header._location_count, u4);
|
||||||
|
_location_bytes = nextPtr(_offsets_table, u4, _header._location_count, u1);
|
||||||
|
_string_bytes = nextPtr(_location_bytes, u1, _header._locations_size, u1);
|
||||||
|
#undef nextPtr
|
||||||
|
|
||||||
|
// Successful open.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageFile::close() {
|
||||||
|
// Dealllocate the index.
|
||||||
|
if (_index_data) {
|
||||||
|
if (_memory_mapped) {
|
||||||
|
os::unmap_memory((char*)_index_data, _index_size);
|
||||||
|
} else {
|
||||||
|
FREE_RESOURCE_ARRAY(u1, _index_data, _index_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
_index_data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// close file.
|
||||||
|
if (_fd != -1) {
|
||||||
|
os::close(_fd);
|
||||||
|
_fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the attribute stream for a named resourced.
|
||||||
|
u1* ImageFile::find_location_data(const char* path) const {
|
||||||
|
// Compute hash.
|
||||||
|
u4 hash = ImageStrings::hash_code(path) % _header._location_count;
|
||||||
|
s4 redirect = _redirect_table[hash];
|
||||||
|
|
||||||
|
if (!redirect) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
u4 index;
|
||||||
|
|
||||||
|
if (redirect < 0) {
|
||||||
|
// If no collision.
|
||||||
|
index = -redirect - 1;
|
||||||
|
} else {
|
||||||
|
// If collision, recompute hash code.
|
||||||
|
index = ImageStrings::hash_code(path, redirect) % _header._location_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(index < _header._location_count, "index exceeds location count");
|
||||||
|
u4 offset = _offsets_table[index];
|
||||||
|
assert(offset < _header._locations_size, "offset exceeds location attributes size");
|
||||||
|
|
||||||
|
if (offset == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _location_bytes + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that a found location matches the supplied path.
|
||||||
|
bool ImageFile::verify_location(ImageLocation& location, const char* path) const {
|
||||||
|
// Retrieve each path component string.
|
||||||
|
ImageStrings strings(_string_bytes, _header._strings_size);
|
||||||
|
// Match a path with each subcomponent without concatenation (copy).
|
||||||
|
// Match up path parent.
|
||||||
|
const char* parent = location.get_attribute(ImageLocation::ATTRIBUTE_PARENT, strings);
|
||||||
|
const char* next = ImageStrings::starts_with(path, parent);
|
||||||
|
// Continue only if a complete match.
|
||||||
|
if (!next) return false;
|
||||||
|
// Match up path base.
|
||||||
|
const char* base = location.get_attribute(ImageLocation::ATTRIBUTE_BASE, strings);
|
||||||
|
next = ImageStrings::starts_with(next, base);
|
||||||
|
// Continue only if a complete match.
|
||||||
|
if (!next) return false;
|
||||||
|
// Match up path extension.
|
||||||
|
const char* extension = location.get_attribute(ImageLocation::ATTRIBUTE_EXTENSION, strings);
|
||||||
|
next = ImageStrings::starts_with(next, extension);
|
||||||
|
|
||||||
|
// True only if complete match and no more characters.
|
||||||
|
return next && *next == '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the resource for the supplied location.
|
||||||
|
u1* ImageFile::get_resource(ImageLocation& location) const {
|
||||||
|
// Retrieve the byte offset and size of the resource.
|
||||||
|
u8 offset = _index_size + location.get_attribute(ImageLocation::ATTRIBUTE_OFFSET);
|
||||||
|
u8 size = location.get_attribute(ImageLocation::ATTRIBUTE_UNCOMPRESSED);
|
||||||
|
u8 compressed_size = location.get_attribute(ImageLocation::ATTRIBUTE_COMPRESSED);
|
||||||
|
u8 read_size = compressed_size ? compressed_size : size;
|
||||||
|
|
||||||
|
// Allocate space for the resource.
|
||||||
|
u1* data = NEW_RESOURCE_ARRAY(u1, read_size);
|
||||||
|
|
||||||
|
bool is_read = os::read_at(_fd, data, read_size, offset) == read_size;
|
||||||
|
guarantee(is_read, "error reading from image or short read");
|
||||||
|
|
||||||
|
// If not compressed, just return the data.
|
||||||
|
if (!compressed_size) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
u1* uncompressed = NEW_RESOURCE_ARRAY(u1, size);
|
||||||
|
char* msg = NULL;
|
||||||
|
jboolean res = ClassLoader::decompress(data, compressed_size, uncompressed, size, &msg);
|
||||||
|
if (!res) warning("decompression failed due to %s\n", msg);
|
||||||
|
guarantee(res, "decompression failed");
|
||||||
|
|
||||||
|
return uncompressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImageFile::get_resource(const char* path, u1*& buffer, u8& size) const {
|
||||||
|
buffer = NULL;
|
||||||
|
size = 0;
|
||||||
|
u1* data = find_location_data(path);
|
||||||
|
if (data) {
|
||||||
|
ImageLocation location(data);
|
||||||
|
if (verify_location(location, path)) {
|
||||||
|
size = location.get_attribute(ImageLocation::ATTRIBUTE_UNCOMPRESSED);
|
||||||
|
buffer = get_resource(location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GrowableArray<const char*>* ImageFile::packages(const char* name) {
|
||||||
|
char entry[JVM_MAXPATHLEN];
|
||||||
|
bool overflow = jio_snprintf(entry, sizeof(entry), "%s/packages.offsets", name) == -1;
|
||||||
|
guarantee(!overflow, "package name overflow");
|
||||||
|
|
||||||
|
u1* buffer;
|
||||||
|
u8 size;
|
||||||
|
|
||||||
|
get_resource(entry, buffer, size);
|
||||||
|
guarantee(buffer, "missing module packages reource");
|
||||||
|
ImageStrings strings(_string_bytes, _header._strings_size);
|
||||||
|
GrowableArray<const char*>* pkgs = new GrowableArray<const char*>();
|
||||||
|
int count = size / 4;
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
u4 offset = Bytes::get_Java_u4(buffer + (i*4));
|
||||||
|
const char* p = strings.get(offset);
|
||||||
|
pkgs->append(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pkgs;
|
||||||
|
}
|
343
hotspot/src/share/vm/classfile/imageFile.hpp
Normal file
343
hotspot/src/share/vm/classfile/imageFile.hpp
Normal file
@ -0,0 +1,343 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SHARE_VM_CLASSFILE_IMAGEFILE_HPP
|
||||||
|
#define SHARE_VM_CLASSFILE_IMAGEFILE_HPP
|
||||||
|
|
||||||
|
#include "classfile/classLoader.hpp"
|
||||||
|
#include "memory/allocation.hpp"
|
||||||
|
#include "memory/allocation.inline.hpp"
|
||||||
|
#include "utilities/globalDefinitions.hpp"
|
||||||
|
|
||||||
|
// Image files are an alternate file format for storing classes and resources. The
|
||||||
|
// goal is to supply file access which is faster and smaller that the jar format.
|
||||||
|
// It should be noted that unlike jars information stored in an image is in native
|
||||||
|
// endian format. This allows the image to be memory mapped into memory without
|
||||||
|
// endian translation. This also means that images are platform dependent.
|
||||||
|
//
|
||||||
|
// Image files are structured as three sections;
|
||||||
|
//
|
||||||
|
// +-----------+
|
||||||
|
// | Header |
|
||||||
|
// +-----------+
|
||||||
|
// | |
|
||||||
|
// | Directory |
|
||||||
|
// | |
|
||||||
|
// +-----------+
|
||||||
|
// | |
|
||||||
|
// | |
|
||||||
|
// | Resources |
|
||||||
|
// | |
|
||||||
|
// | |
|
||||||
|
// +-----------+
|
||||||
|
//
|
||||||
|
// The header contains information related to identification and description of
|
||||||
|
// contents.
|
||||||
|
//
|
||||||
|
// +-------------------------+
|
||||||
|
// | Magic (0xCAFEDADA) |
|
||||||
|
// +------------+------------+
|
||||||
|
// | Major Vers | Minor Vers |
|
||||||
|
// +------------+------------+
|
||||||
|
// | Location Count |
|
||||||
|
// +-------------------------+
|
||||||
|
// | Attributes Size |
|
||||||
|
// +-------------------------+
|
||||||
|
// | Strings Size |
|
||||||
|
// +-------------------------+
|
||||||
|
//
|
||||||
|
// Magic - means of identifying validity of the file. This avoids requiring a
|
||||||
|
// special file extension.
|
||||||
|
// Major vers, minor vers - differences in version numbers indicate structural
|
||||||
|
// changes in the image.
|
||||||
|
// Location count - number of locations/resources in the file. This count is also
|
||||||
|
// the length of lookup tables used in the directory.
|
||||||
|
// Attributes size - number of bytes in the region used to store location attribute
|
||||||
|
// streams.
|
||||||
|
// Strings size - the size of the region used to store strings used by the
|
||||||
|
// directory and meta data.
|
||||||
|
//
|
||||||
|
// The directory contains information related to resource lookup. The algorithm
|
||||||
|
// used for lookup is "A Practical Minimal Perfect Hashing Method"
|
||||||
|
// (http://homepages.dcc.ufmg.br/~nivio/papers/wea05.pdf). Given a path string
|
||||||
|
// in the form <package>/<base>.<extension> return the resource location
|
||||||
|
// information;
|
||||||
|
//
|
||||||
|
// redirectIndex = hash(path, DEFAULT_SEED) % count;
|
||||||
|
// redirect = redirectTable[redirectIndex];
|
||||||
|
// if (redirect == 0) return not found;
|
||||||
|
// locationIndex = redirect < 0 ? -1 - redirect : hash(path, redirect) % count;
|
||||||
|
// location = locationTable[locationIndex];
|
||||||
|
// if (!verify(location, path)) return not found;
|
||||||
|
// return location;
|
||||||
|
//
|
||||||
|
// Note: The hash function takes an initial seed value. A different seed value
|
||||||
|
// usually returns a different result for strings that would otherwise collide with
|
||||||
|
// other seeds. The verify function guarantees the found resource location is
|
||||||
|
// indeed the resource we are looking for.
|
||||||
|
//
|
||||||
|
// The following is the format of the directory;
|
||||||
|
//
|
||||||
|
// +-------------------+
|
||||||
|
// | Redirect Table |
|
||||||
|
// +-------------------+
|
||||||
|
// | Attribute Offsets |
|
||||||
|
// +-------------------+
|
||||||
|
// | Attribute Data |
|
||||||
|
// +-------------------+
|
||||||
|
// | Strings |
|
||||||
|
// +-------------------+
|
||||||
|
//
|
||||||
|
// Redirect Table - Array of 32-bit signed values representing actions that
|
||||||
|
// should take place for hashed strings that map to that
|
||||||
|
// value. Negative values indicate no hash collision and can be
|
||||||
|
// quickly converted to indices into attribute offsets. Positive
|
||||||
|
// values represent a new seed for hashing an index into attribute
|
||||||
|
// offsets. Zero indicates not found.
|
||||||
|
// Attribute Offsets - Array of 32-bit unsigned values representing offsets into
|
||||||
|
// attribute data. Attribute offsets can be iterated to do a
|
||||||
|
// full survey of resources in the image.
|
||||||
|
// Attribute Data - Bytes representing compact attribute data for locations. (See
|
||||||
|
// comments in ImageLocation.)
|
||||||
|
// Strings - Collection of zero terminated UTF-8 strings used by the directory and
|
||||||
|
// image meta data. Each string is accessed by offset. Each string is
|
||||||
|
// unique. Offset zero is reserved for the empty string.
|
||||||
|
//
|
||||||
|
// Note that the memory mapped directory assumes 32 bit alignment of the image
|
||||||
|
// header, the redirect table and the attribute offsets.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
// Manage image file string table.
|
||||||
|
class ImageStrings {
|
||||||
|
private:
|
||||||
|
// Data bytes for strings.
|
||||||
|
u1* _data;
|
||||||
|
// Number of bytes in the string table.
|
||||||
|
u4 _size;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Prime used to generate hash for Perfect Hashing.
|
||||||
|
static const u4 HASH_MULTIPLIER = 0x01000193;
|
||||||
|
|
||||||
|
ImageStrings(u1* data, u4 size) : _data(data), _size(size) {}
|
||||||
|
|
||||||
|
// Return the UTF-8 string beginning at offset.
|
||||||
|
inline const char* get(u4 offset) const {
|
||||||
|
assert(offset < _size, "offset exceeds string table size");
|
||||||
|
return (const char*)(_data + offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the Perfect Hashing hash code for the supplied string.
|
||||||
|
inline static u4 hash_code(const char* string) {
|
||||||
|
return hash_code(string, HASH_MULTIPLIER);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the Perfect Hashing hash code for the supplied string, starting at seed.
|
||||||
|
static u4 hash_code(const char* string, u4 seed);
|
||||||
|
|
||||||
|
// Test to see if string begins with start. If so returns remaining portion
|
||||||
|
// of string. Otherwise, NULL. Used to test sections of a path without
|
||||||
|
// copying.
|
||||||
|
static const char* starts_with(const char* string, const char* start);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Manage image file location attribute streams. Within an image, a location's
|
||||||
|
// attributes are compressed into a stream of bytes. An attribute stream is
|
||||||
|
// composed of individual attribute sequences. Each attribute sequence begins with
|
||||||
|
// a header byte containing the attribute 'kind' (upper 5 bits of header) and the
|
||||||
|
// 'length' less 1 (lower 3 bits of header) of bytes that follow containing the
|
||||||
|
// attribute value. Attribute values present as most significant byte first.
|
||||||
|
//
|
||||||
|
// Ex. Container offset (ATTRIBUTE_OFFSET) 0x33562 would be represented as 0x22
|
||||||
|
// (kind = 4, length = 3), 0x03, 0x35, 0x62.
|
||||||
|
//
|
||||||
|
// An attribute stream is terminated with a header kind of ATTRIBUTE_END (header
|
||||||
|
// byte of zero.)
|
||||||
|
//
|
||||||
|
// ImageLocation inflates the stream into individual values stored in the long
|
||||||
|
// array _attributes. This allows an attribute value can be quickly accessed by
|
||||||
|
// direct indexing. Unspecified values default to zero.
|
||||||
|
//
|
||||||
|
// Notes:
|
||||||
|
// - Even though ATTRIBUTE_END is used to mark the end of the attribute stream,
|
||||||
|
// streams will contain zero byte values to represent lesser significant bits.
|
||||||
|
// Thus, detecting a zero byte is not sufficient to detect the end of an attribute
|
||||||
|
// stream.
|
||||||
|
// - ATTRIBUTE_OFFSET represents the number of bytes from the beginning of the region
|
||||||
|
// storing the resources. Thus, in an image this represents the number of bytes
|
||||||
|
// after the directory.
|
||||||
|
// - Currently, compressed resources are represented by having a non-zero
|
||||||
|
// ATTRIBUTE_COMPRESSED value. This represents the number of bytes stored in the
|
||||||
|
// image, and the value of ATTRIBUTE_UNCOMPRESSED represents number of bytes of the
|
||||||
|
// inflated resource in memory. If the ATTRIBUTE_COMPRESSED is zero then the value
|
||||||
|
// of ATTRIBUTE_UNCOMPRESSED represents both the number of bytes in the image and
|
||||||
|
// in memory. In the future, additional compression techniques will be used and
|
||||||
|
// represented differently.
|
||||||
|
// - Package strings include trailing slash and extensions include prefix period.
|
||||||
|
//
|
||||||
|
class ImageLocation {
|
||||||
|
public:
|
||||||
|
// Attribute kind enumeration.
|
||||||
|
static const u1 ATTRIBUTE_END = 0; // End of attribute stream marker
|
||||||
|
static const u1 ATTRIBUTE_BASE = 1; // String table offset of resource path base
|
||||||
|
static const u1 ATTRIBUTE_PARENT = 2; // String table offset of resource path parent
|
||||||
|
static const u1 ATTRIBUTE_EXTENSION = 3; // String table offset of resource path extension
|
||||||
|
static const u1 ATTRIBUTE_OFFSET = 4; // Container byte offset of resource
|
||||||
|
static const u1 ATTRIBUTE_COMPRESSED = 5; // In image byte size of the compressed resource
|
||||||
|
static const u1 ATTRIBUTE_UNCOMPRESSED = 6; // In memory byte size of the uncompressed resource
|
||||||
|
static const u1 ATTRIBUTE_COUNT = 7; // Number of attribute kinds
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Values of inflated attributes.
|
||||||
|
u8 _attributes[ATTRIBUTE_COUNT];
|
||||||
|
|
||||||
|
// Return the attribute value number of bytes.
|
||||||
|
inline static u1 attribute_length(u1 data) {
|
||||||
|
return (data & 0x7) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the attribute kind.
|
||||||
|
inline static u1 attribute_kind(u1 data) {
|
||||||
|
u1 kind = data >> 3;
|
||||||
|
assert(kind < ATTRIBUTE_COUNT, "invalid attribute kind");
|
||||||
|
return kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the attribute length.
|
||||||
|
inline static u8 attribute_value(u1* data, u1 n) {
|
||||||
|
assert(0 < n && n <= 8, "invalid attribute value length");
|
||||||
|
u8 value = 0;
|
||||||
|
|
||||||
|
// Most significant bytes first.
|
||||||
|
for (u1 i = 0; i < n; i++) {
|
||||||
|
value <<= 8;
|
||||||
|
value |= data[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
ImageLocation(u1* data);
|
||||||
|
|
||||||
|
// Retrieve an attribute value from the inflated array.
|
||||||
|
inline u8 get_attribute(u1 kind) const {
|
||||||
|
assert(ATTRIBUTE_END < kind && kind < ATTRIBUTE_COUNT, "invalid attribute kind");
|
||||||
|
return _attributes[kind];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve an attribute string value from the inflated array.
|
||||||
|
inline const char* get_attribute(u4 kind, const ImageStrings& strings) const {
|
||||||
|
return strings.get((u4)get_attribute(kind));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Manage the image file.
|
||||||
|
class ImageFile: public CHeapObj<mtClass> {
|
||||||
|
private:
|
||||||
|
// Image file marker.
|
||||||
|
static const u4 IMAGE_MAGIC = 0xCAFEDADA;
|
||||||
|
// Image file major version number.
|
||||||
|
static const u2 MAJOR_VERSION = 0;
|
||||||
|
// Image file minor version number.
|
||||||
|
static const u2 MINOR_VERSION = 1;
|
||||||
|
|
||||||
|
struct ImageHeader {
|
||||||
|
u4 _magic; // Image file marker
|
||||||
|
u2 _major_version; // Image file major version number
|
||||||
|
u2 _minor_version; // Image file minor version number
|
||||||
|
u4 _location_count; // Number of locations managed in index.
|
||||||
|
u4 _locations_size; // Number of bytes in attribute table.
|
||||||
|
u4 _strings_size; // Number of bytes in string table.
|
||||||
|
};
|
||||||
|
|
||||||
|
char* _name; // Name of image
|
||||||
|
int _fd; // File descriptor
|
||||||
|
bool _memory_mapped; // Is file memory mapped
|
||||||
|
ImageHeader _header; // Image header
|
||||||
|
u8 _index_size; // Total size of index
|
||||||
|
u1* _index_data; // Raw index data
|
||||||
|
s4* _redirect_table; // Perfect hash redirect table
|
||||||
|
u4* _offsets_table; // Location offset table
|
||||||
|
u1* _location_bytes; // Location attributes
|
||||||
|
u1* _string_bytes; // String table
|
||||||
|
|
||||||
|
// Compute number of bytes in image file index.
|
||||||
|
inline u8 index_size() {
|
||||||
|
return sizeof(ImageHeader) +
|
||||||
|
_header._location_count * sizeof(u4) * 2 +
|
||||||
|
_header._locations_size +
|
||||||
|
_header._strings_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
ImageFile(const char* name);
|
||||||
|
~ImageFile();
|
||||||
|
|
||||||
|
// Open image file for access.
|
||||||
|
bool open();
|
||||||
|
// Close image file.
|
||||||
|
void close();
|
||||||
|
|
||||||
|
// Retrieve name of image file.
|
||||||
|
inline const char* name() const {
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a string table accessor.
|
||||||
|
inline const ImageStrings get_strings() const {
|
||||||
|
return ImageStrings(_string_bytes, _header._strings_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return number of locations in image file index.
|
||||||
|
inline u4 get_location_count() const {
|
||||||
|
return _header._location_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return location attribute stream for location i.
|
||||||
|
inline u1* get_location_data(u4 i) const {
|
||||||
|
u4 offset = _offsets_table[i];
|
||||||
|
|
||||||
|
return offset != 0 ? _location_bytes + offset : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the attribute stream for a named resourced.
|
||||||
|
u1* find_location_data(const char* path) const;
|
||||||
|
|
||||||
|
// Verify that a found location matches the supplied path.
|
||||||
|
bool verify_location(ImageLocation& location, const char* path) const;
|
||||||
|
|
||||||
|
// Return the resource for the supplied location info.
|
||||||
|
u1* get_resource(ImageLocation& location) const;
|
||||||
|
|
||||||
|
// Return the resource associated with the path else NULL if not found.
|
||||||
|
void get_resource(const char* path, u1*& buffer, u8& size) const;
|
||||||
|
|
||||||
|
// Return an array of packages for a given module
|
||||||
|
GrowableArray<const char*>* packages(const char* name);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SHARE_VM_CLASSFILE_IMAGEFILE_HPP
|
@ -41,6 +41,7 @@
|
|||||||
#include "oops/method.hpp"
|
#include "oops/method.hpp"
|
||||||
#include "oops/symbol.hpp"
|
#include "oops/symbol.hpp"
|
||||||
#include "oops/typeArrayOop.hpp"
|
#include "oops/typeArrayOop.hpp"
|
||||||
|
#include "prims/jvmtiRedefineClassesTrace.hpp"
|
||||||
#include "runtime/fieldDescriptor.hpp"
|
#include "runtime/fieldDescriptor.hpp"
|
||||||
#include "runtime/handles.inline.hpp"
|
#include "runtime/handles.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
@ -944,7 +945,7 @@ void java_lang_Thread::compute_offsets() {
|
|||||||
assert(_group_offset == 0, "offsets should be initialized only once");
|
assert(_group_offset == 0, "offsets should be initialized only once");
|
||||||
|
|
||||||
Klass* k = SystemDictionary::Thread_klass();
|
Klass* k = SystemDictionary::Thread_klass();
|
||||||
compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::char_array_signature());
|
compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
|
||||||
compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature());
|
compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature());
|
||||||
compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature());
|
compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature());
|
||||||
compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature());
|
compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature());
|
||||||
@ -974,15 +975,12 @@ void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typeArrayOop java_lang_Thread::name(oop java_thread) {
|
oop java_lang_Thread::name(oop java_thread) {
|
||||||
oop name = java_thread->obj_field(_name_offset);
|
return java_thread->obj_field(_name_offset);
|
||||||
assert(name == NULL || (name->is_typeArray() && TypeArrayKlass::cast(name->klass())->element_type() == T_CHAR), "just checking");
|
|
||||||
return typeArrayOop(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void java_lang_Thread::set_name(oop java_thread, typeArrayOop name) {
|
void java_lang_Thread::set_name(oop java_thread, oop name) {
|
||||||
assert(java_thread->obj_field(_name_offset) == NULL, "name should be NULL");
|
|
||||||
java_thread->obj_field_put(_name_offset, name);
|
java_thread->obj_field_put(_name_offset, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1952,7 +1950,7 @@ Handle java_lang_reflect_Method::create(TRAPS) {
|
|||||||
// This class is eagerly initialized during VM initialization, since we keep a refence
|
// This class is eagerly initialized during VM initialization, since we keep a refence
|
||||||
// to one of the methods
|
// to one of the methods
|
||||||
assert(InstanceKlass::cast(klass)->is_initialized(), "must be initialized");
|
assert(InstanceKlass::cast(klass)->is_initialized(), "must be initialized");
|
||||||
return InstanceKlass::cast(klass)->allocate_instance_handle(CHECK_NH);
|
return InstanceKlass::cast(klass)->allocate_instance_handle(THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
oop java_lang_reflect_Method::clazz(oop reflect) {
|
oop java_lang_reflect_Method::clazz(oop reflect) {
|
||||||
@ -2130,7 +2128,7 @@ Handle java_lang_reflect_Constructor::create(TRAPS) {
|
|||||||
instanceKlassHandle klass (THREAD, k);
|
instanceKlassHandle klass (THREAD, k);
|
||||||
// Ensure it is initialized
|
// Ensure it is initialized
|
||||||
klass->initialize(CHECK_NH);
|
klass->initialize(CHECK_NH);
|
||||||
return klass->allocate_instance_handle(CHECK_NH);
|
return klass->allocate_instance_handle(THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
oop java_lang_reflect_Constructor::clazz(oop reflect) {
|
oop java_lang_reflect_Constructor::clazz(oop reflect) {
|
||||||
@ -2270,7 +2268,7 @@ Handle java_lang_reflect_Field::create(TRAPS) {
|
|||||||
instanceKlassHandle klass (THREAD, k);
|
instanceKlassHandle klass (THREAD, k);
|
||||||
// Ensure it is initialized
|
// Ensure it is initialized
|
||||||
klass->initialize(CHECK_NH);
|
klass->initialize(CHECK_NH);
|
||||||
return klass->allocate_instance_handle(CHECK_NH);
|
return klass->allocate_instance_handle(THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
oop java_lang_reflect_Field::clazz(oop reflect) {
|
oop java_lang_reflect_Field::clazz(oop reflect) {
|
||||||
@ -2397,7 +2395,7 @@ Handle java_lang_reflect_Parameter::create(TRAPS) {
|
|||||||
instanceKlassHandle klass (THREAD, k);
|
instanceKlassHandle klass (THREAD, k);
|
||||||
// Ensure it is initialized
|
// Ensure it is initialized
|
||||||
klass->initialize(CHECK_NH);
|
klass->initialize(CHECK_NH);
|
||||||
return klass->allocate_instance_handle(CHECK_NH);
|
return klass->allocate_instance_handle(THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
oop java_lang_reflect_Parameter::name(oop param) {
|
oop java_lang_reflect_Parameter::name(oop param) {
|
||||||
@ -2447,7 +2445,7 @@ Handle sun_reflect_ConstantPool::create(TRAPS) {
|
|||||||
instanceKlassHandle klass (THREAD, k);
|
instanceKlassHandle klass (THREAD, k);
|
||||||
// Ensure it is initialized
|
// Ensure it is initialized
|
||||||
klass->initialize(CHECK_NH);
|
klass->initialize(CHECK_NH);
|
||||||
return klass->allocate_instance_handle(CHECK_NH);
|
return klass->allocate_instance_handle(THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2797,12 +2795,35 @@ Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
|
|||||||
return (Metadata*)mname->address_field(_vmtarget_offset);
|
return (Metadata*)mname->address_field(_vmtarget_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool java_lang_invoke_MemberName::is_method(oop mname) {
|
||||||
|
assert(is_instance(mname), "must be MemberName");
|
||||||
|
return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
#if INCLUDE_JVMTI
|
#if INCLUDE_JVMTI
|
||||||
// Can be executed on VM thread only
|
// Can be executed on VM thread only
|
||||||
void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Metadata* ref) {
|
void java_lang_invoke_MemberName::adjust_vmtarget(oop mname, Method* old_method,
|
||||||
assert((is_instance(mname) && (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0), "wrong type");
|
Method* new_method, bool* trace_name_printed) {
|
||||||
|
assert(is_method(mname), "wrong type");
|
||||||
assert(Thread::current()->is_VM_thread(), "not VM thread");
|
assert(Thread::current()->is_VM_thread(), "not VM thread");
|
||||||
mname->address_field_put(_vmtarget_offset, (address)ref);
|
|
||||||
|
Method* target = (Method*)mname->address_field(_vmtarget_offset);
|
||||||
|
if (target == old_method) {
|
||||||
|
mname->address_field_put(_vmtarget_offset, (address)new_method);
|
||||||
|
|
||||||
|
if (RC_TRACE_IN_RANGE(0x00100000, 0x00400000)) {
|
||||||
|
if (!(*trace_name_printed)) {
|
||||||
|
// RC_TRACE_MESG macro has an embedded ResourceMark
|
||||||
|
RC_TRACE_MESG(("adjust: name=%s",
|
||||||
|
old_method->method_holder()->external_name()));
|
||||||
|
*trace_name_printed = true;
|
||||||
|
}
|
||||||
|
// RC_TRACE macro has an embedded ResourceMark
|
||||||
|
RC_TRACE(0x00400000, ("MemberName method update: %s(%s)",
|
||||||
|
new_method->name()->as_C_string(),
|
||||||
|
new_method->signature()->as_C_string()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // INCLUDE_JVMTI
|
#endif // INCLUDE_JVMTI
|
||||||
|
|
||||||
|
@ -345,8 +345,8 @@ class java_lang_Thread : AllStatic {
|
|||||||
// Set JavaThread for instance
|
// Set JavaThread for instance
|
||||||
static void set_thread(oop java_thread, JavaThread* thread);
|
static void set_thread(oop java_thread, JavaThread* thread);
|
||||||
// Name
|
// Name
|
||||||
static typeArrayOop name(oop java_thread);
|
static oop name(oop java_thread);
|
||||||
static void set_name(oop java_thread, typeArrayOop name);
|
static void set_name(oop java_thread, oop name);
|
||||||
// Priority
|
// Priority
|
||||||
static ThreadPriority priority(oop java_thread);
|
static ThreadPriority priority(oop java_thread);
|
||||||
static void set_priority(oop java_thread, ThreadPriority priority);
|
static void set_priority(oop java_thread, ThreadPriority priority);
|
||||||
@ -1100,7 +1100,8 @@ class java_lang_invoke_MemberName: AllStatic {
|
|||||||
static Metadata* vmtarget(oop mname);
|
static Metadata* vmtarget(oop mname);
|
||||||
static void set_vmtarget(oop mname, Metadata* target);
|
static void set_vmtarget(oop mname, Metadata* target);
|
||||||
#if INCLUDE_JVMTI
|
#if INCLUDE_JVMTI
|
||||||
static void adjust_vmtarget(oop mname, Metadata* target);
|
static void adjust_vmtarget(oop mname, Method* old_method, Method* new_method,
|
||||||
|
bool* trace_name_printed);
|
||||||
#endif // INCLUDE_JVMTI
|
#endif // INCLUDE_JVMTI
|
||||||
|
|
||||||
static intptr_t vmindex(oop mname);
|
static intptr_t vmindex(oop mname);
|
||||||
@ -1114,6 +1115,8 @@ class java_lang_invoke_MemberName: AllStatic {
|
|||||||
return obj != NULL && is_subclass(obj->klass());
|
return obj != NULL && is_subclass(obj->klass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_method(oop obj);
|
||||||
|
|
||||||
// Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
|
// Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
|
||||||
enum {
|
enum {
|
||||||
MN_IS_METHOD = 0x00010000, // method (not constructor)
|
MN_IS_METHOD = 0x00010000, // method (not constructor)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* 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
|
||||||
@ -164,7 +164,7 @@ void LoaderConstraintTable::purge_loader_constraints() {
|
|||||||
|
|
||||||
// Purge entry
|
// Purge entry
|
||||||
*p = probe->next();
|
*p = probe->next();
|
||||||
FREE_C_HEAP_ARRAY(oop, probe->loaders(), mtClass);
|
FREE_C_HEAP_ARRAY(oop, probe->loaders());
|
||||||
free_entry(probe);
|
free_entry(probe);
|
||||||
} else {
|
} else {
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
@ -340,7 +340,7 @@ void LoaderConstraintTable::ensure_loader_constraint_capacity(
|
|||||||
ClassLoaderData** new_loaders = NEW_C_HEAP_ARRAY(ClassLoaderData*, n, mtClass);
|
ClassLoaderData** new_loaders = NEW_C_HEAP_ARRAY(ClassLoaderData*, n, mtClass);
|
||||||
memcpy(new_loaders, p->loaders(), sizeof(ClassLoaderData*) * p->num_loaders());
|
memcpy(new_loaders, p->loaders(), sizeof(ClassLoaderData*) * p->num_loaders());
|
||||||
p->set_max_loaders(n);
|
p->set_max_loaders(n);
|
||||||
FREE_C_HEAP_ARRAY(ClassLoaderData*, p->loaders(), mtClass);
|
FREE_C_HEAP_ARRAY(ClassLoaderData*, p->loaders());
|
||||||
p->set_loaders(new_loaders);
|
p->set_loaders(new_loaders);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -422,7 +422,7 @@ void LoaderConstraintTable::merge_loader_constraints(
|
|||||||
}
|
}
|
||||||
|
|
||||||
*pp2 = p2->next();
|
*pp2 = p2->next();
|
||||||
FREE_C_HEAP_ARRAY(oop, p2->loaders(), mtClass);
|
FREE_C_HEAP_ARRAY(oop, p2->loaders());
|
||||||
free_entry(p2);
|
free_entry(p2);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ bool SharedPathsMiscInfo::check() {
|
|||||||
bool SharedPathsMiscInfo::check(jint type, const char* path) {
|
bool SharedPathsMiscInfo::check(jint type, const char* path) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case BOOT:
|
case BOOT:
|
||||||
if (strcmp(path, Arguments::get_sysclasspath()) != 0) {
|
if (os::file_name_strcmp(path, Arguments::get_sysclasspath()) != 0) {
|
||||||
return fail("[BOOT classpath mismatch, actual: -Dsun.boot.class.path=", Arguments::get_sysclasspath());
|
return fail("[BOOT classpath mismatch, actual: -Dsun.boot.class.path=", Arguments::get_sysclasspath());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -89,7 +89,7 @@ public:
|
|||||||
}
|
}
|
||||||
~SharedPathsMiscInfo() {
|
~SharedPathsMiscInfo() {
|
||||||
if (_allocated) {
|
if (_allocated) {
|
||||||
FREE_C_HEAP_ARRAY(char, _buf_start, mtClass);
|
FREE_C_HEAP_ARRAY(char, _buf_start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int get_used_bytes() {
|
int get_used_bytes() {
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include "runtime/atomic.inline.hpp"
|
#include "runtime/atomic.inline.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
#include "utilities/hashtable.inline.hpp"
|
#include "utilities/hashtable.inline.hpp"
|
||||||
|
#include "utilities/macros.hpp"
|
||||||
#if INCLUDE_ALL_GCS
|
#if INCLUDE_ALL_GCS
|
||||||
#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
|
#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
|
||||||
#include "gc_implementation/g1/g1StringDedup.hpp"
|
#include "gc_implementation/g1/g1StringDedup.hpp"
|
||||||
|
@ -235,7 +235,7 @@ Symbol* SymbolTable::lookup(const char* name, int len, TRAPS) {
|
|||||||
MutexLocker ml(SymbolTable_lock, THREAD);
|
MutexLocker ml(SymbolTable_lock, THREAD);
|
||||||
|
|
||||||
// Otherwise, add to symbol to table
|
// Otherwise, add to symbol to table
|
||||||
return the_table()->basic_add(index, (u1*)name, len, hashValue, true, CHECK_NULL);
|
return the_table()->basic_add(index, (u1*)name, len, hashValue, true, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol* SymbolTable::lookup(const Symbol* sym, int begin, int end, TRAPS) {
|
Symbol* SymbolTable::lookup(const Symbol* sym, int begin, int end, TRAPS) {
|
||||||
@ -274,7 +274,7 @@ Symbol* SymbolTable::lookup(const Symbol* sym, int begin, int end, TRAPS) {
|
|||||||
// Grab SymbolTable_lock first.
|
// Grab SymbolTable_lock first.
|
||||||
MutexLocker ml(SymbolTable_lock, THREAD);
|
MutexLocker ml(SymbolTable_lock, THREAD);
|
||||||
|
|
||||||
return the_table()->basic_add(index, (u1*)buffer, len, hashValue, true, CHECK_NULL);
|
return the_table()->basic_add(index, (u1*)buffer, len, hashValue, true, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol* SymbolTable::lookup_only(const char* name, int len,
|
Symbol* SymbolTable::lookup_only(const char* name, int len,
|
||||||
|
@ -31,10 +31,6 @@
|
|||||||
#include "classfile/resolutionErrors.hpp"
|
#include "classfile/resolutionErrors.hpp"
|
||||||
#include "classfile/stringTable.hpp"
|
#include "classfile/stringTable.hpp"
|
||||||
#include "classfile/systemDictionary.hpp"
|
#include "classfile/systemDictionary.hpp"
|
||||||
#if INCLUDE_CDS
|
|
||||||
#include "classfile/sharedClassUtil.hpp"
|
|
||||||
#include "classfile/systemDictionaryShared.hpp"
|
|
||||||
#endif
|
|
||||||
#include "classfile/vmSymbols.hpp"
|
#include "classfile/vmSymbols.hpp"
|
||||||
#include "compiler/compileBroker.hpp"
|
#include "compiler/compileBroker.hpp"
|
||||||
#include "interpreter/bytecodeStream.hpp"
|
#include "interpreter/bytecodeStream.hpp"
|
||||||
@ -65,7 +61,10 @@
|
|||||||
#include "services/threadService.hpp"
|
#include "services/threadService.hpp"
|
||||||
#include "utilities/macros.hpp"
|
#include "utilities/macros.hpp"
|
||||||
#include "utilities/ticks.hpp"
|
#include "utilities/ticks.hpp"
|
||||||
|
#if INCLUDE_CDS
|
||||||
|
#include "classfile/sharedClassUtil.hpp"
|
||||||
|
#include "classfile/systemDictionaryShared.hpp"
|
||||||
|
#endif
|
||||||
#if INCLUDE_TRACE
|
#if INCLUDE_TRACE
|
||||||
#include "trace/tracing.hpp"
|
#include "trace/tracing.hpp"
|
||||||
#endif
|
#endif
|
||||||
@ -123,7 +122,7 @@ void SystemDictionary::compute_java_system_loader(TRAPS) {
|
|||||||
|
|
||||||
ClassLoaderData* SystemDictionary::register_loader(Handle class_loader, TRAPS) {
|
ClassLoaderData* SystemDictionary::register_loader(Handle class_loader, TRAPS) {
|
||||||
if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data();
|
if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data();
|
||||||
return ClassLoaderDataGraph::find_or_create(class_loader, CHECK_NULL);
|
return ClassLoaderDataGraph::find_or_create(class_loader, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -233,15 +232,15 @@ Klass* SystemDictionary::resolve_or_null(Symbol* class_name, Handle class_loader
|
|||||||
class_name->as_C_string(),
|
class_name->as_C_string(),
|
||||||
class_loader.is_null() ? "null" : class_loader->klass()->name()->as_C_string()));
|
class_loader.is_null() ? "null" : class_loader->klass()->name()->as_C_string()));
|
||||||
if (FieldType::is_array(class_name)) {
|
if (FieldType::is_array(class_name)) {
|
||||||
return resolve_array_class_or_null(class_name, class_loader, protection_domain, CHECK_NULL);
|
return resolve_array_class_or_null(class_name, class_loader, protection_domain, THREAD);
|
||||||
} else if (FieldType::is_obj(class_name)) {
|
} else if (FieldType::is_obj(class_name)) {
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
// Ignore wrapping L and ;.
|
// Ignore wrapping L and ;.
|
||||||
TempNewSymbol name = SymbolTable::new_symbol(class_name->as_C_string() + 1,
|
TempNewSymbol name = SymbolTable::new_symbol(class_name->as_C_string() + 1,
|
||||||
class_name->utf8_length() - 2, CHECK_NULL);
|
class_name->utf8_length() - 2, CHECK_NULL);
|
||||||
return resolve_instance_class_or_null(name, class_loader, protection_domain, CHECK_NULL);
|
return resolve_instance_class_or_null(name, class_loader, protection_domain, THREAD);
|
||||||
} else {
|
} else {
|
||||||
return resolve_instance_class_or_null(class_name, class_loader, protection_domain, CHECK_NULL);
|
return resolve_instance_class_or_null(class_name, class_loader, protection_domain, THREAD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2660,7 +2659,7 @@ void SystemDictionary::post_class_load_event(const Ticks& start_time,
|
|||||||
class_loader->klass() : (Klass*)NULL);
|
class_loader->klass() : (Klass*)NULL);
|
||||||
event.commit();
|
event.commit();
|
||||||
}
|
}
|
||||||
#endif /* INCLUDE_TRACE */
|
#endif // INCLUDE_TRACE
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
|
@ -289,7 +289,7 @@ class VerificationType VALUE_OBJ_CLASS_SPEC {
|
|||||||
if (is_reference() && from.is_reference()) {
|
if (is_reference() && from.is_reference()) {
|
||||||
return is_reference_assignable_from(from, context,
|
return is_reference_assignable_from(from, context,
|
||||||
from_field_is_protected,
|
from_field_is_protected,
|
||||||
CHECK_false);
|
THREAD);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user