# HG changeset patch # User erikj # Date 1538781268 25200 # Node ID e03e5f61c53fccd5a429cbfa842f1d3805bd11d5 # Parent 3c92ada330a97441607d4f86570210716f2016f1# Parent 549bc49734e870eccf652e29ffb65070e73b60f8 Merge diff -r 3c92ada330a9 -r e03e5f61c53f .hgtags --- a/.hgtags Fri Oct 05 15:15:56 2018 -0700 +++ b/.hgtags Fri Oct 05 16:14:28 2018 -0700 @@ -514,3 +514,6 @@ f0f5d23449d31f1b3580c8a73313918cafeaefd7 jdk-12+11 15094d12a632f452a2064318a4e416d0c7a9ce0c jdk-12+12 511a9946f83e3e3c7b9dbe1840367063fb39b4e1 jdk-12+13 +8897e41b327c0a5601c6ba2bba5d07f15a3ffc91 jdk-12+14 +8897e41b327c0a5601c6ba2bba5d07f15a3ffc91 jdk-12+14 +6f04692c7d5137ee34a6bd94c0c8a6c9219cb127 jdk-12+14 diff -r 3c92ada330a9 -r e03e5f61c53f make/CompileCommands.gmk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/CompileCommands.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,60 @@ +# +# Copyright (c) 2018, 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. +# + +default: all + +include $(SPEC) +include MakeBase.gmk + +# When FIXPATH is set, let it process the file to make sure all paths are usable +# by system native tools. The FIXPATH tool assumes arguments preceeded by an @ +# character points to a text file containing further arguments (similar to a +# linker). It replaces any such arguments with a different temporary filename, +# whose contents has been processed to make any paths native. To obtain a +# properly processed compile_commands.json, FIXPATH is then made to invoke an +# AWK script with the unprocessed json file as the only argument, prepended with +# an @ character. The AWK script simply copies the contents of this processed +# file. +# +# The sed command encloses the fragments inside brackets and removes the final +# trailing comma. +$(OUTPUTDIR)/compile_commands.json: $(wildcard $(MAKESUPPORT_OUTPUTDIR)/compile-commands/*.json) + $(call LogWarn, Updating compile_commands.json) + $(RM) $@ + $(FIND) $(MAKESUPPORT_OUTPUTDIR)/compile-commands/ -name \*.json | \ + $(SORT) | $(XARGS) $(CAT) >> $@.tmp + $(if $(FIXPATH),$(FIXPATH) $(AWK) 'BEGIN { \ + tmpfile = substr(ARGV[2],2); \ + cmd = "$(CP) " "\047" tmpfile "\047" " $@.tmp"; \ + system(cmd); \ + }' -- @$@.tmp) + $(SED) -e '1s/^/[\$(NEWLINE)/' -e '$(DOLLAR)s/,\s\{0,\}$(DOLLAR)/\$(NEWLINE)]/' $@.tmp > $@ + $(RM) $@.tmp + +TARGETS += $(OUTPUTDIR)/compile_commands.json + +all: $(TARGETS) + +.PHONY: all diff -r 3c92ada330a9 -r e03e5f61c53f make/Jprt.gmk --- a/make/Jprt.gmk Fri Oct 05 15:15:56 2018 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -# -# Copyright (c) 2012, 2016, 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. -# - -# This file contains targets and utilities needed by JPRT. - -# Cygpath is only defined when running on Cygwin -ifneq ($(CYGPATH), ) - # If we get JPRT_ARCHIVE_*BUNDLE externally, make sure they have /cygdrive - # style paths - ifdef JPRT_ARCHIVE_BUNDLE - override JPRT_ARCHIVE_BUNDLE := $(shell $(CYGPATH) -u $(JPRT_ARCHIVE_BUNDLE)) - endif - ifdef JPRT_ARCHIVE_TEST_BUNDLE - override JPRT_ARCHIVE_TEST_BUNDLE := \ - $(shell $(CYGPATH) -u $(JPRT_ARCHIVE_TEST_BUNDLE)) - endif - ifdef JPRT_ARCHIVE_SYMBOLS_BUNDLE - override JPRT_ARCHIVE_SYMBOLS_BUNDLE := \ - $(shell $(CYGPATH) -u $(JPRT_ARCHIVE_SYMBOLS_BUNDLE)) - endif -endif - -# When running in JPRT these will be provided. Need defaults so that this makefile -# is valid anyway. -ifndef JPRT_ARCHIVE_BUNDLE - JPRT_ARCHIVE_BUNDLE=/tmp/jprt_bundles/jdk-image.zip -endif -ifndef JPRT_ARCHIVE_TEST_BUNDLE - JPRT_ARCHIVE_TEST_BUNDLE=/tmp/jprt_bundles/test-image.zip -endif -ifndef JPRT_ARCHIVE_SYMBOLS_BUNDLE - JPRT_ARCHIVE_SYMBOLS_BUNDLE=/tmp/jprt_bundles/symbols-image.zip -endif - -ifeq ($(SKIP_BOOT_CYCLE), false) - jprt_bundle: bootcycle-images -endif - -################################################################################ -# JPRT specific bundling targets -JPRT_TARGET ?= $(DEFAULT_MAKE_TARGET) -ifeq ($(JPRT_TARGET), $(DEFAULT_MAKE_TARGET)) - jprt_bundle: $(DEFAULT_MAKE_TARGET) $(JPRT_ARCHIVE_BUNDLE) \ - $(JPRT_ARCHIVE_TEST_BUNDLE) - - SRC_JDK_IMAGE_DIR := $(JDK_IMAGE_DIR) - SRC_TEST_IMAGE_DIR := $(TEST_IMAGE_DIR) - - # This target must be called in the context of a SPEC file - $(JPRT_ARCHIVE_BUNDLE): product-images - $(call MakeDir, $(@D)) - $(CD) $(SRC_JDK_IMAGE_DIR) && $(ZIPEXE) -y -q -r $@ . - - $(JPRT_ARCHIVE_TEST_BUNDLE): test-image - $(call MakeDir, $(@D)) - $(CD) $(SRC_TEST_IMAGE_DIR) && $(ZIPEXE) -y -q -r $@ . - - ############################################################################## - # Optional symbols bundle - ifeq ($(GCOV_ENABLED), true) - jprt_bundle: $(JPRT_ARCHIVE_SYMBOLS_BUNDLE) - - $(JPRT_ARCHIVE_SYMBOLS_BUNDLE): product-images - $(call MakeDir, $(@D)) - $(CD) $(SYMBOLS_IMAGE_DIR) && $(ZIPEXE) -y -q -r $@ . - - endif - - ############################################################################## - -else - # Just fake the main bundle to satisfy JPRT - jprt_bundle: $(JPRT_TARGET) - @$(call TargetEnter) - $(MKDIR) -p $(OUTPUTDIR)/bundles - $(CD) $(TOPDIR) && $(TAR) cf - README | $(GZIP) > \ - $(JPRT_ARCHIVE_BUNDLE) - @$(call TargetExit) -endif - -ALL_TARGETS += jprt_bundle - -################################################################################ - -$(eval $(call IncludeCustomExtension, Jprt.gmk)) diff -r 3c92ada330a9 -r e03e5f61c53f make/Main.gmk --- a/make/Main.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/Main.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -263,6 +263,31 @@ $(HOTSPOT_VARIANT_LIBS_TARGETS) hotspot-ide-project ################################################################################ +# Generate libs and launcher targets for creating compile_commands.json fragments +define DeclareCompileCommandsRecipe + $1-compile-commands: + $$(call LogInfo, Generating compile_commands.json fragments for $1) + +($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f Main.gmk $1-only \ + GENERATE_COMPILE_COMMANDS_ONLY=true) + + COMPILE_COMMANDS_TARGETS_$2 += $1-compile-commands +endef + +$(foreach t, $(HOTSPOT_VARIANT_LIBS_TARGETS), \ + $(eval $(call DeclareCompileCommandsRecipe,$t,HOTSPOT)) \ +) + +$(foreach t, $(LIBS_TARGETS) $(LAUNCHER_TARGETS), \ + $(eval $(call DeclareCompileCommandsRecipe,$t,JDK)) \ +) + +compile-commands compile-commands-hotspot: + +($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CompileCommands.gmk) + +ALL_TARGETS += $(COMPILE_COMMANDS_TARGETS_HOTSPOT) $(COMPILE_COMMANDS_TARGETS_JDK) +ALL_TARGETS += compile-commands compile-commands-hotspot + +################################################################################ # Build demos targets demos-jdk: @@ -559,8 +584,12 @@ test-make: ($(CD) $(TOPDIR)/test/make && $(MAKE) $(MAKE_ARGS) -f TestMake.gmk $(TEST_TARGET)) +test-compile-commands: + ($(CD) $(TOPDIR)/test/make && $(MAKE) $(MAKE_ARGS) -f TestMake.gmk test-compile-commands) + ALL_TARGETS += test test-hotspot-jtreg test-hotspot-jtreg-native \ - test-hotspot-internal test-hotspot-gtest test-jdk-jtreg-native test-make + test-hotspot-internal test-hotspot-gtest test-jdk-jtreg-native test-make \ + test-compile-commands ################################################################################ # Bundles @@ -735,6 +764,20 @@ $(foreach m, $(ALL_MODULES), $(eval $m-jmod: $($(m)_JMOD_DEPS))) $(foreach m, $(INTERIM_IMAGE_MODULES), $(eval $m-interim-jmod: $($(m)_JMOD_DEPS))) + # Setup the minimal set of generated native source dependencies for hotspot + $(foreach v, $(JVM_VARIANTS), \ + $(eval hotspot-$v-libs-compile-commands: hotspot-$v-gensrc) \ + $(foreach m, $(filter java.desktop jdk.hotspot.agent, $(GENSRC_MODULES)), \ + $(eval hotspot-$v-libs-compile-commands: $m-gensrc)) \ + ) + + # For the full JDK compile commands, create all possible generated sources + $(foreach m, $(GENSRC_MODULES), $(eval $m-libs-compile-commands: $m-gensrc)) + $(foreach m, $(filter $(JAVA_MODULES), $(LIBS_MODULES)), $(eval $m-libs-compile-commands: $m-java)) + + compile-commands-hotspot: $(COMPILE_COMMANDS_TARGETS_HOTSPOT) + compile-commands: $(COMPILE_COMMANDS_TARGETS_HOTSPOT) $(COMPILE_COMMANDS_TARGETS_JDK) + # Jmods cannot be created until we have the jmod tool ready to run. During # a normal build we run it from the exploded image, but when cross compiling # it's run from the buildjdk, which is either created at build time or user @@ -849,6 +892,8 @@ test-make: clean-test-make + test-compile-commands: compile-commands + build-test-lib: exploded-image-optimize build-test-failure-handler: interim-langtools @@ -1071,7 +1116,7 @@ # Remove everything, except the output from configure. clean: $(CLEAN_DIR_TARGETS) - ($(CD) $(OUTPUTDIR) && $(RM) -r build*.log*) + ($(CD) $(OUTPUTDIR) && $(RM) -r build*.log* compile_commands.json) $(ECHO) Cleaned all build artifacts. clean-docs: @@ -1131,11 +1176,6 @@ ################################################################################ -# Include JPRT targets -include $(TOPDIR)/make/Jprt.gmk - -################################################################################ - # The following targets are intentionally not added to ALL_TARGETS since they # are internal only, to support Init.gmk. diff -r 3c92ada330a9 -r e03e5f61c53f make/ModuleWrapper.gmk --- a/make/ModuleWrapper.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/ModuleWrapper.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -100,5 +100,9 @@ $(TARGETS)), \ )) -all: $(TARGETS) $(COPY_LIBS_TO_BIN) $(COPY_LIBS_TO_LIB) \ - $(COPY_INCLUDE) $(COPY_CMDS) $(COPY_CONF) $(LINK_LIBS_TO_LIB) +ifeq ($(GENERATE_COMPILE_COMMANDS_ONLY), true) + all: $(filter $(MAKESUPPORT_OUTPUTDIR)/compile-commands/%, $(TARGETS)) +else + all: $(TARGETS) $(COPY_LIBS_TO_BIN) $(COPY_LIBS_TO_LIB) \ + $(COPY_INCLUDE) $(COPY_CMDS) $(COPY_CONF) $(LINK_LIBS_TO_LIB) +endif diff -r 3c92ada330a9 -r e03e5f61c53f make/RunTests.gmk --- a/make/RunTests.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/RunTests.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -151,13 +151,13 @@ ifneq ($(TEST_OPTS), ) # Inform the user $(info Running tests using TEST_OPTS control variable '$(TEST_OPTS)') - - $(eval $(call SetTestOpt,VM_OPTIONS,JTREG)) - $(eval $(call SetTestOpt,VM_OPTIONS,GTEST)) +endif - $(eval $(call SetTestOpt,JOBS,JTREG)) - $(eval $(call SetTestOpt,TIMEOUT_FACTOR,JTREG)) -endif +$(eval $(call SetTestOpt,VM_OPTIONS,JTREG)) +$(eval $(call SetTestOpt,VM_OPTIONS,GTEST)) + +$(eval $(call SetTestOpt,JOBS,JTREG)) +$(eval $(call SetTestOpt,TIMEOUT_FACTOR,JTREG)) $(eval $(call ParseKeywordVariable, JTREG, \ SINGLE_KEYWORDS := JOBS TIMEOUT_FACTOR TEST_MODE ASSERT VERBOSE RETAIN MAX_MEM \ diff -r 3c92ada330a9 -r e03e5f61c53f make/common/JavaCompilation.gmk --- a/make/common/JavaCompilation.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/common/JavaCompilation.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -76,8 +76,8 @@ $1_COPY_$$($2_TARGET) := 1 # Now we can setup the dependency that will trigger the copying. $$($1_BIN)$$($1_MODULE_SUBDIR)$$($2_TARGET) : $2 - $(MKDIR) -p $$(@D) - $(CP) $$< $$@ + $$(call LogInfo, Copying $$(patsubst $(OUTPUTDIR)/%,%, $$@)) + $$(install-file) $(CHMOD) -f ug+w $$@ # And do not forget this target @@ -120,7 +120,8 @@ ifneq ($$($1_CLEAN_$$($2_TARGET)), 1) $1_CLEAN_$$($2_TARGET) := 1 $$($1_BIN)$$($1_MODULE_SUBDIR)$$($2_TARGET) : $2 - $(MKDIR) -p $$(@D) + $$(call LogInfo, Cleaning $$(patsubst $(OUTPUTDIR)/%,%, $$@)) + $$(call MakeTargetDir) export LC_ALL=C ; ( $(CAT) $$< && $(ECHO) "" ) \ | $(SED) -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' \ -e 's/\([^\\]\)!/\1\\!/g' -e 's/^[ ]*#.*/#/g' \ diff -r 3c92ada330a9 -r e03e5f61c53f make/common/JdkNativeCompilation.gmk --- a/make/common/JdkNativeCompilation.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/common/JdkNativeCompilation.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -47,6 +47,29 @@ $(TOPDIR)/src/$(strip $1)/$(OPENJDK_TARGET_OS_TYPE)/native/$(strip $2) \ $(TOPDIR)/src/$(strip $1)/share/native/$(strip $2))) +# Find a library +# Param 1 - module name +# Param 2 - library name +# Param 3 - optional subdir for library +FindLib = \ + $(call FindLibDirForModule, \ + $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX) + +# Find a static library +# Param 1 - module name +# Param 2 - library name +# Param 3 - optional subdir for library +FindStaticLib = \ + $(addprefix $(SUPPORT_OUTPUTDIR)/native/, \ + $(strip $1)$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(STATIC_LIBRARY_SUFFIX)) + +# If only generating compile_commands.json, make these return empty to avoid +# declaring dependencies. +ifeq ($(GENERATE_COMPILE_COMMANDS_ONLY), true) + FindLib = + FindStaticLib = +endif + GetJavaHeaderDir = \ $(wildcard $(SUPPORT_OUTPUTDIR)/headers/$(strip $1)) diff -r 3c92ada330a9 -r e03e5f61c53f make/common/NativeCompilation.gmk --- a/make/common/NativeCompilation.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/common/NativeCompilation.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -60,6 +60,29 @@ endef ################################################################################ +# Creates a recipe that creates a compile_commands.json fragment. Remove any +# occurences of FIXPATH programs from the command to show the actual invocation. +# +# Param 1: Name of file to create +# Param 2: Working directory +# Param 3: Source file +# Param 4: Compile command +# Param 5: Object name +################################################################################ +define WriteCompileCommandsFragment + $(call LogInfo, Creating compile commands fragment for $(notdir $3)) + $(call MakeDir, $(dir $1)) + $(call WriteFile,{ \ + "directory": "$(strip $2)"$(COMMA) \ + "file": "$(strip $3)"$(COMMA) \ + "command": "$(strip $(subst $(DQUOTE),\$(DQUOTE),$(subst \,\\,\ + $(subst $(FIXPATH),,$4))))"$(COMMA) \ + "output": "$(strip $5)" \ + }$(COMMA), \ + $1) +endef + +################################################################################ # Define a native toolchain configuration that can be used by # SetupNativeCompilation calls # @@ -203,6 +226,11 @@ $1_OBJ := $$($$($1_BASE)_OBJECT_DIR)/$$(call replace_with_obj_extension, \ $$($1_FILENAME)) + # Generate the corresponding compile_commands.json fragment. + $1_OBJ_JSON = $$(MAKESUPPORT_OUTPUTDIR)/compile-commands/$$(subst /,_,$$(subst \ + $$(OUTPUTDIR)/,,$$($1_OBJ))).json + $$($1_BASE)_ALL_OBJS_JSON += $$($1_OBJ_JSON) + # Only continue if this object file hasn't been processed already. This lets # the first found source file override any other with the same name. ifeq ($$(findstring $$($1_OBJ), $$($$($1_BASE)_OBJS_SO_FAR)), ) @@ -297,8 +325,15 @@ $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, $$($1_OBJ).vardeps) endif - $$($1_OBJ): $$($1_SRC_FILE) $$($$($1_BASE)_COMPILE_VARDEPS_FILE) \ - $$($$($1_BASE)_EXTRA_DEPS) $$($1_VARDEPS_FILE) | $$($$($1_BASE)_BUILD_INFO) + $1_OBJ_DEPS := $$($1_SRC_FILE) $$($$($1_BASE)_COMPILE_VARDEPS_FILE) \ + $$($$($1_BASE)_EXTRA_DEPS) $$($1_VARDEPS_FILE) + $1_COMPILE_OPTIONS := $$($1_FLAGS) $(CC_OUT_OPTION)$$($1_OBJ) $$($1_SRC_FILE) + + $$($1_OBJ_JSON): $$($1_OBJ_DEPS) + $$(call WriteCompileCommandsFragment, $$@, $$(PWD), $$($1_SRC_FILE), \ + $$($1_COMPILER) $$($1_COMPILE_OPTIONS), $$($1_OBJ)) + + $$($1_OBJ): $$($1_OBJ_DEPS) | $$($$($1_BASE)_BUILD_INFO) $$(call LogInfo, Compiling $$($1_FILENAME) (for $$($$($1_BASE)_BASENAME))) $$(call MakeDir, $$(@D)) ifneq ($(TOOLCHAIN_TYPE), microsoft) @@ -307,13 +342,11 @@ # object file in the generated deps files. Fixing it with sed. If # compiling assembly, don't try this. $$(call ExecuteWithLog, $$@, \ - $$($1_COMPILER) $$($1_FLAGS) $$($1_DEP_FLAG) $$($1_DEP).tmp \ - $(CC_OUT_OPTION)$$($1_OBJ) $$($1_SRC_FILE)) + $$($1_COMPILER) $$($1_DEP_FLAG) $$($1_DEP).tmp $$($1_COMPILE_OPTIONS)) $(SED) 's|^$$(@F):|$$@:|' $$($1_DEP).tmp > $$($1_DEP) else $$(call ExecuteWithLog, $$@, \ - $$($1_COMPILER) $$($1_FLAGS) $$($1_DEP_FLAG) $$($1_DEP) \ - $(CC_OUT_OPTION)$$($1_OBJ) $$($1_SRC_FILE)) + $$($1_COMPILER) $$($1_DEP_FLAG) $$($1_DEP) $$($1_COMPILE_OPTIONS)) endif # Create a dependency target file from the dependency file. # Solution suggested by http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/ @@ -329,8 +362,7 @@ # on Windows. No need to save exit code from compilation since # pipefail is always active on Windows. $$(call ExecuteWithLog, $$@, \ - $$($1_COMPILER) $$($1_FLAGS) -showIncludes \ - $(CC_OUT_OPTION)$$($1_OBJ) $$($1_SRC_FILE)) \ + $$($1_COMPILER) -showIncludes $$($1_COMPILE_OPTIONS)) \ | $(TR) -d '\r' | $(GREP) -v -e "^Note: including file:" \ -e "^$$($1_FILENAME)$$$$" || test "$$$$?" = "1" ; \ $(ECHO) $$@: \\ > $$($1_DEP) ; \ @@ -694,17 +726,25 @@ -include $$($1_PCH_DEP) -include $$($1_PCH_DEP_TARGETS) + $1_PCH_COMMAND := $$($1_CC) $$($1_CFLAGS) $$($1_EXTRA_CFLAGS) $$($1_SYSROOT_CFLAGS) \ + $$($1_OPT_CFLAGS) -x c++-header -c $(C_FLAG_DEPS) $$($1_PCH_DEP) + $$($1_PCH_FILE): $$($1_PRECOMPILED_HEADER) $$($1_COMPILE_VARDEPS_FILE) $$(call LogInfo, Generating precompiled header) $$(call MakeDir, $$(@D)) - $$(call ExecuteWithLog, $$@, \ - $$($1_CC) $$($1_CFLAGS) $$($1_EXTRA_CFLAGS) $$($1_SYSROOT_CFLAGS) \ - $$($1_OPT_CFLAGS) \ - -x c++-header -c $(C_FLAG_DEPS) $$($1_PCH_DEP) $$< -o $$@) + $$(call ExecuteWithLog, $$@, $$($1_PCH_COMMAND) $$< -o $$@) $(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_PCH_DEP) > $$($1_PCH_DEP_TARGETS) $$($1_ALL_OBJS): $$($1_PCH_FILE) + # Generate the corresponding compile_commands.json fragment. + $1_PCH_FILE_JSON := $$(MAKESUPPORT_OUTPUTDIR)/compile-commands/$$(subst /,_,$$(subst \ + $$(OUTPUTDIR)/,,$$($1_PCH_FILE))).json + $1_ALL_OBJS_JSON += $$($1_PCH_FILE_JSON) + + $$($1_PCH_FILE_JSON): $$($1_PRECOMPILED_HEADER) $$($1_COMPILE_VARDEPS_FILE) + $$(call WriteCompileCommandsFragment, $$@, $$(PWD), $$<, \ + $$($1_PCH_COMMAND) $$< -o $$($1_PCH_FILE), $$($1_PCH_FILE)) endif endif endif @@ -1025,6 +1065,10 @@ endif endif endif + + ifeq ($(GENERATE_COMPILE_COMMANDS_ONLY), true) + $1 := $$($1_ALL_OBJS_JSON) + endif endef endif # _NATIVE_COMPILATION_GMK diff -r 3c92ada330a9 -r e03e5f61c53f make/conf/jib-profiles.js --- a/make/conf/jib-profiles.js Fri Oct 05 15:15:56 2018 -0700 +++ b/make/conf/jib-profiles.js Fri Oct 05 16:14:28 2018 -0700 @@ -522,11 +522,10 @@ .forEach(function (name) { var maketestName = name + "-testmake"; profiles[maketestName] = concatObjects(profiles[name], testmakeBase); - profiles[maketestName].default_make_targets = [ "test-make" ]; + profiles[maketestName].default_make_targets = [ "test-make", "test-compile-commands" ]; }); - // Profiles for building the zero jvm variant. These are used for verification - // in JPRT. + // Profiles for building the zero jvm variant. These are used for verification. var zeroProfiles = { "linux-x64-zero": { target_os: "linux", @@ -733,18 +732,8 @@ }); }); - // Profiles used to run tests. Used in JPRT and Mach 5. + // Profiles used to run tests. var testOnlyProfiles = { - "run-test-jprt": { - target_os: input.build_os, - target_cpu: input.build_cpu, - dependencies: [ "jtreg", "gnumake", "boot_jdk", "devkit", "jib" ], - labels: "test", - environment: { - "JT_JAVA": common.boot_jdk_home - } - }, - "run-test": { target_os: input.build_os, target_cpu: input.build_cpu, @@ -805,7 +794,6 @@ + "/Xcode.app/Contents/Developer/usr/bin" }; profiles["run-test"] = concatObjects(profiles["run-test"], macosxRunTestExtra); - profiles["run-test-jprt"] = concatObjects(profiles["run-test-jprt"], macosxRunTestExtra); profiles["run-test-prebuilt"] = concatObjects(profiles["run-test-prebuilt"], macosxRunTestExtra); } // On windows we want the debug symbols available at test time diff -r 3c92ada330a9 -r e03e5f61c53f make/data/unicodedata/UnicodeData.txt --- a/make/data/unicodedata/UnicodeData.txt Fri Oct 05 15:15:56 2018 -0700 +++ b/make/data/unicodedata/UnicodeData.txt Fri Oct 05 16:14:28 2018 -0700 @@ -11729,6 +11729,7 @@ 32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; 32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; 32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; +32FF;SQUARE ERA NAME NEWERA;So;0;L; 5143 53F7;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME NEWERA;;;; 3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; 3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; 3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; diff -r 3c92ada330a9 -r e03e5f61c53f make/hotspot/lib/CompileJvm.gmk --- a/make/hotspot/lib/CompileJvm.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/hotspot/lib/CompileJvm.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -92,7 +92,7 @@ DISABLED_WARNINGS_gcc += return-type switch endif -DISABLED_WARNINGS_clang := tautological-compare deprecated-declarations \ +DISABLED_WARNINGS_clang := tautological-compare \ undefined-var-template sometimes-uninitialized unknown-pragmas \ delete-non-virtual-dtor missing-braces char-subscripts \ ignored-qualifiers missing-field-initializers mismatched-tags @@ -214,15 +214,17 @@ $(VM_VERSION_OBJ): $(filter-out $(VM_VERSION_OBJ) $(JVM_MAPFILE), \ $(BUILD_LIBJVM_TARGET_DEPS)) -ifeq ($(OPENJDK_TARGET_OS), windows) - # It doesn't matter which jvm.lib file gets exported, but we need - # to pick just one. - ifeq ($(JVM_VARIANT), $(JVM_VARIANT_MAIN)) - $(eval $(call SetupCopyFiles, COPY_JVM_LIB, \ - DEST := $(LIB_OUTPUTDIR), \ - FILES :=$(BUILD_LIBJVM_IMPORT_LIBRARY), \ - )) - TARGETS += $(COPY_JVM_LIB) +ifneq ($(GENERATE_COMPILE_COMMANDS_ONLY), true) + ifeq ($(OPENJDK_TARGET_OS), windows) + # It doesn't matter which jvm.lib file gets exported, but we need + # to pick just one. + ifeq ($(JVM_VARIANT), $(JVM_VARIANT_MAIN)) + $(eval $(call SetupCopyFiles, COPY_JVM_LIB, \ + DEST := $(LIB_OUTPUTDIR), \ + FILES :=$(BUILD_LIBJVM_IMPORT_LIBRARY), \ + )) + TARGETS += $(COPY_JVM_LIB) + endif endif endif @@ -261,44 +263,46 @@ # Search the output for the operator(s) of interest, to see where they are # referenced. -ifneq ($(filter $(TOOLCHAIN_TYPE), gcc clang solstudio), ) +ifneq ($(GENERATE_COMPILE_COMMANDS_ONLY), true) + ifneq ($(filter $(TOOLCHAIN_TYPE), gcc clang solstudio), ) - DEMANGLED_REGEXP := [^:]operator (new|delete) + DEMANGLED_REGEXP := [^:]operator (new|delete) - # Running c++filt to find offending symbols in all files is too expensive, - # especially on Solaris, so use mangled names when looking for symbols. - # Save the demangling for when something is actually found. - ifeq ($(TOOLCHAIN_TYPE), solstudio) - MANGLED_SYMS := \ - __1c2n6FL_pv_ \ - __1c2N6FL_pv_ \ - __1c2k6Fpv_v_ \ - __1c2K6Fpv_v_ \ - # - UNDEF_PATTERN := UNDEF - else - MANGLED_SYMS := \ - _ZdaPv \ - _ZdlPv \ - _Znam \ - _Znwm \ - # - UNDEF_PATTERN := ' U ' + # Running c++filt to find offending symbols in all files is too expensive, + # especially on Solaris, so use mangled names when looking for symbols. + # Save the demangling for when something is actually found. + ifeq ($(TOOLCHAIN_TYPE), solstudio) + MANGLED_SYMS := \ + __1c2n6FL_pv_ \ + __1c2N6FL_pv_ \ + __1c2k6Fpv_v_ \ + __1c2K6Fpv_v_ \ + # + UNDEF_PATTERN := UNDEF + else + MANGLED_SYMS := \ + _ZdaPv \ + _ZdlPv \ + _Znam \ + _Znwm \ + # + UNDEF_PATTERN := ' U ' + endif + + define SetupOperatorNewDeleteCheck + $1.op_check: $1 + if [ -n "`$(NM) $$< | $(GREP) $(addprefix -e , $(MANGLED_SYMS)) \ + | $(GREP) $(UNDEF_PATTERN)`" ]; then \ + $(ECHO) "$$<: Error: Use of global operators new and delete is not allowed in Hotspot:"; \ + $(NM) $$< | $(CXXFILT) | $(EGREP) '$(DEMANGLED_REGEXP)' | $(GREP) $(UNDEF_PATTERN); \ + $(ECHO) "See: $(TOPDIR)/make/hotspot/lib/CompileJvm.gmk"; \ + exit 1; \ + fi + $(TOUCH) $$@ + + TARGETS += $1.op_check + endef + + $(foreach o, $(BUILD_LIBJVM_ALL_OBJS), $(eval $(call SetupOperatorNewDeleteCheck,$o))) endif - - define SetupOperatorNewDeleteCheck - $1.op_check: $1 - if [ -n "`$(NM) $$< | $(GREP) $(addprefix -e , $(MANGLED_SYMS)) \ - | $(GREP) $(UNDEF_PATTERN)`" ]; then \ - $(ECHO) "$$<: Error: Use of global operators new and delete is not allowed in Hotspot:"; \ - $(NM) $$< | $(CXXFILT) | $(EGREP) '$(DEMANGLED_REGEXP)' | $(GREP) $(UNDEF_PATTERN); \ - $(ECHO) "See: $(TOPDIR)/make/hotspot/lib/CompileJvm.gmk"; \ - exit 1; \ - fi - $(TOUCH) $$@ - - TARGETS += $1.op_check - endef - - $(foreach o, $(BUILD_LIBJVM_ALL_OBJS), $(eval $(call SetupOperatorNewDeleteCheck,$o))) endif diff -r 3c92ada330a9 -r e03e5f61c53f make/jprt.properties --- a/make/jprt.properties Fri Oct 05 15:15:56 2018 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,503 +0,0 @@ -# -# Copyright (c) 2006, 2018, 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. -# - -############## -# -# Global settings -# - -# Install test bundle for targets in jprt.test.bundle.targets set -jprt.selective.test.bundle.installation=true - -# The current release name -jprt.tools.default.release=jdk9 - -# Allow concurrent changes to be merged in prior to pushing -jprt.sync.push=true - -# Directories to be excluded from the source bundles -jprt.bundle.exclude.src.dirs=build dist webrev ${jprt.bundle.exclude.src.dirs.extra} - -# Use configure when building -jprt.build.use.configure=true -jprt.build.use.jib=true -jprt.test.use.jib=true -jprt.jib.launcher=bin/jib.sh -jprt.build.use.jib.publish=true - -# Clear out all the build needs as JIB handles this -jprt.jdk9.build.needs= -jprt.macosx.jdk9.build.needs= -jprt.windows_i586.jdk9.build.needs= -jprt.windows_x64.jdk9.build.needs= -jprt.solaris.jdk9.build.needs= -jprt.linux_i586.jdk9.build.needs= -jprt.linux_x64.jdk9.build.needs= -jprt.linux_armv6.jdk9.build.needs= -jprt.linux_armvh.jdk9.build.needs= -jprt.linux_arm64.jdk9.build.needs= -jprt.linux_armsflt.jdk9.build.needs= -jprt.linux_armvfpsflt.jdk9.build.needs= -jprt.linux_armvfphflt.jdk9.build.needs= -jprt.linux_armv6vfphflt.jdk9.build.needs= -jprt.solaris.client.build.needs= -jprt.linux.client.build.needs= -jprt.solaris.jdk9.compiler= -jprt.linux.jdk9.compiler= -jprt.jdk9.test.needs= - -# Disable the need for preinstalled Visual Studio and Xcode -jprt.windows.jdk9.compiler= -jprt.windows.6.2.jdk9.compiler= -jprt.windows.6.3.jdk9.compiler= -jprt.windows.jdk9.target.attribute.compilerVS2013.appliesTo.builds=none -jprt.macosx.jdk9.target.attribute.compilerXcode511.appliesTo.builds=none - -# Set up the run flavors (jvm variants) -jprt.run.flavors=c2,default,${my.additional.run.flavors} - -# Setup jib profiles -jprt.linux_i586.product.build.jib.profile=linux-x86 -jprt.linux_x64.product.build.jib.profile=linux-x64 -jprt.macosx_x64.product.build.jib.profile=macosx-x64 -jprt.solaris_sparcv9.product.build.jib.profile=solaris-sparcv9 -jprt.solaris_x64.product.build.jib.profile=solaris-x64 -jprt.windows_i586.product.build.jib.profile=windows-x86 -jprt.windows_x64.product.build.jib.profile=windows-x64 - -jprt.linux_i586.fastdebug.build.jib.profile=linux-x86-debug -jprt.linux_x64.fastdebug.build.jib.profile=linux-x64-debug -jprt.macosx_x64.fastdebug.build.jib.profile=macosx-x64-debug -jprt.solaris_sparcv9.fastdebug.build.jib.profile=solaris-sparcv9-debug -jprt.solaris_x64.fastdebug.build.jib.profile=solaris-x64-debug -jprt.windows_i586.fastdebug.build.jib.profile=windows-x86-debug -jprt.windows_x64.fastdebug.build.jib.profile=windows-x64-debug - -jprt.linux_i586.slowdebug.build.jib.profile=linux-x86-slowdebug -jprt.linux_x64.slowdebug.build.jib.profile=linux-x64-slowdebug -jprt.macosx_x64.slowdebug.build.jib.profile=macosx-x64-slowdebug -jprt.solaris_sparcv9.slowdebug.build.jib.profile=solaris-sparcv9-slowdebug -jprt.solaris_x64.slowdebug.build.jib.profile=solaris-x64-slowdebug -jprt.windows_i586.slowdebug.build.jib.profile=windows-x86-slowdebug -jprt.windows_x64.slowdebug.build.jib.profile=windows-x64-slowdebug - -jprt.linux_i586.productOpen.build.jib.profile=linux-x86-open -jprt.linux_x64.productOpen.build.jib.profile=linux-x64-open -jprt.macosx_x64.productOpen.build.jib.profile=macosx-x64-open -jprt.solaris_sparcv9.productOpen.build.jib.profile=solaris-sparcv9-open -jprt.solaris_x64.productOpen.build.jib.profile=solaris-x64-open -jprt.windows_i586.productOpen.build.jib.profile=windows-x86-open -jprt.windows_x64.productOpen.build.jib.profile=windows-x64-open - -jprt.linux_i586.fastdebugOpen.build.jib.profile=linux-x86-open-debug -jprt.linux_x64.fastdebugOpen.build.jib.profile=linux-x64-open-debug -jprt.macosx_x64.fastdebugOpen.build.jib.profile=macosx-x64-open-debug -jprt.solaris_sparcv9.fastdebugOpen.build.jib.profile=solaris-sparcv9-open-debug -jprt.solaris_x64.fastdebugOpen.build.jib.profile=solaris-x64-open-debug -jprt.windows_i586.fastdebugOpen.build.jib.profile=windows-x86-open-debug -jprt.windows_x64.fastdebugOpen.build.jib.profile=windows-x64-open-debug - -jprt.linux_i586.productZero.build.jib.profile=linux-x86-zero -jprt.linux_x64.productZero.build.jib.profile=linux-x64-zero - -jprt.linux_i586.fastdebugZero.build.jib.profile=linux-x86-zero-debug -jprt.linux_x64.fastdebugZero.build.jib.profile=linux-x64-zero-debug - -jprt.test.jib.profile=run-test-jprt - -# Set make target to use for different build flavors -jprt.build.flavor.fastdebugOpen.target=jprt_bundle -jprt.build.flavor.fastdebug.target=jprt_bundle -jprt.build.flavor.product.target=jprt_bundle -jprt.build.flavor.productOpen.target=jprt_bundle -jprt.build.flavor.optimized.target=jprt_bundle -jprt.build.flavor.optimizedOpen.target=jprt_bundle -jprt.build.flavor.slowdebug.target=jprt_bundle -jprt.build.flavor.productZero.target=jprt_bundle -jprt.build.flavor.fastdebugZero.target=jprt_bundle - -# Use these configure args to define debug level or provide specific -# configuration details not covered by Jib profiles. -jprt.slowdebug.build.configure.args= -jprt.fastdebug.build.configure.args=--disable-precompiled-headers -# Don't disable precompiled headers on windows. It's simply too slow. -jprt.windows_i586.fastdebug.build.configure.args= -jprt.windows_x64.fastdebug.build.configure.args= -jprt.windows_i586.fastdebugOpen.build.configure.args= -jprt.windows_x64.fastdebugOpen.build.configure.args= -jprt.product.build.configure.args= -jprt.optimized.build.configure.args=--with-debug-level=optimized -jprt.slowdebugOpen.build.configure.args=${jprt.slowdebug.build.configure.args} -jprt.fastdebugOpen.build.configure.args=${jprt.fastdebug.build.configure.args} -jprt.productOpen.build.configure.args=${jprt.product.build.configure.args} -jprt.optimizedOpen.build.configure.args=${jprt.product.build.configure.args} - - -# hotspot testset has custom build flavors and build targets -my.jprt.testsetHasCustomBuildFlavors.hotspot=true -my.jprt.testsetHasCustomBuildTargets.hotspot=true -my.jprt.testsetHasCustomBuildFlavors.buildinfra=true -my.jprt.testsetHasCustomBuildTargets.buildinfra=true - -# determine if the specified testset has custom build flavors or build targets -my.jprt.testsetHasCustomBuildFlavors=${my.jprt.testsetHasCustomBuildFlavors.${jprt.test.set}} -my.jprt.testsetHasCustomBuildTargets=${my.jprt.testsetHasCustomBuildTargets.${jprt.test.set}} - -# Select build flavors and build targets based on the specified testset -jprt.build.flavors=${my.jprt.testsetHasCustomBuildFlavors ? \ - ${my.build.flavors.${jprt.test.set}} : ${my.build.flavors.default}} -jprt.build.targets=${my.jprt.testsetHasCustomBuildTargets ? \ - ${my.build.targets.${jprt.test.set}} : ${my.build.targets.default}} - -# Select test targets - jprt default for jprt.test.set is "default" -jprt.test.targets=${my.test.targets.${jprt.test.set}} -jprt.make.rule.test.targets=${my.make.rule.test.targets.${jprt.test.set}} - -# Not all test targets need the test image -jprt.test.bundle.targets=\ - ${my.make.rule.test.targets.svc}, \ - ${my.make.rule.test.targets.hotspot.reg}, \ - ${my.make.rule.test.targets.hotspot.gtest} \ - ${my.make.rule.test.targets.nativesanity} \ - ${my.test.target.set:TESTNAME=jdk_lang} \ - ${my.test.target.set:TESTNAME=jdk_nio} - -# 7155453: Work-around to prevent popups on OSX from blocking test completion -# but the work-around is added to all platforms to be consistent -jprt.jbb.options=-Djava.awt.headless=true - -######## -# -# Build options (generic) -# - -# Configure args common to all builds -# Also allows for additional, testset specific configure arguments to be set -jprt.build.configure.args= \ - --with-output-sync=recurse \ - --with-jobs=$ALT_PARALLEL_COMPILE_JOBS \ - --with-version-opt=$JPRT_JOB_ID \ - ${my.additional.build.configure.args.${jprt.test.set}} \ - ${my.custom.build.configure.args} - -######## -# -# Build targets and options (default/jdk) -# - -# The default build flavors -my.build.flavors.default=fastdebug,product - -# Standard list of jprt build targets for this source tree -my.build.targets.default= \ - solaris_sparcv9_5.11-{product|fastdebug}, \ - solaris_x64_5.11-{product|fastdebug}, \ - linux_i586_3.8-{product|fastdebug}, \ - linux_x64_3.8-{product|fastdebug}, \ - macosx_x64_10.9-{product|fastdebug}, \ - windows_i586_6.3-{product|fastdebug}, \ - windows_x64_6.3-{product|fastdebug}, \ - ${my.additional.build.targets.default} - -# Test target list (no fastdebug & limited c2 testing) -my.test.target.set= \ - solaris_sparcv9_5.11-product-c2-TESTNAME, \ - solaris_x64_5.11-product-c2-TESTNAME, \ - linux_i586_3.8-product-c2-TESTNAME, \ - linux_x64_3.8-product-c2-TESTNAME, \ - macosx_x64_10.9-product-c2-TESTNAME, \ - windows_i586_6.3-product-c2-TESTNAME, \ - windows_x64_6.3-product-c2-TESTNAME - -# Default vm test targets (testset=default) -my.test.targets.default= \ - ${my.test.target.set:TESTNAME=jvm98}, \ - ${my.test.target.set:TESTNAME=scimark} - -# Default jdk test targets (testset=default) -my.make.rule.test.targets.default= \ - ${my.test.target.set:TESTNAME=langtools_jtreg}, \ - ${my.test.target.set:TESTNAME=jdk_lang}, \ - ${my.test.target.set:TESTNAME=jdk_math}, \ - ${my.test.target.set:TESTNAME=jdk_util} - -# Default vm test targets (testset=core) -my.test.targets.core= - -# Core jdk test targets (testset=core) -my.make.rule.test.targets.core= \ - ${my.test.target.set:TESTNAME=jdk_lang}, \ - ${my.test.target.set:TESTNAME=jdk_math}, \ - ${my.test.target.set:TESTNAME=jdk_util}, \ - ${my.test.target.set:TESTNAME=jdk_io}, \ - ${my.test.target.set:TESTNAME=jdk_net}, \ - ${my.test.target.set:TESTNAME=jdk_nio}, \ - ${my.test.target.set:TESTNAME=jdk_security1}, \ - ${my.test.target.set:TESTNAME=jdk_security2}, \ - ${my.test.target.set:TESTNAME=jdk_security3}, \ - ${my.test.target.set:TESTNAME=jdk_security4}, \ - ${my.test.target.set:TESTNAME=jdk_rmi}, \ - ${my.test.target.set:TESTNAME=jdk_text}, \ - ${my.test.target.set:TESTNAME=jdk_time}, \ - ${my.test.target.set:TESTNAME=jdk_other}, \ - ${my.test.target.set:TESTNAME=core_tools} - -# Svc vm test targets (testset=svc) -my.test.targets.svc= - -# Core jdk test targets (testset=svc) -my.make.rule.test.targets.svc= \ - ${my.test.target.set:TESTNAME=jdk_management}, \ - ${my.test.target.set:TESTNAME=jdk_instrument}, \ - ${my.test.target.set:TESTNAME=jdk_jmx}, \ - ${my.test.target.set:TESTNAME=jdk_jdi}, \ - ${my.test.target.set:TESTNAME=jdk_jfr}, \ - ${my.test.target.set:TESTNAME=svc_tools}, \ - ${my.make.rule.test.targets.svc.extra} - -# JAXP vm test targets (testset=jaxp) -my.test.targets.jaxp= - -# JAXP test targets (testset=jaxp) -my.make.rule.test.targets.jaxp= \ - ${my.test.target.set:TESTNAME=jaxp_all} - -# All vm test targets (testset=all) -my.test.targets.all= \ - ${my.test.targets.default}, \ - ${my.test.target.set:TESTNAME=runThese}, \ - ${my.test.target.set:TESTNAME=jbb_default} - -# All jdk test targets (testset=all) -my.make.rule.test.targets.all= \ - ${my.make.rule.test.targets.core}, \ - ${my.make.rule.test.targets.svc}, \ - ${my.test.target.set:TESTNAME=jdk_awt}, \ - ${my.test.target.set:TESTNAME=jdk_beans}, \ - ${my.test.target.set:TESTNAME=jdk_sound}, \ - ${my.test.target.set:TESTNAME=jdk_swing} - -# PIT vm test targets (testset=pit) -my.test.targets.pit= \ - ${my.test.targets.all} - -# PIT jdk test targets (testset=pit) -my.make.rule.test.targets.pit= \ - ${my.test.target.set:TESTNAME=langtools_jtreg}, \ - ${my.make.rule.test.targets.core}, \ - ${my.make.rule.test.targets.svc} \ - ${my.make.rule.test.targets.jaxp} - -# JCK test targets in test/Makefile (no windows) -my.test.target.set.jck= \ - solaris_sparcv9_5.11-product-c2-JCK7TESTRULE, \ - solaris_x64_5.11-product-c2-JCK7TESTRULE, \ - linux_i586_3.8-product-c2-JCK7TESTRULE, \ - linux_x64_3.8-product-c2-JCK7TESTRULE - -# JCK testset targets -my.make.rule.test.targets.jck= \ - ${my.test.target.set.jck:JCK7TESTRULE=jck7devtools}, \ - ${my.test.target.set.jck:JCK7TESTRULE=jck7runtime}, \ - ${my.test.target.set.jck:JCK7TESTRULE=jck7compiler} - - -############# -# -# Hotspot related settings (testset=hotspot) -# - -# The hotspot build flavors -my.build.flavors.hotspot= \ - fastdebugOpen,fastdebug,product,productOpen,optimized,optimizedOpen \ - ${my.additional.build.flavors.hotspot} - -# Platforms built for hotspot push jobs -my.build.targets.hotspot= \ - solaris_sparcv9_5.11-{product|fastdebug}, \ - solaris_x64_5.11-{product|fastdebug}, \ - linux_i586_3.8-{product|fastdebug}, \ - linux_x64_3.8-{product|fastdebug}, \ - macosx_x64_10.9-{product|fastdebug}, \ - windows_i586_6.3-{product|fastdebug}, \ - windows_x64_6.3-{product|fastdebug}, \ - solaris_x64_5.11-{fastdebugOpen}, \ - linux_x64_3.8-{productOpen}, \ - ${my.additional.build.targets.hotspot} - -# Tests to run on the various platforms for hotspot push jobs -my.test.targets.hotspot.solaris.sparcv9= \ - solaris_sparcv9_5.11-{product|fastdebug}-c2-jvm98, \ - solaris_sparcv9_5.11-{product|fastdebug}-c2-jvm98_nontiered, \ - solaris_sparcv9_5.11-{product|fastdebug}-c2-scimark, \ - solaris_sparcv9_5.11-product-c2-runThese8, - -my.test.targets.hotspot.solaris.x64= \ - solaris_x64_5.11-{product|fastdebug}-c2-jvm98, \ - solaris_x64_5.11-{product|fastdebug}-c2-jvm98_nontiered, \ - solaris_x64_5.11-{product|fastdebug}-c2-scimark, \ - solaris_x64_5.11-product-c2-runThese8, \ - solaris_x64_5.11-product-c2-runThese8_Xcomp_lang, \ - solaris_x64_5.11-product-c2-runThese8_Xcomp_vm, - -my.test.targets.hotspot.linux.i586= \ - linux_i586_3.8-{product|fastdebug}-c2-jvm98, \ - linux_i586_3.8-{product|fastdebug}-c2-jvm98_nontiered, \ - linux_i586_3.8-{product|fastdebug}-c2-scimark, \ - linux_i586_3.8-fastdebug-c2-runThese8_Xcomp_lang, \ - linux_i586_3.8-fastdebug-c2-runThese8_Xcomp_vm - -my.test.targets.hotspot.linux.x64= \ - linux_x64_3.8-{product|fastdebug}-c2-jvm98, \ - linux_x64_3.8-{product|fastdebug}-c2-jvm98_nontiered, \ - linux_x64_3.8-{product|fastdebug}-c2-scimark - -my.test.targets.hotspot.macosx.x64= \ - macosx_x64_10.9-{product|fastdebug}-c2-jvm98, \ - macosx_x64_10.9-{product|fastdebug}-c2-jvm98_nontiered, \ - macosx_x64_10.9-{product|fastdebug}-c2-scimark - -my.test.targets.hotspot.windows.i586= \ - windows_i586_6.3-{product|fastdebug}-c2-jvm98, \ - windows_i586_6.3-{product|fastdebug}-c2-jvm98_nontiered, \ - windows_i586_6.3-{product|fastdebug}-c2-scimark, \ - windows_i586_6.3-product-c2-runThese8, \ - windows_i586_6.3-product-c2-runThese8_Xcomp_lang, \ - windows_i586_6.3-product-c2-runThese8_Xcomp_vm, - -my.test.targets.hotspot.windows.x64= \ - windows_x64_6.3-{product|fastdebug}-c2-jvm98, \ - windows_x64_6.3-{product|fastdebug}-c2-jvm98_nontiered, \ - windows_x64_6.3-{product|fastdebug}-c2-scimark, \ - windows_x64_6.3-product-c2-runThese8, \ - windows_x64_6.3-product-c2-runThese8_Xcomp_lang, \ - windows_x64_6.3-product-c2-runThese8_Xcomp_vm, - -# Some basic "smoke" tests for OpenJDK builds -my.test.targets.hotspot.open= \ - solaris_x64_5.11-{productOpen|fastdebugOpen}-c2-jvm98, \ - linux_x64_3.8-{productOpen|fastdebugOpen}-c2-jvm98 - -# The complete list of test targets for jprt -my.test.targets.hotspot= \ - ${my.test.targets.hotspot.open}, \ - ${my.test.targets.hotspot.solaris.sparcv9}, \ - ${my.test.targets.hotspot.solaris.x64}, \ - ${my.test.targets.hotspot.linux.i586}, \ - ${my.test.targets.hotspot.linux.x64}, \ - ${my.test.targets.hotspot.macosx.x64}, \ - ${my.test.targets.hotspot.windows.i586}, \ - ${my.test.targets.hotspot.windows.x64}, \ - ${my.test.targets.hotspot.solaris.sparcv9}, \ - ${my.test.targets.hotspot.solaris.x64}, \ - ${my.test.targets.hotspot.linux.x64}, \ - ${my.test.targets.hotspot.windows.i586}, \ - ${my.test.targets.hotspot.windows.x64}, \ - ${my.additional.test.targets.hotspot} - - -# Make file based test targets - -my.make.rule.test.targets.hotspot.gtest= \ - linux_i586_3.8-*-default-hotspot_gtest, \ - linux_x64_3.8-*-default-hotspot_gtest, \ - macosx_x64_10.9-*-default-hotspot_gtest, \ - solaris_sparcv9_5.11-*-default-hotspot_gtest, \ - solaris_x64_5.11-*-default-hotspot_gtest, \ - windows_i586_6.3-*-default-hotspot_gtest, \ - windows_x64_6.3-*-default-hotspot_gtest, \ - ${my.additional.make.rule.test.targets.hotspot.gtest} - -my.make.rule.test.targets.hotspot.reg.group= \ - solaris_sparcv9_5.11-fastdebug-c2-GROUP, \ - solaris_x64_5.11-fastdebug-c2-GROUP, \ - linux_i586_3.8-fastdebug-c2-GROUP, \ - linux_x64_3.8-fastdebug-c2-GROUP, \ - macosx_x64_10.9-fastdebug-c2-GROUP, \ - windows_i586_6.3-fastdebug-c2-GROUP, \ - windows_x64_6.3-fastdebug-c2-GROUP - -# Hotspot jtreg tests -my.make.rule.test.targets.hotspot.reg= \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_compiler_1}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_compiler_2}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_compiler_3}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_compiler_closed}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_gc_1}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_gc_2}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_gc_closed}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_gc_gcold}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_gc_gcbasher}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_runtime}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_tier1_serviceability}, \ - ${my.make.rule.test.targets.hotspot.reg.group:GROUP=jdk_svc_sanity}, \ - solaris_sparcv9_5.11-product-c2-hotspot_tier1_gc_gcbasher, \ - solaris_x64_5.11-product-c2-hotspot_tier1_gc_gcbasher, \ - linux_i586_3.8-product-c2-hotspot_tier1_gc_gcbasher, \ - linux_x64_3.8-product-c2-hotspot_tier1_gc_gcbasher, \ - macosx_x64_10.9-product-c2-hotspot_tier1_gc_gcbasher, \ - windows_i586_6.3-product-c2-hotspot_tier1_gc_gcbasher, \ - windows_x64_6.3-product-c2-hotspot_tier1_gc_gcbasher, \ - ${my.additional.make.rule.test.targets.hotspot.reg} - -# Other Makefile based Hotspot tests -my.make.rule.test.targets.hotspot.other= \ - ${my.make.rule.test.targets.hotspot.gtest}, \ - ${my.additional.make.rule.test.targets.hotspot.other} - -# All the makefile based tests to run -my.make.rule.test.targets.hotspot= \ - ${my.make.rule.test.targets.hotspot.reg} \ - ${my.make.rule.test.targets.hotspot.other} - -# Native jdk and hotspot test targets (testset=nativesanity) -my.make.rule.test.targets.nativesanity= \ - ${my.test.target.set:TESTNAME=jdk_native_sanity}, \ - ${my.test.target.set:TESTNAME=hotspot_native_sanity} - -################################################################################ -# Testset buildinfra -my.build.flavors.buildinfra = \ - product,fastdebug,slowdebug,productZero,fastdebugZero \ - ${my.additional.build.flavors.buildinfra} - -# Platforms built for hotspot push jobs -my.build.targets.buildinfra = \ - solaris_sparcv9_5.11-{product|fastdebug|slowdebug}, \ - solaris_x64_5.11-{product|fastdebug|slowdebug}, \ - linux_i586_3.8-{product|fastdebug|slowdebug|productZero|fastdebugZero}, \ - linux_x64_3.8-{product|fastdebug|slowdebug|productZero|fastdebugZero}, \ - macosx_x64_10.9-{product|fastdebug|slowdebug}, \ - windows_i586_6.3-{product|fastdebug|slowdebug}, \ - windows_x64_6.3-{product|fastdebug|slowdebug}, \ - ${my.additional.build.targets.buildinfra} - -my.test.targets.buildinfra = \ - ${my.test.targets.default}, \ - ${my.test.targets.hotspot} - -my.make.rule.test.targets.buildinfra = \ - ${my.make.rule.test.targets.default}, \ - ${my.make.rule.test.targets.hotspot} diff -r 3c92ada330a9 -r e03e5f61c53f make/launcher/Launcher-jdk.pack.gmk --- a/make/launcher/Launcher-jdk.pack.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/launcher/Launcher-jdk.pack.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -91,21 +91,15 @@ CFLAGS_solaris := -KPIC, \ CFLAGS_macosx := -fPIC, \ DISABLED_WARNINGS_clang := format-nonliteral, \ - LDFLAGS := $(UNPACKEXE_ZIPOBJS) \ - $(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \ + LDFLAGS := $(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LIBS := $(UNPACKEXE_LIBS) $(LIBCXX), \ OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/unpackexe, \ MANIFEST := $(TOPDIR)/src/jdk.pack/windows/native/unpack200/unpack200_proto.exe.manifest, \ MANIFEST_VERSION := $(VERSION_NUMBER_FOUR_POSITIONS), \ + EXTRA_OBJECT_FILES := $(UNPACKEXE_ZIPOBJS) \ )) -ifneq ($(USE_EXTERNAL_LIBZ), true) - - $(BUILD_UNPACKEXE): $(UNPACKEXE_ZIPOBJS) - -endif - TARGETS += $(BUILD_UNPACKEXE) ################################################################################ diff -r 3c92ada330a9 -r e03e5f61c53f make/launcher/LauncherCommon.gmk --- a/make/launcher/LauncherCommon.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/launcher/LauncherCommon.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -135,7 +135,7 @@ $1_LIBS += -lz endif - $1_WINDOWS_JLI_LIB := $(SUPPORT_OUTPUTDIR)/native/java.base/libjli/jli.lib + $1_WINDOWS_JLI_LIB := $(call FindStaticLib, java.base, jli, /libjli) $$(eval $$(call SetupJdkExecutable, BUILD_LAUNCHER_$1, \ NAME := $1, \ @@ -181,11 +181,11 @@ TARGETS += $$($1) ifeq ($(OPENJDK_TARGET_OS), aix) - $$(BUILD_LAUNCHER_$1): $(SUPPORT_OUTPUTDIR)/native/java.base/libjli_static.a + $$(BUILD_LAUNCHER_$1): $(call FindStaticLib, java.base, jli_static) endif ifeq ($(OPENJDK_TARGET_OS), windows) - $$(BUILD_LAUNCHER_$1): $(SUPPORT_OUTPUTDIR)/native/java.base/libjava/java.lib \ + $$(BUILD_LAUNCHER_$1): $(call FindStaticLib, java.base, java, /libjava) \ $$($1_WINDOWS_JLI_LIB) endif endef diff -r 3c92ada330a9 -r e03e5f61c53f make/lib/Awt2dLibraries.gmk --- a/make/lib/Awt2dLibraries.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/lib/Awt2dLibraries.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -739,11 +739,11 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false) $(BUILD_LIBJAWT): $(BUILD_LIBAWT_XAWT) else - $(BUILD_LIBJAWT): $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)awt_headless$(SHARED_LIBRARY_SUFFIX) + $(BUILD_LIBJAWT): $(call FindLib, $(MODULE), awt_headless) endif ifeq ($(OPENJDK_TARGET_OS), macosx) - $(BUILD_LIBJAWT): $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)awt_lwawt$(SHARED_LIBRARY_SUFFIX) + $(BUILD_LIBJAWT): $(call FindLib, $(MODULE), awt_lwawt) endif endif # OPENJDK_TARGET_OS diff -r 3c92ada330a9 -r e03e5f61c53f make/lib/Lib-jdk.accessibility.gmk --- a/make/lib/Lib-jdk.accessibility.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/lib/Lib-jdk.accessibility.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -55,7 +55,7 @@ VERSIONINFO_RESOURCE := $(ROOT_SRCDIR)/common/AccessBridgeStatusWindow.rc, \ ) - $$(BUILD_JAVAACCESSBRIDGE$1): $(SUPPORT_OUTPUTDIR)/native/java.desktop/libjawt/jawt.lib + $$(BUILD_JAVAACCESSBRIDGE$1): $(call FindStaticLib, java.desktop, jawt, /libjawt) TARGETS += $$(BUILD_JAVAACCESSBRIDGE$1) endef diff -r 3c92ada330a9 -r e03e5f61c53f make/lib/LibCommon.gmk --- a/make/lib/LibCommon.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/make/lib/LibCommon.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -61,24 +61,6 @@ endif endif -################################################################################ -# Find a library -# Param 1 - module name -# Param 2 - library name -# Param 3 - optional subdir for library -FindLib = \ - $(call FindLibDirForModule, \ - $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX) - -################################################################################ -# Find a static library -# Param 1 - module name -# Param 2 - library name -# Param 3 - optional subdir for library -FindStaticLib = \ - $(addprefix $(SUPPORT_OUTPUTDIR)/native/, \ - $(strip $1)$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(STATIC_LIBRARY_SUFFIX)) - # Put the libraries here. INSTALL_LIBRARIES_HERE := $(call FindLibDirForModule, $(MODULE)) diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp --- a/src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2018, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -195,9 +195,7 @@ void CompiledDirectStaticCall::verify() { // Verify call. _call->verify(); - if (os::is_MP()) { - _call->verify_alignment(); - } + _call->verify_alignment(); // Verify stub. address stub = find_stub(false /* is_aot */); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp --- a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1950,24 +1950,20 @@ // didn't see any synchronization is progress, and escapes. __ mov(rscratch1, _thread_in_native_trans); - if(os::is_MP()) { - if (UseMembar) { - __ strw(rscratch1, Address(rthread, JavaThread::thread_state_offset())); - - // Force this write out before the read below - __ dmb(Assembler::ISH); - } else { - __ lea(rscratch2, Address(rthread, JavaThread::thread_state_offset())); - __ stlrw(rscratch1, rscratch2); - - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(rthread, r2); - } + if (UseMembar) { + __ strw(rscratch1, Address(rthread, JavaThread::thread_state_offset())); + + // Force this write out before the read below + __ dmb(Assembler::ISH); } else { - __ strw(rscratch1, Address(rthread, JavaThread::thread_state_offset())); + __ lea(rscratch2, Address(rthread, JavaThread::thread_state_offset())); + __ stlrw(rscratch1, rscratch2); + + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(rthread, r2); } // check for safepoint operation in progress and/or pending suspend requests diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp --- a/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1394,17 +1394,15 @@ __ lea(rscratch2, Address(rthread, JavaThread::thread_state_offset())); __ stlrw(rscratch1, rscratch2); - if (os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below - __ dmb(Assembler::ISH); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(rthread, rscratch2); - } + if (UseMembar) { + // Force this write out before the read below + __ dmb(Assembler::ISH); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(rthread, rscratch2); } // check for safepoint operation in progress and/or pending suspend requests diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/arm/arm.ad --- a/src/hotspot/cpu/arm/arm.ad Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/arm/arm.ad Fri Oct 05 16:14:28 2018 -0700 @@ -5316,8 +5316,7 @@ // Prefetch instructions. // Must be safe to execute with invalid address (cannot fault). -instruct prefetchAlloc_mp( memoryP mem ) %{ - predicate(os::is_MP()); +instruct prefetchAlloc( memoryP mem ) %{ match( PrefetchAllocation mem ); ins_cost(MEMORY_REF_COST); size(4); @@ -5333,23 +5332,6 @@ ins_pipe(iload_mem); %} -instruct prefetchAlloc_sp( memoryP mem ) %{ - predicate(!os::is_MP()); - match( PrefetchAllocation mem ); - ins_cost(MEMORY_REF_COST); - size(4); - - format %{ "PLD $mem\t! Prefetch allocation" %} - ins_encode %{ -#ifdef AARCH64 - __ prfm(pstl1keep, $mem$$Address); -#else - __ pld($mem$$Address); -#endif - %} - ins_pipe(iload_mem); -%} - //----------Store Instructions------------------------------------------------- // Store Byte instruct storeB(memoryB mem, store_RegI src) %{ diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/arm/compiledIC_arm.cpp --- a/src/hotspot/cpu/arm/compiledIC_arm.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/arm/compiledIC_arm.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -155,9 +155,7 @@ void CompiledDirectStaticCall::verify() { // Verify call. _call->verify(); - if (os::is_MP()) { - _call->verify_alignment(); - } + _call->verify_alignment(); // Verify stub. address stub = find_stub(/*is_aot*/ false); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/arm/jniFastGetField_arm.cpp --- a/src/hotspot/cpu/arm/jniFastGetField_arm.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/arm/jniFastGetField_arm.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -127,13 +127,9 @@ __ bic(R1, R1, JNIHandles::weak_tag_mask); #endif - if (os::is_MP()) { - // Address dependency restricts memory access ordering. It's cheaper than explicit LoadLoad barrier - __ andr(Rtmp1, Rsafept_cnt, (unsigned)1); - __ ldr(Robj, Address(R1, Rtmp1)); - } else { - __ ldr(Robj, Address(R1)); - } + // Address dependency restricts memory access ordering. It's cheaper than explicit LoadLoad barrier + __ andr(Rtmp1, Rsafept_cnt, (unsigned)1); + __ ldr(Robj, Address(R1, Rtmp1)); #ifdef AARCH64 __ add(Robj, Robj, AsmOperand(R2, lsr, 2)); @@ -198,25 +194,21 @@ ShouldNotReachHere(); } - if(os::is_MP()) { - // Address dependency restricts memory access ordering. It's cheaper than explicit LoadLoad barrier + // Address dependency restricts memory access ordering. It's cheaper than explicit LoadLoad barrier #if defined(__ABI_HARD__) && !defined(AARCH64) - if (type == T_FLOAT || type == T_DOUBLE) { - __ ldr_literal(Rsafepoint_counter_addr, safepoint_counter_addr); - __ fmrrd(Rres, Rres_hi, D0); - __ eor(Rtmp2, Rres, Rres); - __ ldr_s32(Rsafept_cnt2, Address(Rsafepoint_counter_addr, Rtmp2)); - } else + if (type == T_FLOAT || type == T_DOUBLE) { + __ ldr_literal(Rsafepoint_counter_addr, safepoint_counter_addr); + __ fmrrd(Rres, Rres_hi, D0); + __ eor(Rtmp2, Rres, Rres); + __ ldr_s32(Rsafept_cnt2, Address(Rsafepoint_counter_addr, Rtmp2)); + } else #endif // __ABI_HARD__ && !AARCH64 - { + { #ifndef AARCH64 - __ ldr_literal(Rsafepoint_counter_addr, safepoint_counter_addr); + __ ldr_literal(Rsafepoint_counter_addr, safepoint_counter_addr); #endif // !AARCH64 - __ eor(Rtmp2, Rres, Rres); - __ ldr_s32(Rsafept_cnt2, Address(Rsafepoint_counter_addr, Rtmp2)); - } - } else { - __ ldr_s32(Rsafept_cnt2, Address(Rsafepoint_counter_addr)); + __ eor(Rtmp2, Rres, Rres); + __ ldr_s32(Rsafept_cnt2, Address(Rsafepoint_counter_addr, Rtmp2)); } __ cmp(Rsafept_cnt2, Rsafept_cnt); #ifdef AARCH64 diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/arm/macroAssembler_arm.cpp --- a/src/hotspot/cpu/arm/macroAssembler_arm.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/arm/macroAssembler_arm.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1563,8 +1563,6 @@ // Serializes memory. // tmp register is not used on AArch64, this parameter is provided solely for better compatibility with 32-bit ARM void MacroAssembler::membar(Membar_mask_bits order_constraint, Register tmp) { - if (!os::is_MP()) return; - // TODO-AARCH64 investigate dsb vs dmb effects if (order_constraint == StoreStore) { dmb(DMB_st); @@ -1585,7 +1583,6 @@ Register tmp, bool preserve_flags, Register load_tgt) { - if (!os::is_MP()) return; if (order_constraint == StoreStore) { dmb(DMB_st, tmp); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/arm/templateTable_arm.cpp --- a/src/hotspot/cpu/arm/templateTable_arm.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/arm/templateTable_arm.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -3146,15 +3146,11 @@ const Register Rindex = R5_tmp; const Register Rflags = R5_tmp; - const bool gen_volatile_check = os::is_MP(); - resolve_cache_and_index(byte_no, Rcache, Rindex, sizeof(u2)); jvmti_post_field_access(Rcache, Rindex, is_static, false); load_field_cp_cache_entry(Rcache, Rindex, Roffset, Rflags, Robj, is_static); - if (gen_volatile_check) { - __ mov(Rflagsav, Rflags); - } + __ mov(Rflagsav, Rflags); if (!is_static) pop_and_check_object(Robj); @@ -3391,16 +3387,13 @@ __ bind(Done); - if (gen_volatile_check) { - // Check for volatile field - Label notVolatile; - __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::LoadLoad | MacroAssembler::LoadStore), Rtemp); - - __ bind(notVolatile); - } - + // Check for volatile field + Label notVolatile; + __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); + + volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::LoadLoad | MacroAssembler::LoadStore), Rtemp); + + __ bind(notVolatile); } void TemplateTable::getfield(int byte_no) { @@ -3492,22 +3485,18 @@ const Register Rindex = R5_tmp; const Register Rflags = R5_tmp; - const bool gen_volatile_check = os::is_MP(); - resolve_cache_and_index(byte_no, Rcache, Rindex, sizeof(u2)); jvmti_post_field_mod(Rcache, Rindex, is_static); load_field_cp_cache_entry(Rcache, Rindex, Roffset, Rflags, Robj, is_static); - if (gen_volatile_check) { - // Check for volatile field - Label notVolatile; - __ mov(Rflagsav, Rflags); - __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreStore | MacroAssembler::LoadStore), Rtemp); - - __ bind(notVolatile); - } + // Check for volatile field + Label notVolatile; + __ mov(Rflagsav, Rflags); + __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); + + volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreStore | MacroAssembler::LoadStore), Rtemp); + + __ bind(notVolatile); Label Done, Lint, shouldNotReachHere; Label Ltable, Lbtos, Lztos, Lctos, Lstos, Litos, Lltos, Lftos, Ldtos, Latos; @@ -3733,36 +3722,33 @@ __ bind(Done); - if (gen_volatile_check) { - Label notVolatile; - if (is_static) { - // Just check for volatile. Memory barrier for static final field - // is handled by class initialization. - __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - volatile_barrier(MacroAssembler::StoreLoad, Rtemp); - __ bind(notVolatile); - } else { - // Check for volatile field and final field - Label skipMembar; - - __ tst(Rflagsav, 1 << ConstantPoolCacheEntry::is_volatile_shift | - 1 << ConstantPoolCacheEntry::is_final_shift); - __ b(skipMembar, eq); - - __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - // StoreLoad barrier after volatile field write - volatile_barrier(MacroAssembler::StoreLoad, Rtemp); - __ b(skipMembar); - - // StoreStore barrier after final field write - __ bind(notVolatile); - volatile_barrier(MacroAssembler::StoreStore, Rtemp); - - __ bind(skipMembar); - } + Label notVolatile2; + if (is_static) { + // Just check for volatile. Memory barrier for static final field + // is handled by class initialization. + __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile2); + volatile_barrier(MacroAssembler::StoreLoad, Rtemp); + __ bind(notVolatile2); + } else { + // Check for volatile field and final field + Label skipMembar; + + __ tst(Rflagsav, 1 << ConstantPoolCacheEntry::is_volatile_shift | + 1 << ConstantPoolCacheEntry::is_final_shift); + __ b(skipMembar, eq); + + __ tbz(Rflagsav, ConstantPoolCacheEntry::is_volatile_shift, notVolatile2); + + // StoreLoad barrier after volatile field write + volatile_barrier(MacroAssembler::StoreLoad, Rtemp); + __ b(skipMembar); + + // StoreStore barrier after final field write + __ bind(notVolatile2); + volatile_barrier(MacroAssembler::StoreStore, Rtemp); + + __ bind(skipMembar); } - } void TemplateTable::putfield(int byte_no) { @@ -3832,31 +3818,25 @@ const Register Rflags = Rtmp_save0; // R4/R19 const Register Robj = R5_tmp; - const bool gen_volatile_check = os::is_MP(); - // access constant pool cache __ get_cache_and_index_at_bcp(Rcache, Rindex, 1); __ add(Rcache, Rcache, AsmOperand(Rindex, lsl, LogBytesPerWord)); - if (gen_volatile_check) { - // load flags to test volatile - __ ldr_u32(Rflags, Address(Rcache, base + ConstantPoolCacheEntry::flags_offset())); - } + // load flags to test volatile + __ ldr_u32(Rflags, Address(Rcache, base + ConstantPoolCacheEntry::flags_offset())); // replace index with field offset from cache entry __ ldr(Roffset, Address(Rcache, base + ConstantPoolCacheEntry::f2_offset())); - if (gen_volatile_check) { - // Check for volatile store - Label notVolatile; - __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - // TODO-AARCH64 on AArch64, store-release instructions can be used to get rid of this explict barrier - volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreStore | MacroAssembler::LoadStore), Rtemp); - - __ bind(notVolatile); - } + // Check for volatile store + Label notVolatile; + __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); + + // TODO-AARCH64 on AArch64, store-release instructions can be used to get rid of this explict barrier + volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreStore | MacroAssembler::LoadStore), Rtemp); + + __ bind(notVolatile); // Get object from stack pop_and_check_object(Robj); @@ -3903,28 +3883,25 @@ ShouldNotReachHere(); } - if (gen_volatile_check) { - Label notVolatile; - Label skipMembar; - __ tst(Rflags, 1 << ConstantPoolCacheEntry::is_volatile_shift | - 1 << ConstantPoolCacheEntry::is_final_shift); - __ b(skipMembar, eq); - - __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - // StoreLoad barrier after volatile field write - volatile_barrier(MacroAssembler::StoreLoad, Rtemp); - __ b(skipMembar); - - // StoreStore barrier after final field write - __ bind(notVolatile); - volatile_barrier(MacroAssembler::StoreStore, Rtemp); - - __ bind(skipMembar); - } + Label notVolatile2; + Label skipMembar; + __ tst(Rflags, 1 << ConstantPoolCacheEntry::is_volatile_shift | + 1 << ConstantPoolCacheEntry::is_final_shift); + __ b(skipMembar, eq); + + __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile2); + + // StoreLoad barrier after volatile field write + volatile_barrier(MacroAssembler::StoreLoad, Rtemp); + __ b(skipMembar); + + // StoreStore barrier after final field write + __ bind(notVolatile2); + volatile_barrier(MacroAssembler::StoreStore, Rtemp); + + __ bind(skipMembar); } - void TemplateTable::fast_accessfield(TosState state) { transition(atos, state); @@ -3954,18 +3931,14 @@ const Register Rindex = R3_tmp; const Register Roffset = R3_tmp; - const bool gen_volatile_check = os::is_MP(); - // access constant pool cache __ get_cache_and_index_at_bcp(Rcache, Rindex, 1); // replace index with field offset from cache entry __ add(Rtemp, Rcache, AsmOperand(Rindex, lsl, LogBytesPerWord)); __ ldr(Roffset, Address(Rtemp, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset())); - if (gen_volatile_check) { - // load flags to test volatile - __ ldr_u32(Rflags, Address(Rtemp, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset())); - } + // load flags to test volatile + __ ldr_u32(Rflags, Address(Rtemp, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset())); __ verify_oop(Robj); __ null_check(Robj, Rtemp); @@ -4008,16 +3981,14 @@ ShouldNotReachHere(); } - if (gen_volatile_check) { - // Check for volatile load - Label notVolatile; - __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - // TODO-AARCH64 on AArch64, load-acquire instructions can be used to get rid of this explict barrier - volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::LoadLoad | MacroAssembler::LoadStore), Rtemp); - - __ bind(notVolatile); - } + // Check for volatile load + Label notVolatile; + __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); + + // TODO-AARCH64 on AArch64, load-acquire instructions can be used to get rid of this explict barrier + volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::LoadLoad | MacroAssembler::LoadStore), Rtemp); + + __ bind(notVolatile); } @@ -4039,12 +4010,8 @@ __ add(Rtemp, Rcache, AsmOperand(Rindex, lsl, LogBytesPerWord)); __ ldr(Roffset, Address(Rtemp, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset())); - const bool gen_volatile_check = os::is_MP(); - - if (gen_volatile_check) { - // load flags to test volatile - __ ldr_u32(Rflags, Address(Rtemp, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset())); - } + // load flags to test volatile + __ ldr_u32(Rflags, Address(Rtemp, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset())); // make sure exception is reported in correct bcp range (getfield is next instruction) __ add(Rbcp, Rbcp, 1); @@ -4052,32 +4019,30 @@ __ sub(Rbcp, Rbcp, 1); #ifdef AARCH64 - if (gen_volatile_check) { - Label notVolatile; - __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - __ add(Rtemp, Robj, Roffset); - - if (state == itos) { + Label notVolatile; + __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); + + __ add(Rtemp, Robj, Roffset); + + if (state == itos) { + __ ldar_w(R0_tos, Rtemp); + } else if (state == atos) { + if (UseCompressedOops) { __ ldar_w(R0_tos, Rtemp); - } else if (state == atos) { - if (UseCompressedOops) { - __ ldar_w(R0_tos, Rtemp); - __ decode_heap_oop(R0_tos); - } else { - __ ldar(R0_tos, Rtemp); - } - __ verify_oop(R0_tos); - } else if (state == ftos) { - __ ldar_w(R0_tos, Rtemp); - __ fmov_sw(S0_tos, R0_tos); + __ decode_heap_oop(R0_tos); } else { - ShouldNotReachHere(); + __ ldar(R0_tos, Rtemp); } - __ b(done); - - __ bind(notVolatile); + __ verify_oop(R0_tos); + } else if (state == ftos) { + __ ldar_w(R0_tos, Rtemp); + __ fmov_sw(S0_tos, R0_tos); + } else { + ShouldNotReachHere(); } + __ b(done); + + __ bind(notVolatile); #endif // AARCH64 if (state == itos) { @@ -4100,15 +4065,13 @@ } #ifndef AARCH64 - if (gen_volatile_check) { - // Check for volatile load - Label notVolatile; - __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); - - volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::LoadLoad | MacroAssembler::LoadStore), Rtemp); - - __ bind(notVolatile); - } + // Check for volatile load + Label notVolatile; + __ tbz(Rflags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile); + + volatile_barrier(MacroAssembler::Membar_mask_bits(MacroAssembler::LoadLoad | MacroAssembler::LoadStore), Rtemp); + + __ bind(notVolatile); #endif // !AARCH64 __ bind(done); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/ppc/compiledIC_ppc.cpp --- a/src/hotspot/cpu/ppc/compiledIC_ppc.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/ppc/compiledIC_ppc.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -215,9 +215,7 @@ void CompiledDirectStaticCall::verify() { // Verify call. _call->verify(); - if (os::is_MP()) { - _call->verify_alignment(); - } + _call->verify_alignment(); // Verify stub. address stub = find_stub(/*is_aot*/ false); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp --- a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2430,17 +2430,15 @@ { Label no_block, sync; - if (os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below. - __ fence(); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(R16_thread, r_temp_4, r_temp_5); - } + if (UseMembar) { + // Force this write out before the read below. + __ fence(); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(R16_thread, r_temp_4, r_temp_5); } Register sync_state_addr = r_temp_4; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/s390/compiledIC_s390.cpp --- a/src/hotspot/cpu/s390/compiledIC_s390.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/s390/compiledIC_s390.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -145,9 +145,7 @@ void CompiledDirectStaticCall::verify() { // Verify call. _call->verify(); - if (os::is_MP()) { - _call->verify_alignment(); - } + _call->verify_alignment(); // Verify stub. address stub = find_stub(/*is_aot*/ false); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/s390/macroAssembler_s390.hpp --- a/src/hotspot/cpu/s390/macroAssembler_s390.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/s390/macroAssembler_s390.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -593,7 +593,6 @@ static int call_far_patchable_ret_addr_offset() { return call_far_patchable_size(); } static bool call_far_patchable_requires_alignment_nop(address pc) { - if (!os::is_MP()) return false; int size = call_far_patchable_size(); return ((intptr_t)(pc + size) & 0x03L) != 0; } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/s390/sharedRuntime_s390.cpp --- a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2161,18 +2161,17 @@ save_native_result(masm, ret_type, workspace_slot_offset); // Make Z_R2 available as work reg. - if (os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below. - __ z_fence(); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(Z_thread, Z_R1, Z_R2); - } + if (UseMembar) { + // Force this write out before the read below. + __ z_fence(); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(Z_thread, Z_R1, Z_R2); } + __ safepoint_poll(sync, Z_R1); __ load_and_test_int(Z_R0, Address(Z_thread, JavaThread::suspend_flags_offset())); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/sparc/compiledIC_sparc.cpp --- a/src/hotspot/cpu/sparc/compiledIC_sparc.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/sparc/compiledIC_sparc.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -142,9 +142,7 @@ void CompiledDirectStaticCall::verify() { // Verify call. _call->verify(); - if (os::is_MP()) { - _call->verify_alignment(); - } + _call->verify_alignment(); // Verify stub. address stub = find_stub(/*is_aot*/ false); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/sparc/macroAssembler_sparc.cpp --- a/src/hotspot/cpu/sparc/macroAssembler_sparc.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/sparc/macroAssembler_sparc.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2786,7 +2786,7 @@ delayed()-> st_ptr(G0, Address(Rmark, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner))); - if (os::is_MP()) { membar(StoreLoad); } + membar(StoreLoad); // Check that _succ is (or remains) non-zero ld_ptr(Address(Rmark, OM_OFFSET_NO_MONITOR_VALUE_TAG(succ)), Rscratch); andcc(Rscratch, Rscratch, G0); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/sparc/macroAssembler_sparc.inline.hpp --- a/src/hotspot/cpu/sparc/macroAssembler_sparc.inline.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/sparc/macroAssembler_sparc.inline.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -614,17 +614,12 @@ // returns if membar generates anything, obviously this code should mirror // membar below. inline bool MacroAssembler::membar_has_effect( Membar_mask_bits const7a ) { - if (!os::is_MP()) - return false; // Not needed on single CPU const Membar_mask_bits effective_mask = Membar_mask_bits(const7a & ~(LoadLoad | LoadStore | StoreStore)); return (effective_mask != 0); } inline void MacroAssembler::membar( Membar_mask_bits const7a ) { - // Uniprocessors do not need memory barriers - if (!os::is_MP()) - return; // Weakened for current Sparcs and TSO. See the v9 manual, sections 8.4.3, // 8.4.4.3, a.31 and a.50. // Under TSO, setting bit 3, 2, or 0 is redundant, so the only value diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/sparc/sharedRuntime_sparc.cpp --- a/src/hotspot/cpu/sparc/sharedRuntime_sparc.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/sparc/sharedRuntime_sparc.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2371,17 +2371,16 @@ // didn't see any synchronization is progress, and escapes. __ set(_thread_in_native_trans, G3_scratch); __ st(G3_scratch, G2_thread, JavaThread::thread_state_offset()); - if(os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below - __ membar(Assembler::StoreLoad); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(G2_thread, G1_scratch, G3_scratch); - } + + if (UseMembar) { + // Force this write out before the read below + __ membar(Assembler::StoreLoad); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(G2_thread, G1_scratch, G3_scratch); } Label L; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/sparc/templateInterpreterGenerator_sparc.cpp --- a/src/hotspot/cpu/sparc/templateInterpreterGenerator_sparc.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/sparc/templateInterpreterGenerator_sparc.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1373,17 +1373,16 @@ // didn't see any synchronization is progress, and escapes. __ set(_thread_in_native_trans, G3_scratch); __ st(G3_scratch, thread_state); - if (os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below - __ membar(Assembler::StoreLoad); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(G2_thread, G1_scratch, G3_scratch); - } + + if (UseMembar) { + // Force this write out before the read below + __ membar(Assembler::StoreLoad); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(G2_thread, G1_scratch, G3_scratch); } Label L; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/assembler_x86.cpp --- a/src/hotspot/cpu/x86/assembler_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/assembler_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -972,7 +972,6 @@ return ip; case 0xF0: // Lock - assert(os::is_MP(), "only on MP"); goto again_after_prefix; case 0xF3: // For SSE diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/assembler_x86.hpp --- a/src/hotspot/cpu/x86/assembler_x86.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/assembler_x86.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -1345,40 +1345,38 @@ // Serializes memory and blows flags void membar(Membar_mask_bits order_constraint) { - if (os::is_MP()) { - // We only have to handle StoreLoad - if (order_constraint & StoreLoad) { - // All usable chips support "locked" instructions which suffice - // as barriers, and are much faster than the alternative of - // using cpuid instruction. We use here a locked add [esp-C],0. - // This is conveniently otherwise a no-op except for blowing - // flags, and introducing a false dependency on target memory - // location. We can't do anything with flags, but we can avoid - // memory dependencies in the current method by locked-adding - // somewhere else on the stack. Doing [esp+C] will collide with - // something on stack in current method, hence we go for [esp-C]. - // It is convenient since it is almost always in data cache, for - // any small C. We need to step back from SP to avoid data - // dependencies with other things on below SP (callee-saves, for - // example). Without a clear way to figure out the minimal safe - // distance from SP, it makes sense to step back the complete - // cache line, as this will also avoid possible second-order effects - // with locked ops against the cache line. Our choice of offset - // is bounded by x86 operand encoding, which should stay within - // [-128; +127] to have the 8-byte displacement encoding. - // - // Any change to this code may need to revisit other places in - // the code where this idiom is used, in particular the - // orderAccess code. - - int offset = -VM_Version::L1_line_size(); - if (offset < -128) { - offset = -128; - } - - lock(); - addl(Address(rsp, offset), 0);// Assert the lock# signal here + // We only have to handle StoreLoad + if (order_constraint & StoreLoad) { + // All usable chips support "locked" instructions which suffice + // as barriers, and are much faster than the alternative of + // using cpuid instruction. We use here a locked add [esp-C],0. + // This is conveniently otherwise a no-op except for blowing + // flags, and introducing a false dependency on target memory + // location. We can't do anything with flags, but we can avoid + // memory dependencies in the current method by locked-adding + // somewhere else on the stack. Doing [esp+C] will collide with + // something on stack in current method, hence we go for [esp-C]. + // It is convenient since it is almost always in data cache, for + // any small C. We need to step back from SP to avoid data + // dependencies with other things on below SP (callee-saves, for + // example). Without a clear way to figure out the minimal safe + // distance from SP, it makes sense to step back the complete + // cache line, as this will also avoid possible second-order effects + // with locked ops against the cache line. Our choice of offset + // is bounded by x86 operand encoding, which should stay within + // [-128; +127] to have the 8-byte displacement encoding. + // + // Any change to this code may need to revisit other places in + // the code where this idiom is used, in particular the + // orderAccess code. + + int offset = -VM_Version::L1_line_size(); + if (offset < -128) { + offset = -128; } + + lock(); + addl(Address(rsp, offset), 0);// Assert the lock# signal here } } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp --- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1906,9 +1906,7 @@ assert(op->new_value()->as_register_lo() == rbx, "wrong register"); assert(op->new_value()->as_register_hi() == rcx, "wrong register"); Register addr = op->addr()->as_register(); - if (os::is_MP()) { - __ lock(); - } + __ lock(); NOT_LP64(__ cmpxchg8(Address(addr, 0))); } else if (op->code() == lir_cas_int || op->code() == lir_cas_obj ) { @@ -1928,24 +1926,18 @@ __ encode_heap_oop(cmpval); __ mov(rscratch1, newval); __ encode_heap_oop(rscratch1); - if (os::is_MP()) { - __ lock(); - } + __ lock(); // cmpval (rax) is implicitly used by this instruction __ cmpxchgl(rscratch1, Address(addr, 0)); } else #endif { - if (os::is_MP()) { - __ lock(); - } + __ lock(); __ cmpxchgptr(newval, Address(addr, 0)); } } else { assert(op->code() == lir_cas_int, "lir_cas_int expected"); - if (os::is_MP()) { - __ lock(); - } + __ lock(); __ cmpxchgl(newval, Address(addr, 0)); } #ifdef _LP64 @@ -1958,9 +1950,7 @@ assert(cmpval != newval, "cmp and new values must be in different registers"); assert(cmpval != addr, "cmp and addr must be in different registers"); assert(newval != addr, "new value and addr must be in different registers"); - if (os::is_MP()) { - __ lock(); - } + __ lock(); __ cmpxchgq(newval, Address(addr, 0)); #endif // _LP64 } else { @@ -2804,28 +2794,26 @@ void LIR_Assembler::align_call(LIR_Code code) { - if (os::is_MP()) { - // make sure that the displacement word of the call ends up word aligned - int offset = __ offset(); - switch (code) { - case lir_static_call: - case lir_optvirtual_call: - case lir_dynamic_call: - offset += NativeCall::displacement_offset; - break; - case lir_icvirtual_call: - offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size; - break; - case lir_virtual_call: // currently, sparc-specific for niagara - default: ShouldNotReachHere(); - } - __ align(BytesPerWord, offset); + // make sure that the displacement word of the call ends up word aligned + int offset = __ offset(); + switch (code) { + case lir_static_call: + case lir_optvirtual_call: + case lir_dynamic_call: + offset += NativeCall::displacement_offset; + break; + case lir_icvirtual_call: + offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size; + break; + case lir_virtual_call: // currently, sparc-specific for niagara + default: ShouldNotReachHere(); } + __ align(BytesPerWord, offset); } void LIR_Assembler::call(LIR_OpJavaCall* op, relocInfo::relocType rtype) { - assert(!os::is_MP() || (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0, + assert((__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0, "must be aligned"); __ call(AddressLiteral(op->addr(), rtype)); add_call_info(code_offset(), op->info()); @@ -2835,8 +2823,7 @@ void LIR_Assembler::ic_call(LIR_OpJavaCall* op) { __ ic_call(op->addr()); add_call_info(code_offset(), op->info()); - assert(!os::is_MP() || - (__ offset() - NativeCall::instruction_size + NativeCall::displacement_offset) % BytesPerWord == 0, + assert((__ offset() - NativeCall::instruction_size + NativeCall::displacement_offset) % BytesPerWord == 0, "must be aligned"); } @@ -2856,14 +2843,13 @@ } int start = __ offset(); - if (os::is_MP()) { - // make sure that the displacement word of the call ends up word aligned - __ align(BytesPerWord, __ offset() + NativeMovConstReg::instruction_size + NativeCall::displacement_offset); - } + + // make sure that the displacement word of the call ends up word aligned + __ align(BytesPerWord, __ offset() + NativeMovConstReg::instruction_size + NativeCall::displacement_offset); __ relocate(static_stub_Relocation::spec(call_pc, false /* is_aot */)); __ mov_metadata(rbx, (Metadata*)NULL); // must be set to -1 at code generation time - assert(!os::is_MP() || ((__ offset() + 1) % BytesPerWord) == 0, "must be aligned on MP"); + assert(((__ offset() + 1) % BytesPerWord) == 0, "must be aligned"); // On 64bit this will die since it will take a movq & jmp, must be only a jmp __ jump(RuntimeAddress(__ pc())); @@ -3992,9 +3978,7 @@ if (data->type() == T_INT) { if (code == lir_xadd) { - if (os::is_MP()) { - __ lock(); - } + __ lock(); __ xaddl(as_Address(src->as_address_ptr()), data->as_register()); } else { __ xchgl(data->as_register(), as_Address(src->as_address_ptr())); @@ -4017,9 +4001,7 @@ #ifdef _LP64 assert(data->as_register_lo() == data->as_register_hi(), "should be a single register"); if (code == lir_xadd) { - if (os::is_MP()) { - __ lock(); - } + __ lock(); __ xaddq(as_Address(src->as_address_ptr()), data->as_register_lo()); } else { __ xchgq(data->as_register_lo(), as_Address(src->as_address_ptr())); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp --- a/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -65,7 +65,7 @@ // test if object header is still the same (i.e. unlocked), and if so, store the // displaced header address in the object header - if it is not the same, get the // object header instead - if (os::is_MP()) MacroAssembler::lock(); // must be immediately before cmpxchg! + MacroAssembler::lock(); // must be immediately before cmpxchg! cmpxchgptr(disp_hdr, Address(obj, hdr_offset)); // if the object header was the same, we're done if (PrintBiasedLockingStatistics) { @@ -126,7 +126,7 @@ // test if object header is pointing to the displaced header, and if so, restore // the displaced header in the object - if the object header is not pointing to // the displaced header, get the object header instead - if (os::is_MP()) MacroAssembler::lock(); // must be immediately before cmpxchg! + MacroAssembler::lock(); // must be immediately before cmpxchg! cmpxchgptr(hdr, Address(obj, hdr_offset)); // if the object header was not pointing to the displaced header, // we do unlocking via runtime call diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/compiledIC_x86.cpp --- a/src/hotspot/cpu/x86/compiledIC_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/compiledIC_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -198,9 +198,7 @@ void CompiledDirectStaticCall::verify() { // Verify call. _call->verify(); - if (os::is_MP()) { - _call->verify_alignment(); - } + _call->verify_alignment(); #ifdef ASSERT CodeBlob *cb = CodeCache::find_blob_unsafe((address) _call); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/interp_masm_x86.cpp --- a/src/hotspot/cpu/x86/interp_masm_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1191,7 +1191,7 @@ assert(lock_offset == 0, "displaced header must be first word in BasicObjectLock"); - if (os::is_MP()) lock(); + lock(); cmpxchgptr(lock_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes())); if (PrintBiasedLockingStatistics) { cond_inc32(Assembler::zero, @@ -1288,7 +1288,7 @@ jcc(Assembler::zero, done); // Atomic swap back the old header - if (os::is_MP()) lock(); + lock(); cmpxchgptr(header_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes())); // zero for simple unlock of a stack-lock case diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/jniFastGetField_x86_32.cpp --- a/src/hotspot/cpu/x86/jniFastGetField_x86_32.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/jniFastGetField_x86_32.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -75,15 +75,11 @@ __ mov32 (rcx, counter); __ testb (rcx, 1); __ jcc (Assembler::notZero, slow); - if (os::is_MP()) { - __ mov(rax, rcx); - __ andptr(rax, 1); // rax, must end up 0 - __ movptr(rdx, Address(rsp, rax, Address::times_1, 2*wordSize)); - // obj, notice rax, is 0. - // rdx is data dependent on rcx. - } else { - __ movptr (rdx, Address(rsp, 2*wordSize)); // obj - } + __ mov(rax, rcx); + __ andptr(rax, 1); // rax, must end up 0 + __ movptr(rdx, Address(rsp, rax, Address::times_1, 2*wordSize)); + // obj, notice rax, is 0. + // rdx is data dependent on rcx. __ movptr(rax, Address(rsp, 3*wordSize)); // jfieldID __ clear_jweak_tag(rdx); @@ -103,17 +99,13 @@ } Address ca1; - if (os::is_MP()) { - __ lea(rdx, counter); - __ xorptr(rdx, rax); - __ xorptr(rdx, rax); - __ cmp32(rcx, Address(rdx, 0)); - // ca1 is the same as ca because - // rax, ^ counter_addr ^ rax, = address - // ca1 is data dependent on rax,. - } else { - __ cmp32(rcx, counter); - } + __ lea(rdx, counter); + __ xorptr(rdx, rax); + __ xorptr(rdx, rax); + __ cmp32(rcx, Address(rdx, 0)); + // ca1 is the same as ca because + // rax, ^ counter_addr ^ rax, = address + // ca1 is data dependent on rax,. __ jcc (Assembler::notEqual, slow); #ifndef _WINDOWS @@ -196,15 +188,11 @@ __ mov32 (rcx, counter); __ testb (rcx, 1); __ jcc (Assembler::notZero, slow); - if (os::is_MP()) { - __ mov(rax, rcx); - __ andptr(rax, 1); // rax, must end up 0 - __ movptr(rdx, Address(rsp, rax, Address::times_1, 3*wordSize)); - // obj, notice rax, is 0. - // rdx is data dependent on rcx. - } else { - __ movptr(rdx, Address(rsp, 3*wordSize)); // obj - } + __ mov(rax, rcx); + __ andptr(rax, 1); // rax, must end up 0 + __ movptr(rdx, Address(rsp, rax, Address::times_1, 3*wordSize)); + // obj, notice rax, is 0. + // rdx is data dependent on rcx. __ movptr(rsi, Address(rsp, 4*wordSize)); // jfieldID __ clear_jweak_tag(rdx); @@ -220,19 +208,15 @@ __ movl(rdx, Address(rdx, rsi, Address::times_1, 4)); #endif // _LP64 - if (os::is_MP()) { - __ lea(rsi, counter); - __ xorptr(rsi, rdx); - __ xorptr(rsi, rax); - __ xorptr(rsi, rdx); - __ xorptr(rsi, rax); - __ cmp32(rcx, Address(rsi, 0)); - // ca1 is the same as ca because - // rax, ^ rdx ^ counter_addr ^ rax, ^ rdx = address - // ca1 is data dependent on both rax, and rdx. - } else { - __ cmp32(rcx, counter); - } + __ lea(rsi, counter); + __ xorptr(rsi, rdx); + __ xorptr(rsi, rax); + __ xorptr(rsi, rdx); + __ xorptr(rsi, rax); + __ cmp32(rcx, Address(rsi, 0)); + // ca1 is the same as ca because + // rax, ^ rdx ^ counter_addr ^ rax, ^ rdx = address + // ca1 is data dependent on both rax, and rdx. __ jcc (Assembler::notEqual, slow); __ pop (rsi); @@ -288,15 +272,11 @@ __ mov32 (rcx, counter); __ testb (rcx, 1); __ jcc (Assembler::notZero, slow); - if (os::is_MP()) { - __ mov(rax, rcx); - __ andptr(rax, 1); // rax, must end up 0 - __ movptr(rdx, Address(rsp, rax, Address::times_1, 2*wordSize)); - // obj, notice rax, is 0. - // rdx is data dependent on rcx. - } else { - __ movptr(rdx, Address(rsp, 2*wordSize)); // obj - } + __ mov(rax, rcx); + __ andptr(rax, 1); // rax, must end up 0 + __ movptr(rdx, Address(rsp, rax, Address::times_1, 2*wordSize)); + // obj, notice rax, is 0. + // rdx is data dependent on rcx. __ movptr(rax, Address(rsp, 3*wordSize)); // jfieldID __ clear_jweak_tag(rdx); @@ -318,20 +298,16 @@ } Address ca1; - if (os::is_MP()) { - __ fst_s (Address(rsp, -4)); - __ lea(rdx, counter); - __ movl (rax, Address(rsp, -4)); - // garbage hi-order bits on 64bit are harmless. - __ xorptr(rdx, rax); - __ xorptr(rdx, rax); - __ cmp32(rcx, Address(rdx, 0)); - // rax, ^ counter_addr ^ rax, = address - // ca1 is data dependent on the field - // access. - } else { - __ cmp32(rcx, counter); - } + __ fst_s (Address(rsp, -4)); + __ lea(rdx, counter); + __ movl (rax, Address(rsp, -4)); + // garbage hi-order bits on 64bit are harmless. + __ xorptr(rdx, rax); + __ xorptr(rdx, rax); + __ cmp32(rcx, Address(rdx, 0)); + // rax, ^ counter_addr ^ rax, = address + // ca1 is data dependent on the field + // access. __ jcc (Assembler::notEqual, slow_with_pop); #ifndef _WINDOWS diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/jniFastGetField_x86_64.cpp --- a/src/hotspot/cpu/x86/jniFastGetField_x86_64.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/jniFastGetField_x86_64.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -77,12 +77,11 @@ __ mov (robj, c_rarg1); __ testb (rcounter, 1); __ jcc (Assembler::notZero, slow); - if (os::is_MP()) { - __ xorptr(robj, rcounter); - __ xorptr(robj, rcounter); // obj, since - // robj ^ rcounter ^ rcounter == robj - // robj is data dependent on rcounter. - } + + __ xorptr(robj, rcounter); + __ xorptr(robj, rcounter); // obj, since + // robj ^ rcounter ^ rcounter == robj + // robj is data dependent on rcounter. __ mov (roffset, c_rarg2); __ shrptr(roffset, 2); // offset @@ -104,15 +103,12 @@ default: ShouldNotReachHere(); } - if (os::is_MP()) { - __ lea(rcounter_addr, counter); - // ca is data dependent on rax. - __ xorptr(rcounter_addr, rax); - __ xorptr(rcounter_addr, rax); - __ cmpl (rcounter, Address(rcounter_addr, 0)); - } else { - __ cmp32 (rcounter, counter); - } + // create data dependency on rax + __ lea(rcounter_addr, counter); + __ xorptr(rcounter_addr, rax); + __ xorptr(rcounter_addr, rax); + __ cmpl (rcounter, Address(rcounter_addr, 0)); + __ jcc (Assembler::notEqual, slow); __ ret (0); @@ -181,12 +177,11 @@ __ mov (robj, c_rarg1); __ testb (rcounter, 1); __ jcc (Assembler::notZero, slow); - if (os::is_MP()) { - __ xorptr(robj, rcounter); - __ xorptr(robj, rcounter); // obj, since - // robj ^ rcounter ^ rcounter == robj - // robj is data dependent on rcounter. - } + + __ xorptr(robj, rcounter); + __ xorptr(robj, rcounter); // obj, since + // robj ^ rcounter ^ rcounter == robj + // robj is data dependent on rcounter. // Both robj and rtmp are clobbered by try_resolve_jobject_in_native. BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); @@ -204,16 +199,12 @@ default: ShouldNotReachHere(); } - if (os::is_MP()) { - __ lea(rcounter_addr, counter); - __ movdq (rax, xmm0); - // counter address is data dependent on xmm0. - __ xorptr(rcounter_addr, rax); - __ xorptr(rcounter_addr, rax); - __ cmpl (rcounter, Address(rcounter_addr, 0)); - } else { - __ cmp32 (rcounter, counter); - } + __ lea(rcounter_addr, counter); + __ movdq (rax, xmm0); + // counter address is data dependent on xmm0. + __ xorptr(rcounter_addr, rax); + __ xorptr(rcounter_addr, rax); + __ cmpl (rcounter, Address(rcounter_addr, 0)); __ jcc (Assembler::notEqual, slow); __ ret (0); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/macroAssembler_x86.cpp --- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1030,8 +1030,7 @@ } void MacroAssembler::atomic_incl(Address counter_addr) { - if (os::is_MP()) - lock(); + lock(); incrementl(counter_addr); } @@ -1046,8 +1045,7 @@ #ifdef _LP64 void MacroAssembler::atomic_incq(Address counter_addr) { - if (os::is_MP()) - lock(); + lock(); incrementq(counter_addr); } @@ -1213,9 +1211,7 @@ get_thread(tmp_reg); orptr(tmp_reg, swap_reg); #endif - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(tmp_reg, mark_addr); // compare tmp_reg and swap_reg // If the biasing toward our thread failed, this means that // another thread succeeded in biasing it toward itself and we @@ -1248,9 +1244,7 @@ orptr(tmp_reg, swap_reg); movptr(swap_reg, saved_mark_addr); #endif - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(tmp_reg, mark_addr); // compare tmp_reg and swap_reg // If the biasing toward our thread failed, then another thread // succeeded in biasing it toward itself and we need to revoke that @@ -1278,9 +1272,7 @@ // bits in this situation. Should attempt to preserve them. NOT_LP64( movptr(swap_reg, saved_mark_addr); ) load_prototype_header(tmp_reg, obj_reg); - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(tmp_reg, mark_addr); // compare tmp_reg and swap_reg // Fall through to the normal CAS-based lock, because no matter what // the result of the above CAS, some thread must have succeeded in @@ -1376,9 +1368,7 @@ if (method_data != NULL) { // set rtm_state to "no rtm" in MDO mov_metadata(tmpReg, method_data); - if (os::is_MP()) { - lock(); - } + lock(); orl(Address(tmpReg, MethodData::rtm_state_offset_in_bytes()), NoRTM); } jmpb(L_done); @@ -1392,9 +1382,7 @@ if (method_data != NULL) { // set rtm_state to "always rtm" in MDO mov_metadata(tmpReg, method_data); - if (os::is_MP()) { - lock(); - } + lock(); orl(Address(tmpReg, MethodData::rtm_state_offset_in_bytes()), UseRTM); } bind(L_done); @@ -1605,9 +1593,7 @@ get_thread(scrReg); Register threadReg = scrReg; #endif - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(threadReg, Address(boxReg, owner_offset)); // Updates tmpReg if (RTMRetryCount > 0) { @@ -1767,9 +1753,7 @@ // Attempt stack-locking ... orptr (tmpReg, markOopDesc::unlocked_value); movptr(Address(boxReg, 0), tmpReg); // Anticipate successful CAS - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(boxReg, Address(objReg, oopDesc::mark_offset_in_bytes())); // Updates tmpReg if (counters != NULL) { cond_inc32(Assembler::equal, @@ -1826,9 +1810,7 @@ // we later store "Self" into m->Owner. Transiently storing a stack address // (rsp or the address of the box) into m->owner is harmless. // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand. - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(scrReg, Address(boxReg, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner))); movptr(Address(scrReg, 0), 3); // box->_displaced_header = 3 // If we weren't able to swing _owner from NULL to the BasicLock @@ -1851,9 +1833,7 @@ movq(scrReg, tmpReg); xorq(tmpReg, tmpReg); - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(r15_thread, Address(scrReg, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner))); // Unconditionally set box->_displaced_header = markOopDesc::unused_mark(). // Without cast to int32_t movptr will destroy r10 which is typically obj. @@ -2000,9 +1980,7 @@ // The "box" value on the stack is stable, so we can reload // and be assured we observe the same value as above. movptr(tmpReg, Address(boxReg, 0)); - if (os::is_MP()) { - lock(); - } + lock(); cmpxchgptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); // Uses RAX which is box // Intention fall-thru into DONE_LABEL @@ -2036,16 +2014,16 @@ xorptr(boxReg, boxReg); movptr(Address(tmpReg, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner)), (int32_t)NULL_WORD); - if (os::is_MP()) { - // Memory barrier/fence - // Dekker pivot point -- fulcrum : ST Owner; MEMBAR; LD Succ - // Instead of MFENCE we use a dummy locked add of 0 to the top-of-stack. - // This is faster on Nehalem and AMD Shanghai/Barcelona. - // See https://blogs.oracle.com/dave/entry/instruction_selection_for_volatile_fences - // We might also restructure (ST Owner=0;barrier;LD _Succ) to - // (mov box,0; xchgq box, &m->Owner; LD _succ) . - lock(); addl(Address(rsp, 0), 0); - } + + // Memory barrier/fence + // Dekker pivot point -- fulcrum : ST Owner; MEMBAR; LD Succ + // Instead of MFENCE we use a dummy locked add of 0 to the top-of-stack. + // This is faster on Nehalem and AMD Shanghai/Barcelona. + // See https://blogs.oracle.com/dave/entry/instruction_selection_for_volatile_fences + // We might also restructure (ST Owner=0;barrier;LD _Succ) to + // (mov box,0; xchgq box, &m->Owner; LD _succ) . + lock(); addl(Address(rsp, 0), 0); + cmpptr(Address(tmpReg, OM_OFFSET_NO_MONITOR_VALUE_TAG(succ)), (int32_t)NULL_WORD); jccb (Assembler::notZero, LSuccess); @@ -2063,7 +2041,7 @@ // box is really RAX -- the following CMPXCHG depends on that binding // cmpxchg R,[M] is equivalent to rax = CAS(M,rax,R) - if (os::is_MP()) { lock(); } + lock(); cmpxchgptr(r15_thread, Address(tmpReg, OM_OFFSET_NO_MONITOR_VALUE_TAG(owner))); // There's no successor so we tried to regrab the lock. // If that didn't work, then another thread grabbed the @@ -2081,7 +2059,7 @@ bind (Stacked); movptr(tmpReg, Address (boxReg, 0)); // re-fetch - if (os::is_MP()) { lock(); } + lock(); cmpxchgptr(tmpReg, Address(objReg, oopDesc::mark_offset_in_bytes())); // Uses RAX which is box #endif @@ -2633,13 +2611,11 @@ void MacroAssembler::locked_cmpxchgptr(Register reg, AddressLiteral adr) { if (reachable(adr)) { - if (os::is_MP()) - lock(); + lock(); cmpxchgptr(reg, as_Address(adr)); } else { lea(rscratch1, adr); - if (os::is_MP()) - lock(); + lock(); cmpxchgptr(reg, Address(rscratch1, 0)); } } @@ -3266,8 +3242,9 @@ } } +#ifdef COMPILER2 void MacroAssembler::setvectmask(Register dst, Register src) { - guarantee(PostLoopMultiversioning == true, "must be"); + guarantee(PostLoopMultiversioning, "must be"); Assembler::movl(dst, 1); Assembler::shlxl(dst, dst, src); Assembler::decl(dst); @@ -3276,9 +3253,10 @@ } void MacroAssembler::restorevectmask() { - guarantee(PostLoopMultiversioning == true, "must be"); + guarantee(PostLoopMultiversioning, "must be"); Assembler::knotwl(k1, k0); } +#endif // COMPILER2 void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) { if (reachable(src)) { @@ -5028,12 +5006,15 @@ // Clear upper bits of YMM registers to avoid SSE <-> AVX transition penalty. vzeroupper(); // Reset k1 to 0xffff. + +#ifdef COMPILER2 if (PostLoopMultiversioning && VM_Version::supports_evex()) { push(rcx); movl(rcx, 0xffff); kmovwl(k1, rcx); pop(rcx); } +#endif // COMPILER2 #ifndef _LP64 // Either restore the x87 floating pointer control word after returning diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/macroAssembler_x86.hpp --- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -156,9 +156,11 @@ void incrementq(Register reg, int value = 1); void incrementq(Address dst, int value = 1); +#ifdef COMPILER2 // special instructions for EVEX void setvectmask(Register dst, Register src); void restorevectmask(); +#endif // Support optimal SSE move instructions. void movflt(XMMRegister dst, XMMRegister src) { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/nativeInst_x86.cpp --- a/src/hotspot/cpu/x86/nativeInst_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/nativeInst_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -202,9 +202,7 @@ assert (instr_addr != NULL, "illegal address for code patching"); NativeCall* n_call = nativeCall_at (instr_addr); // checking that it is a call - if (os::is_MP()) { - guarantee((intptr_t)instr_addr % BytesPerWord == 0, "must be aligned"); - } + guarantee((intptr_t)instr_addr % BytesPerWord == 0, "must be aligned"); // First patch dummy jmp in place unsigned char patch[4]; @@ -262,67 +260,14 @@ assert(Patching_lock->is_locked() || SafepointSynchronize::is_at_safepoint(), "concurrent code patching"); // Both C1 and C2 should now be generating code which aligns the patched address - // to be within a single cache line except that C1 does not do the alignment on - // uniprocessor systems. + // to be within a single cache line. bool is_aligned = ((uintptr_t)displacement_address() + 0) / cache_line_size == ((uintptr_t)displacement_address() + 3) / cache_line_size; - guarantee(!os::is_MP() || is_aligned, "destination must be aligned"); - - if (is_aligned) { - // Simple case: The destination lies within a single cache line. - set_destination(dest); - } else if ((uintptr_t)instruction_address() / cache_line_size == - ((uintptr_t)instruction_address()+1) / cache_line_size) { - // Tricky case: The instruction prefix lies within a single cache line. - intptr_t disp = dest - return_address(); -#ifdef AMD64 - guarantee(disp == (intptr_t)(jint)disp, "must be 32-bit offset"); -#endif // AMD64 - - int call_opcode = instruction_address()[0]; - - // First patch dummy jump in place: - { - u_char patch_jump[2]; - patch_jump[0] = 0xEB; // jmp rel8 - patch_jump[1] = 0xFE; // jmp to self - - assert(sizeof(patch_jump)==sizeof(short), "sanity check"); - *(short*)instruction_address() = *(short*)patch_jump; - } - // Invalidate. Opteron requires a flush after every write. - wrote(0); + guarantee(is_aligned, "destination must be aligned"); - // (Note: We assume any reader which has already started to read - // the unpatched call will completely read the whole unpatched call - // without seeing the next writes we are about to make.) - - // Next, patch the last three bytes: - u_char patch_disp[5]; - patch_disp[0] = call_opcode; - *(int32_t*)&patch_disp[1] = (int32_t)disp; - assert(sizeof(patch_disp)==instruction_size, "sanity check"); - for (int i = sizeof(short); i < instruction_size; i++) - instruction_address()[i] = patch_disp[i]; - - // Invalidate. Opteron requires a flush after every write. - wrote(sizeof(short)); - - // (Note: We assume that any reader which reads the opcode we are - // about to repatch will also read the writes we just made.) - - // Finally, overwrite the jump: - *(short*)instruction_address() = *(short*)patch_disp; - // Invalidate. Opteron requires a flush after every write. - wrote(0); - - debug_only(verify()); - guarantee(destination() == dest, "patch succeeded"); - } else { - // Impossible: One or the other must be atomically writable. - ShouldNotReachHere(); - } + // The destination lies within a single cache line. + set_destination(dest); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp --- a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2007,12 +2007,9 @@ // Save (object->mark() | 1) into BasicLock's displaced header __ movptr(Address(lock_reg, mark_word_offset), swap_reg); - if (os::is_MP()) { - __ lock(); - } - // src -> dest iff dest == rax, else rax, <- dest // *obj_reg = lock_reg iff *obj_reg == rax, else rax, = *(obj_reg) + __ lock(); __ cmpxchgptr(lock_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes())); __ jcc(Assembler::equal, lock_done); @@ -2091,19 +2088,17 @@ // didn't see any synchronization is progress, and escapes. __ movl(Address(thread, JavaThread::thread_state_offset()), _thread_in_native_trans); - if(os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below - __ membar(Assembler::Membar_mask_bits( - Assembler::LoadLoad | Assembler::LoadStore | - Assembler::StoreLoad | Assembler::StoreStore)); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(thread, rcx); - } + if (UseMembar) { + // Force this write out before the read below + __ membar(Assembler::Membar_mask_bits( + Assembler::LoadLoad | Assembler::LoadStore | + Assembler::StoreLoad | Assembler::StoreStore)); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(thread, rcx); } if (AlwaysRestoreFPU) { @@ -2199,12 +2194,9 @@ __ lea(rax, Address(rbp, lock_slot_rbp_offset)); // Atomic swap old header if oop still contains the stack lock - if (os::is_MP()) { - __ lock(); - } - // src -> dest iff dest == rax, else rax, <- dest // *obj_reg = rbx, iff *obj_reg == rax, else rax, = *(obj_reg) + __ lock(); __ cmpxchgptr(rbx, Address(obj_reg, oopDesc::mark_offset_in_bytes())); __ jcc(Assembler::notEqual, slow_path_unlock); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp --- a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2464,11 +2464,8 @@ // Save (object->mark() | 1) into BasicLock's displaced header __ movptr(Address(lock_reg, mark_word_offset), swap_reg); - if (os::is_MP()) { - __ lock(); - } - // src -> dest iff dest == rax else rax <- dest + __ lock(); __ cmpxchgptr(lock_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes())); __ jcc(Assembler::equal, lock_done); @@ -2558,19 +2555,17 @@ // didn't see any synchronization is progress, and escapes. __ movl(Address(r15_thread, JavaThread::thread_state_offset()), _thread_in_native_trans); - if(os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below - __ membar(Assembler::Membar_mask_bits( - Assembler::LoadLoad | Assembler::LoadStore | - Assembler::StoreLoad | Assembler::StoreStore)); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(r15_thread, rcx); - } + if (UseMembar) { + // Force this write out before the read below + __ membar(Assembler::Membar_mask_bits( + Assembler::LoadLoad | Assembler::LoadStore | + Assembler::StoreLoad | Assembler::StoreStore)); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(r15_thread, rcx); } Label after_transition; @@ -2661,9 +2656,7 @@ __ movptr(old_hdr, Address(rax, 0)); // Atomic swap old header if oop still contains the stack lock - if (os::is_MP()) { - __ lock(); - } + __ lock(); __ cmpxchgptr(old_hdr, Address(obj_reg, oopDesc::mark_offset_in_bytes())); __ jcc(Assembler::notEqual, slow_path_unlock); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/stubGenerator_x86_64.cpp --- a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -607,7 +607,7 @@ address start = __ pc(); __ movl(rax, c_rarg2); - if ( os::is_MP() ) __ lock(); + __ lock(); __ cmpxchgl(c_rarg0, Address(c_rarg1, 0)); __ ret(0); @@ -633,7 +633,7 @@ address start = __ pc(); __ movsbq(rax, c_rarg2); - if ( os::is_MP() ) __ lock(); + __ lock(); __ cmpxchgb(c_rarg0, Address(c_rarg1, 0)); __ ret(0); @@ -659,7 +659,7 @@ address start = __ pc(); __ movq(rax, c_rarg2); - if ( os::is_MP() ) __ lock(); + __ lock(); __ cmpxchgq(c_rarg0, Address(c_rarg1, 0)); __ ret(0); @@ -680,7 +680,7 @@ address start = __ pc(); __ movl(rax, c_rarg0); - if ( os::is_MP() ) __ lock(); + __ lock(); __ xaddl(Address(c_rarg1, 0), c_rarg0); __ addl(rax, c_rarg0); __ ret(0); @@ -702,7 +702,7 @@ address start = __ pc(); __ movptr(rax, c_rarg0); // Copy to eax we need a return value anyhow - if ( os::is_MP() ) __ lock(); + __ lock(); __ xaddptr(Address(c_rarg1, 0), c_rarg0); __ addptr(rax, c_rarg0); __ ret(0); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/templateInterpreterGenerator_x86.cpp --- a/src/hotspot/cpu/x86/templateInterpreterGenerator_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/templateInterpreterGenerator_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1090,19 +1090,17 @@ __ movl(Address(thread, JavaThread::thread_state_offset()), _thread_in_native_trans); - if (os::is_MP()) { - if (UseMembar) { - // Force this write out before the read below - __ membar(Assembler::Membar_mask_bits( - Assembler::LoadLoad | Assembler::LoadStore | - Assembler::StoreLoad | Assembler::StoreStore)); - } else { - // Write serialization page so VM thread can do a pseudo remote membar. - // We use the current thread pointer to calculate a thread specific - // offset to write to within the page. This minimizes bus traffic - // due to cache line collision. - __ serialize_memory(thread, rcx); - } + if (UseMembar) { + // Force this write out before the read below + __ membar(Assembler::Membar_mask_bits( + Assembler::LoadLoad | Assembler::LoadStore | + Assembler::StoreLoad | Assembler::StoreStore)); + } else { + // Write serialization page so VM thread can do a pseudo remote membar. + // We use the current thread pointer to calculate a thread specific + // offset to write to within the page. This minimizes bus traffic + // due to cache line collision. + __ serialize_memory(thread, rcx); } #ifndef _LP64 diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/templateTable_x86.cpp --- a/src/hotspot/cpu/x86/templateTable_x86.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/templateTable_x86.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2714,7 +2714,6 @@ void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint ) { // Helper function to insert a is-volatile test and memory barrier - if(!os::is_MP()) return; // Not needed on single CPU __ membar(order_constraint); } @@ -3493,13 +3492,12 @@ __ get_cache_and_index_at_bcp(rcx, rbx, 1); // replace index with field offset from cache entry // [jk] not needed currently - // if (os::is_MP()) { - // __ movl(rdx, Address(rcx, rbx, Address::times_8, - // in_bytes(ConstantPoolCache::base_offset() + - // ConstantPoolCacheEntry::flags_offset()))); - // __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); - // __ andl(rdx, 0x1); - // } + // __ movl(rdx, Address(rcx, rbx, Address::times_8, + // in_bytes(ConstantPoolCache::base_offset() + + // ConstantPoolCacheEntry::flags_offset()))); + // __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); + // __ andl(rdx, 0x1); + // __ movptr(rbx, Address(rcx, rbx, Address::times_ptr, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f2_offset()))); @@ -3544,13 +3542,11 @@ ShouldNotReachHere(); } // [jk] not needed currently - // if (os::is_MP()) { // Label notVolatile; // __ testl(rdx, rdx); // __ jcc(Assembler::zero, notVolatile); // __ membar(Assembler::LoadLoad); // __ bind(notVolatile); - //}; } void TemplateTable::fast_xaccess(TosState state) { @@ -3585,17 +3581,15 @@ } // [jk] not needed currently - // if (os::is_MP()) { - // Label notVolatile; - // __ movl(rdx, Address(rcx, rdx, Address::times_8, - // in_bytes(ConstantPoolCache::base_offset() + - // ConstantPoolCacheEntry::flags_offset()))); - // __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); - // __ testl(rdx, 0x1); - // __ jcc(Assembler::zero, notVolatile); - // __ membar(Assembler::LoadLoad); - // __ bind(notVolatile); - // } + // Label notVolatile; + // __ movl(rdx, Address(rcx, rdx, Address::times_8, + // in_bytes(ConstantPoolCache::base_offset() + + // ConstantPoolCacheEntry::flags_offset()))); + // __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift); + // __ testl(rdx, 0x1); + // __ jcc(Assembler::zero, notVolatile); + // __ membar(Assembler::LoadLoad); + // __ bind(notVolatile); __ decrement(rbcp); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/vm_version_x86.hpp --- a/src/hotspot/cpu/x86/vm_version_x86.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/vm_version_x86.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -608,10 +608,10 @@ static bool os_supports_avx_vectors() { bool retVal = false; + int nreg = 2 LP64_ONLY(+2); if (supports_evex()) { // Verify that OS save/restore all bits of EVEX registers // during signal processing. - int nreg = 2 LP64_ONLY(+2); retVal = true; for (int i = 0; i < 16 * nreg; i++) { // 64 bytes per zmm register if (_cpuid_info.zmm_save[i] != ymm_test_value()) { @@ -622,7 +622,6 @@ } else if (supports_avx()) { // Verify that OS save/restore all bits of AVX registers // during signal processing. - int nreg = 2 LP64_ONLY(+2); retVal = true; for (int i = 0; i < 8 * nreg; i++) { // 32 bytes per ymm register if (_cpuid_info.ymm_save[i] != ymm_test_value()) { @@ -634,7 +633,6 @@ if (retVal == false) { // Verify that OS save/restore all bits of EVEX registers // during signal processing. - int nreg = 2 LP64_ONLY(+2); retVal = true; for (int i = 0; i < 16 * nreg; i++) { // 64 bytes per zmm register if (_cpuid_info.zmm_save[i] != ymm_test_value()) { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/x86.ad --- a/src/hotspot/cpu/x86/x86.ad Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/x86.ad Fri Oct 05 16:14:28 2018 -0700 @@ -2804,11 +2804,7 @@ format %{ $$template - if (os::is_MP()) { - $$emit$$"pause\t! membar_onspinwait" - } else { - $$emit$$"MEMBAR-onspinwait ! (empty encoding)" - } + $$emit$$"pause\t! membar_onspinwait" %} ins_encode %{ __ pause(); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/x86_32.ad --- a/src/hotspot/cpu/x86/x86_32.ad Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/x86_32.ad Fri Oct 05 16:14:28 2018 -0700 @@ -2087,8 +2087,7 @@ %} enc_class lock_prefix( ) %{ - if( os::is_MP() ) - emit_opcode(cbuf,0xF0); // [Lock] + emit_opcode(cbuf,0xF0); // [Lock] %} // Cmp-xchg long value. @@ -2102,8 +2101,7 @@ emit_opcode(cbuf,0x87); emit_opcode(cbuf,0xD9); // [Lock] - if( os::is_MP() ) - emit_opcode(cbuf,0xF0); + emit_opcode(cbuf,0xF0); // CMPXCHG8 [Eptr] emit_opcode(cbuf,0x0F); emit_opcode(cbuf,0xC7); @@ -2115,8 +2113,7 @@ enc_class enc_cmpxchg(eSIRegP mem_ptr) %{ // [Lock] - if( os::is_MP() ) - emit_opcode(cbuf,0xF0); + emit_opcode(cbuf,0xF0); // CMPXCHG [Eptr] emit_opcode(cbuf,0x0F); @@ -2126,8 +2123,7 @@ enc_class enc_cmpxchgb(eSIRegP mem_ptr) %{ // [Lock] - if( os::is_MP() ) - emit_opcode(cbuf,0xF0); + emit_opcode(cbuf,0xF0); // CMPXCHGB [Eptr] emit_opcode(cbuf,0x0F); @@ -2137,8 +2133,7 @@ enc_class enc_cmpxchgw(eSIRegP mem_ptr) %{ // [Lock] - if( os::is_MP() ) - emit_opcode(cbuf,0xF0); + emit_opcode(cbuf,0xF0); // 16-bit mode emit_opcode(cbuf, 0x66); @@ -6764,11 +6759,7 @@ format %{ $$template - if (os::is_MP()) { - $$emit$$"LOCK ADDL [ESP + #0], 0\t! membar_volatile" - } else { - $$emit$$"MEMBAR-volatile ! (empty encoding)" - } + $$emit$$"LOCK ADDL [ESP + #0], 0\t! membar_volatile" %} ins_encode %{ __ membar(Assembler::StoreLoad); @@ -7373,8 +7364,7 @@ // rcx as the high order word of the new value to store but // our register encoding uses rbx. __ xchgl(as_Register(EBX_enc), as_Register(ECX_enc)); - if( os::is_MP() ) - __ lock(); + __ lock(); __ cmpxchg8($mem$$Address); __ xchgl(as_Register(EBX_enc), as_Register(ECX_enc)); %} @@ -7499,7 +7489,7 @@ effect(KILL cr); format %{ "ADDB [$mem],$add" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ addb($mem$$Address, $add$$constant); %} ins_pipe( pipe_cmpxchg ); @@ -7511,7 +7501,7 @@ effect(KILL cr); format %{ "XADDB [$mem],$newval" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ xaddb($mem$$Address, $newval$$Register); %} ins_pipe( pipe_cmpxchg ); @@ -7523,7 +7513,7 @@ effect(KILL cr); format %{ "ADDS [$mem],$add" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ addw($mem$$Address, $add$$constant); %} ins_pipe( pipe_cmpxchg ); @@ -7534,7 +7524,7 @@ effect(KILL cr); format %{ "XADDS [$mem],$newval" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ xaddw($mem$$Address, $newval$$Register); %} ins_pipe( pipe_cmpxchg ); @@ -7546,7 +7536,7 @@ effect(KILL cr); format %{ "ADDL [$mem],$add" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ addl($mem$$Address, $add$$constant); %} ins_pipe( pipe_cmpxchg ); @@ -7557,7 +7547,7 @@ effect(KILL cr); format %{ "XADDL [$mem],$newval" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ xaddl($mem$$Address, $newval$$Register); %} ins_pipe( pipe_cmpxchg ); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/cpu/x86/x86_64.ad --- a/src/hotspot/cpu/x86/x86_64.ad Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/cpu/x86/x86_64.ad Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ // -// Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. +// Copyright (c) 2003, 2018, 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 @@ -2341,9 +2341,7 @@ enc_class lock_prefix() %{ - if (os::is_MP()) { - emit_opcode(cbuf, 0xF0); // lock - } + emit_opcode(cbuf, 0xF0); // lock %} enc_class REX_mem(memory mem) @@ -6601,11 +6599,7 @@ format %{ $$template - if (os::is_MP()) { - $$emit$$"lock addl [rsp + #0], 0\t! membar_volatile" - } else { - $$emit$$"MEMBAR-volatile ! (empty encoding)" - } + $$emit$$"lock addl [rsp + #0], 0\t! membar_volatile" %} ins_encode %{ __ membar(Assembler::StoreLoad); @@ -7801,7 +7795,7 @@ effect(KILL cr); format %{ "ADDB [$mem],$add" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ addb($mem$$Address, $add$$constant); %} ins_pipe( pipe_cmpxchg ); @@ -7812,7 +7806,7 @@ effect(KILL cr); format %{ "XADDB [$mem],$newval" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ xaddb($mem$$Address, $newval$$Register); %} ins_pipe( pipe_cmpxchg ); @@ -7824,7 +7818,7 @@ effect(KILL cr); format %{ "ADDW [$mem],$add" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ addw($mem$$Address, $add$$constant); %} ins_pipe( pipe_cmpxchg ); @@ -7835,7 +7829,7 @@ effect(KILL cr); format %{ "XADDW [$mem],$newval" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ xaddw($mem$$Address, $newval$$Register); %} ins_pipe( pipe_cmpxchg ); @@ -7847,7 +7841,7 @@ effect(KILL cr); format %{ "ADDL [$mem],$add" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ addl($mem$$Address, $add$$constant); %} ins_pipe( pipe_cmpxchg ); @@ -7858,7 +7852,7 @@ effect(KILL cr); format %{ "XADDL [$mem],$newval" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ xaddl($mem$$Address, $newval$$Register); %} ins_pipe( pipe_cmpxchg ); @@ -7870,7 +7864,7 @@ effect(KILL cr); format %{ "ADDQ [$mem],$add" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ addq($mem$$Address, $add$$constant); %} ins_pipe( pipe_cmpxchg ); @@ -7881,7 +7875,7 @@ effect(KILL cr); format %{ "XADDQ [$mem],$newval" %} ins_encode %{ - if (os::is_MP()) { __ lock(); } + __ lock(); __ xaddq($mem$$Address, $newval$$Register); %} ins_pipe( pipe_cmpxchg ); @@ -10898,7 +10892,7 @@ ins_pipe(pipe_slow); %} -instruct rep_stos_large(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero, +instruct rep_stos_large(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero, Universe dummy, rFlagsReg cr) %{ predicate(((ClearArrayNode*)n)->is_large()); @@ -10942,7 +10936,7 @@ } %} ins_encode %{ - __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, + __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, $tmp$$XMMRegister, true); %} ins_pipe(pipe_slow); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os/bsd/os_bsd.cpp --- a/src/hotspot/os/bsd/os_bsd.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os/bsd/os_bsd.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -3238,16 +3238,6 @@ Bsd::clock_init(); initial_time_count = javaTimeNanos(); -#ifdef __APPLE__ - // XXXDARWIN - // Work around the unaligned VM callbacks in hotspot's - // sharedRuntime. The callbacks don't use SSE2 instructions, and work on - // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces - // alignment when doing symbol lookup. To work around this, we force early - // binding of all symbols now, thus binding when alignment is known-good. - _dyld_bind_fully_image_containing_address((const void *) &os::init); -#endif - os::Posix::init(); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os/linux/os_linux.cpp --- a/src/hotspot/os/linux/os_linux.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os/linux/os_linux.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -137,7 +137,6 @@ address os::Linux::_initial_thread_stack_bottom = NULL; uintptr_t os::Linux::_initial_thread_stack_size = 0; -int (*os::Linux::_clock_gettime)(clockid_t, struct timespec *) = NULL; int (*os::Linux::_pthread_getcpuclockid)(pthread_t, clockid_t *) = NULL; int (*os::Linux::_pthread_setname_np)(pthread_t, const char*) = NULL; Mutex* os::Linux::_createThread_lock = NULL; @@ -268,8 +267,7 @@ // Most versions of linux have a bug where the number of processors are // determined by looking at the /proc file system. In a chroot environment, -// the system call returns 1. This causes the VM to act as if it is -// a single processor and elide locking (see is_MP() call). +// the system call returns 1. static bool unsafe_chroot_detected = false; static const char *unstable_chroot_error = "/proc file system not found.\n" "Java may be unstable running multithreaded in a chroot " @@ -1173,6 +1171,10 @@ //////////////////////////////////////////////////////////////////////////////// // time support +#ifndef SUPPORTS_CLOCK_MONOTONIC +#error "Build platform doesn't support clock_gettime and related functionality" +#endif + // Time since start-up in seconds to a fine granularity. // Used by VMSelfDestructTimer and the MemProfiler. double os::elapsedTime() { @@ -1218,62 +1220,6 @@ nanos = jlong(time.tv_usec) * 1000; } - -#ifndef CLOCK_MONOTONIC - #define CLOCK_MONOTONIC (1) -#endif - -void os::Linux::clock_init() { - // we do dlopen's in this particular order due to bug in linux - // dynamical loader (see 6348968) leading to crash on exit - void* handle = dlopen("librt.so.1", RTLD_LAZY); - if (handle == NULL) { - handle = dlopen("librt.so", RTLD_LAZY); - } - - if (handle) { - int (*clock_getres_func)(clockid_t, struct timespec*) = - (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_getres"); - int (*clock_gettime_func)(clockid_t, struct timespec*) = - (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_gettime"); - if (clock_getres_func && clock_gettime_func) { - // See if monotonic clock is supported by the kernel. Note that some - // early implementations simply return kernel jiffies (updated every - // 1/100 or 1/1000 second). It would be bad to use such a low res clock - // for nano time (though the monotonic property is still nice to have). - // It's fixed in newer kernels, however clock_getres() still returns - // 1/HZ. We check if clock_getres() works, but will ignore its reported - // resolution for now. Hopefully as people move to new kernels, this - // won't be a problem. - struct timespec res; - struct timespec tp; - if (clock_getres_func (CLOCK_MONOTONIC, &res) == 0 && - clock_gettime_func(CLOCK_MONOTONIC, &tp) == 0) { - // yes, monotonic clock is supported - _clock_gettime = clock_gettime_func; - return; - } else { - // close librt if there is no monotonic clock - dlclose(handle); - } - } - } - warning("No monotonic clock was available - timed services may " \ - "be adversely affected if the time-of-day clock changes"); -} - -#ifndef SYS_clock_getres - #if defined(X86) || defined(PPC64) || defined(S390) - #define SYS_clock_getres AMD64_ONLY(229) IA32_ONLY(266) PPC64_ONLY(247) S390_ONLY(261) - #define sys_clock_getres(x,y) ::syscall(SYS_clock_getres, x, y) - #else - #warning "SYS_clock_getres not defined for this platform, disabling fast_thread_cpu_time" - #define sys_clock_getres(x,y) -1 - #endif -#else - #define sys_clock_getres(x,y) ::syscall(SYS_clock_getres, x, y) -#endif - void os::Linux::fast_thread_clock_init() { if (!UseLinuxPosixThreadCPUClocks) { return; @@ -1284,17 +1230,17 @@ (int(*)(pthread_t, clockid_t *)) dlsym(RTLD_DEFAULT, "pthread_getcpuclockid"); // Switch to using fast clocks for thread cpu time if - // the sys_clock_getres() returns 0 error code. + // the clock_getres() returns 0 error code. // Note, that some kernels may support the current thread // clock (CLOCK_THREAD_CPUTIME_ID) but not the clocks // returned by the pthread_getcpuclockid(). - // If the fast Posix clocks are supported then the sys_clock_getres() + // If the fast Posix clocks are supported then the clock_getres() // must return at least tp.tv_sec == 0 which means a resolution // better than 1 sec. This is extra check for reliability. if (pthread_getcpuclockid_func && pthread_getcpuclockid_func(_main_thread, &clockid) == 0 && - sys_clock_getres(clockid, &tp) == 0 && tp.tv_sec == 0) { + os::Posix::clock_getres(clockid, &tp) == 0 && tp.tv_sec == 0) { _supports_fast_thread_cpu_time = true; _pthread_getcpuclockid = pthread_getcpuclockid_func; } @@ -1303,7 +1249,7 @@ jlong os::javaTimeNanos() { if (os::supports_monotonic_clock()) { struct timespec tp; - int status = Linux::clock_gettime(CLOCK_MONOTONIC, &tp); + int status = os::Posix::clock_gettime(CLOCK_MONOTONIC, &tp); assert(status == 0, "gettime error"); jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec); return result; @@ -1622,9 +1568,6 @@ // This is OK - No Java threads have been created yet, and hence no // stack guard pages to fix. // - // This should happen only when you are building JDK7 using a very - // old version of JDK6 (e.g., with JPRT) and running test_gamma. - // // Dynamic loader will make all stacks executable after // this function returns, and will not do that again. assert(Threads::number_of_threads() == 0, "no Java threads should exist yet."); @@ -2482,7 +2425,7 @@ static struct timespec create_semaphore_timespec(unsigned int sec, int nsec) { struct timespec ts; // Semaphore's are always associated with CLOCK_REALTIME - os::Linux::clock_gettime(CLOCK_REALTIME, &ts); + os::Posix::clock_gettime(CLOCK_REALTIME, &ts); // see os_posix.cpp for discussion on overflow checking if (sec >= MAX_SECS) { ts.tv_sec += MAX_SECS; @@ -4715,7 +4658,7 @@ jlong os::Linux::fast_thread_cpu_time(clockid_t clockid) { struct timespec tp; - int rc = os::Linux::clock_gettime(clockid, &tp); + int rc = os::Posix::clock_gettime(clockid, &tp); assert(rc == 0, "clock_gettime is expected to return 0 code"); return (tp.tv_sec * NANOSECS_PER_SEC) + tp.tv_nsec; @@ -4987,14 +4930,19 @@ // _main_thread points to the thread that created/loaded the JVM. Linux::_main_thread = pthread_self(); - Linux::clock_init(); - initial_time_count = javaTimeNanos(); - // retrieve entry point for pthread_setname_np Linux::_pthread_setname_np = (int(*)(pthread_t, const char*))dlsym(RTLD_DEFAULT, "pthread_setname_np"); os::Posix::init(); + + initial_time_count = javaTimeNanos(); + + // Always warn if no monotonic clock available + if (!os::Posix::supports_monotonic_clock()) { + warning("No monotonic clock was available - timed services may " \ + "be adversely affected if the time-of-day clock changes"); + } } // To install functions for atexit system call diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os/linux/os_linux.hpp --- a/src/hotspot/os/linux/os_linux.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os/linux/os_linux.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -43,7 +43,6 @@ static void check_signal_handler(int sig); - static int (*_clock_gettime)(clockid_t, struct timespec *); static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *); static int (*_pthread_setname_np)(pthread_t, const char*); @@ -190,16 +189,9 @@ static bool manually_expand_stack(JavaThread * t, address addr); static int max_register_window_saves_before_flushing(); - // Real-time clock functions - static void clock_init(void); - // fast POSIX clocks support static void fast_thread_clock_init(void); - static int clock_gettime(clockid_t clock_id, struct timespec *tp) { - return _clock_gettime ? _clock_gettime(clock_id, tp) : -1; - } - static int pthread_getcpuclockid(pthread_t tid, clockid_t *clock_id) { return _pthread_getcpuclockid ? _pthread_getcpuclockid(tid, clock_id) : -1; } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os/linux/os_linux.inline.hpp --- a/src/hotspot/os/linux/os_linux.inline.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os/linux/os_linux.inline.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -141,7 +141,7 @@ } inline bool os::supports_monotonic_clock() { - return Linux::_clock_gettime != NULL; + return os::Posix::supports_monotonic_clock(); } inline void os::exit(int num) { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os/posix/os_posix.cpp --- a/src/hotspot/os/posix/os_posix.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os/posix/os_posix.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1609,10 +1609,25 @@ // This means we have clockid_t, clock_gettime et al and CLOCK_MONOTONIC static int (*_clock_gettime)(clockid_t, struct timespec *); +static int (*_clock_getres)(clockid_t, struct timespec *); static int (*_pthread_condattr_setclock)(pthread_condattr_t *, clockid_t); static bool _use_clock_monotonic_condattr; +// Exported clock functionality + +int os::Posix::clock_gettime(clockid_t clock_id, struct timespec *tp) { + return _clock_gettime != NULL ? _clock_gettime(clock_id, tp) : -1; +} + +int os::Posix::clock_getres(clockid_t clock_id, struct timespec *tp) { + return _clock_getres != NULL ? _clock_getres(clock_id, tp) : -1; +} + +bool os::Posix::supports_monotonic_clock() { + return _clock_gettime != NULL; +} + // Determine what POSIX API's are present and do appropriate // configuration. void os::Posix::init(void) { @@ -1620,8 +1635,6 @@ // NOTE: no logging available when this is called. Put logging // statements in init_2(). - // Copied from os::Linux::clock_init(). The duplication is temporary. - // 1. Check for CLOCK_MONOTONIC support. void* handle = NULL; @@ -1642,6 +1655,7 @@ } _clock_gettime = NULL; + _clock_getres = NULL; int (*clock_getres_func)(clockid_t, struct timespec*) = (int(*)(clockid_t, struct timespec*))dlsym(handle, "clock_getres"); @@ -1656,6 +1670,7 @@ clock_gettime_func(CLOCK_MONOTONIC, &tp) == 0) { // Yes, monotonic clock is supported. _clock_gettime = clock_gettime_func; + _clock_getres = clock_getres_func; } else { #ifdef NEEDS_LIBRT // Close librt if there is no monotonic clock. diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os/posix/os_posix.hpp --- a/src/hotspot/os/posix/os_posix.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os/posix/os_posix.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -116,6 +116,18 @@ // Returns true if either given uid is effective uid and given gid is // effective gid, or if given uid is root. static bool matches_effective_uid_and_gid_or_root(uid_t uid, gid_t gid); + +#ifdef SUPPORTS_CLOCK_MONOTONIC + + static bool supports_monotonic_clock(); + static int clock_gettime(clockid_t clock_id, struct timespec *tp); + static int clock_getres(clockid_t clock_id, struct timespec *tp); + +#else + + static bool supports_monotonic_clock() { return false; } + +#endif }; // On POSIX platforms the signal handler is global so we just do the write. diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os_cpu/bsd_x86/atomic_bsd_x86.hpp --- a/src/hotspot/os_cpu/bsd_x86/atomic_bsd_x86.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os_cpu/bsd_x86/atomic_bsd_x86.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -136,7 +136,7 @@ extern "C" { // defined in bsd_x86.s - int64_t _Atomic_cmpxchg_long(int64_t, volatile int64_t*, int64_t, bool); + int64_t _Atomic_cmpxchg_long(int64_t, volatile int64_t*, int64_t); void _Atomic_move_long(const volatile int64_t* src, volatile int64_t* dst); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os_cpu/bsd_x86/bsd_x86_32.s --- a/src/hotspot/os_cpu/bsd_x86/bsd_x86_32.s Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os_cpu/bsd_x86/bsd_x86_32.s Fri Oct 05 16:14:28 2018 -0700 @@ -635,8 +635,7 @@ # Support for int64_t Atomic::cmpxchg(int64_t exchange_value, # volatile int64_t* dest, - # int64_t compare_value, - # bool is_MP) + # int64_t compare_value) # .p2align 4,,15 ELF_TYPE(_Atomic_cmpxchg_long,@function) @@ -649,10 +648,8 @@ movl 24(%esp), %eax # 24(%esp) : compare_value (low) movl 28(%esp), %edx # 28(%esp) : compare_value (high) movl 20(%esp), %edi # 20(%esp) : dest - cmpl $0, 32(%esp) # 32(%esp) : is_MP - je 1f lock -1: cmpxchg8b (%edi) + cmpxchg8b (%edi) popl %edi popl %ebx ret diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/os_cpu/linux_arm/orderAccess_linux_arm.hpp --- a/src/hotspot/os_cpu/linux_arm/orderAccess_linux_arm.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/os_cpu/linux_arm/orderAccess_linux_arm.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -50,17 +50,12 @@ // // inline void _OrderAccess_dsb() { // volatile intptr_t dummy = 0; -// if (os::is_MP()) { -// __asm__ volatile ( -// "mcr p15, 0, %0, c7, c10, 4" -// : : "r" (dummy) : "memory"); -// } +// __asm__ volatile ( +// "mcr p15, 0, %0, c7, c10, 4" +// : : "r" (dummy) : "memory"); // } inline static void dmb_sy() { - if (!os::is_MP()) { - return; - } #ifdef AARCH64 __asm__ __volatile__ ("dmb sy" : : : "memory"); #else @@ -82,9 +77,6 @@ } inline static void dmb_st() { - if (!os::is_MP()) { - return; - } #ifdef AARCH64 __asm__ __volatile__ ("dmb st" : : : "memory"); #else @@ -108,9 +100,6 @@ // Load-Load/Store barrier inline static void dmb_ld() { #ifdef AARCH64 - if (!os::is_MP()) { - return; - } __asm__ __volatile__ ("dmb ld" : : : "memory"); #else dmb_sy(); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/c1/c1_CodeStubs.hpp --- a/src/hotspot/share/c1/c1_CodeStubs.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/c1/c1_CodeStubs.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -394,11 +394,9 @@ _id(id) , _info(NULL) , _index(index) { - if (os::is_MP()) { - // force alignment of patch sites on MP hardware so we - // can guarantee atomic writes to the patch site. - align_patch_site(masm); - } + // force alignment of patch sites so we + // can guarantee atomic writes to the patch site. + align_patch_site(masm); _pc_start = masm->pc(); masm->bind(_patch_site_entry); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/c1/c1_InstructionPrinter.cpp --- a/src/hotspot/share/c1/c1_InstructionPrinter.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/c1/c1_InstructionPrinter.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -918,18 +918,16 @@ } void InstructionPrinter::do_MemBar(MemBar* x) { - if (os::is_MP()) { - LIR_Code code = x->code(); - switch (code) { - case lir_membar_acquire : output()->print("membar_acquire"); break; - case lir_membar_release : output()->print("membar_release"); break; - case lir_membar : output()->print("membar"); break; - case lir_membar_loadload : output()->print("membar_loadload"); break; - case lir_membar_storestore: output()->print("membar_storestore"); break; - case lir_membar_loadstore : output()->print("membar_loadstore"); break; - case lir_membar_storeload : output()->print("membar_storeload"); break; - default : ShouldNotReachHere(); break; - } + LIR_Code code = x->code(); + switch (code) { + case lir_membar_acquire : output()->print("membar_acquire"); break; + case lir_membar_release : output()->print("membar_release"); break; + case lir_membar : output()->print("membar"); break; + case lir_membar_loadload : output()->print("membar_loadload"); break; + case lir_membar_storestore: output()->print("membar_storestore"); break; + case lir_membar_loadstore : output()->print("membar_loadstore"); break; + case lir_membar_storeload : output()->print("membar_storeload"); break; + default : ShouldNotReachHere(); break; } } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/c1/c1_LIRAssembler.cpp --- a/src/hotspot/share/c1/c1_LIRAssembler.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/c1/c1_LIRAssembler.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -446,10 +446,8 @@ void LIR_Assembler::emit_call(LIR_OpJavaCall* op) { verify_oop_map(op->info()); - if (os::is_MP()) { - // must align calls sites, otherwise they can't be updated atomically on MP hardware - align_call(op->code()); - } + // must align calls sites, otherwise they can't be updated atomically + align_call(op->code()); // emit the static call stub stuff out of line emit_static_call_stub(); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/c1/c1_LIRGenerator.cpp --- a/src/hotspot/share/c1/c1_LIRGenerator.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/c1/c1_LIRGenerator.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -3068,13 +3068,13 @@ break; case vmIntrinsics::_loadFence : - if (os::is_MP()) __ membar_acquire(); + __ membar_acquire(); break; case vmIntrinsics::_storeFence: - if (os::is_MP()) __ membar_release(); + __ membar_release(); break; case vmIntrinsics::_fullFence : - if (os::is_MP()) __ membar(); + __ membar(); break; case vmIntrinsics::_onSpinWait: __ on_spin_wait(); @@ -3623,18 +3623,16 @@ } void LIRGenerator::do_MemBar(MemBar* x) { - if (os::is_MP()) { - LIR_Code code = x->code(); - switch(code) { - case lir_membar_acquire : __ membar_acquire(); break; - case lir_membar_release : __ membar_release(); break; - case lir_membar : __ membar(); break; - case lir_membar_loadload : __ membar_loadload(); break; - case lir_membar_storestore: __ membar_storestore(); break; - case lir_membar_loadstore : __ membar_loadstore(); break; - case lir_membar_storeload : __ membar_storeload(); break; - default : ShouldNotReachHere(); break; - } + LIR_Code code = x->code(); + switch(code) { + case lir_membar_acquire : __ membar_acquire(); break; + case lir_membar_release : __ membar_release(); break; + case lir_membar : __ membar(); break; + case lir_membar_loadload : __ membar_loadload(); break; + case lir_membar_storestore: __ membar_storestore(); break; + case lir_membar_loadstore : __ membar_loadstore(); break; + case lir_membar_storeload : __ membar_storeload(); break; + default : ShouldNotReachHere(); break; } } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/ci/ciEnv.cpp --- a/src/hotspot/share/ci/ciEnv.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/ci/ciEnv.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -399,8 +399,8 @@ // Now we need to check the SystemDictionary Symbol* sym = name->get_symbol(); - if (sym->byte_at(0) == 'L' && - sym->byte_at(sym->utf8_length()-1) == ';') { + if (sym->char_at(0) == 'L' && + sym->char_at(sym->utf8_length()-1) == ';') { // This is a name from a signature. Strip off the trimmings. // Call recursive to keep scope of strippedsym. TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1, @@ -427,7 +427,7 @@ // setup up the proper type to return on OOM ciKlass* fail_type; - if (sym->byte_at(0) == '[') { + if (sym->char_at(0) == '[') { fail_type = _unloaded_ciobjarrayklass; } else { fail_type = _unloaded_ciinstance_klass; @@ -453,8 +453,8 @@ // we must build an array type around it. The CI requires array klasses // to be loaded if their element klasses are loaded, except when memory // is exhausted. - if (sym->byte_at(0) == '[' && - (sym->byte_at(1) == '[' || sym->byte_at(1) == 'L')) { + if (sym->char_at(0) == '[' && + (sym->char_at(1) == '[' || sym->char_at(1) == 'L')) { // We have an unloaded array. // Build it on the fly if the element class exists. TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1, diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/ci/ciInstanceKlass.cpp --- a/src/hotspot/share/ci/ciInstanceKlass.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/ci/ciInstanceKlass.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -116,7 +116,7 @@ jobject loader, jobject protection_domain) : ciKlass(name, T_OBJECT) { - assert(name->byte_at(0) != '[', "not an instance klass"); + assert(name->char_at(0) != '[', "not an instance klass"); _init_state = (InstanceKlass::ClassState)0; _nonstatic_field_size = -1; _has_nonstatic_fields = false; @@ -299,7 +299,7 @@ return false; // Test for trailing '/' - if ((char) name()->byte_at(len) != '/') + if (name()->char_at(len) != '/') return false; // Make sure it's not actually in a subpackage: diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/ci/ciObjArrayKlass.cpp --- a/src/hotspot/share/ci/ciObjArrayKlass.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/ci/ciObjArrayKlass.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -112,9 +112,9 @@ Symbol* base_name_sym = element_name->get_symbol(); char* name; - if (base_name_sym->byte_at(0) == '[' || - (base_name_sym->byte_at(0) == 'L' && // watch package name 'Lxx' - base_name_sym->byte_at(element_len-1) == ';')) { + if (base_name_sym->char_at(0) == '[' || + (base_name_sym->char_at(0) == 'L' && // watch package name 'Lxx' + base_name_sym->char_at(element_len-1) == ';')) { int new_len = element_len + dimension + 1; // for the ['s and '\0' name = CURRENT_THREAD_ENV->name_buffer(new_len); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/ci/ciObjectFactory.cpp --- a/src/hotspot/share/ci/ciObjectFactory.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/ci/ciObjectFactory.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -466,7 +466,7 @@ // Two cases: this is an unloaded ObjArrayKlass or an // unloaded InstanceKlass. Deal with both. - if (name->byte_at(0) == '[') { + if (name->char_at(0) == '[') { // Decompose the name.' FieldArrayInfo fd; BasicType element_type = FieldType::get_array_info(name->get_symbol(), diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/ci/ciSymbol.cpp --- a/src/hotspot/share/ci/ciSymbol.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/ci/ciSymbol.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, 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 @@ -68,14 +68,14 @@ // ------------------------------------------------------------------ // ciSymbol::base -const jbyte* ciSymbol::base() { +const u1* ciSymbol::base() { GUARDED_VM_ENTRY(return get_symbol()->base();) } // ------------------------------------------------------------------ -// ciSymbol::byte_at -int ciSymbol::byte_at(int i) { - GUARDED_VM_ENTRY(return get_symbol()->byte_at(i);) +// ciSymbol::char_at +char ciSymbol::char_at(int i) { + GUARDED_VM_ENTRY(return get_symbol()->char_at(i);) } // ------------------------------------------------------------------ diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/ci/ciSymbol.hpp --- a/src/hotspot/share/ci/ciSymbol.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/ci/ciSymbol.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, 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 @@ -61,7 +61,7 @@ void print_impl(outputStream* st); // This is public in Symbol* but private here, because the base can move: - const jbyte* base(); + const u1* base(); // Make a ciSymbol from a C string (implementation). static ciSymbol* make_impl(const char* s); @@ -77,8 +77,8 @@ // The text of the symbol as ascii with all non-printable characters quoted as \u#### const char* as_quoted_ascii(); - // Return the i-th utf8 byte, where i < utf8_length - int byte_at(int i); + // Return the i-th utf byte as a char, where i < utf8_length + char char_at(int i); // Tests if the symbol starts with the given prefix. bool starts_with(const char* prefix, int len) const; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/classFileParser.cpp --- a/src/hotspot/share/classfile/classFileParser.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/classFileParser.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -655,7 +655,7 @@ "Illegal zero length constant pool entry at %d in class %s", name_index, CHECK); - if (sig->byte_at(0) == JVM_SIGNATURE_FUNC) { + if (sig->char_at(0) == JVM_SIGNATURE_FUNC) { // Format check method name and signature verify_legal_method_name(name, CHECK); verify_legal_method_signature(name, sig, CHECK); @@ -682,7 +682,7 @@ // CONSTANT_Dynamic's name and signature are verified above, when iterating NameAndType_info. // Need only to be sure signature is non-zero length and the right type. if (signature->utf8_length() == 0 || - signature->byte_at(0) == JVM_SIGNATURE_FUNC) { + signature->char_at(0) == JVM_SIGNATURE_FUNC) { throwIllegalSignature("CONSTANT_Dynamic", name, signature, CHECK); } } @@ -707,7 +707,7 @@ // Field name and signature are verified above, when iterating NameAndType_info. // Need only to be sure signature is non-zero length and the right type. if (signature->utf8_length() == 0 || - signature->byte_at(0) == JVM_SIGNATURE_FUNC) { + signature->char_at(0) == JVM_SIGNATURE_FUNC) { throwIllegalSignature("Field", name, signature, CHECK); } } @@ -716,7 +716,7 @@ // Method name and signature are verified above, when iterating NameAndType_info. // Need only to be sure signature is non-zero length and the right type. if (signature->utf8_length() == 0 || - signature->byte_at(0) != JVM_SIGNATURE_FUNC) { + signature->char_at(0) != JVM_SIGNATURE_FUNC) { throwIllegalSignature("Method", name, signature, CHECK); } } @@ -724,7 +724,7 @@ const unsigned int name_len = name->utf8_length(); if (tag == JVM_CONSTANT_Methodref && name_len != 0 && - name->byte_at(0) == '<' && + name->char_at(0) == '<' && name != vmSymbols::object_initializer_name()) { classfile_parse_error( "Bad method name at constant pool index %u in class file %s", @@ -942,7 +942,7 @@ // Don't need to check legal name because it's checked when parsing constant pool. // But need to make sure it's not an array type. - guarantee_property(unresolved_klass->byte_at(0) != JVM_SIGNATURE_ARRAY, + guarantee_property(unresolved_klass->char_at(0) != JVM_SIGNATURE_ARRAY, "Bad interface name in class file %s", CHECK); // Call resolve_super so classcircularity is checked @@ -3752,7 +3752,7 @@ if (need_verify) is_array = super_klass->is_array_klass(); } else if (need_verify) { - is_array = (cp->klass_name_at(super_class_index)->byte_at(0) == JVM_SIGNATURE_ARRAY); + is_array = (cp->klass_name_at(super_class_index)->char_at(0) == JVM_SIGNATURE_ARRAY); } if (need_verify) { guarantee_property(!is_array, @@ -5379,7 +5379,7 @@ // The first non-signature thing better be a ')' if ((length > 0) && (*p++ == JVM_SIGNATURE_ENDFUNC)) { length--; - if (name->utf8_length() > 0 && name->byte_at(0) == '<') { + if (name->utf8_length() > 0 && name->char_at(0) == '<') { // All internal methods must return void if ((length == 1) && (p[0] == JVM_SIGNATURE_VOID)) { return args_size; @@ -5796,7 +5796,7 @@ void ClassFileParser::fix_unsafe_anonymous_class_name(TRAPS) { assert(_unsafe_anonymous_host != NULL, "Expected an unsafe anonymous class"); - const jbyte* anon_last_slash = UTF8::strrchr(_class_name->base(), + const jbyte* anon_last_slash = UTF8::strrchr((const jbyte*)_class_name->base(), _class_name->utf8_length(), '/'); if (anon_last_slash == NULL) { // Unnamed package prepend_host_package_name(_unsafe_anonymous_host, CHECK); @@ -6119,7 +6119,7 @@ // It has been checked when constant pool is parsed. // However, make sure it is not an array type. if (_need_verify) { - guarantee_property(_class_name->byte_at(0) != JVM_SIGNATURE_ARRAY, + guarantee_property(_class_name->char_at(0) != JVM_SIGNATURE_ARRAY, "Bad class name in class file %s", CHECK); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/classLoaderDataGraph.cpp --- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -487,6 +487,21 @@ } #endif // PRODUCT +bool ClassLoaderDataGraph::is_valid(ClassLoaderData* loader_data) { + DEBUG_ONLY( if (!VMError::is_error_reported()) { assert_locked_or_safepoint(ClassLoaderDataGraph_lock); } ) + if (loader_data != NULL) { + if (loader_data == ClassLoaderData::the_null_class_loader_data()) { + return true; + } + for (ClassLoaderData* data = _head; data != NULL; data = data->next()) { + if (loader_data == data) { + return true; + } + } + } + return false; +} + // Move class loader data from main list to the unloaded list for unloading // and deallocation later. bool ClassLoaderDataGraph::do_unloading(bool do_cleaning) { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/classLoaderDataGraph.hpp --- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -146,6 +146,10 @@ #ifndef PRODUCT static bool contains_loader_data(ClassLoaderData* loader_data); #endif + + // Check if ClassLoaderData is part of the ClassLoaderDataGraph (not unloaded) + // Usage without lock only allowed during error reporting. + static bool is_valid(ClassLoaderData* loader_data); }; class LockedClassesDo : public KlassClosure { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/symbolTable.cpp --- a/src/hotspot/share/classfile/symbolTable.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/symbolTable.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -478,8 +478,8 @@ #ifdef ASSERT assert(sym->utf8_length() == _len, "%s [%d,%d]", where, sym->utf8_length(), _len); for (int i = 0; i < _len; i++) { - assert(sym->byte_at(i) == (jbyte) _name[i], - "%s [%d,%d,%d]", where, i, sym->byte_at(i), _name[i]); + assert(sym->char_at(i) == _name[i], + "%s [%d,%d,%d]", where, i, sym->char_at(i), _name[i]); } #endif } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/systemDictionary.cpp --- a/src/hotspot/share/classfile/systemDictionary.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/systemDictionary.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2601,7 +2601,7 @@ if (type->utf8_length() == 1) { // It's a primitive. (Void has a primitive mirror too.) - char ch = (char) type->byte_at(0); + char ch = type->char_at(0); assert(is_java_primitive(char2type(ch)) || ch == 'V', ""); return Handle(THREAD, find_java_mirror_for_type(ch)); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/verificationType.cpp --- a/src/hotspot/share/classfile/verificationType.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/verificationType.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -120,7 +120,7 @@ VerificationType VerificationType::get_component(ClassVerifier *context, TRAPS) const { assert(is_array() && name()->utf8_length() >= 2, "Must be a valid array"); Symbol* component; - switch (name()->byte_at(1)) { + switch (name()->char_at(1)) { case 'Z': return VerificationType(Boolean); case 'B': return VerificationType(Byte); case 'C': return VerificationType(Char); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/verificationType.hpp --- a/src/hotspot/share/classfile/verificationType.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/verificationType.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -207,7 +207,7 @@ bool is_check() const { return (_u._data & TypeQuery) == TypeQuery; } bool is_x_array(char sig) const { - return is_null() || (is_array() && (name()->byte_at(1) == sig)); + return is_null() || (is_array() && (name()->char_at(1) == sig)); } bool is_int_array() const { return is_x_array('I'); } bool is_byte_array() const { return is_x_array('B'); } @@ -223,10 +223,10 @@ { return is_object_array() || is_array_array(); } bool is_object() const { return (is_reference() && !is_null() && name()->utf8_length() >= 1 && - name()->byte_at(0) != '['); } + name()->char_at(0) != '['); } bool is_array() const { return (is_reference() && !is_null() && name()->utf8_length() >= 2 && - name()->byte_at(0) == '['); } + name()->char_at(0) == '['); } bool is_uninitialized() const { return ((_u._data & Uninitialized) == Uninitialized); } bool is_uninitialized_this() const @@ -322,7 +322,7 @@ int dimensions() const { assert(is_array(), "Must be an array"); int index = 0; - while (name()->byte_at(index) == '[') index++; + while (name()->char_at(index) == '[') index++; return index; } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/verifier.cpp --- a/src/hotspot/share/classfile/verifier.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/verifier.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2809,7 +2809,7 @@ } } - if (method_name->byte_at(0) == '<') { + if (method_name->char_at(0) == '<') { // Make sure can only be invoked by invokespecial if (opcode != Bytecodes::_invokespecial || method_name != vmSymbols::object_initializer_name()) { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/classfile/vmSymbols.cpp --- a/src/hotspot/share/classfile/vmSymbols.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/classfile/vmSymbols.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -212,7 +212,7 @@ BasicType vmSymbols::signature_type(const Symbol* s) { assert(s != NULL, "checking"); if (s->utf8_length() == 1) { - BasicType result = char2type(s->byte_at(0)); + BasicType result = char2type(s->char_at(0)); if (is_java_primitive(result) || result == T_VOID) { assert(s == _type_signatures[result], ""); return result; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/code/codeBlob.cpp --- a/src/hotspot/share/code/codeBlob.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/code/codeBlob.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -26,7 +26,9 @@ #include "jvm.h" #include "code/codeBlob.hpp" #include "code/codeCache.hpp" +#include "code/icBuffer.hpp" #include "code/relocInfo.hpp" +#include "code/vtableStubs.hpp" #include "compiler/disassembler.hpp" #include "interpreter/bytecode.hpp" #include "memory/allocation.inline.hpp" @@ -559,6 +561,67 @@ st->print_cr("[CodeBlob]"); } +void CodeBlob::dump_for_addr(address addr, outputStream* st, bool verbose) const { + if (is_buffer_blob()) { + // the interpreter is generated into a buffer blob + InterpreterCodelet* i = Interpreter::codelet_containing(addr); + if (i != NULL) { + st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an Interpreter codelet", p2i(addr), (int)(addr - i->code_begin())); + i->print_on(st); + return; + } + if (Interpreter::contains(addr)) { + st->print_cr(INTPTR_FORMAT " is pointing into interpreter code" + " (not bytecode specific)", p2i(addr)); + return; + } + // + if (AdapterHandlerLibrary::contains(this)) { + st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an AdapterHandler", p2i(addr), (int)(addr - code_begin())); + AdapterHandlerLibrary::print_handler_on(st, this); + } + // the stubroutines are generated into a buffer blob + StubCodeDesc* d = StubCodeDesc::desc_for(addr); + if (d != NULL) { + st->print_cr(INTPTR_FORMAT " is at begin+%d in a stub", p2i(addr), (int)(addr - d->begin())); + d->print_on(st); + st->cr(); + return; + } + if (StubRoutines::contains(addr)) { + st->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) stub routine", p2i(addr)); + return; + } + // the InlineCacheBuffer is using stubs generated into a buffer blob + if (InlineCacheBuffer::contains(addr)) { + st->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", p2i(addr)); + return; + } + VtableStub* v = VtableStubs::stub_containing(addr); + if (v != NULL) { + st->print_cr(INTPTR_FORMAT " is at entry_point+%d in a vtable stub", p2i(addr), (int)(addr - v->entry_point())); + v->print_on(st); + st->cr(); + return; + } + } + if (is_nmethod()) { + nmethod* nm = (nmethod*)this; + ResourceMark rm; + st->print(INTPTR_FORMAT " is at entry_point+%d in (nmethod*)" INTPTR_FORMAT, + p2i(addr), (int)(addr - nm->entry_point()), p2i(nm)); + if (verbose) { + st->print(" for "); + nm->method()->print_value_on(st); + } + st->cr(); + nm->print_nmethod(verbose); + return; + } + st->print_cr(INTPTR_FORMAT " is at code_begin+%d in ", p2i(addr), (int)(addr - code_begin())); + print_on(st); +} + void RuntimeBlob::verify() { ShouldNotReachHere(); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/code/codeBlob.hpp --- a/src/hotspot/share/code/codeBlob.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/code/codeBlob.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -221,6 +221,7 @@ virtual void print() const { print_on(tty); }; virtual void print_on(outputStream* st) const; virtual void print_value_on(outputStream* st) const; + void dump_for_addr(address addr, outputStream* st, bool verbose) const; void print_code(); // Print the comment associated with offset on stream, if there is one diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/code/nmethod.cpp --- a/src/hotspot/share/code/nmethod.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/code/nmethod.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -2748,9 +2748,7 @@ virtual void verify() const { // make sure code pattern is actually a call imm32 instruction _call->verify(); - if (os::is_MP()) { - _call->verify_alignment(); - } + _call->verify_alignment(); } virtual void verify_resolve_call(address dest) const { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/compiler/compileBroker.cpp --- a/src/hotspot/share/compiler/compileBroker.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/compiler/compileBroker.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1781,30 +1781,31 @@ return; // Stop this thread. } } - continue; - } - - if (UseDynamicNumberOfCompilerThreads) { - possibly_add_compiler_threads(); - } + } else { + // Assign the task to the current thread. Mark this compilation + // thread as active for the profiler. + // CompileTaskWrapper also keeps the Method* from being deallocated if redefinition + // occurs after fetching the compile task off the queue. + CompileTaskWrapper ctw(task); + nmethodLocker result_handle; // (handle for the nmethod produced by this task) + task->set_code_handle(&result_handle); + methodHandle method(thread, task->method()); - // Assign the task to the current thread. Mark this compilation - // thread as active for the profiler. - CompileTaskWrapper ctw(task); - nmethodLocker result_handle; // (handle for the nmethod produced by this task) - task->set_code_handle(&result_handle); - methodHandle method(thread, task->method()); + // Never compile a method if breakpoints are present in it + if (method()->number_of_breakpoints() == 0) { + // Compile the method. + if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) { + invoke_compiler_on_method(task); + thread->start_idle_timer(); + } else { + // After compilation is disabled, remove remaining methods from queue + method->clear_queued_for_compilation(); + task->set_failure_reason("compilation is disabled"); + } + } - // Never compile a method if breakpoints are present in it - if (method()->number_of_breakpoints() == 0) { - // Compile the method. - if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) { - invoke_compiler_on_method(task); - thread->start_idle_timer(); - } else { - // After compilation is disabled, remove remaining methods from queue - method->clear_queued_for_compilation(); - task->set_failure_reason("compilation is disabled"); + if (UseDynamicNumberOfCompilerThreads) { + possibly_add_compiler_threads(); } } } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/gc/cms/jvmFlagConstraintsCMS.cpp --- a/src/hotspot/share/gc/cms/jvmFlagConstraintsCMS.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/gc/cms/jvmFlagConstraintsCMS.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -136,7 +136,6 @@ return JVMFlag::VIOLATES_CONSTRAINT; } } - return JVMFlag::SUCCESS; } @@ -151,12 +150,11 @@ if (value % HeapWordSize != 0) { JVMFlag::printError(verbose, "CMSRescanMultiple (" SIZE_FORMAT ") must be " - "a multiple of " SIZE_FORMAT "\n", + "a multiple of %d\n", value, HeapWordSize); status = JVMFlag::VIOLATES_CONSTRAINT; } } - return status; } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/gc/g1/g1CollectedHeap.cpp --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1049,6 +1049,9 @@ // Rebuild the strong code root lists for each region rebuild_strong_code_roots(); + // Purge code root memory + purge_code_root_memory(); + // Start a new incremental collection set for the next pause start_new_collection_set(); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/gc/shared/c1/barrierSetC1.cpp --- a/src/hotspot/share/gc/shared/c1/barrierSetC1.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/gc/shared/c1/barrierSetC1.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -135,7 +135,7 @@ void BarrierSetC1::store_at_resolved(LIRAccess& access, LIR_Opr value) { DecoratorSet decorators = access.decorators(); - bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses) && os::is_MP(); + bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses); bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0; bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0; LIRGenerator* gen = access.gen(); @@ -144,7 +144,7 @@ value = gen->mask_boolean(access.base().opr(), value, access.access_emit_info()); } - if (is_volatile && os::is_MP()) { + if (is_volatile) { __ membar_release(); } @@ -163,7 +163,7 @@ void BarrierSetC1::load_at_resolved(LIRAccess& access, LIR_Opr result) { LIRGenerator *gen = access.gen(); DecoratorSet decorators = access.decorators(); - bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses) && os::is_MP(); + bool is_volatile = (((decorators & MO_SEQ_CST) != 0) || AlwaysAtomicAccesses); bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0; bool mask_boolean = (decorators & C1_MASK_BOOLEAN) != 0; bool in_native = (decorators & IN_NATIVE) != 0; @@ -181,7 +181,7 @@ __ load(access.resolved_addr()->as_address_ptr(), result, access.access_emit_info(), patch_code); } - if (is_volatile && os::is_MP()) { + if (is_volatile) { __ membar_acquire(); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/gc/shared/genCollectedHeap.cpp --- a/src/hotspot/share/gc/shared/genCollectedHeap.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/gc/shared/genCollectedHeap.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -649,9 +649,6 @@ // a whole heap collection. complete = complete || collected_old; - print_heap_change(young_prev_used, old_prev_used); - MetaspaceUtils::print_metaspace_change(metadata_prev_used); - // Adjust generation sizes. if (collected_old) { _old_gen->compute_new_size(); @@ -667,6 +664,9 @@ update_full_collections_completed(); } + print_heap_change(young_prev_used, old_prev_used); + MetaspaceUtils::print_metaspace_change(metadata_prev_used); + // Track memory usage and detect low memory after GC finishes MemoryService::track_memory_usage(); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/jvmci/jvmciCompilerToVM.cpp --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -435,8 +435,8 @@ if (resolve) { resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0); } else { - if (class_name->byte_at(0) == 'L' && - class_name->byte_at(class_name->utf8_length()-1) == ';') { + if (class_name->char_at(0) == 'L' && + class_name->char_at(class_name->utf8_length()-1) == ';') { // This is a name from a signature. Strip off the trimmings. // Call recursive to keep scope of strippedsym. TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1, diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/jvmci/jvmciEnv.cpp --- a/src/hotspot/share/jvmci/jvmciEnv.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/jvmci/jvmciEnv.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -98,8 +98,8 @@ JVMCI_EXCEPTION_CONTEXT; // Now we need to check the SystemDictionary - if (sym->byte_at(0) == 'L' && - sym->byte_at(sym->utf8_length()-1) == ';') { + if (sym->char_at(0) == 'L' && + sym->char_at(sym->utf8_length()-1) == ';') { // This is a name from a signature. Strip off the trimmings. // Call recursive to keep scope of strippedsym. TempNewSymbol strippedsym = SymbolTable::new_symbol(sym->as_utf8()+1, @@ -132,8 +132,8 @@ // we must build an array type around it. The CI requires array klasses // to be loaded if their element klasses are loaded, except when memory // is exhausted. - if (sym->byte_at(0) == '[' && - (sym->byte_at(1) == '[' || sym->byte_at(1) == 'L')) { + if (sym->char_at(0) == '[' && + (sym->char_at(1) == '[' || sym->char_at(1) == 'L')) { // We have an unloaded array. // Build it on the fly if the element class exists. TempNewSymbol elem_sym = SymbolTable::new_symbol(sym->as_utf8()+1, diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/memory/metaspace.cpp --- a/src/hotspot/share/memory/metaspace.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/memory/metaspace.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -863,6 +863,42 @@ #endif } +// Utils to check if a pointer or range is part of a committed metaspace region. +metaspace::VirtualSpaceNode* MetaspaceUtils::find_enclosing_virtual_space(const void* p) { + VirtualSpaceNode* vsn = Metaspace::space_list()->find_enclosing_space(p); + if (Metaspace::using_class_space() && vsn == NULL) { + vsn = Metaspace::class_space_list()->find_enclosing_space(p); + } + return vsn; +} + +bool MetaspaceUtils::is_in_committed(const void* p) { +#if INCLUDE_CDS + if (UseSharedSpaces) { + for (int idx = MetaspaceShared::ro; idx <= MetaspaceShared::mc; idx++) { + if (FileMapInfo::current_info()->is_in_shared_region(p, idx)) { + return true; + } + } + } +#endif + return find_enclosing_virtual_space(p) != NULL; +} + +bool MetaspaceUtils::is_range_in_committed(const void* from, const void* to) { +#if INCLUDE_CDS + if (UseSharedSpaces) { + for (int idx = MetaspaceShared::ro; idx <= MetaspaceShared::mc; idx++) { + if (FileMapInfo::current_info()->is_in_shared_region(from, idx)) { + return FileMapInfo::current_info()->is_in_shared_region(to, idx); + } + } + } +#endif + VirtualSpaceNode* vsn = find_enclosing_virtual_space(from); + return (vsn != NULL) && vsn->contains(to); +} + // Metaspace methods diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/memory/metaspace.hpp --- a/src/hotspot/share/memory/metaspace.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/memory/metaspace.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -71,6 +71,7 @@ class PrintCLDMetaspaceInfoClosure; class SpaceManager; class VirtualSpaceList; + class VirtualSpaceNode; } // Metaspaces each have a SpaceManager and allocations @@ -297,6 +298,10 @@ // Spacemanager updates running counters. friend class metaspace::SpaceManager; + // Special access for error reporting (checks without locks). + friend class oopDesc; + friend class Klass; + // Running counters for statistics concerning in-use chunks. // Note: capacity = used + free + waste + overhead. Note that we do not // count free and waste. Their sum can be deduces from the three other values. @@ -324,6 +329,12 @@ // Helper for print_xx_report. static void print_vs(outputStream* out, size_t scale); + // Utils to check if a pointer or range is part of a committed metaspace region + // without acquiring any locks. + static metaspace::VirtualSpaceNode* find_enclosing_virtual_space(const void* p); + static bool is_in_committed(const void* p); + static bool is_range_in_committed(const void* from, const void* to); + public: // Collect used metaspace statistics. This involves walking the CLDG. The resulting diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/memory/metaspace/virtualSpaceList.cpp --- a/src/hotspot/share/memory/metaspace/virtualSpaceList.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/memory/metaspace/virtualSpaceList.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -141,17 +141,17 @@ // This function looks at the mmap regions in the metaspace without locking. // The chunks are added with store ordering and not deleted except for at // unloading time during a safepoint. -bool VirtualSpaceList::contains(const void* ptr) { +VirtualSpaceNode* VirtualSpaceList::find_enclosing_space(const void* ptr) { // List should be stable enough to use an iterator here because removing virtual // space nodes is only allowed at a safepoint. VirtualSpaceListIterator iter(virtual_space_list()); while (iter.repeat()) { VirtualSpaceNode* vsn = iter.get_next(); if (vsn->contains(ptr)) { - return true; + return vsn; } } - return false; + return NULL; } void VirtualSpaceList::retire_current_virtual_space() { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/memory/metaspace/virtualSpaceList.hpp --- a/src/hotspot/share/memory/metaspace/virtualSpaceList.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/memory/metaspace/virtualSpaceList.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -116,7 +116,8 @@ void inc_virtual_space_count(); void dec_virtual_space_count(); - bool contains(const void* ptr); + VirtualSpaceNode* find_enclosing_space(const void* ptr); + bool contains(const void* ptr) { return find_enclosing_space(ptr) != NULL; } // Unlink empty VirtualSpaceNodes and free it. void purge(ChunkManager* chunk_manager); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/oops/klass.cpp --- a/src/hotspot/share/oops/klass.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/oops/klass.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "classfile/classLoaderData.inline.hpp" +#include "classfile/classLoaderDataGraph.inline.hpp" #include "classfile/dictionary.hpp" #include "classfile/javaClasses.hpp" #include "classfile/systemDictionary.hpp" @@ -740,6 +741,22 @@ guarantee(obj->klass()->is_klass(), "klass field is not a klass"); } +Klass* Klass::decode_klass_raw(narrowKlass narrow_klass) { + return (Klass*)(void*)( (uintptr_t)Universe::narrow_klass_base() + + ((uintptr_t)narrow_klass << Universe::narrow_klass_shift())); +} + +bool Klass::is_valid(Klass* k) { + if (!is_aligned(k, sizeof(MetaWord))) return false; + if ((size_t)k < os::min_page_size()) return false; + + if (!os::is_readable_range(k, k + 1)) return false; + if (!MetaspaceUtils::is_range_in_committed(k, k + 1)) return false; + + if (!Symbol::is_valid(k->name())) return false; + return ClassLoaderDataGraph::is_valid(k->class_loader_data()); +} + klassVtable Klass::vtable() const { return klassVtable(const_cast(this), start_of_vtable(), vtable_length() / vtableEntry::size()); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/oops/klass.hpp --- a/src/hotspot/share/oops/klass.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/oops/klass.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -715,6 +715,10 @@ virtual void oop_verify_on(oop obj, outputStream* st); + // for error reporting + static Klass* decode_klass_raw(narrowKlass narrow_klass); + static bool is_valid(Klass* k); + static bool is_null(narrowKlass obj); static bool is_null(Klass* obj); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/oops/oop.cpp --- a/src/hotspot/share/oops/oop.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/oops/oop.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -171,6 +171,63 @@ return UseCompressedClassPointers; } +oop oopDesc::decode_oop_raw(narrowOop narrow_oop) { + return (oop)(void*)( (uintptr_t)Universe::narrow_oop_base() + + ((uintptr_t)narrow_oop << Universe::narrow_oop_shift())); +} + +void* oopDesc::load_klass_raw(oop obj) { + if (UseCompressedClassPointers) { + narrowKlass narrow_klass = *(obj->compressed_klass_addr()); + if (narrow_klass == 0) return NULL; + return (void*)Klass::decode_klass_raw(narrow_klass); + } else { + return *(void**)(obj->klass_addr()); + } +} + +void* oopDesc::load_oop_raw(oop obj, int offset) { + uintptr_t addr = (uintptr_t)(void*)obj + (uint)offset; + if (UseCompressedOops) { + narrowOop narrow_oop = *(narrowOop*)addr; + if (narrow_oop == 0) return NULL; + return (void*)decode_oop_raw(narrow_oop); + } else { + return *(void**)addr; + } +} + +bool oopDesc::is_valid(oop obj) { + if (!is_object_aligned(obj)) return false; + if ((size_t)(oopDesc*)obj < os::min_page_size()) return false; + + // We need at least the mark and the klass word in the committed region. + if (!os::is_readable_range(obj, (oopDesc*)obj + 1)) return false; + if (!Universe::heap()->is_in(obj)) return false; + + Klass* k = (Klass*)load_klass_raw(obj); + + if (!os::is_readable_range(k, k + 1)) return false; + return MetaspaceUtils::is_range_in_committed(k, k + 1); +} + +oop oopDesc::oop_or_null(address addr) { + if (is_valid(oop(addr))) { + // We were just given an oop directly. + return oop(addr); + } + + // Try to find addr using block_start. + HeapWord* p = Universe::heap()->block_start(addr); + if (p != NULL && Universe::heap()->block_is_obj(p)) { + if (!is_valid(oop(p))) return NULL; + return oop(p); + } + + // If we can't find it it just may mean that heap wasn't parsable. + return NULL; +} + oop oopDesc::obj_field_acquire(int offset) const { return HeapAccess::oop_load_at(as_oop(), offset); } void oopDesc::obj_field_put_raw(int offset, oop value) { RawAccess<>::oop_store_at(as_oop(), offset, value); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/oops/oop.hpp --- a/src/hotspot/share/oops/oop.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/oops/oop.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -334,6 +334,13 @@ assert(has_klass_gap(), "only applicable to compressed klass pointers"); return klass_offset_in_bytes() + sizeof(narrowKlass); } + + // for error reporting + static oop decode_oop_raw(narrowOop narrow_oop); + static void* load_klass_raw(oop obj); + static void* load_oop_raw(oop obj, int offset); + static bool is_valid(oop obj); + static oop oop_or_null(address addr); }; #endif // SHARE_VM_OOPS_OOP_HPP diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/oops/symbol.cpp --- a/src/hotspot/share/oops/symbol.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/oops/symbol.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -26,6 +26,7 @@ #include "precompiled.hpp" #include "classfile/altHashing.hpp" #include "classfile/classLoaderData.hpp" +#include "gc/shared/collectedHeap.hpp" #include "logging/log.hpp" #include "logging/logStream.hpp" #include "memory/allocation.inline.hpp" @@ -79,7 +80,7 @@ bool Symbol::starts_with(const char* prefix, int len) const { if (len > utf8_length()) return false; while (len-- > 0) { - if (prefix[len] != (char) byte_at(len)) + if (prefix[len] != char_at(len)) return false; } assert(len == -1, "we should be at the beginning"); @@ -117,7 +118,7 @@ if (size > 0) { int len = MIN2(size - 1, utf8_length()); for (int i = 0; i < len; i++) { - buf[i] = byte_at(i); + buf[i] = char_at(i); } buf[len] = '\0'; } @@ -311,11 +312,27 @@ } else { st->print("'"); for (int i = 0; i < utf8_length(); i++) { - st->print("%c", byte_at(i)); + st->print("%c", char_at(i)); } st->print("'"); } } +bool Symbol::is_valid(Symbol* s) { + if (!is_aligned(s, sizeof(MetaWord))) return false; + if ((size_t)s < os::min_page_size()) return false; + + if (!os::is_readable_range(s, s + 1)) return false; + + // Symbols are not allocated in Java heap. + if (Universe::heap()->is_in_reserved(s)) return false; + + int len = s->utf8_length(); + if (len < 0) return false; + + jbyte* bytes = (jbyte*) s->bytes(); + return os::is_readable_range(bytes, bytes + len); +} + // SymbolTable prints this in its statistics NOT_PRODUCT(size_t Symbol::_total_count = 0;) diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/oops/symbol.hpp --- a/src/hotspot/share/oops/symbol.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/oops/symbol.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -112,7 +112,7 @@ // in high half word. length is the number of UTF8 characters in the symbol volatile uint32_t _length_and_refcount; short _identity_hash; - jbyte _body[2]; + u1 _body[2]; enum { // max_symbol_length must fit into the top 16 bits of _length_and_refcount @@ -128,7 +128,7 @@ return (int)heap_word_size(byte_size(length)); } - void byte_at_put(int index, int value) { + void byte_at_put(int index, u1 value) { assert(index >=0 && index < length(), "symbol index overflow"); _body[index] = value; } @@ -148,7 +148,7 @@ public: // Low-level access (used with care, since not GC-safe) - const jbyte* base() const { return &_body[0]; } + const u1* base() const { return &_body[0]; } int size() { return size(utf8_length()); } int byte_size() { return byte_size(utf8_length()); } @@ -176,12 +176,16 @@ return (refcount() == PERM_REFCOUNT); } - int byte_at(int index) const { + // Function char_at() returns the Symbol's selected u1 byte as a char type. + // + // Note that all multi-byte chars have the sign bit set on all their bytes. + // No single byte chars have their sign bit set. + char char_at(int index) const { assert(index >=0 && index < length(), "symbol index overflow"); - return base()[index]; + return (char)base()[index]; } - const jbyte* bytes() const { return base(); } + const u1* bytes() const { return base(); } int utf8_length() const { return length(); } @@ -190,7 +194,7 @@ int l = utf8_length(); if (l != len) return false; while (l-- > 0) { - if (str[l] != (char) byte_at(l)) + if (str[l] != char_at(l)) return false; } assert(l == -1, "we should be at the beginning"); @@ -251,6 +255,8 @@ void print() { print_on(tty); } void print_value() { print_value_on(tty); } + static bool is_valid(Symbol* s); + #ifndef PRODUCT // Empty constructor to create a dummy symbol object on stack // only for getting its vtable pointer. diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/prims/jni.cpp --- a/src/hotspot/share/prims/jni.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/prims/jni.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -3779,13 +3779,7 @@ void quicken_jni_functions() { // Replace GetField with fast versions if (UseFastJNIAccessors && !JvmtiExport::can_post_field_access() - && !VerifyJNIFields && !CountJNICalls && !CheckJNICalls -#if defined(_WINDOWS) && defined(IA32) && defined(COMPILER2) - // windows x86 currently needs SEH wrapper and the gain of the fast - // versions currently isn't certain for server vm on uniprocessor. - && os::is_MP() -#endif - ) { + && !VerifyJNIFields && !CountJNICalls && !CheckJNICalls) { address func; func = JNI_FastGetField::generate_fast_get_boolean_field(); if (func != (address)-1) { @@ -3918,9 +3912,7 @@ // We use Atomic::xchg rather than Atomic::add/dec since on some platforms // the add/dec implementations are dependent on whether we are running - // on a multiprocessor, and at this stage of initialization the os::is_MP - // function used to determine this will always return false. Atomic::xchg - // does not have this problem. + // on a multiprocessor Atomic::xchg does not have this problem. if (Atomic::xchg(1, &vm_created) == 1) { return JNI_EEXIST; // already created, or create attempt in progress } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/prims/jvmtiTagMap.cpp --- a/src/hotspot/share/prims/jvmtiTagMap.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/prims/jvmtiTagMap.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -853,7 +853,7 @@ if (!fld.access_flags().is_static()) { continue; } - field_map->add(max_field_index - index, fld.signature()->byte_at(0), fld.offset()); + field_map->add(max_field_index - index, fld.signature()->char_at(0), fld.offset()); } return field_map; } @@ -879,7 +879,7 @@ if (fld.access_flags().is_static()) { continue; } - field_map->add(max_field_index - index, fld.signature()->byte_at(0), fld.offset()); + field_map->add(max_field_index - index, fld.signature()->char_at(0), fld.offset()); } return field_map; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/prims/methodHandles.cpp --- a/src/hotspot/share/prims/methodHandles.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/prims/methodHandles.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -537,7 +537,7 @@ assert(vmSymbols::object_signature()->equals(OBJ_SIG), ""); const int len = sig->utf8_length(); for (int i = 0; i < len; i++) { - switch (sig->byte_at(i)) { + switch (sig->char_at(i)) { case 'L': // only java/lang/Object is valid here if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i) @@ -563,8 +563,8 @@ } else if (is_basic_type_signature(sig)) { sig->increment_refcount(); return sig; // that was easy - } else if (sig->byte_at(0) != '(') { - BasicType bt = char2type(sig->byte_at(0)); + } else if (sig->char_at(0) != '(') { + BasicType bt = char2type(sig->char_at(0)); if (is_subword_type(bt)) { bsig = vmSymbols::int_signature(); } else { @@ -615,7 +615,7 @@ int array = 0; bool prev_type = false; for (int i = 0; i < len; i++) { - char ch = sig->byte_at(i); + char ch = sig->char_at(i); switch (ch) { case '(': case ')': prev_type = false; @@ -630,7 +630,7 @@ { if (prev_type) st->put(','); int start = i+1, slash = start; - while (++i < len && (ch = sig->byte_at(i)) != ';') { + while (++i < len && (ch = sig->char_at(i)) != ';') { if (ch == '/' || ch == '.' || ch == '$') slash = i+1; } if (slash < i) start = slash; @@ -638,7 +638,7 @@ st->put('L'); } else { for (int j = start; j < i; j++) - st->put(sig->byte_at(j)); + st->put(sig->char_at(j)); prev_type = true; } break; @@ -975,7 +975,7 @@ } if (sig != NULL) { if (sig->utf8_length() == 0) return 0; // a match is not possible - if (sig->byte_at(0) == '(') + if (sig->char_at(0) == '(') match_flags &= ~(IS_FIELD | IS_TYPE); else match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD); @@ -1456,7 +1456,7 @@ { Symbol* type = caller->constants()->signature_ref_at(bss_index_in_pool); Handle th; - if (type->byte_at(0) == '(') { + if (type->char_at(0) == '(') { th = SystemDictionary::find_method_handle_type(type, caller, CHECK); } else { th = SystemDictionary::find_java_mirror_for_type(type, caller, SignatureStream::NCDFError, CHECK); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/prims/nativeLookup.cpp --- a/src/hotspot/share/prims/nativeLookup.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/prims/nativeLookup.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -103,7 +103,7 @@ st.print("__"); // find ')' int end; - for (end = 0; end < signature->utf8_length() && signature->byte_at(end) != ')'; end++); + for (end = 0; end < signature->utf8_length() && signature->char_at(end) != ')'; end++); // skip first '(' mangle_name_on(&st, signature, 1, end); return st.as_string(); @@ -288,7 +288,7 @@ Symbol* signature = method->signature(); for (int end = 0; end < signature->utf8_length(); end++) { - if (signature->byte_at(end) == 'L') { + if (signature->char_at(end) == 'L') { // Don't allow object types return NULL; } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/arguments.cpp --- a/src/hotspot/share/runtime/arguments.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/arguments.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -526,8 +526,6 @@ // --- Non-alias flags - sorted by obsolete_in then expired_in: { "MaxGCMinorPauseMillis", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() }, { "UseConcMarkSweepGC", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, - { "AssumeMP", JDK_Version::jdk(10),JDK_Version::undefined(), JDK_Version::undefined() }, - { "MonitorInUseLists", JDK_Version::jdk(10),JDK_Version::undefined(), JDK_Version::undefined() }, { "MaxRAMFraction", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() }, { "MinRAMFraction", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() }, { "InitialRAMFraction", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() }, @@ -540,34 +538,16 @@ // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "DefaultMaxRAMFraction", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() }, { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, - { "MustCallLoadClassInternal", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "UnsyncloadClass", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) }, { "TLABStats", JDK_Version::jdk(12), JDK_Version::undefined(), JDK_Version::undefined() }, // -------------- Obsolete Flags - sorted by expired_in -------------- - { "CheckAssertionStatusDirectives",JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "PrintMallocFree", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "PrintMalloc", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "ShowSafepointMsgs", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "FastTLABRefill", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "SafepointSpinBeforeYield", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "CheckEndorsedAndExtDirs", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "DeferThrSuspendLoopCount", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "DeferPollingPageLoopCount", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "TraceScavenge", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, { "PermSize", JDK_Version::undefined(), JDK_Version::jdk(8), JDK_Version::undefined() }, { "MaxPermSize", JDK_Version::undefined(), JDK_Version::jdk(8), JDK_Version::undefined() }, { "SharedReadWriteSize", JDK_Version::undefined(), JDK_Version::jdk(10), JDK_Version::undefined() }, { "SharedReadOnlySize", JDK_Version::undefined(), JDK_Version::jdk(10), JDK_Version::undefined() }, { "SharedMiscDataSize", JDK_Version::undefined(), JDK_Version::jdk(10), JDK_Version::undefined() }, { "SharedMiscCodeSize", JDK_Version::undefined(), JDK_Version::jdk(10), JDK_Version::undefined() }, - { "UseUTCFileTimestamp", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "InlineNotify", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "EnableTracing", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "UseLockedTracing", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "NativeMonitorTimeout", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "NativeMonitorSpinLimit", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, - { "NativeMonitorFlags", JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) }, + { "AssumeMP", JDK_Version::jdk(10), JDK_Version::jdk(12), JDK_Version::jdk(13) }, { "UnlinkSymbolsALot", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) }, { "AllowNonVirtualCalls", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) }, { "PrintSafepointStatistics", JDK_Version::jdk(11), JDK_Version::jdk(12), JDK_Version::jdk(13) }, @@ -579,6 +559,7 @@ { "SyncVerbose", JDK_Version::undefined(), JDK_Version::jdk(12), JDK_Version::jdk(13) }, { "SyncFlags", JDK_Version::undefined(), JDK_Version::jdk(12), JDK_Version::jdk(13) }, { "SyncKnobs", JDK_Version::undefined(), JDK_Version::jdk(12), JDK_Version::jdk(13) }, + { "MonitorInUseLists", JDK_Version::jdk(10), JDK_Version::jdk(12), JDK_Version::jdk(13) }, #ifdef TEST_VERIFY_SPECIAL_JVM_FLAGS { "dep > obs", JDK_Version::jdk(9), JDK_Version::jdk(8), JDK_Version::undefined() }, diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/deoptimization.cpp --- a/src/hotspot/share/runtime/deoptimization.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/deoptimization.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1451,7 +1451,7 @@ Symbol* symbol = constant_pool->symbol_at(index); // class name? - if (symbol->byte_at(0) != '(') { + if (symbol->char_at(0) != '(') { Handle protection_domain (THREAD, constant_pool->pool_holder()->protection_domain()); SystemDictionary::resolve_or_null(symbol, class_loader, protection_domain, CHECK); return; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/fieldType.cpp --- a/src/hotspot/share/runtime/fieldType.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/fieldType.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -32,21 +32,21 @@ #include "runtime/signature.hpp" BasicType FieldType::basic_type(Symbol* signature) { - return char2type(signature->byte_at(0)); + return char2type(signature->char_at(0)); } // Check if it is a valid array signature bool FieldType::is_valid_array_signature(Symbol* sig) { assert(sig->utf8_length() > 1, "this should already have been checked"); - assert(sig->byte_at(0) == '[', "this should already have been checked"); + assert(sig->char_at(0) == '[', "this should already have been checked"); // The first character is already checked int i = 1; int len = sig->utf8_length(); // First skip all '['s - while(i < len - 1 && sig->byte_at(i) == '[') i++; + while(i < len - 1 && sig->char_at(i) == '[') i++; // Check type - switch(sig->byte_at(i)) { + switch(sig->char_at(i)) { case 'B': // T_BYTE case 'C': // T_CHAR case 'D': // T_DOUBLE @@ -59,7 +59,7 @@ return (i + 1 == len); case 'L': // If it is an object, the last character must be a ';' - return sig->byte_at(len - 1) == ';'; + return sig->char_at(len - 1) == ';'; } return false; @@ -70,7 +70,7 @@ assert(basic_type(signature) == T_ARRAY, "must be array"); int index = 1; int dim = 1; - while (signature->byte_at(index) == '[') { + while (signature->char_at(index) == '[') { index++; dim++; } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/fieldType.hpp --- a/src/hotspot/share/runtime/fieldType.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/fieldType.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -58,14 +58,14 @@ static BasicType basic_type(Symbol* signature); // Testing - static bool is_array(Symbol* signature) { return signature->utf8_length() > 1 && signature->byte_at(0) == '[' && is_valid_array_signature(signature); } + static bool is_array(Symbol* signature) { return signature->utf8_length() > 1 && signature->char_at(0) == '[' && is_valid_array_signature(signature); } static bool is_obj(Symbol* signature) { int sig_length = signature->utf8_length(); // Must start with 'L' and end with ';' return (sig_length >= 2 && - (signature->byte_at(0) == 'L') && - (signature->byte_at(sig_length - 1) == ';')); + (signature->char_at(0) == 'L') && + (signature->char_at(sig_length - 1) == ';')); } // Parse field and extract array information. Works for T_ARRAY only. diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/flags/jvmFlag.hpp --- a/src/hotspot/share/runtime/flags/jvmFlag.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/flags/jvmFlag.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -272,7 +272,7 @@ // printRanges will print out flags type, name and range values as expected by -XX:+PrintFlagsRanges static void printFlags(outputStream* out, bool withComments, bool printRanges = false, bool skipDefaults = false); - static void printError(bool verbose, const char* msg, ...); + static void printError(bool verbose, const char* msg, ...) ATTRIBUTE_PRINTF(2, 3); static void verify() PRODUCT_RETURN; }; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp --- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -94,7 +94,7 @@ if (value < 0 || value > 512) { JVMFlag::printError(verbose, "AllocatePrefetchDistance (" INTX_FORMAT ") must be " - "between 0 and " INTX_FORMAT "\n", + "between 0 and %d\n", AllocatePrefetchDistance, 512); return JVMFlag::VIOLATES_CONSTRAINT; } @@ -162,7 +162,7 @@ JVMFlag::printError(verbose, "CompileThreshold * (InterpreterProfilePercentage - OnStackReplacePercentage) / 100 = " INTX_FORMAT " " - "must be between 0 and " INTX_FORMAT ", try changing " + "must be between 0 and %d, try changing " "CompileThreshold, InterpreterProfilePercentage, and/or OnStackReplacePercentage\n", (CompileThreshold * (OnStackReplacePercentage - InterpreterProfilePercentage)) / 100, INT_MAX >> InvocationCounter::count_shift); @@ -182,7 +182,7 @@ if (backward_branch_limit < 0) { JVMFlag::printError(verbose, "CompileThreshold * OnStackReplacePercentage / 100 = " INTX_FORMAT " " - "must be between 0 and " INTX_FORMAT ", try changing " + "must be between 0 and %d, try changing " "CompileThreshold and/or OnStackReplacePercentage\n", (CompileThreshold * OnStackReplacePercentage) / 100, INT_MAX >> InvocationCounter::count_shift); @@ -395,8 +395,8 @@ #if INCLUDE_RTM_OPT if (UseRTMLocking && !is_power_of_2(RTMTotalCountIncrRate)) { JVMFlag::printError(verbose, - "RTMTotalCountIncrRate (" INTX_FORMAT - ") must be a power of 2, resetting it to 64\n", + "RTMTotalCountIncrRate (%d) must be " + "a power of 2, resetting it to 64\n", RTMTotalCountIncrRate); FLAG_SET_DEFAULT(RTMTotalCountIncrRate, 64); } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp --- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -42,8 +42,8 @@ if (value >= (intx)os::vm_page_size()) { JVMFlag::printError(verbose, "ObjectAlignmentInBytes (" INTX_FORMAT ") must be " - "less than page size (" INTX_FORMAT ")\n", - value, (intx)os::vm_page_size()); + "less than page size (%d)\n", + value, os::vm_page_size()); return JVMFlag::VIOLATES_CONSTRAINT; } return JVMFlag::SUCCESS; @@ -79,7 +79,7 @@ if ((value % PeriodicTask::interval_gran) != 0) { JVMFlag::printError(verbose, "BiasedLockingStartupDelay (" INTX_FORMAT ") must be " - "evenly divisible by PeriodicTask::interval_gran (" INTX_FORMAT ")\n", + "evenly divisible by PeriodicTask::interval_gran (%d)\n", value, PeriodicTask::interval_gran); return JVMFlag::VIOLATES_CONSTRAINT; } else { @@ -123,7 +123,7 @@ if ((value % PeriodicTask::interval_gran != 0)) { JVMFlag::printError(verbose, "PerfDataSamplingInterval (" INTX_FORMAT ") must be " - "evenly divisible by PeriodicTask::interval_gran (" INTX_FORMAT ")\n", + "evenly divisible by PeriodicTask::interval_gran (%d)\n", value, PeriodicTask::interval_gran); return JVMFlag::VIOLATES_CONSTRAINT; } else { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/globals.hpp --- a/src/hotspot/share/runtime/globals.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/globals.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -247,9 +247,6 @@ range(8, 256) \ constraint(ObjectAlignmentInBytesConstraintFunc,AtParse) \ \ - product(bool, AssumeMP, true, \ - "(Deprecated) Instruct the VM to assume multiple processors are available")\ - \ /* UseMembar is theoretically a temp flag used for memory barrier */ \ /* removal testing. It was supposed to be removed before FCS but has */ \ /* been re-added (see 6401008) */ \ @@ -830,8 +827,6 @@ product(intx, MonitorBound, 0, "Bound Monitor population") \ range(0, max_jint) \ \ - product(bool, MonitorInUseLists, true, "Track Monitors for Deflation") \ - \ experimental(intx, MonitorUsedDeflationThreshold, 90, \ "Percentage of used monitors before triggering cleanup " \ "safepoint which deflates monitors (0 is off). " \ diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/handshake.cpp --- a/src/hotspot/share/runtime/handshake.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/handshake.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, 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 @@ -347,6 +347,27 @@ target->is_ext_suspended(); } +static bool possibly_vmthread_can_process_handshake(JavaThread* target) { + // An externally suspended thread cannot be resumed while the + // Threads_lock is held so it is safe. + // Note that this method is allowed to produce false positives. + assert(Threads_lock->owned_by_self(), "Not holding Threads_lock."); + if (target->is_ext_suspended()) { + return true; + } + switch (target->thread_state()) { + case _thread_in_native: + // native threads are safe if they have no java stack or have walkable stack + return !target->has_last_Java_frame() || target->frame_anchor()->walkable(); + + case _thread_blocked: + return true; + + default: + return false; + } +} + bool HandshakeState::claim_handshake_for_vmthread() { if (!_semaphore.trywait()) { return false; @@ -366,7 +387,7 @@ return; } - if (!vmthread_can_process_handshake(target)) { + if (!possibly_vmthread_can_process_handshake(target)) { // JT is observed in an unsafe state, it must notice the handshake itself return; } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/interfaceSupport.inline.hpp --- a/src/hotspot/share/runtime/interfaceSupport.inline.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/interfaceSupport.inline.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -79,17 +79,15 @@ private: static void serialize_thread_state_internal(JavaThread* thread, bool needs_exception_handler) { // Make sure new state is seen by VM thread - if (os::is_MP()) { - if (UseMembar) { - // Force a fence between the write above and read below - OrderAccess::fence(); + if (UseMembar) { + // Force a fence between the write above and read below + OrderAccess::fence(); + } else { + // store to serialize page so VM thread can do pseudo remote membar + if (needs_exception_handler) { + os::write_memory_serialize_page_with_handler(thread); } else { - // store to serialize page so VM thread can do pseudo remote membar - if (needs_exception_handler) { - os::write_memory_serialize_page_with_handler(thread); - } else { - os::write_memory_serialize_page(thread); - } + os::write_memory_serialize_page(thread); } } } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/os.cpp --- a/src/hotspot/share/runtime/os.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/os.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -1010,6 +1010,15 @@ return (SafeFetch32(aligned, cafebabe) != cafebabe) || (SafeFetch32(aligned, deadbeef) != deadbeef); } +bool os::is_readable_range(const void* from, const void* to) { + for (address p = align_down((address)from, min_page_size()); p < to; p += min_page_size()) { + if (!is_readable_pointer(p)) { + return false; + } + } + return true; +} + // moved from debug.cpp (used to be find()) but still called from there // The verbose parameter is only set by the debug code in one case @@ -1020,99 +1029,48 @@ st->print_cr("0x0 is NULL"); return; } + + // Check if addr points into a code blob. CodeBlob* b = CodeCache::find_blob_unsafe(addr); if (b != NULL) { - if (b->is_buffer_blob()) { - // the interpreter is generated into a buffer blob - InterpreterCodelet* i = Interpreter::codelet_containing(addr); - if (i != NULL) { - st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an Interpreter codelet", p2i(addr), (int)(addr - i->code_begin())); - i->print_on(st); - return; - } - if (Interpreter::contains(addr)) { - st->print_cr(INTPTR_FORMAT " is pointing into interpreter code" - " (not bytecode specific)", p2i(addr)); - return; - } - // - if (AdapterHandlerLibrary::contains(b)) { - st->print_cr(INTPTR_FORMAT " is at code_begin+%d in an AdapterHandler", p2i(addr), (int)(addr - b->code_begin())); - AdapterHandlerLibrary::print_handler_on(st, b); - } - // the stubroutines are generated into a buffer blob - StubCodeDesc* d = StubCodeDesc::desc_for(addr); - if (d != NULL) { - st->print_cr(INTPTR_FORMAT " is at begin+%d in a stub", p2i(addr), (int)(addr - d->begin())); - d->print_on(st); - st->cr(); - return; - } - if (StubRoutines::contains(addr)) { - st->print_cr(INTPTR_FORMAT " is pointing to an (unnamed) stub routine", p2i(addr)); - return; - } - // the InlineCacheBuffer is using stubs generated into a buffer blob - if (InlineCacheBuffer::contains(addr)) { - st->print_cr(INTPTR_FORMAT " is pointing into InlineCacheBuffer", p2i(addr)); - return; - } - VtableStub* v = VtableStubs::stub_containing(addr); - if (v != NULL) { - st->print_cr(INTPTR_FORMAT " is at entry_point+%d in a vtable stub", p2i(addr), (int)(addr - v->entry_point())); - v->print_on(st); - st->cr(); - return; - } - } - nmethod* nm = b->as_nmethod_or_null(); - if (nm != NULL) { - ResourceMark rm; - st->print(INTPTR_FORMAT " is at entry_point+%d in (nmethod*)" INTPTR_FORMAT, - p2i(addr), (int)(addr - nm->entry_point()), p2i(nm)); - if (verbose) { - st->print(" for "); - nm->method()->print_value_on(st); - } - st->cr(); - nm->print_nmethod(verbose); - return; - } - st->print_cr(INTPTR_FORMAT " is at code_begin+%d in ", p2i(addr), (int)(addr - b->code_begin())); - b->print_on(st); + b->dump_for_addr(addr, st, verbose); return; } + // Check if addr points into Java heap. if (Universe::heap()->is_in(addr)) { - HeapWord* p = Universe::heap()->block_start(addr); - bool print = false; - // If we couldn't find it it just may mean that heap wasn't parsable - // See if we were just given an oop directly - if (p != NULL && Universe::heap()->block_is_obj(p)) { - print = true; - } else if (p == NULL && oopDesc::is_oop(oop(addr))) { - p = (HeapWord*) addr; - print = true; - } - if (print) { - if (p == (HeapWord*) addr) { - st->print_cr(INTPTR_FORMAT " is an oop", p2i(addr)); + oop o = oopDesc::oop_or_null(addr); + if (o != NULL) { + if ((HeapWord*)o == (HeapWord*)addr) { + st->print(INTPTR_FORMAT " is an oop: ", p2i(addr)); } else { - st->print_cr(INTPTR_FORMAT " is pointing into object: " INTPTR_FORMAT, p2i(addr), p2i(p)); + st->print(INTPTR_FORMAT " is pointing into object: " , p2i(addr)); } - oop(p)->print_on(st); + o->print_on(st); return; } - } else { - if (Universe::heap()->is_in_reserved(addr)) { - st->print_cr(INTPTR_FORMAT " is an unallocated location " - "in the heap", p2i(addr)); + } else if (Universe::heap()->is_in_reserved(addr)) { + st->print_cr(INTPTR_FORMAT " is an unallocated location in the heap", p2i(addr)); + return; + } + + // Compressed oop needs to be decoded first. +#ifdef _LP64 + if (UseCompressedOops && ((uintptr_t)addr &~ (uintptr_t)max_juint) == 0) { + narrowOop narrow_oop = (narrowOop)(uintptr_t)addr; + oop o = oopDesc::decode_oop_raw(narrow_oop); + + if (oopDesc::is_valid(o)) { + st->print(UINT32_FORMAT " is a compressed pointer to object: ", narrow_oop); + o->print_on(st); return; } } +#endif bool accessible = is_readable_pointer(addr); + // Check if addr is a JNI handle. if (align_down((intptr_t)addr, sizeof(intptr_t)) != 0 && accessible) { if (JNIHandles::is_global_handle((jobject) addr)) { st->print_cr(INTPTR_FORMAT " is a global jni handle", p2i(addr)); @@ -1131,6 +1089,7 @@ #endif } + // Check if addr belongs to a Java thread. for (JavaThreadIteratorWithHandle jtiwh; JavaThread *thread = jtiwh.next(); ) { // Check for privilege stack if (thread->privileged_stack_top() != NULL && @@ -1159,9 +1118,12 @@ } } - // Check if in metaspace and print types that have vptrs (only method now) + // Check if in metaspace and print types that have vptrs if (Metaspace::contains(addr)) { - if (Method::has_method_vptr((const void*)addr)) { + if (Klass::is_valid((Klass*)addr)) { + st->print_cr(INTPTR_FORMAT " is a pointer to class: ", p2i(addr)); + ((Klass*)addr)->print_on(st); + } else if (Method::is_valid_method((const Method*)addr)) { ((Method*)addr)->print_value_on(st); st->cr(); } else { @@ -1171,6 +1133,20 @@ return; } + // Compressed klass needs to be decoded first. +#ifdef _LP64 + if (UseCompressedClassPointers && ((uintptr_t)addr &~ (uintptr_t)max_juint) == 0) { + narrowKlass narrow_klass = (narrowKlass)(uintptr_t)addr; + Klass* k = Klass::decode_klass_raw(narrow_klass); + + if (Klass::is_valid(k)) { + st->print_cr(UINT32_FORMAT " is a compressed pointer to class: " INTPTR_FORMAT, narrow_klass, p2i((HeapWord*)k)); + k->print_on(st); + return; + } + } +#endif + // Try an OS specific find if (os::find(addr, st)) { return; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/os.hpp --- a/src/hotspot/share/runtime/os.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/os.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -226,8 +226,9 @@ // the bootstrap routine for the stub generator needs to check // the processor count directly and leave the bootstrap routine // in place until called after initialization has ocurred. - return AssumeMP || (_processor_count != 1); + return (_processor_count != 1); } + static julong available_memory(); static julong physical_memory(); static bool has_allocatable_memory_limit(julong* limit); @@ -302,6 +303,9 @@ return _page_sizes[0]; } + // Return a lower bound for page sizes. Also works before os::init completed. + static size_t min_page_size() { return 4 * K; } + // Methods for tracing page sizes returned by the above method. // The region_{min,max}_size parameters should be the values // passed to page_size_for_region() and page_size should be the result of that @@ -414,6 +418,7 @@ // Check if pointer points to readable memory (by 4-byte read access) static bool is_readable_pointer(const void* p); + static bool is_readable_range(const void* from, const void* to); // Routines used to serialize the thread state without using membars static void serialize_thread_states(); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/signature.cpp --- a/src/hotspot/share/runtime/signature.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/signature.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -50,7 +50,7 @@ } void SignatureIterator::expect(char c) { - if (_signature->byte_at(_index) != c) fatal("expecting %c", c); + if (_signature->char_at(_index) != c) fatal("expecting %c", c); _index++; } @@ -61,7 +61,7 @@ // work (stack underflow for some tests) - this seems to be a VC++ 6.0 // compiler bug (was problem - gri 4/27/2000). int size = -1; - switch(_signature->byte_at(_index)) { + switch(_signature->char_at(_index)) { case 'B': do_byte (); if (_parameter_index < 0 ) _return_type = T_BYTE; _index++; size = T_BYTE_size ; break; case 'C': do_char (); if (_parameter_index < 0 ) _return_type = T_CHAR; @@ -83,7 +83,7 @@ case 'L': { int begin = ++_index; Symbol* sig = _signature; - while (sig->byte_at(_index++) != ';') ; + while (sig->char_at(_index++) != ';') ; do_object(begin, _index); } if (_parameter_index < 0 ) _return_type = T_OBJECT; @@ -92,11 +92,11 @@ case '[': { int begin = ++_index; Symbol* sig = _signature; - while (sig->byte_at(_index) == '[') { + while (sig->char_at(_index) == '[') { _index++; } - if (sig->byte_at(_index) == 'L') { - while (sig->byte_at(_index++) != ';') ; + if (sig->char_at(_index) == 'L') { + while (sig->char_at(_index++) != ';') ; } else { _index++; } @@ -137,7 +137,7 @@ _index = 0; _parameter_index = 0; expect('('); - while (_signature->byte_at(_index) != ')') _parameter_index += parse_type(); + while (_signature->char_at(_index) != ')') _parameter_index += parse_type(); expect(')'); _parameter_index = 0; } @@ -217,8 +217,8 @@ // Need to skip over each type in the signature's argument list until a // closing ')' is found., then get the return type. We cannot just scan // for the first ')' because ')' is a legal character in a type name. - while (sig->byte_at(_index) != ')') { - switch(sig->byte_at(_index)) { + while (sig->char_at(_index) != ')') { + switch(sig->char_at(_index)) { case 'B': case 'C': case 'D': @@ -234,17 +234,17 @@ break; case 'L': { - while (sig->byte_at(_index++) != ';') ; + while (sig->char_at(_index++) != ';') ; } break; case '[': { int begin = ++_index; - while (sig->byte_at(_index) == '[') { + while (sig->char_at(_index) == '[') { _index++; } - if (sig->byte_at(_index) == 'L') { - while (sig->byte_at(_index++) != ';') ; + if (sig->char_at(_index) == 'L') { + while (sig->char_at(_index++) != ';') ; } else { _index++; } @@ -269,7 +269,7 @@ _parameter_index = 0; _index = 0; expect('('); - while (_signature->byte_at(_index) != ')') _parameter_index += parse_type(); + while (_signature->char_at(_index) != ')') _parameter_index += parse_type(); expect(')'); // Parse return type _parameter_index = -1; @@ -304,20 +304,20 @@ case 'L': { _type = T_OBJECT; Symbol* sig = _signature; - while (sig->byte_at(_end++) != ';'); + while (sig->char_at(_end++) != ';'); break; } case '[': { _type = T_ARRAY; Symbol* sig = _signature; - char c = sig->byte_at(_end); - while ('0' <= c && c <= '9') c = sig->byte_at(_end++); - while (sig->byte_at(_end) == '[') { + char c = sig->char_at(_end); + while ('0' <= c && c <= '9') c = sig->char_at(_end++); + while (sig->char_at(_end) == '[') { _end++; - c = sig->byte_at(_end); - while ('0' <= c && c <= '9') c = sig->byte_at(_end++); + c = sig->char_at(_end); + while ('0' <= c && c <= '9') c = sig->char_at(_end++); } - switch(sig->byte_at(_end)) { + switch(sig->char_at(_end)) { case 'B': case 'C': case 'D': @@ -327,7 +327,7 @@ case 'S': case 'Z':_end++; break; default: { - while (sig->byte_at(_end++) != ';'); + while (sig->char_at(_end++) != ';'); break; } } @@ -353,8 +353,8 @@ int begin = _begin; int end = _end; - if ( _signature->byte_at(_begin) == 'L' - && _signature->byte_at(_end-1) == ';') { + if ( _signature->char_at(_begin) == 'L' + && _signature->char_at(_end-1) == ';') { begin++; end--; } @@ -394,15 +394,15 @@ int begin = _begin; int end = _end; - if ( _signature->byte_at(_begin) == 'L' - && _signature->byte_at(_end-1) == ';') { + if ( _signature->char_at(_begin) == 'L' + && _signature->char_at(_end-1) == ';') { begin++; end--; } char* buffer = NEW_RESOURCE_ARRAY(char, end - begin); for (int index = begin; index < end; index++) { - buffer[index - begin] = _signature->byte_at(index); + buffer[index - begin] = _signature->char_at(index); } Symbol* result = SymbolTable::probe(buffer, end - begin); return result; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/signature.hpp --- a/src/hotspot/share/runtime/signature.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/signature.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -378,7 +378,7 @@ } _begin = _end; - int t = sig->byte_at(_begin); + int t = sig->char_at(_begin); switch (t) { case 'B': _type = T_BYTE; break; case 'C': _type = T_CHAR; break; @@ -405,8 +405,8 @@ enum FailureMode { ReturnNull, CNFException, NCDFError }; Klass* as_klass(Handle class_loader, Handle protection_domain, FailureMode failure_mode, TRAPS); oop as_java_mirror(Handle class_loader, Handle protection_domain, FailureMode failure_mode, TRAPS); - const jbyte* raw_bytes() { return _signature->bytes() + _begin; } - int raw_length() { return _end - _begin; } + const u1* raw_bytes() { return _signature->bytes() + _begin; } + int raw_length() { return _end - _begin; } // return same as_symbol except allocation of new symbols is avoided. Symbol* as_symbol_or_null(); diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/synchronizer.cpp --- a/src/hotspot/share/runtime/synchronizer.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/synchronizer.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -961,28 +961,9 @@ } void ObjectSynchronizer::oops_do(OopClosure* f) { - if (MonitorInUseLists) { - // When using thread local monitor lists, we only scan the - // global used list here (for moribund threads), and - // the thread-local monitors in Thread::oops_do(). - global_used_oops_do(f); - } else { - global_oops_do(f); - } -} - -void ObjectSynchronizer::global_oops_do(OopClosure* f) { - assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); - PaddedEnd * block = OrderAccess::load_acquire(&gBlockList); - for (; block != NULL; block = next(block)) { - assert(block->object() == CHAINMARKER, "must be a block header"); - for (int i = 1; i < _BLOCKSIZE; i++) { - ObjectMonitor* mid = (ObjectMonitor *)&block[i]; - if (mid->object() != NULL) { - f->do_oop((oop*)mid->object_addr()); - } - } - } + // We only scan the global used list here (for moribund threads), and + // the thread-local monitors in Thread::oops_do(). + global_used_oops_do(f); } void ObjectSynchronizer::global_used_oops_do(OopClosure* f) { @@ -1078,15 +1059,10 @@ if (m != NULL) { Self->omFreeList = m->FreeNext; Self->omFreeCount--; - // CONSIDER: set m->FreeNext = BAD -- diagnostic hygiene guarantee(m->object() == NULL, "invariant"); - if (MonitorInUseLists) { - m->FreeNext = Self->omInUseList; - Self->omInUseList = m; - Self->omInUseCount++; - } else { - m->FreeNext = NULL; - } + m->FreeNext = Self->omInUseList; + Self->omInUseList = m; + Self->omInUseCount++; return m; } @@ -1208,7 +1184,7 @@ guarantee(m->object() == NULL, "invariant"); guarantee(((m->is_busy()|m->_recursions) == 0), "freeing in-use monitor"); // Remove from omInUseList - if (MonitorInUseLists && fromPerThreadAlloc) { + if (fromPerThreadAlloc) { ObjectMonitor* cur_mid_in_use = NULL; bool extracted = false; for (ObjectMonitor* mid = Self->omInUseList; mid != NULL; cur_mid_in_use = mid, mid = mid->FreeNext) { @@ -1531,28 +1507,21 @@ } -// Deflate_idle_monitors() is called at all safepoints, immediately -// after all mutators are stopped, but before any objects have moved. -// It traverses the list of known monitors, deflating where possible. -// The scavenged monitor are returned to the monitor free list. +// We create a list of in-use monitors for each thread. // -// Beware that we scavenge at *every* stop-the-world point. -// Having a large number of monitors in-circulation negatively -// impacts the performance of some applications (e.g., PointBase). -// Broadly, we want to minimize the # of monitors in circulation. +// deflate_thread_local_monitors() scans a single thread's in-use list, while +// deflate_idle_monitors() scans only a global list of in-use monitors which +// is populated only as a thread dies (see omFlush()). // -// We have added a flag, MonitorInUseLists, which creates a list -// of active monitors for each thread. deflate_idle_monitors() -// only scans the per-thread in-use lists. omAlloc() puts all -// assigned monitors on the per-thread list. deflate_idle_monitors() -// returns the non-busy monitors to the global free list. -// When a thread dies, omFlush() adds the list of active monitors for -// that thread to a global gOmInUseList acquiring the -// global list lock. deflate_idle_monitors() acquires the global -// list lock to scan for non-busy monitors to the global free list. -// An alternative could have used a single global in-use list. The -// downside would have been the additional cost of acquiring the global list lock -// for every omAlloc(). +// These operations are called at all safepoints, immediately after mutators +// are stopped, but before any objects have moved. Collectively they traverse +// the population of in-use monitors, deflating where possible. The scavenged +// monitors are returned to the monitor free list. +// +// Beware that we scavenge at *every* stop-the-world point. Having a large +// number of monitors in-use could negatively impact performance. We also want +// to minimize the total # of monitors in circulation, as they incur a small +// footprint penalty. // // Perversely, the heap size -- and thus the STW safepoint rate -- // typically drives the scavenge rate. Large heaps can mean infrequent GC, @@ -1671,47 +1640,16 @@ // See e.g. 6320749 Thread::muxAcquire(&gListLock, "scavenge - return"); - if (MonitorInUseLists) { - // Note: the thread-local monitors lists get deflated in - // a separate pass. See deflate_thread_local_monitors(). - - // For moribund threads, scan gOmInUseList - if (gOmInUseList) { - counters->nInCirculation += gOmInUseCount; - int deflated_count = deflate_monitor_list((ObjectMonitor **)&gOmInUseList, &freeHeadp, &freeTailp); - gOmInUseCount -= deflated_count; - counters->nScavenged += deflated_count; - counters->nInuse += gOmInUseCount; - } + // Note: the thread-local monitors lists get deflated in + // a separate pass. See deflate_thread_local_monitors(). - } else { - PaddedEnd * block = OrderAccess::load_acquire(&gBlockList); - for (; block != NULL; block = next(block)) { - // Iterate over all extant monitors - Scavenge all idle monitors. - assert(block->object() == CHAINMARKER, "must be a block header"); - counters->nInCirculation += _BLOCKSIZE; - for (int i = 1; i < _BLOCKSIZE; i++) { - ObjectMonitor* mid = (ObjectMonitor*)&block[i]; - oop obj = (oop)mid->object(); - - if (obj == NULL) { - // The monitor is not associated with an object. - // The monitor should either be a thread-specific private - // free list or the global free list. - // obj == NULL IMPLIES mid->is_busy() == 0 - guarantee(!mid->is_busy(), "invariant"); - continue; - } - deflated = deflate_monitor(mid, obj, &freeHeadp, &freeTailp); - - if (deflated) { - mid->FreeNext = NULL; - counters->nScavenged++; - } else { - counters->nInuse++; - } - } - } + // For moribund threads, scan gOmInUseList + if (gOmInUseList) { + counters->nInCirculation += gOmInUseCount; + int deflated_count = deflate_monitor_list((ObjectMonitor **)&gOmInUseList, &freeHeadp, &freeTailp); + gOmInUseCount -= deflated_count; + counters->nScavenged += deflated_count; + counters->nInuse += gOmInUseCount; } // Move the scavenged monitors back to the global free list. @@ -1744,7 +1682,6 @@ void ObjectSynchronizer::deflate_thread_local_monitors(Thread* thread, DeflateMonitorCounters* counters) { assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); - if (!MonitorInUseLists) return; ObjectMonitor * freeHeadp = NULL; // Local SLL of scavenged monitors ObjectMonitor * freeTailp = NULL; diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/synchronizer.hpp --- a/src/hotspot/share/runtime/synchronizer.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/synchronizer.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -168,8 +168,6 @@ // count of entries in gOmInUseList static int gOmInUseCount; - // Process oops in all monitors - static void global_oops_do(OopClosure* f); // Process oops in all global used monitors (i.e. moribund thread's monitors) static void global_used_oops_do(OopClosure* f); // Process oops in monitors on the given list diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/thread.cpp --- a/src/hotspot/share/runtime/thread.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/thread.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -851,11 +851,9 @@ f->do_oop((oop*)&_pending_exception); handle_area()->oops_do(f); - if (MonitorInUseLists) { - // When using thread local monitor lists, we scan them here, - // and the remaining global monitors in ObjectSynchronizer::oops_do(). - ObjectSynchronizer::thread_local_used_oops_do(this, f); - } + // We scan thread local monitor lists here, and the remaining global + // monitors in ObjectSynchronizer::oops_do(). + ObjectSynchronizer::thread_local_used_oops_do(this, f); } void Thread::metadata_handles_do(void f(Metadata*)) { diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/runtime/vmStructs.cpp --- a/src/hotspot/share/runtime/vmStructs.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/runtime/vmStructs.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -329,8 +329,8 @@ nonstatic_field(ObjArrayKlass, _bottom_klass, Klass*) \ volatile_nonstatic_field(Symbol, _length_and_refcount, unsigned int) \ nonstatic_field(Symbol, _identity_hash, short) \ - unchecked_nonstatic_field(Symbol, _body, sizeof(jbyte)) /* NOTE: no type */ \ - nonstatic_field(Symbol, _body[0], jbyte) \ + unchecked_nonstatic_field(Symbol, _body, sizeof(u1)) /* NOTE: no type */ \ + nonstatic_field(Symbol, _body[0], u1) \ nonstatic_field(TypeArrayKlass, _max_length, jint) \ \ /***********************/ \ diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/services/heapDumper.cpp --- a/src/hotspot/share/services/heapDumper.cpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/services/heapDumper.cpp Fri Oct 05 16:14:28 2018 -0700 @@ -696,7 +696,7 @@ // returns hprof tag for the given type signature hprofTag DumperSupport::sig2tag(Symbol* sig) { - switch (sig->byte_at(0)) { + switch (sig->char_at(0)) { case JVM_SIGNATURE_CLASS : return HPROF_NORMAL_OBJECT; case JVM_SIGNATURE_ARRAY : return HPROF_NORMAL_OBJECT; case JVM_SIGNATURE_BYTE : return HPROF_BYTE; @@ -821,7 +821,7 @@ for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) { if (!fld.access_flags().is_static()) { Symbol* sig = fld.signature(); - switch (sig->byte_at(0)) { + switch (sig->char_at(0)) { case JVM_SIGNATURE_CLASS : case JVM_SIGNATURE_ARRAY : size += oopSize; break; @@ -889,7 +889,7 @@ writer->write_u1(sig2tag(sig)); // type // value - dump_field_value(writer, sig->byte_at(0), ik->java_mirror(), fld.offset()); + dump_field_value(writer, sig->char_at(0), ik->java_mirror(), fld.offset()); } } @@ -925,7 +925,7 @@ for (FieldStream fld(ik, false, false); !fld.eos(); fld.next()) { if (!fld.access_flags().is_static()) { Symbol* sig = fld.signature(); - dump_field_value(writer, sig->byte_at(0), o, fld.offset()); + dump_field_value(writer, sig->char_at(0), o, fld.offset()); } } } diff -r 3c92ada330a9 -r e03e5f61c53f src/hotspot/share/utilities/globalDefinitions_gcc.hpp --- a/src/hotspot/share/utilities/globalDefinitions_gcc.hpp Fri Oct 05 15:15:56 2018 -0700 +++ b/src/hotspot/share/utilities/globalDefinitions_gcc.hpp Fri Oct 05 16:14:28 2018 -0700 @@ -218,8 +218,8 @@ // Checking for finiteness -inline int g_isfinite(jfloat f) { return finite(f); } -inline int g_isfinite(jdouble f) { return finite(f); } +inline int g_isfinite(jfloat f) { return isfinite(f); } +inline int g_isfinite(jdouble f) { return isfinite(f); } // Wide characters diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/lang/Character.java --- a/src/java.base/share/classes/java/lang/Character.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/lang/Character.java Fri Oct 05 16:14:28 2018 -0700 @@ -5385,7 +5385,7 @@ 0x3260, // 3260..327E; HANGUL 0x327F, // 327F..32CF; COMMON 0x32D0, // 32D0..32FE; KATAKANA - 0x32FF, // 32FF ; UNKNOWN + 0x32FF, // 32FF ; COMMON 0x3300, // 3300..3357; KATAKANA 0x3358, // 3358..33FF; COMMON 0x3400, // 3400..4DB5; HAN @@ -6902,7 +6902,7 @@ HANGUL, // 3260..327E COMMON, // 327F..32CF KATAKANA, // 32D0..32FE - UNKNOWN, // 32FF + COMMON, // 32FF KATAKANA, // 3300..3357 COMMON, // 3358..33FF HAN, // 3400..4DB5 diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/lang/Class.java --- a/src/java.base/share/classes/java/lang/Class.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/lang/Class.java Fri Oct 05 16:14:28 2018 -0700 @@ -64,7 +64,6 @@ import jdk.internal.loader.BootLoader; import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.misc.Unsafe; -import jdk.internal.misc.VM; import jdk.internal.module.Resources; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.ConstantPool; @@ -540,11 +539,9 @@ checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), false); } - // NOTE: the following code may not be strictly correct under - // the current Java memory model. - // Constructor lookup - if (cachedConstructor == null) { + Constructor tmpConstructor = cachedConstructor; + if (tmpConstructor == null) { if (this == Class.class) { throw new IllegalAccessException( "Can not call newInstance() on the Class for java.lang.Class" @@ -555,9 +552,7 @@ final Constructor c = getReflectionFactory().copyConstructor( getConstructor0(empty, Member.DECLARED)); // Disable accessibility checks on the constructor - // since we have to do the security check here anyway - // (the stack depth is wrong for the Constructor's - // security check to work) + // access check is done with the true caller java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<>() { public Void run() { @@ -565,32 +560,24 @@ return null; } }); - cachedConstructor = c; + cachedConstructor = tmpConstructor = c; } catch (NoSuchMethodException e) { throw (InstantiationException) new InstantiationException(getName()).initCause(e); } } - Constructor tmpConstructor = cachedConstructor; - // Security check (same as in java.lang.reflect.Constructor) - Class caller = Reflection.getCallerClass(); - if (newInstanceCallerCache != caller) { - int modifiers = tmpConstructor.getModifiers(); - Reflection.ensureMemberAccess(caller, this, this, modifiers); - newInstanceCallerCache = caller; - } - // Run constructor + try { - return tmpConstructor.newInstance((Object[])null); + Class caller = Reflection.getCallerClass(); + return getReflectionFactory().newInstance(tmpConstructor, null, caller); } catch (InvocationTargetException e) { Unsafe.getUnsafe().throwException(e.getTargetException()); // Not reached return null; } } + private transient volatile Constructor cachedConstructor; - private transient volatile Class newInstanceCallerCache; - /** * Determines if the specified {@code Object} is assignment-compatible diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java --- a/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java Fri Oct 05 16:14:28 2018 -0700 @@ -37,7 +37,6 @@ import java.lang.reflect.Modifier; import java.security.AccessController; import java.security.PrivilegedAction; -import java.security.ProtectionDomain; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -578,23 +577,17 @@ InvokerBytecodeGenerator.maybeDump(classBCName(className), classFile); Class speciesCode; - ClassLoader cl = topClass().getClassLoader(); - ProtectionDomain pd = null; - if (cl != null) { - pd = AccessController.doPrivileged( - new PrivilegedAction<>() { - @Override - public ProtectionDomain run() { - return topClass().getProtectionDomain(); - } - }); - } - try { - speciesCode = UNSAFE.defineClass(className, classFile, 0, classFile.length, cl, pd); - } catch (Exception ex) { - throw newInternalError(ex); - } - + MethodHandles.Lookup lookup = IMPL_LOOKUP.in(topClass()); + speciesCode = AccessController.doPrivileged(new PrivilegedAction<>() { + @Override + public Class run() { + try { + return lookup.defineClass(classFile); + } catch (Exception ex) { + throw newInternalError(ex); + } + } + }); return speciesCode.asSubclass(topClass()); } diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/lang/reflect/AccessibleObject.java --- a/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java Fri Oct 05 16:14:28 2018 -0700 @@ -27,6 +27,7 @@ import java.lang.annotation.Annotation; import java.lang.invoke.MethodHandle; +import java.lang.ref.WeakReference; import java.security.AccessController; import jdk.internal.misc.VM; @@ -567,21 +568,68 @@ // Shared access checking logic. // For non-public members or members in package-private classes, - // it is necessary to perform somewhat expensive security checks. - // If the security check succeeds for a given class, it will + // it is necessary to perform somewhat expensive access checks. + // If the access check succeeds for a given class, it will // always succeed (it is not affected by the granting or revoking // of permissions); we speed up the check in the common case by // remembering the last Class for which the check succeeded. // - // The simple security check for Constructor is to see if + // The simple access check for Constructor is to see if // the caller has already been seen, verified, and cached. - // (See also Class.newInstance(), which uses a similar method.) // - // A more complicated security check cache is needed for Method and Field - // The cache can be either null (empty cache), a 2-array of {caller,targetClass}, + // A more complicated access check cache is needed for Method and Field + // The cache can be either null (empty cache), {caller,targetClass} pair, // or a caller (with targetClass implicitly equal to memberClass). - // In the 2-array case, the targetClass is always different from the memberClass. - volatile Object securityCheckCache; + // In the {caller,targetClass} case, the targetClass is always different + // from the memberClass. + volatile Object accessCheckCache; + + private static class Cache { + final WeakReference> callerRef; + final WeakReference> targetRef; + + Cache(Class caller, Class target) { + this.callerRef = new WeakReference<>(caller); + this.targetRef = new WeakReference<>(target); + } + + boolean isCacheFor(Class caller, Class refc) { + return callerRef.get() == caller && targetRef.get() == refc; + } + + static Object protectedMemberCallerCache(Class caller, Class refc) { + return new Cache(caller, refc); + } + } + + /* + * Returns true if the previous access check was verified for the + * given caller accessing a protected member with an instance of + * the given targetClass where the target class is different than + * the declaring member class. + */ + private boolean isAccessChecked(Class caller, Class targetClass) { + Object cache = accessCheckCache; // read volatile + if (cache instanceof Cache) { + return ((Cache) cache).isCacheFor(caller, targetClass); + } + return false; + } + + /* + * Returns true if the previous access check was verified for the + * given caller accessing a static member or an instance member of + * the target class that is the same as the declaring member class. + */ + private boolean isAccessChecked(Class caller) { + Object cache = accessCheckCache; // read volatile + if (cache instanceof WeakReference) { + @SuppressWarnings("unchecked") + WeakReference> ref = (WeakReference>) cache; + return ref.get() == caller; + } + return false; + } final void checkAccess(Class caller, Class memberClass, Class targetClass, int modifiers) @@ -603,21 +651,13 @@ if (caller == memberClass) { // quick check return true; // ACCESS IS OK } - Object cache = securityCheckCache; // read volatile if (targetClass != null // instance member or constructor && Modifier.isProtected(modifiers) && targetClass != memberClass) { - // Must match a 2-list of { caller, targetClass }. - if (cache instanceof Class[]) { - Class[] cache2 = (Class[]) cache; - if (cache2[1] == targetClass && - cache2[0] == caller) { - return true; // ACCESS IS OK - } - // (Test cache[1] first since range check for [1] - // subsumes range check for [0].) + if (isAccessChecked(caller, targetClass)) { + return true; // ACCESS IS OK } - } else if (cache == caller) { + } else if (isAccessChecked(caller)) { // Non-protected case (or targetClass == memberClass or static member). return true; // ACCESS IS OK } @@ -642,14 +682,9 @@ Object cache = (targetClass != null && Modifier.isProtected(modifiers) && targetClass != memberClass) - ? new Class[] { caller, targetClass } - : caller; - - // Note: The two cache elements are not volatile, - // but they are effectively final. The Java memory model - // guarantees that the initializing stores for the cache - // elements will occur before the volatile write. - securityCheckCache = cache; // write volatile + ? Cache.protectedMemberCallerCache(caller, targetClass) + : new WeakReference<>(caller); + accessCheckCache = cache; // write volatile return true; } diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/lang/reflect/Constructor.java --- a/src/java.base/share/classes/java/lang/reflect/Constructor.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/lang/reflect/Constructor.java Fri Oct 05 16:14:28 2018 -0700 @@ -476,18 +476,27 @@ throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - if (!override) { - Class caller = Reflection.getCallerClass(); + Class caller = override ? null : Reflection.getCallerClass(); + return newInstanceWithCaller(initargs, !override, caller); + } + + /* package-private */ + T newInstanceWithCaller(Object[] args, boolean checkAccess, Class caller) + throws InstantiationException, IllegalAccessException, + InvocationTargetException + { + if (checkAccess) checkAccess(caller, clazz, clazz, modifiers); - } + if ((clazz.getModifiers() & Modifier.ENUM) != 0) throw new IllegalArgumentException("Cannot reflectively create enum objects"); + ConstructorAccessor ca = constructorAccessor; // read volatile if (ca == null) { ca = acquireConstructorAccessor(); } @SuppressWarnings("unchecked") - T inst = (T) ca.newInstance(initargs); + T inst = (T) ca.newInstance(args); return inst; } diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/lang/reflect/Proxy.java --- a/src/java.base/share/classes/java/lang/reflect/Proxy.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java Fri Oct 05 16:14:28 2018 -0700 @@ -39,12 +39,11 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.Collectors; -import java.util.stream.Stream; import jdk.internal.loader.BootLoader; +import jdk.internal.misc.JavaLangAccess; +import jdk.internal.misc.SharedSecrets; import jdk.internal.module.Modules; -import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; @@ -468,7 +467,7 @@ * in which the proxy class will be defined. */ private static final class ProxyBuilder { - private static final Unsafe UNSAFE = Unsafe.getUnsafe(); + private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess(); // prefix for all proxy class names private static final String proxyClassNamePrefix = "$Proxy"; @@ -535,9 +534,8 @@ byte[] proxyClassFile = ProxyGenerator.generateProxyClass( proxyName, interfaces.toArray(EMPTY_CLASS_ARRAY), accessFlags); try { - Class pc = UNSAFE.defineClass(proxyName, proxyClassFile, - 0, proxyClassFile.length, - loader, null); + Class pc = JLA.defineClass(loader, proxyName, proxyClassFile, + null, "__dynamic_proxy__"); reverseProxyCache.sub(pc).putIfAbsent(loader, Boolean.TRUE); return pc; } catch (ClassFormatError e) { diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/lang/reflect/ReflectAccess.java --- a/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java Fri Oct 05 16:14:28 2018 -0700 @@ -159,4 +159,10 @@ public T getRoot(T obj) { return (T) obj.getRoot(); } + + public T newInstance(Constructor ctor, Object[] args, Class caller) + throws IllegalAccessException, InstantiationException, InvocationTargetException + { + return ctor.newInstanceWithCaller(args, true, caller); + } } diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/time/format/DateTimeFormatter.java --- a/src/java.base/share/classes/java/time/format/DateTimeFormatter.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/time/format/DateTimeFormatter.java Fri Oct 05 16:14:28 2018 -0700 @@ -1138,9 +1138,12 @@ *

* This returns an immutable formatter capable of formatting and parsing * the ISO-8601 instant format. - * When formatting, the second-of-minute is always output. + * When formatting, the instant will always be suffixed by 'Z' to indicate UTC. + * The second-of-minute is always output. * The nano-of-second outputs zero, three, six or nine digits as necessary. - * When parsing, time to at least the seconds field is required. + * When parsing, the behaviour of {@link DateTimeFormatterBuilder#appendOffsetId()} + * will be used to parse the offset, converting the instant to UTC as necessary. + * The time to at least the seconds field is required. * Fractional seconds from zero to nine are parsed. * The localized decimal style is not used. *

diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java --- a/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Fri Oct 05 16:14:28 2018 -0700 @@ -837,6 +837,10 @@ * The leap-second time of '23:59:59' is handled to some degree, see * {@link DateTimeFormatter#parsedLeapSecond()} for full details. *

+ * When formatting, the instant will always be suffixed by 'Z' to indicate UTC. + * When parsing, the behaviour of {@link DateTimeFormatterBuilder#appendOffsetId()} + * will be used to parse the offset, converting the instant to UTC as necessary. + *

* An alternative to this method is to format/parse the instant as a single * epoch-seconds value. That is achieved using {@code appendValue(INSTANT_SECONDS)}. * @@ -3468,7 +3472,7 @@ .appendValue(MINUTE_OF_HOUR, 2).appendLiteral(':') .appendValue(SECOND_OF_MINUTE, 2) .appendFraction(NANO_OF_SECOND, minDigits, maxDigits, true) - .appendLiteral('Z') + .appendOffsetId() .toFormatter().toPrinterParser(false); DateTimeParseContext newContext = context.copy(); int pos = parser.parse(newContext, text, position); @@ -3486,6 +3490,7 @@ Long nanoVal = newContext.getParsed(NANO_OF_SECOND); int sec = (secVal != null ? secVal.intValue() : 0); int nano = (nanoVal != null ? nanoVal.intValue() : 0); + int offset = newContext.getParsed(OFFSET_SECONDS).intValue(); int days = 0; if (hour == 24 && min == 0 && sec == 0 && nano == 0) { hour = 0; @@ -3498,7 +3503,7 @@ long instantSecs; try { LocalDateTime ldt = LocalDateTime.of(year, month, day, hour, min, sec, 0).plusDays(days); - instantSecs = ldt.toEpochSecond(ZoneOffset.UTC); + instantSecs = ldt.toEpochSecond(ZoneOffset.ofTotalSeconds(offset)); instantSecs += Math.multiplyExact(yearParsed / 10_000L, SECONDS_PER_10000_YEARS); } catch (RuntimeException ex) { return ~position; diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/jdk/internal/reflect/ClassDefiner.java --- a/src/java.base/share/classes/jdk/internal/reflect/ClassDefiner.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/jdk/internal/reflect/ClassDefiner.java Fri Oct 05 16:14:28 2018 -0700 @@ -27,14 +27,16 @@ import java.security.AccessController; import java.security.PrivilegedAction; -import jdk.internal.misc.Unsafe; -/** Utility class which assists in calling Unsafe.defineClass() by +import jdk.internal.misc.JavaLangAccess; +import jdk.internal.misc.SharedSecrets; + +/** Utility class which assists in calling defineClass() by creating a new class loader which delegates to the one needed in order for proper resolution of the given bytecodes to occur. */ class ClassDefiner { - static final Unsafe unsafe = Unsafe.getUnsafe(); + static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess(); /**

We define generated code into a new class loader which delegates to the defining loader of the target class. It is @@ -60,7 +62,7 @@ return new DelegatingClassLoader(parentClassLoader); } }); - return unsafe.defineClass(name, bytes, off, len, newLoader, null); + return JLA.defineClass(newLoader, name, bytes, null, "__ClassDefiner__"); } } diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java --- a/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/jdk/internal/reflect/LangReflectAccess.java Fri Oct 05 16:14:28 2018 -0700 @@ -118,4 +118,8 @@ /** Gets the root of the given AccessibleObject object; null if arg is the root */ public T getRoot(T obj); + + /** Returns a new instance created by the given constructor with access check */ + public T newInstance(Constructor ctor, Object[] args, Class caller) + throws IllegalAccessException, InstantiationException, InvocationTargetException; } diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java --- a/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Fri Oct 05 16:14:28 2018 -0700 @@ -398,6 +398,12 @@ return langReflectAccess().getExecutableSharedParameterTypes(ex); } + public T newInstance(Constructor ctor, Object[] args, Class caller) + throws IllegalAccessException, InstantiationException, InvocationTargetException + { + return langReflectAccess().newInstance(ctor, args, caller); + } + //-------------------------------------------------------------------------- // // Routines used by serialization diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/unix/native/libjava/Console_md.c --- a/src/java.base/unix/native/libjava/Console_md.c Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/unix/native/libjava/Console_md.c Fri Oct 05 16:14:28 2018 -0700 @@ -56,7 +56,7 @@ JNU_ThrowIOExceptionWithLastError(env, "tcgetattr failed"); return !on; } - old = (tio.c_lflag & ECHO); + old = (tio.c_lflag & ECHO) != 0; if (on) { tio.c_lflag |= ECHO; } else { diff -r 3c92ada330a9 -r e03e5f61c53f src/java.base/unix/native/libjsig/jsig.c --- a/src/java.base/unix/native/libjsig/jsig.c Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.base/unix/native/libjsig/jsig.c Fri Oct 05 16:14:28 2018 -0700 @@ -312,7 +312,7 @@ } /* The three functions for the jvm to call into. */ -void JVM_begin_signal_setting() { +JNIEXPORT void JVM_begin_signal_setting() { signal_lock(); sigemptyset(&jvmsigs); jvm_signal_installing = true; @@ -320,7 +320,7 @@ signal_unlock(); } -void JVM_end_signal_setting() { +JNIEXPORT void JVM_end_signal_setting() { signal_lock(); jvm_signal_installed = true; jvm_signal_installing = false; @@ -328,7 +328,7 @@ signal_unlock(); } -struct sigaction *JVM_get_signal_action(int sig) { +JNIEXPORT struct sigaction *JVM_get_signal_action(int sig) { allocate_sact(); /* Does race condition make sense here? */ if (sigismember(&jvmsigs, sig)) { diff -r 3c92ada330a9 -r e03e5f61c53f src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java --- a/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java Fri Oct 05 16:14:28 2018 -0700 @@ -337,17 +337,17 @@ // then reset the timeout. if (socket instanceof SSLSocket) { SSLSocket sslSocket = (SSLSocket) socket; - int socketTimeout = sslSocket.getSoTimeout(); if (!IS_HOSTNAME_VERIFICATION_DISABLED) { SSLParameters param = sslSocket.getSSLParameters(); param.setEndpointIdentificationAlgorithm("LDAPS"); sslSocket.setSSLParameters(param); } if (connectTimeout > 0) { + int socketTimeout = sslSocket.getSoTimeout(); sslSocket.setSoTimeout(connectTimeout); // reuse full timeout value + sslSocket.startHandshake(); + sslSocket.setSoTimeout(socketTimeout); } - sslSocket.startHandshake(); - sslSocket.setSoTimeout(socketTimeout); } return socket; } diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.compiler/share/classes/com/sun/tools/javac/code/Source.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Source.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Source.java Fri Oct 05 16:14:28 2018 -0700 @@ -180,6 +180,7 @@ UNDERSCORE_IDENTIFIER(MIN, JDK8), PRIVATE_INTERFACE_METHODS(JDK9, Fragments.FeaturePrivateIntfMethods, DiagKind.PLURAL), LOCAL_VARIABLE_TYPE_INFERENCE(JDK10), + VAR_SYNTAX_IMPLICIT_LAMBDAS(JDK11, Fragments.FeatureVarSyntaxInImplicitLambda, DiagKind.PLURAL), IMPORT_ON_DEMAND_OBSERVABLE_PACKAGES(JDK1_2, JDK8), SWITCH_MULTIPLE_CASE_LABELS(JDK12, Fragments.FeatureMultipleCaseLabels, DiagKind.PLURAL), SWITCH_RULE(JDK12, Fragments.FeatureSwitchRules, DiagKind.PLURAL), diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Oct 05 16:14:28 2018 -0700 @@ -1783,7 +1783,9 @@ if (param.vartype != null && isRestrictedLocalVarTypeName(param.vartype, false) && param.vartype.hasTag(TYPEARRAY)) { - log.error(DiagnosticFlag.SYNTAX, param.pos, Errors.VarNotAllowedArray); + log.error(DiagnosticFlag.SYNTAX, param.pos, + Feature.VAR_SYNTAX_IMPLICIT_LAMBDAS.allowedInSource(source) + ? Errors.VarNotAllowedArray : Errors.VarNotAllowedHere); } lambdaClassifier.addParameter(param); if (lambdaClassifier.result() == LambdaParameterKind.ERROR) { @@ -1794,7 +1796,9 @@ log.error(DiagnosticFlag.SYNTAX, pos, Errors.InvalidLambdaParameterDeclaration(lambdaClassifier.diagFragment)); } for (JCVariableDecl param: params) { - if (param.vartype != null && isRestrictedLocalVarTypeName(param.vartype, true)) { + if (param.vartype != null + && isRestrictedLocalVarTypeName(param.vartype, true)) { + checkSourceLevel(param.pos, Feature.VAR_SYNTAX_IMPLICIT_LAMBDAS); param.startPos = TreeInfo.getStartPos(param.vartype); param.vartype = null; } @@ -1804,9 +1808,9 @@ } enum LambdaParameterKind { - EXPLICIT(0), - IMPLICIT(1), - VAR(2), + VAR(0), + EXPLICIT(1), + IMPLICIT(2), ERROR(-1); private final int index; @@ -1816,11 +1820,11 @@ } } - private final static Fragment[][] decisionTable = new Fragment[][]{ - /* EXPLICIT IMPLICIT VAR */ - /* EXPLICIT */ {null, ImplicitAndExplicitNotAllowed, VarAndExplicitNotAllowed}, - /* IMPLICIT */ {ImplicitAndExplicitNotAllowed, null, VarAndImplicitNotAllowed}, - /* VAR */ {VarAndExplicitNotAllowed, VarAndImplicitNotAllowed, null} + private final static Fragment[][] decisionTable = new Fragment[][] { + /* VAR EXPLICIT IMPLICIT */ + /* VAR */ {null, VarAndExplicitNotAllowed, VarAndImplicitNotAllowed}, + /* EXPLICIT */ {VarAndExplicitNotAllowed, null, ImplicitAndExplicitNotAllowed}, + /* IMPLICIT */ {VarAndImplicitNotAllowed, ImplicitAndExplicitNotAllowed, null}, }; class LambdaClassifier { @@ -1849,7 +1853,10 @@ } else if (kind != newKind && kind != LambdaParameterKind.ERROR) { LambdaParameterKind currentKind = kind; kind = LambdaParameterKind.ERROR; - diagFragment = decisionTable[currentKind.index][newKind.index]; + boolean varIndex = currentKind.index == LambdaParameterKind.VAR.index || + newKind.index == LambdaParameterKind.VAR.index; + diagFragment = Feature.VAR_SYNTAX_IMPLICIT_LAMBDAS.allowedInSource(source) || !varIndex ? + decisionTable[currentKind.index][newKind.index] : null; } } diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Oct 05 16:14:28 2018 -0700 @@ -2832,6 +2832,9 @@ compiler.misc.feature.raw.string.literals=\ raw string literals +compiler.misc.feature.var.syntax.in.implicit.lambda=\ + var syntax in implicit lambdas + compiler.warn.underscore.as.identifier=\ as of release 9, ''_'' is a keyword, and may not be used as an identifier diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/types/Field.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/types/Field.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/types/Field.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, 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 @@ -57,7 +57,7 @@ FIXME: among other things, this interface is not sufficient to describe fields which are themselves arrays (like Symbol's - jbyte _body[1]). */ + u1 _body[1]). */ public interface Field { /** Get the name of this field */ public String getName(); diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java --- a/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java Fri Oct 05 16:14:28 2018 -0700 @@ -210,6 +210,7 @@ PlaceholderOutputStream o = getPlaceholderResponseBody(); tmpout.write (bytes(statusLine, 0), 0, statusLine.length()); boolean noContentToSend = false; // assume there is content + boolean noContentLengthHeader = false; // must not send Content-length is set rspHdrs.set ("Date", dateFormat.get().format (new Date())); /* check for response type that is not allowed to send a body */ @@ -225,6 +226,7 @@ logger.log (Level.WARNING, msg); } contentLen = -1; + noContentLengthHeader = (rCode != 304); } if (isHeadRequest() || rCode == 304) { @@ -253,7 +255,11 @@ noContentToSend = true; contentLen = 0; } - rspHdrs.set("Content-length", Long.toString(contentLen)); + if (noContentLengthHeader) { + rspHdrs.remove("Content-length"); + } else { + rspHdrs.set("Content-length", Long.toString(contentLen)); + } o.setWrappedStream (new FixedLengthOutputStream (this, ros, contentLen)); } } diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantReflectionProvider.java --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantReflectionProvider.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantReflectionProvider.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, 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 @@ -108,7 +108,6 @@ * Otherwise the generated code might be the only reference to the boxed value and since object * references from nmethods are weak this can cause GC problems. * - * @param source * @return true if the box is cached */ private static boolean isBoxCached(JavaConstant source) { @@ -182,13 +181,13 @@ if (hotspotField.isStatic()) { HotSpotResolvedJavaType holder = (HotSpotResolvedJavaType) hotspotField.getDeclaringClass(); if (holder.isInitialized()) { - return memoryAccess.readFieldValue(hotspotField, holder.mirror()); + return memoryAccess.readFieldValue(hotspotField, holder.mirror(), field.isVolatile()); } } else { if (receiver.isNonNull()) { Object object = ((HotSpotObjectConstantImpl) receiver).object(); if (hotspotField.isInObject(receiver)) { - return memoryAccess.readFieldValue(hotspotField, object); + return memoryAccess.readFieldValue(hotspotField, object, field.isVolatile()); } } } diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMemoryAccessProviderImpl.java --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMemoryAccessProviderImpl.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMemoryAccessProviderImpl.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, 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 @@ -208,37 +208,34 @@ return ret; } - JavaConstant readFieldValue(HotSpotResolvedJavaField field, Object obj) { + JavaConstant readFieldValue(HotSpotResolvedJavaField field, Object obj, boolean isVolatile) { assert obj != null; assert !field.isStatic() || obj instanceof Class; long displacement = field.getOffset(); assert checkRead(field.getJavaKind(), displacement, (HotSpotResolvedObjectType) runtime.getHostJVMCIBackend().getMetaAccess().lookupJavaType(obj.getClass()), obj, runtime.getHostJVMCIBackend().getMetaAccess()); - if (field.getJavaKind() == JavaKind.Object) { - Object o = UNSAFE.getObject(obj, displacement); - return HotSpotObjectConstantImpl.forObject(o); - } else { - JavaKind kind = field.getJavaKind(); - switch (kind) { - case Boolean: - return JavaConstant.forBoolean(UNSAFE.getBoolean(obj, displacement)); - case Byte: - return JavaConstant.forByte(UNSAFE.getByte(obj, displacement)); - case Char: - return JavaConstant.forChar(UNSAFE.getChar(obj, displacement)); - case Short: - return JavaConstant.forShort(UNSAFE.getShort(obj, displacement)); - case Int: - return JavaConstant.forInt(UNSAFE.getInt(obj, displacement)); - case Long: - return JavaConstant.forLong(UNSAFE.getLong(obj, displacement)); - case Float: - return JavaConstant.forFloat(UNSAFE.getFloat(obj, displacement)); - case Double: - return JavaConstant.forDouble(UNSAFE.getDouble(obj, displacement)); - default: - throw new IllegalArgumentException("Unsupported kind: " + kind); - } + JavaKind kind = field.getJavaKind(); + switch (kind) { + case Boolean: + return JavaConstant.forBoolean(isVolatile ? UNSAFE.getBooleanVolatile(obj, displacement) : UNSAFE.getBoolean(obj, displacement)); + case Byte: + return JavaConstant.forByte(isVolatile ? UNSAFE.getByteVolatile(obj, displacement) : UNSAFE.getByte(obj, displacement)); + case Char: + return JavaConstant.forChar(isVolatile ? UNSAFE.getCharVolatile(obj, displacement) : UNSAFE.getChar(obj, displacement)); + case Short: + return JavaConstant.forShort(isVolatile ? UNSAFE.getShortVolatile(obj, displacement) : UNSAFE.getShort(obj, displacement)); + case Int: + return JavaConstant.forInt(isVolatile ? UNSAFE.getIntVolatile(obj, displacement) : UNSAFE.getInt(obj, displacement)); + case Long: + return JavaConstant.forLong(isVolatile ? UNSAFE.getLongVolatile(obj, displacement) : UNSAFE.getLong(obj, displacement)); + case Float: + return JavaConstant.forFloat(isVolatile ? UNSAFE.getFloatVolatile(obj, displacement) : UNSAFE.getFloat(obj, displacement)); + case Double: + return JavaConstant.forDouble(isVolatile ? UNSAFE.getDoubleVolatile(obj, displacement) : UNSAFE.getDouble(obj, displacement)); + case Object: + return HotSpotObjectConstantImpl.forObject(isVolatile ? UNSAFE.getObjectVolatile(obj, displacement) : UNSAFE.getObject(obj, displacement)); + default: + throw new IllegalArgumentException("Unsupported kind: " + kind); } } diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java Fri Oct 05 16:14:28 2018 -0700 @@ -399,6 +399,10 @@ // Utils needs docEnv, safe to init now. utils = new Utils(this); + if (!javafx) { + javafx = isJavaFXMode(); + } + // Once docEnv and Utils have been initialized, others should be safe. cmtUtils = new CommentUtils(this); workArounds = new WorkArounds(this); @@ -1347,4 +1351,19 @@ public synchronized VisibleMemberTable getVisibleMemberTable(TypeElement te) { return visibleMemberCache.getVisibleMemberTable(te); } + + /** + * Determines if JavaFX is available in the compilation environment. + * @return true if JavaFX is available + */ + public boolean isJavaFXMode() { + TypeElement observable = utils.elementUtils.getTypeElement("javafx.beans.Observable"); + if (observable != null) { + ModuleElement javafxModule = utils.elementUtils.getModuleOf(observable); + if (javafxModule == null || javafxModule.isUnnamed() || javafxModule.getQualifiedName().contentEquals("javafx.base")) { + return true; + } + } + return false; + } } diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/MessageOutput.java --- a/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/MessageOutput.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/MessageOutput.java Fri Oct 05 16:14:28 2018 -0700 @@ -189,8 +189,12 @@ } static void printPrompt() { + printPrompt(false); + } + + static void printPrompt(boolean simple) { ThreadInfo threadInfo = ThreadInfo.getCurrentThreadInfo(); - if (threadInfo == null) { + if (simple || threadInfo == null) { System.out.print (MessageOutput.format("jdb prompt with no current thread")); } else { diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTY.java --- a/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTY.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTY.java Fri Oct 05 16:14:28 2018 -0700 @@ -464,6 +464,8 @@ } else if (cmd.equals("resume")) { evaluator.commandResume(t); } else if (cmd.equals("cont")) { + MessageOutput.printPrompt(true); + showPrompt = false; evaluator.commandCont(); } else if (cmd.equals("threadgroups")) { evaluator.commandThreadGroups(); @@ -474,10 +476,16 @@ } else if (cmd.equals("ignore")) { evaluator.commandIgnoreException(t); } else if (cmd.equals("step")) { + MessageOutput.printPrompt(true); + showPrompt = false; evaluator.commandStep(t); } else if (cmd.equals("stepi")) { + MessageOutput.printPrompt(true); + showPrompt = false; evaluator.commandStepi(); } else if (cmd.equals("next")) { + MessageOutput.printPrompt(true); + showPrompt = false; evaluator.commandNext(); } else if (cmd.equals("kill")) { evaluator.commandKill(t); diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.jfr/share/classes/jdk/jfr/internal/EventClassBuilder.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventClassBuilder.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventClassBuilder.java Fri Oct 05 16:14:28 2018 -0700 @@ -70,7 +70,7 @@ endClass(); byte[] bytes = classWriter.toByteArray(); ASMToolkit.logASM(fullClassName, bytes); - return SecuritySupport.defineClass(type.getInternalName(), bytes, Event.class.getClassLoader()).asSubclass(Event.class); + return SecuritySupport.defineClass(Event.class, bytes).asSubclass(Event.class); } private void endClass() { diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.jfr/share/classes/jdk/jfr/internal/EventHandlerCreator.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/EventHandlerCreator.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/EventHandlerCreator.java Fri Oct 05 16:14:28 2018 -0700 @@ -134,7 +134,7 @@ buildWriteMethod(); byte[] bytes = classWriter.toByteArray(); ASMToolkit.logASM(className, bytes); - return SecuritySupport.defineClass(className, bytes, Event.class.getClassLoader()).asSubclass(EventHandler.class); + return SecuritySupport.defineClass(EventHandler.class, bytes).asSubclass(EventHandler.class); } public static EventHandler instantiateEventHandler(Class handlerClass, boolean registered, EventType eventType, EventControl eventControl) throws Error { diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,6 +31,7 @@ import java.io.InputStream; import java.io.RandomAccessFile; import java.io.Reader; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -71,6 +72,7 @@ */ public final class SecuritySupport { private final static Unsafe unsafe = Unsafe.getUnsafe(); + private final static MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); private final static Module JFR_MODULE = Event.class.getModule(); public final static SafePath JFC_DIRECTORY = getPathInProperty("java.home", "lib/jfr"); @@ -381,8 +383,17 @@ unsafe.ensureClassInitialized(clazz); } - static Class defineClass(String name, byte[] bytes, ClassLoader classLoader) { - return unsafe.defineClass(name, bytes, 0, bytes.length, classLoader, null); + static Class defineClass(Class lookupClass, byte[] bytes) { + return AccessController.doPrivileged(new PrivilegedAction<>() { + @Override + public Class run() { + try { + return MethodHandles.privateLookupIn(lookupClass, LOOKUP).defineClass(bytes); + } catch (IllegalAccessException e) { + throw new InternalError(e); + } + } + }); } static Thread createThreadWitNoPermissions(String threadName, Runnable runnable) { diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipDirectoryStream.java --- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipDirectoryStream.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipDirectoryStream.java Fri Oct 05 16:14:28 2018 -0700 @@ -41,21 +41,21 @@ class ZipDirectoryStream implements DirectoryStream { private final ZipFileSystem zipfs; - private final byte[] path; + private final ZipPath dir; private final DirectoryStream.Filter filter; private volatile boolean isClosed; private volatile Iterator itr; - ZipDirectoryStream(ZipPath zipPath, + ZipDirectoryStream(ZipPath dir, DirectoryStream.Filter filter) throws IOException { - this.zipfs = zipPath.getFileSystem(); - this.path = zipPath.getResolvedPath(); + this.zipfs = dir.getFileSystem(); + this.dir = dir; this.filter = filter; // sanity check - if (!zipfs.isDirectory(path)) - throw new NotDirectoryException(zipPath.toString()); + if (!zipfs.isDirectory(dir.getResolvedPath())) + throw new NotDirectoryException(dir.toString()); } @Override @@ -66,7 +66,7 @@ throw new IllegalStateException("Iterator has already been returned"); try { - itr = zipfs.iteratorOf(path, filter); + itr = zipfs.iteratorOf(dir, filter); } catch (IOException e) { throw new IllegalStateException(e); } @@ -98,5 +98,4 @@ isClosed = true; } - } diff -r 3c92ada330a9 -r e03e5f61c53f src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java --- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java Fri Oct 05 15:15:56 2018 -0700 +++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java Fri Oct 05 16:14:28 2018 -0700 @@ -399,23 +399,32 @@ } // returns the list of child paths of "path" - Iterator iteratorOf(byte[] path, + Iterator iteratorOf(ZipPath dir, DirectoryStream.Filter filter) throws IOException { beginWrite(); // iteration of inodes needs exclusive lock try { ensureOpen(); + byte[] path = dir.getResolvedPath(); IndexNode inode = getInode(path); if (inode == null) throw new NotDirectoryException(getString(path)); List list = new ArrayList<>(); IndexNode child = inode.child; while (child != null) { - // assume all path from zip file itself is "normalized" - ZipPath zp = new ZipPath(this, child.name, true); - if (filter == null || filter.accept(zp)) - list.add(zp); + // (1) assume all path from zip file itself is "normalized" + // (2) IndexNode.name is absolute. see IndexNode(byte[],int,int) + // (3) if parent "dir" is relative when ZipDirectoryStream + // is created, the returned child path needs to be relative + // as well. + byte[] cname = child.name; + if (!dir.isAbsolute()) { + cname = Arrays.copyOfRange(cname, 1, cname.length); + } + ZipPath zpath = new ZipPath(this, cname, true); + if (filter == null || filter.accept(zpath)) + list.add(zpath); child = child.sibling; } return list.iterator(); diff -r 3c92ada330a9 -r e03e5f61c53f test/TestCommon.gmk --- a/test/TestCommon.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/test/TestCommon.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -118,7 +118,7 @@ ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR) endif -# Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test) +# If unset, set up the PRODUCT_HOME variable to the jdk to test ifndef PRODUCT_HOME # Try to use images/jdk if it exists ABS_JDK_IMAGE = $(ABS_PLATFORM_BUILD_ROOT)/images/jdk @@ -145,28 +145,12 @@ JTREG_BASIC_OPTIONS += -e:_NT_SYMBOL_PATH='$(_NT_SYMBOL_PATH)' endif -# Expect JPRT to set JPRT_PRODUCT_ARGS (e.g. -server etc.) -# Should be passed into 'java' only. -# Could include: -d64 -server -client OR any java option -ifdef JPRT_PRODUCT_ARGS - JAVA_ARGS = $(JPRT_PRODUCT_ARGS) -endif - -# Expect JPRT to set JPRT_PRODUCT_VM_ARGS (e.g. -Xcomp etc.) -# Should be passed into anything running the vm (java, javac, javadoc, ...). -ifdef JPRT_PRODUCT_VM_ARGS - JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS) -endif - ifneq ($(NATIVE_TEST_PATH), ) # jtreg -nativepath

# - # Local make tests will be TEST_IMAGE_DIR and JPRT with jprt.use.reg.test.bundle=true - # should be JPRT_TESTNATIVE_PATH + # Local make tests will be TEST_IMAGE_DIR ifdef TEST_IMAGE_DIR TESTNATIVE_DIR = $(TEST_IMAGE_DIR) - else ifdef JPRT_TESTNATIVE_PATH - TESTNATIVE_DIR = $(JPRT_TESTNATIVE_PATH) endif ifdef TESTNATIVE_DIR JTREG_NATIVE_PATH = -nativepath:$(shell $(GETMIXEDPATH) "$(TESTNATIVE_DIR)/$(NATIVE_TEST_PATH)") @@ -208,11 +192,6 @@ TEST_PREREQS += $(CDS_ARCHIVE_FILE) endif -# Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results) -ifdef JPRT_ARCHIVE_BUNDLE - ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE) -endif - # How to create the test bundle (pass or fail, we want to create this) # Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed. ifneq ($(ARCHIVE_BUNDLE), ) @@ -340,9 +319,6 @@ # Expect JT_HOME to be set for jtreg tests. (home for jtreg) ifndef JT_HOME JT_HOME = $(SLASH_JAVA)/re/jtreg/$(USE_JTREG_VERSION)/promoted/latest/binaries/jtreg - ifdef JPRT_JTREG_HOME - JT_HOME = $(JPRT_JTREG_HOME) - endif endif # Problematic tests to be excluded @@ -358,7 +334,7 @@ # ------------------------------------------------------------------ -# When called from JPRT the TESTDIRS variable is set to the jtreg tests to run +# The TESTDIRS variable can be used to select the jtreg tests to run ifdef TESTDIRS TEST_SELECTION = $(TESTDIRS) endif diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/ProblemList.txt --- a/test/hotspot/jtreg/ProblemList.txt Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/ProblemList.txt Fri Oct 05 16:14:28 2018 -0700 @@ -84,7 +84,6 @@ runtime/CompressedOops/UseCompressedOops.java 8079353 generic-all runtime/RedefineTests/RedefineRunningMethods.java 8208778 macosx-x64 runtime/SharedArchiveFile/SASymbolTableTest.java 8193639 solaris-all -runtime/XCheckJniJsig/XCheckJSig.java 8211084 macosx-x64 ############################################################################# diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/TEST.groups --- a/test/hotspot/jtreg/TEST.groups Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/TEST.groups Fri Oct 05 16:14:28 2018 -0700 @@ -139,7 +139,8 @@ -compiler/runtime/Test6826736.java tier1_compiler_not_xcomp = \ - compiler/aot + compiler/aot \ + compiler/profiling tier1_compiler_not_cms = \ compiler/aot \ @@ -258,7 +259,7 @@ hotspot_appcds = \ runtime/appcds/ -# A subset of AppCDS tests to be run in JPRT push +# A subset of AppCDS tests to be run in tier1 tier1_runtime_appcds = \ runtime/appcds/HelloTest.java \ runtime/appcds/sharedStrings/SharedStringsBasic.java \ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/compiler/jsr292/NonInlinedCall/RedefineTest.java --- a/test/hotspot/jtreg/compiler/jsr292/NonInlinedCall/RedefineTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/compiler/jsr292/NonInlinedCall/RedefineTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, 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 @@ -48,7 +48,6 @@ package compiler.jsr292.NonInlinedCall; -import jdk.internal.misc.Unsafe; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.vm.annotation.DontInline; @@ -68,13 +67,15 @@ public class RedefineTest { static final MethodHandles.Lookup LOOKUP = MethodHandleHelper.IMPL_LOOKUP; - static final Unsafe UNSAFE = Unsafe.getUnsafe(); - static final String NAME = "compiler/jsr292/NonInlinedCall/RedefineTest$T"; static Class getClass(int r) { byte[] classFile = getClassFile(r); - return UNSAFE.defineClass(NAME, classFile, 0, classFile.length, null, null); + try { + return MethodHandles.lookup().defineClass(classFile); + } catch (IllegalAccessException e) { + throw new Error(e); + } } /** diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/compiler/profiling/TestSpecTrapClassUnloading.java --- a/test/hotspot/jtreg/compiler/profiling/TestSpecTrapClassUnloading.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/compiler/profiling/TestSpecTrapClassUnloading.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -28,6 +28,7 @@ * * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation * -XX:-UseOnStackReplacement -XX:-BackgroundCompilation + * -XX:CompileThreshold=10000 * -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 * -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke * -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/compiler/profiling/TestTypeProfiling.java --- a/test/hotspot/jtreg/compiler/profiling/TestTypeProfiling.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/compiler/profiling/TestTypeProfiling.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,10 +31,12 @@ * @run driver ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI * -XX:-BackgroundCompilation -XX:-UseOnStackReplacement + * -XX:CompileThreshold=10000 * -server -XX:-TieredCompilation -XX:TypeProfileLevel=020 * compiler.profiling.TestTypeProfiling * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI * -XX:-BackgroundCompilation -XX:-UseOnStackReplacement + * -XX:CompileThreshold=10000 * -server -XX:-TieredCompilation -XX:TypeProfileLevel=200 * compiler.profiling.TestTypeProfiling */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/compiler/profiling/spectrapredefineclass/Launcher.java --- a/test/hotspot/jtreg/compiler/profiling/spectrapredefineclass/Launcher.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/compiler/profiling/spectrapredefineclass/Launcher.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -32,6 +32,7 @@ * @run driver ClassFileInstaller compiler.profiling.spectrapredefineclass.Agent * @run driver compiler.profiling.spectrapredefineclass.Launcher * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation + * -XX:CompileThreshold=10000 * -XX:-UseOnStackReplacement -XX:TypeProfileLevel=222 * -XX:ReservedCodeCacheSize=3M -Djdk.attach.allowAttachSelf * compiler.profiling.spectrapredefineclass.Agent diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/compiler/profiling/spectrapredefineclass_classloaders/Launcher.java --- a/test/hotspot/jtreg/compiler/profiling/spectrapredefineclass_classloaders/Launcher.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/compiler/profiling/spectrapredefineclass_classloaders/Launcher.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -35,6 +35,7 @@ * @run driver ClassFileInstaller compiler.profiling.spectrapredefineclass_classloaders.Agent * @run driver compiler.profiling.spectrapredefineclass_classloaders.Launcher * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation + * -XX:CompileThreshold=10000 * -XX:-UseOnStackReplacement -XX:TypeProfileLevel=222 * -XX:ReservedCodeCacheSize=3M -Djdk.attach.allowAttachSelf * compiler.profiling.spectrapredefineclass_classloaders.Agent diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/compiler/uncommontrap/TestDeoptOOM.java --- a/test/hotspot/jtreg/compiler/uncommontrap/TestDeoptOOM.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/compiler/uncommontrap/TestDeoptOOM.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -26,6 +26,7 @@ * @bug 6898462 8198826 * @summary failed reallocations of scalar replaced objects during deoptimization causes crash * + * @requires !vm.graal.enabled * @run main/othervm -XX:-BackgroundCompilation -Xmx128M -XX:+IgnoreUnrecognizedVMOptions -XX:+VerifyStack * -XX:CompileCommand=exclude,compiler.uncommontrap.TestDeoptOOM::main * -XX:CompileCommand=exclude,compiler.uncommontrap.TestDeoptOOM::m9_1 diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/compiler/unsafe/UnsafeGetConstantField.java --- a/test/hotspot/jtreg/compiler/unsafe/UnsafeGetConstantField.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/compiler/unsafe/UnsafeGetConstantField.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,6 +32,9 @@ * java.base/jdk.internal.vm.annotation * java.base/jdk.internal.misc * + * @library ../jsr292/patches + * @build java.base/java.lang.invoke.MethodHandleHelper + * * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions * -Xbatch -XX:-TieredCompilation * -XX:+FoldStableValues @@ -64,6 +67,9 @@ import jdk.test.lib.Asserts; import jdk.test.lib.Platform; +import java.lang.invoke.MethodHandleHelper; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -393,8 +399,9 @@ } Test generate() { - Class c = U.defineClass(className, classFile, 0, classFile.length, THIS_CLASS.getClassLoader(), null); try { + Lookup lookup = MethodHandleHelper.IMPL_LOOKUP.in(MethodHandles.class); + Class c = lookup.defineClass(classFile); return (Test) c.newInstance(); } catch(Exception e) { throw new Error(e); diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/gc/logging/TestMetaSpaceLog.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/gc/logging/TestMetaSpaceLog.java Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, Google 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. + */ + +import java.io.File; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import jdk.test.lib.Asserts; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; +import sun.hotspot.WhiteBox; + +/* + * @test TestMetaSpaceLog + * @bug 8211123 + * @summary Ensure that the Metaspace is updated in the log + * @requires vm.gc=="null" + * @key gc + * @library /test/lib + * @modules java.base/jdk.internal.misc + * java.management + * + * @compile TestMetaSpaceLog.java + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * @run main TestMetaSpaceLog + */ + +public class TestMetaSpaceLog { + private static Pattern metaSpaceRegexp; + + static { + // Do this once here. + metaSpaceRegexp = Pattern.compile(".*Metaspace: ([0-9]+).*->([0-9]+).*"); + } + + public static void main(String[] args) throws Exception { + testMetaSpaceUpdate("UseParallelGC"); + testMetaSpaceUpdate("UseG1GC"); + testMetaSpaceUpdate("UseConcMarkSweepGC"); + testMetaSpaceUpdate("UseSerialGC"); + } + + private static void verifyContainsMetaSpaceUpdate(OutputAnalyzer output) { + Predicate collectedMetaSpace = line -> check(line); + + // At least one metaspace line from GC should show GC being collected. + boolean foundCollectedMetaSpace = output.asLines().stream() + .filter(s -> s.contains("[gc,metaspace")) + .anyMatch(TestMetaSpaceLog::check); + Asserts.assertTrue(foundCollectedMetaSpace); + } + + private static boolean check(String line) { + Matcher m = metaSpaceRegexp.matcher(line); + Asserts.assertTrue(m.matches(), "Unexpected line for metaspace logging: " + line); + long before = Long.parseLong(m.group(1)); + long after = Long.parseLong(m.group(2)); + return before > after; + } + + private static void testMetaSpaceUpdate(String gcFlag) throws Exception { + // Propagate test.src for the jar file. + String testSrc= "-Dtest.src=" + System.getProperty("test.src", "."); + + System.err.println("Testing with GC Flag: " + gcFlag); + ProcessBuilder pb = + ProcessTools.createJavaProcessBuilder( + "-XX:+" + gcFlag, + "-Xlog:gc*", + "-Xbootclasspath/a:.", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+WhiteBoxAPI", + "-Xmx1000M", + "-Xms1000M", + testSrc, StressMetaSpace.class.getName()); + + OutputAnalyzer output = null; + try { + output = new OutputAnalyzer(pb.start()); + verifyContainsMetaSpaceUpdate(output); + } catch (Exception e) { + // For error diagnosis: print and throw. + e.printStackTrace(); + output.reportDiagnosticSummary(); + throw e; + } + } + + static class StressMetaSpace { + private static URL[] urls = new URL[1]; + + static { + try { + File jarFile = new File(System.getProperty("test.src") + "/testcases.jar"); + urls[0] = jarFile.toURI().toURL(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String args[]) { + WhiteBox wb = WhiteBox.getWhiteBox(); + for(int i = 0; i < 10000; i++) { + loadClass(wb); + } + wb.fullGC(); + } + + public static void loadClass(WhiteBox wb) { + try { + URLClassLoader ucl = new URLClassLoader(urls); + Class.forName("case00", false, ucl); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/gc/logging/testcases.jar Binary file test/hotspot/jtreg/gc/logging/testcases.jar has changed diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/jprt.config --- a/test/hotspot/jtreg/jprt.config Fri Oct 05 15:15:56 2018 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,185 +0,0 @@ -#!echo "This is not a shell script" -############################################################################# -# -# Copyright (c) 2006, 2007, 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. -# -############################################################################# - -############################################################################# -# -# JPRT shell configuration for testing. -# -# Input environment variables: -# Windows Only: -# PATH -# ROOTDIR -# -# Output variable settings: -# make Full path to GNU make -# -# Output environment variables: -# PATH -# -############################################################################# - -############################################################################# -# Error -error() # message -{ - echo "ERROR: $1" - exit 6 -} -# Directory must exist -dirMustExist() # dir name -{ - if [ ! -d "$1" ] ; then - error "Directory for $2 does not exist: $1" - fi -} -# File must exist -fileMustExist() # dir name -{ - if [ ! -f "$1" ] ; then - error "File for $2 does not exist: $1" - fi -} -############################################################################# - -# Should be set by JPRT as the 3 basic inputs -slashjava="${ALT_SLASH_JAVA}" -if [ "${slashjava}" = "" ] ; then - slashjava=/java -fi - -# Check input -dirMustExist "${slashjava}" ALT_SLASH_JAVA - -# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise. -osname=`uname -s` -case "${osname}" in - SunOS ) - # SOLARIS: Sparc or X86 - osarch=`uname -p` - if [ "${osarch}" = sparc ] ; then - solaris_arch=sparc - else - solaris_arch=i386 - fi - - # Add basic solaris system paths - path4sdk=/usr/bin - - # Find GNU make - make=/usr/bin/gmake - if [ ! -f ${make} ] ; then - make=/usr/gnu/bin/make - if [ ! -f ${make} ] ; then - make=${slashjava}/devtools/${solaris_arch}/bin/gnumake - fi - fi - fileMustExist "${make}" make - - # File creation mask - umask 002 - ;; - - Linux | Darwin ) - # Add basic paths - path4sdk=/usr/bin:/bin:/usr/sbin:/sbin - - # Find GNU make - make=/usr/bin/make - fileMustExist "${make}" make - - umask 002 - ;; - - FreeBSD | OpenBSD ) - # Add basic paths - path4sdk=/usr/bin:/bin:/usr/sbin:/sbin - - # Find GNU make - make=/usr/local/bin/gmake - fileMustExist "${make}" make - - umask 002 - ;; - - NetBSD ) - # Add basic paths - path4sdk=/usr/bin:/bin:/usr/sbin:/sbin - - # Find GNU make - make=/usr/pkg/bin/gmake - fileMustExist "${make}" make - - umask 002 - ;; - - * ) - # Windows: Differs on CYGWIN vs. MKS. - - # We need to determine if we are running a CYGWIN shell or an MKS shell - # (if uname isn't available, then it will be unix_toolset=unknown) - unix_toolset=unknown - if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then - # We kind of assume ROOTDIR is where MKS is and it's ok - unix_toolset=MKS - mkshome=`dosname -s "${ROOTDIR}"` - # Most unix utilities are in the mksnt directory of ROOTDIR - unixcommand_path="${mkshome}/mksnt" - path4sdk="${unixcommand_path}" - devtools_path="${slashjava}/devtools/win32/bin" - path4sdk="${devtools_path};${path4sdk}" - # Find GNU make - make="${devtools_path}/gnumake.exe" - fileMustExist "${make}" make - elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then - # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist - unix_toolset=CYGWIN - # Most unix utilities are in the /usr/bin - unixcommand_path="/usr/bin" - path4sdk="${unixcommand_path}" - # Find GNU make - make="${unixcommand_path}/make.exe" - fileMustExist "${make}" make - else - echo "WARNING: Cannot figure out if this is MKS or CYGWIN" - fi - - - # For windows, it's hard to know where the system is, so we just add this - # to PATH. - slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`" - path4sdk="${slash_path};${PATH}" - - # Convert path4sdk to cygwin style - if [ "${unix_toolset}" = CYGWIN ] ; then - path4sdk="`/usr/bin/cygpath -p ${path4sdk}`" - fi - ;; -esac - -# Export PATH setting -PATH="${path4sdk}" -export PATH - diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/CommandLine/ObsoleteFlagErrorMessage.java --- a/test/hotspot/jtreg/runtime/CommandLine/ObsoleteFlagErrorMessage.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/CommandLine/ObsoleteFlagErrorMessage.java Fri Oct 05 16:14:28 2018 -0700 @@ -45,10 +45,10 @@ // Case 2: Newly obsolete flags should be recognized as newly obsolete (8073989) ProcessBuilder pb2 = ProcessTools.createJavaProcessBuilder( - "-XX:+SafepointSpinBeforeYield", "-version"); + "-XX:+EmitSync", "-version"); OutputAnalyzer output2 = new OutputAnalyzer(pb2.start()); output2.shouldContain("Ignoring option").shouldContain("support was removed"); - output2.shouldContain("SafepointSpinBeforeYield"); + output2.shouldContain("EmitSync"); } } diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java --- a/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java Fri Oct 05 16:14:28 2018 -0700 @@ -44,7 +44,6 @@ {"MaxRAMFraction", "8"}, {"MinRAMFraction", "2"}, {"InitialRAMFraction", "64"}, - {"AssumeMP", "false"}, {"UseMembar", "true"}, {"TLABStats", "false"}, diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/Dictionary/CleanProtectionDomain.java --- a/test/hotspot/jtreg/runtime/Dictionary/CleanProtectionDomain.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/Dictionary/CleanProtectionDomain.java Fri Oct 05 16:14:28 2018 -0700 @@ -57,11 +57,10 @@ static class Test { public static void test() throws Exception { - Unsafe unsafe = Unsafe.getUnsafe(); TestClassLoader classloader = new TestClassLoader(); ProtectionDomain pd = new ProtectionDomain(null, null); byte klassbuf[] = InMemoryJavaCompiler.compile("TestClass", "class TestClass { }"); - Class klass = unsafe.defineClass(null, klassbuf, 0, klassbuf.length, classloader, pd); + Class klass = classloader.defineClass("TestClass", klassbuf, pd); } public static void main(String[] args) throws Exception { @@ -91,6 +90,10 @@ public TestClassLoader() { super(); } + + public Class defineClass(String name, byte[] bytes, ProtectionDomain pd) { + return defineClass(name, bytes, 0, bytes.length, pd); + } } } } diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/ArchiveDoesNotExist.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/ArchiveDoesNotExist.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/ArchiveDoesNotExist.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run main ArchiveDoesNotExist + * @run driver ArchiveDoesNotExist */ import jdk.test.lib.cds.CDSOptions; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @bug 8025642 * @modules java.base/jdk.internal.misc * java.management - * @run main CdsDifferentObjectAlignment + * @run driver CdsDifferentObjectAlignment */ import jdk.test.lib.cds.CDSTestUtils; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/CdsSameObjectAlignment.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/CdsSameObjectAlignment.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/CdsSameObjectAlignment.java Fri Oct 05 16:14:28 2018 -0700 @@ -30,7 +30,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run main CdsSameObjectAlignment + * @run driver CdsSameObjectAlignment */ import jdk.test.lib.Platform; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/DumpSharedDictionary.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/DumpSharedDictionary.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/DumpSharedDictionary.java Fri Oct 05 16:14:28 2018 -0700 @@ -28,7 +28,7 @@ * @requires vm.cds * @library /test/lib * @modules java.base/jdk.internal.misc - * @run main DumpSharedDictionary + * @run driver DumpSharedDictionary */ import jdk.test.lib.cds.CDSTestUtils; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/NonBootLoaderClasses.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/NonBootLoaderClasses.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/NonBootLoaderClasses.java Fri Oct 05 16:14:28 2018 -0700 @@ -28,7 +28,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run main NonBootLoaderClasses + * @run driver NonBootLoaderClasses */ import jdk.test.lib.cds.CDSOptions; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/SharedBaseAddress.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedBaseAddress.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedBaseAddress.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run main SharedBaseAddress + * @run driver SharedBaseAddress */ import jdk.test.lib.cds.CDSTestUtils; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStrings.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStrings.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStrings.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * java.management * @build SharedStringsWb sun.hotspot.WhiteBox * @run driver ClassFileInstaller -jar whitebox.jar sun.hotspot.WhiteBox - * @run main SharedStrings + * @run driver SharedStrings */ import jdk.test.lib.cds.CDSTestUtils; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStringsDedup.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStringsDedup.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStringsDedup.java Fri Oct 05 16:14:28 2018 -0700 @@ -28,7 +28,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run main SharedStringsDedup + * @run driver SharedStringsDedup */ import jdk.test.lib.cds.CDSTestUtils; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStringsRunAuto.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStringsRunAuto.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/SharedStringsRunAuto.java Fri Oct 05 16:14:28 2018 -0700 @@ -28,7 +28,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run main SharedStringsRunAuto + * @run driver SharedStringsRunAuto */ import jdk.test.lib.cds.CDSTestUtils; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/SharedArchiveFile/TestInterpreterMethodEntries.java --- a/test/hotspot/jtreg/runtime/SharedArchiveFile/TestInterpreterMethodEntries.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/SharedArchiveFile/TestInterpreterMethodEntries.java Fri Oct 05 16:14:28 2018 -0700 @@ -30,7 +30,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * java.management - * @run main TestInterpreterMethodEntries + * @run driver TestInterpreterMethodEntries */ import java.lang.Math; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/XCheckJniJsig/XCheckJSig.java --- a/test/hotspot/jtreg/runtime/XCheckJniJsig/XCheckJSig.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/XCheckJniJsig/XCheckJSig.java Fri Oct 05 16:14:28 2018 -0700 @@ -44,29 +44,21 @@ System.out.println("Regression test for bugs 7051189 and 8023393"); String jdk_path = System.getProperty("test.jdk"); - String os_arch = Platform.getOsArch(); String libjsig; String env_var; if (Platform.isOSX()) { env_var = "DYLD_INSERT_LIBRARIES"; - libjsig = jdk_path + "/jre/lib/libjsig.dylib"; // jdk location - if (!(new File(libjsig).exists())) { - libjsig = jdk_path + "/lib/libjsig.dylib"; // jre location - } + libjsig = jdk_path + "/lib/libjsig.dylib"; // jre location } else { env_var = "LD_PRELOAD"; - libjsig = jdk_path + "/jre/lib/" + os_arch + "/libjsig.so"; // jdk location - if (!(new File(libjsig).exists())) { - libjsig = jdk_path + "/lib/" + os_arch + "/libjsig.so"; // jre location - } + libjsig = jdk_path + "/lib/libjsig.so"; // jre location } // If this test fails, these might be useful to know. System.out.println("libjsig: " + libjsig); - System.out.println("osArch: " + os_arch); // Make sure the libjsig file exists. if (!(new File(libjsig).exists())) { - throw new jtreg.SkippedException("File " + libjsig + " not found"); + throw new RuntimeException("File libjsig not found, path: " + libjsig); } ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xcheck:jni", "-version"); diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/AppendClasspath.java --- a/test/hotspot/jtreg/runtime/appcds/AppendClasspath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/AppendClasspath.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java * @compile test-classes/HelloMore.java - * @run main AppendClasspath + * @run driver AppendClasspath */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/BootClassPathMismatch.java --- a/test/hotspot/jtreg/runtime/appcds/BootClassPathMismatch.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/BootClassPathMismatch.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main BootClassPathMismatch + * @run driver BootClassPathMismatch */ import jdk.test.lib.cds.CDSOptions; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/CDSandJFR.java --- a/test/hotspot/jtreg/runtime/appcds/CDSandJFR.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/CDSandJFR.java Fri Oct 05 16:14:28 2018 -0700 @@ -30,7 +30,7 @@ * @modules jdk.jfr * @build Hello GetFlightRecorder * @run driver ClassFileInstaller -jar CDSandJFR.jar Hello GetFlightRecorder GetFlightRecorder$TestEvent GetFlightRecorder$SimpleEvent - * @run main CDSandJFR + * @run driver CDSandJFR */ import jdk.test.lib.BuildHelper; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/CaseSensitiveClassPath.java --- a/test/hotspot/jtreg/runtime/appcds/CaseSensitiveClassPath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/CaseSensitiveClassPath.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * jdk.jartool/sun.tools.jar * @requires os.family != "mac" * @compile test-classes/Hello.java - * @run main CaseSensitiveClassPath + * @run driver CaseSensitiveClassPath */ import java.nio.file.FileAlreadyExistsException; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/ClassLoaderTest.java --- a/test/hotspot/jtreg/runtime/appcds/ClassLoaderTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/ClassLoaderTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -36,7 +36,7 @@ * @compile test-classes/BootClassPathAppendHelper.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main ClassLoaderTest + * @run driver ClassLoaderTest */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/ClassPathAttr.java --- a/test/hotspot/jtreg/runtime/appcds/ClassPathAttr.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/ClassPathAttr.java Fri Oct 05 16:14:28 2018 -0700 @@ -30,7 +30,7 @@ * @modules java.base/jdk.internal.misc * java.management * jdk.jartool/sun.tools.jar - * @run main ClassPathAttr + * @run driver ClassPathAttr */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/CommandLineFlagComboNegative.java --- a/test/hotspot/jtreg/runtime/appcds/CommandLineFlagComboNegative.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/CommandLineFlagComboNegative.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main CommandLineFlagComboNegative + * @run driver CommandLineFlagComboNegative */ import java.util.ArrayList; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/DirClasspathTest.java --- a/test/hotspot/jtreg/runtime/appcds/DirClasspathTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/DirClasspathTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -28,7 +28,7 @@ * @requires vm.cds * @library /test/lib * @compile test-classes/Hello.java - * @run main DirClasspathTest + * @run driver DirClasspathTest */ import jdk.test.lib.Platform; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/DumpClassList.java --- a/test/hotspot/jtreg/runtime/appcds/DumpClassList.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/DumpClassList.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @compile test-classes/ArrayListTest.java - * @run main DumpClassList + * @run driver DumpClassList */ import jdk.test.lib.compiler.InMemoryJavaCompiler; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/ExtraSymbols.java --- a/test/hotspot/jtreg/runtime/appcds/ExtraSymbols.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/ExtraSymbols.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main ExtraSymbols + * @run driver ExtraSymbols */ import java.io.*; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/FieldAnnotationsTest.java --- a/test/hotspot/jtreg/runtime/appcds/FieldAnnotationsTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/FieldAnnotationsTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, 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 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/FieldAnnotationsApp.java test-classes/MyAnnotation.java - * @run main FieldAnnotationsTest + * @run driver FieldAnnotationsTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/FreeUnusedMetadata.java --- a/test/hotspot/jtreg/runtime/appcds/FreeUnusedMetadata.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/FreeUnusedMetadata.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, 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 @@ -29,7 +29,7 @@ * @library /test/lib * @modules jdk.jartool/sun.tools.jar * @compile test-classes/MethodNoReturn.jasm test-classes/Hello.java - * @run main FreeUnusedMetadata + * @run driver FreeUnusedMetadata */ import java.nio.file.Files; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/HelloExtTest.java --- a/test/hotspot/jtreg/runtime/appcds/HelloExtTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/HelloExtTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -35,7 +35,7 @@ * @compile test-classes/HelloExt.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main HelloExtTest + * @run driver HelloExtTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/HelloTest.java --- a/test/hotspot/jtreg/runtime/appcds/HelloTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/HelloTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main HelloTest + * @run driver HelloTest */ public class HelloTest { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/IgnoreEmptyClassPaths.java --- a/test/hotspot/jtreg/runtime/appcds/IgnoreEmptyClassPaths.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/IgnoreEmptyClassPaths.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java * @compile test-classes/HelloMore.java - * @run main IgnoreEmptyClassPaths + * @run driver IgnoreEmptyClassPaths */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/JvmtiAddPath.java --- a/test/hotspot/jtreg/runtime/appcds/JvmtiAddPath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/JvmtiAddPath.java Fri Oct 05 16:14:28 2018 -0700 @@ -35,7 +35,7 @@ * @run driver ClassFileInstaller sun.hotspot.WhiteBox * @compile test-classes/Hello.java * @compile test-classes/JvmtiApp.java - * @run main JvmtiAddPath + * @run driver JvmtiAddPath */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/MissingSuperTest.java --- a/test/hotspot/jtreg/runtime/appcds/MissingSuperTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/MissingSuperTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -32,7 +32,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/MissingSuper.java - * @run main MissingSuperTest + * @run driver MissingSuperTest */ public class MissingSuperTest { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/MoveJDKTest.java --- a/test/hotspot/jtreg/runtime/appcds/MoveJDKTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/MoveJDKTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main MoveJDKTest + * @run driver MoveJDKTest */ // This test works only on Linux because it depends on symlinks and the name of the hotspot DLL (libjvm.so). diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/MultiProcessSharing.java --- a/test/hotspot/jtreg/runtime/appcds/MultiProcessSharing.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/MultiProcessSharing.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox * @compile test-classes/MultiProcClass.java - * @run main MultiProcessSharing + * @run driver MultiProcessSharing */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/OldClassTest.java --- a/test/hotspot/jtreg/runtime/appcds/OldClassTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/OldClassTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java * @run build TestCommon JarBuilder - * @run main OldClassTest + * @run driver OldClassTest */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/PackageSealing.java --- a/test/hotspot/jtreg/runtime/appcds/PackageSealing.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/PackageSealing.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -32,7 +32,7 @@ * @compile test-classes/C1.java * @compile test-classes/C2.java * @compile test-classes/PackageSealingTest.java - * @run main PackageSealing + * @run driver PackageSealing */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/ParallelLoad2.java --- a/test/hotspot/jtreg/runtime/appcds/ParallelLoad2.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/ParallelLoad2.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/ParallelLoad.java * @compile test-classes/ParallelClasses.java - * @run main ParallelLoad2 + * @run driver ParallelLoad2 */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/ParallelLoadTest.java --- a/test/hotspot/jtreg/runtime/appcds/ParallelLoadTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/ParallelLoadTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/ParallelLoad.java * @compile test-classes/ParallelClasses.java - * @run main ParallelLoadTest + * @run driver ParallelLoadTest */ public class ParallelLoadTest { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/ProhibitedPackage.java --- a/test/hotspot/jtreg/runtime/appcds/ProhibitedPackage.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/ProhibitedPackage.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/ProhibitedHelper.java test-classes/Prohibited.jasm - * @run main ProhibitedPackage + * @run driver ProhibitedPackage */ import jdk.test.lib.cds.CDSOptions; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/ProtectionDomain.java --- a/test/hotspot/jtreg/runtime/appcds/ProtectionDomain.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/ProtectionDomain.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * @compile test-classes/ProtDomain.java * @compile test-classes/ProtDomainB.java * @compile test-classes/JimageClassProtDomain.java - * @run main ProtectionDomain + * @run driver ProtectionDomain */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/RewriteBytecodesTest.java --- a/test/hotspot/jtreg/runtime/appcds/RewriteBytecodesTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/RewriteBytecodesTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * @compile test-classes/RewriteBytecodes.java test-classes/Util.java test-classes/Super.java test-classes/Child.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main RewriteBytecodesTest + * @run driver RewriteBytecodesTest */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/SharedPackages.java --- a/test/hotspot/jtreg/runtime/appcds/SharedPackages.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/SharedPackages.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/PackageTest.java * @compile test-classes/JimageClassPackage.java - * @run main SharedPackages + * @run driver SharedPackages */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/SignedJar.java --- a/test/hotspot/jtreg/runtime/appcds/SignedJar.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/SignedJar.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, 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 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main SignedJar + * @run driver SignedJar */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/SpecifySysLoaderProp.java --- a/test/hotspot/jtreg/runtime/appcds/SpecifySysLoaderProp.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/SpecifySysLoaderProp.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * @compile test-classes/TestClassLoader.java * @compile test-classes/ReportMyLoader.java * @compile test-classes/TrySwitchMyLoader.java - * @run main SpecifySysLoaderProp + * @run driver SpecifySysLoaderProp */ import java.io.*; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/TestWithProfiler.java --- a/test/hotspot/jtreg/runtime/appcds/TestWithProfiler.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/TestWithProfiler.java Fri Oct 05 16:14:28 2018 -0700 @@ -36,7 +36,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/MyThread.java * @compile test-classes/TestWithProfilerHelper.java - * @run main TestWithProfiler + * @run driver TestWithProfiler */ import jdk.test.lib.BuildHelper; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/TraceLongClasspath.java --- a/test/hotspot/jtreg/runtime/appcds/TraceLongClasspath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/TraceLongClasspath.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main TraceLongClasspath + * @run driver TraceLongClasspath */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/WideIloadTest.java --- a/test/hotspot/jtreg/runtime/appcds/WideIloadTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/WideIloadTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, 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 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Iloadw.jasm * @compile test-classes/IloadwMain.java - * @run main WideIloadTest + * @run driver WideIloadTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/WrongClasspath.java --- a/test/hotspot/jtreg/runtime/appcds/WrongClasspath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/WrongClasspath.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main WrongClasspath + * @run driver WrongClasspath */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/XShareAutoWithChangedJar.java --- a/test/hotspot/jtreg/runtime/appcds/XShareAutoWithChangedJar.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/XShareAutoWithChangedJar.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java - * @run main XShareAutoWithChangedJar + * @run driver XShareAutoWithChangedJar */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedIntegerCacheTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedIntegerCacheTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedIntegerCacheTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile CheckIntegerCacheApp.java * @run driver ClassFileInstaller -jar integer.jar CheckIntegerCacheApp * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main ArchivedIntegerCacheTest + * @run driver ArchivedIntegerCacheTest */ import java.nio.file.Files; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleComboTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleComboTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleComboTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile CheckArchivedModuleApp.java * @run driver ClassFileInstaller -jar app.jar CheckArchivedModuleApp * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main ArchivedModuleComboTest + * @run driver ArchivedModuleComboTest */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleCompareTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleCompareTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleCompareTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @compile PrintSystemModulesApp.java * @run driver ClassFileInstaller -jar app.jar PrintSystemModulesApp - * @run main ArchivedModuleCompareTest + * @run driver ArchivedModuleCompareTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleWithCustomImageTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleWithCustomImageTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/ArchivedModuleWithCustomImageTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile CheckArchivedModuleApp.java * @run driver ClassFileInstaller -jar app.jar CheckArchivedModuleApp * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main ArchivedModuleWithCustomImageTest + * @run driver ArchivedModuleWithCustomImageTest */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/CheckCachedMirrorTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/CheckCachedMirrorTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/CheckCachedMirrorTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -37,7 +37,7 @@ * @run driver ClassFileInstaller -jar app.jar CheckCachedMirrorApp * @run driver ClassFileInstaller -jar hello.jar Hello * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main CheckCachedMirrorTest + * @run driver CheckCachedMirrorTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/CheckCachedResolvedReferences.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/CheckCachedResolvedReferences.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/CheckCachedResolvedReferences.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, 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 @@ -37,7 +37,7 @@ * @run driver ClassFileInstaller -jar app.jar CheckCachedResolvedReferencesApp * @run driver ClassFileInstaller -jar hello.jar Hello * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main CheckCachedResolvedReferences + * @run driver CheckCachedResolvedReferences */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/DifferentHeapSizes.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/DifferentHeapSizes.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/DifferentHeapSizes.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/DumpTimeVerifyFailure.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/DumpTimeVerifyFailure.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/DumpTimeVerifyFailure.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * @modules java.management * jdk.jartool/sun.tools.jar * @compile MyOuter.java MyException.java - * @run main DumpTimeVerifyFailure + * @run driver DumpTimeVerifyFailure */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/GCStressTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/GCStressTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/GCStressTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile GCStressApp.java * @run driver ClassFileInstaller -jar gcstress.jar GCStressApp * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main GCStressTest + * @run driver GCStressTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/MirrorWithReferenceFieldsTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/MirrorWithReferenceFieldsTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/MirrorWithReferenceFieldsTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile MirrorWithReferenceFieldsApp.java * @run driver ClassFileInstaller -jar app.jar MirrorWithReferenceFieldsApp * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main MirrorWithReferenceFieldsTest + * @run driver MirrorWithReferenceFieldsTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/OpenArchiveRegion.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/OpenArchiveRegion.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/OpenArchiveRegion.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2018, 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 @@ -32,7 +32,7 @@ * @modules java.management * jdk.jartool/sun.tools.jar * @compile ../test-classes/Hello.java - * @run main OpenArchiveRegion + * @run driver OpenArchiveRegion */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/PrimitiveTypesTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/PrimitiveTypesTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/PrimitiveTypesTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile PrimitiveTypesApp.java * @run driver ClassFileInstaller -jar app.jar PrimitiveTypesApp FieldsTest * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main PrimitiveTypesTest + * @run driver PrimitiveTypesTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/cacheObject/RedefineClassTest.java --- a/test/hotspot/jtreg/runtime/appcds/cacheObject/RedefineClassTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/cacheObject/RedefineClassTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * RedefineClassApp * InstrumentationClassFileTransformer * InstrumentationRegisterClassFileTransformer - * @run main RedefineClassTest + * @run driver RedefineClassTest */ import com.sun.tools.attach.VirtualMachine; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/condy/CondyHelloTest.java --- a/test/hotspot/jtreg/runtime/appcds/condy/CondyHelloTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/condy/CondyHelloTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @build sun.hotspot.WhiteBox CondyHelloTest CondyHelloApp * @run driver ClassFileInstaller -jar condy_hello.jar CondyHello CondyHelloApp * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main CondyHelloTest + * @run driver CondyHelloTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatA.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatA.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatA.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java test-classes/CustomLoadee.java test-classes/CustomLoadee2.java * test-classes/CustomInterface2_ia.java test-classes/CustomInterface2_ib.java - * @run main ClassListFormatA + * @run driver ClassListFormatA */ public class ClassListFormatA extends ClassListFormatBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatB.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatB.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatB.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java test-classes/CustomLoadee.java test-classes/CustomLoadee2.java * test-classes/CustomInterface2_ia.java test-classes/CustomInterface2_ib.java - * @run main ClassListFormatB + * @run driver ClassListFormatB */ public class ClassListFormatB extends ClassListFormatBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatC.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatC.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatC.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java test-classes/CustomLoadee.java test-classes/CustomLoadee2.java * test-classes/CustomInterface2_ia.java test-classes/CustomInterface2_ib.java - * @run main ClassListFormatC + * @run driver ClassListFormatC */ public class ClassListFormatC extends ClassListFormatBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatD.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatD.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatD.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java test-classes/CustomLoadee.java test-classes/CustomLoadee2.java * test-classes/CustomInterface2_ia.java test-classes/CustomInterface2_ib.java - * @run main ClassListFormatD + * @run driver ClassListFormatD */ public class ClassListFormatD extends ClassListFormatBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatE.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatE.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ClassListFormatE.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * jdk.jartool/sun.tools.jar * @compile test-classes/Hello.java test-classes/CustomLoadee.java test-classes/CustomLoadee2.java * test-classes/CustomInterface2_ia.java test-classes/CustomInterface2_ib.java - * @run main ClassListFormatE + * @run driver ClassListFormatE */ public class ClassListFormatE extends ClassListFormatBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/HelloCustom.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/HelloCustom.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/HelloCustom.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -35,7 +35,7 @@ * @run driver ClassFileInstaller -jar hello.jar Hello * @run driver ClassFileInstaller -jar hello_custom.jar CustomLoadee * @run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox - * @run main HelloCustom + * @run driver HelloCustom */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/LoaderSegregationTest.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/LoaderSegregationTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/LoaderSegregationTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -41,7 +41,7 @@ * ../test-classes/Util.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main LoaderSegregationTest + * @run driver LoaderSegregationTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ParallelTestMultiFP.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ParallelTestMultiFP.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ParallelTestMultiFP.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -32,7 +32,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile ../test-classes/ParallelLoad.java ../test-classes/ParallelClasses.java - * @run main ParallelTestMultiFP + * @run driver ParallelTestMultiFP */ public class ParallelTestMultiFP extends ParallelTestBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ParallelTestSingleFP.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ParallelTestSingleFP.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ParallelTestSingleFP.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -32,7 +32,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile ../test-classes/ParallelLoad.java ../test-classes/ParallelClasses.java - * @run main ParallelTestSingleFP + * @run driver ParallelTestSingleFP */ public class ParallelTestSingleFP extends ParallelTestBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ProhibitedPackageNamesTest.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ProhibitedPackageNamesTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ProhibitedPackageNamesTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -32,7 +32,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile ClassListFormatBase.java test-classes/Hello.java test-classes/InProhibitedPkg.java - * @run main ProhibitedPackageNamesTest + * @run driver ProhibitedPackageNamesTest */ public class ProhibitedPackageNamesTest extends ClassListFormatBase { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/ProtectionDomain.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/ProtectionDomain.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/ProtectionDomain.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/ProtDomain.java - * @run main ProtectionDomain + * @run driver ProtectionDomain */ public class ProtectionDomain { diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/SameNameInTwoLoadersTest.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/SameNameInTwoLoadersTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/SameNameInTwoLoadersTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -38,7 +38,7 @@ * test-classes/SameNameUnrelatedLoaders.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main SameNameInTwoLoadersTest + * @run driver SameNameInTwoLoadersTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/UnintendedLoadersTest.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/UnintendedLoadersTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/UnintendedLoadersTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * @compile test-classes/UnintendedLoaders.java test-classes/CustomLoadee.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main UnintendedLoadersTest + * @run driver UnintendedLoadersTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/UnloadUnregisteredLoaderTest.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/UnloadUnregisteredLoaderTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/UnloadUnregisteredLoaderTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -39,7 +39,7 @@ * @run driver ClassFileInstaller ClassUnloadCommon * @run driver ClassFileInstaller ClassUnloadCommon$1 * @run driver ClassFileInstaller ClassUnloadCommon$TestFailure - * @run main UnloadUnregisteredLoaderTest + * @run driver UnloadUnregisteredLoaderTest */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/customLoader/UnsupportedPlatforms.java --- a/test/hotspot/jtreg/runtime/appcds/customLoader/UnsupportedPlatforms.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/customLoader/UnsupportedPlatforms.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -31,7 +31,7 @@ * java.management * jdk.jartool/sun.tools.jar * @compile test-classes/SimpleHello.java - * @run main UnsupportedPlatforms + * @run driver UnsupportedPlatforms */ import jdk.test.lib.Platform; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/javaldr/ArrayTest.java --- a/test/hotspot/jtreg/runtime/appcds/javaldr/ArrayTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/javaldr/ArrayTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @compile ArrayTestHelper.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main ArrayTest + * @run driver ArrayTest */ import java.util.List; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/CheckUnsupportedDumpingOptions.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/CheckUnsupportedDumpingOptions.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/CheckUnsupportedDumpingOptions.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * jdk.internal.jvmstat/sun.jvmstat.monitor * @compile ../test-classes/Hello.java - * @run main CheckUnsupportedDumpingOptions + * @run driver CheckUnsupportedDumpingOptions */ import jdk.test.lib.compiler.InMemoryJavaCompiler; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/JigsawOptionsCombo.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/JigsawOptionsCombo.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/JigsawOptionsCombo.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * jdk.jartool/sun.tools.jar * jdk.internal.jvmstat/sun.jvmstat.monitor * @compile ../test-classes/Hello.java ../test-classes/HelloMore.java - * @run main JigsawOptionsCombo + * @run driver JigsawOptionsCombo */ import jdk.test.lib.compiler.InMemoryJavaCompiler; import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/AppClassInCP.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/AppClassInCP.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/AppClassInCP.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main AppClassInCP + * @run driver AppClassInCP */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/CustomPackage.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/CustomPackage.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/CustomPackage.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main CustomPackage + * @run driver CustomPackage */ import jdk.test.lib.compiler.InMemoryJavaCompiler; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/MismatchedPatchModule.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/MismatchedPatchModule.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/MismatchedPatchModule.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main MismatchedPatchModule + * @run driver MismatchedPatchModule */ import jdk.test.lib.compiler.InMemoryJavaCompiler; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/PatchDir.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/PatchDir.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/PatchDir.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main PatchDir + * @run driver PatchDir */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/PatchJavaBase.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/PatchJavaBase.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/PatchJavaBase.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main PatchJavaBase + * @run driver PatchJavaBase */ import jdk.test.lib.compiler.InMemoryJavaCompiler; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/Simple.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/Simple.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/Simple.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main Simple + * @run driver Simple */ import jdk.test.lib.compiler.InMemoryJavaCompiler; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/SubClassOfPatchedClass.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/SubClassOfPatchedClass.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/SubClassOfPatchedClass.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main SubClassOfPatchedClass + * @run driver SubClassOfPatchedClass */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/TwoJars.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/TwoJars.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/PatchModule/TwoJars.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * @modules java.base/jdk.internal.misc * jdk.jartool/sun.tools.jar * @build PatchMain - * @run main TwoJars + * @run driver TwoJars */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/BootAppendTests.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/BootAppendTests.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/BootAppendTests.java Fri Oct 05 16:14:28 2018 -0700 @@ -35,7 +35,7 @@ * @compile src/com/sun/tools/javac/MyMain.jasm * @compile src/sun/nio/cs/ext/MyClass.java * @compile src/sun/nio/cs/ext1/MyClass.java - * @run main BootAppendTests + * @run driver BootAppendTests */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/ClassPathTests.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/ClassPathTests.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/ClassPathTests.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile src/com/sun/tools/javac/Main.jasm * @compile src/com/sun/tools/javac/MyMain.jasm * @compile ../../../SharedArchiveFile/javax/annotation/processing/FilerException.jasm - * @run main ClassPathTests + * @run driver ClassPathTests * @summary AppCDS tests for testing classpath/package conflicts */ @@ -52,6 +52,7 @@ * same name and package. */ +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.file.Path; import java.nio.file.Paths; @@ -62,6 +63,8 @@ import jdk.test.lib.process.ProcessTools; import jdk.test.lib.process.OutputAnalyzer; +import jtreg.SkippedException; + public class ClassPathTests { private static final String TEST_SRC = System.getProperty("test.src"); @@ -83,7 +86,7 @@ private static String testArchiveName; - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { ClassPathTests tests = new ClassPathTests(); tests.dumpArchive(); @@ -92,7 +95,16 @@ for (Method m : methods) { if (m.getName().startsWith("test")) { System.out.println("About to run test method: " + m.getName()); - m.invoke(tests); + try { + m.invoke(tests); + } catch (InvocationTargetException ite) { + Throwable throwable = ite.getCause(); + if (throwable instanceof SkippedException) { + throw throwable; + } else { + throw ite; + } + } numOfTestMethodsRun++; } } diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/DummyClassesInBootClassPath.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/DummyClassesInBootClassPath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/DummyClassesInBootClassPath.java Fri Oct 05 16:14:28 2018 -0700 @@ -34,7 +34,7 @@ * @compile ../../../SharedArchiveFile/javax/annotation/processing/FilerException.jasm * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main DummyClassesInBootClassPath + * @run driver DummyClassesInBootClassPath */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java Fri Oct 05 16:14:28 2018 -0700 @@ -37,7 +37,7 @@ * jdk.internal.jvmstat/sun.jvmstat.monitor * @compile ../../test-classes/EmptyClassHelper.java * @compile ../../test-classes/com/sun/tools/javac/Main.jasm - * @run main EmptyClassInBootClassPath + * @run driver EmptyClassInBootClassPath */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddModules.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddModules.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddModules.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @modules jdk.compiler * jdk.jartool/sun.tools.jar * jdk.jlink - * @run main AddModules + * @run driver AddModules * @summary sanity test the --add-modules option */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddOpens.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddOpens.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddOpens.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @modules jdk.compiler * jdk.jartool/sun.tools.jar * jdk.jlink - * @run main AddOpens + * @run driver AddOpens * @summary sanity test the --add-opens option */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddReads.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddReads.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/AddReads.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @modules jdk.compiler * jdk.jartool/sun.tools.jar * jdk.jlink - * @run main AddReads + * @run driver AddReads * @summary sanity test the --add-reads option */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/ExportModule.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/ExportModule.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/ExportModule.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @modules jdk.compiler * jdk.jartool/sun.tools.jar * jdk.jlink - * @run main ExportModule + * @run driver ExportModule * @summary Tests involve exporting a module from the module path to a jar in the -cp. */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/JvmtiAddPath.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/JvmtiAddPath.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/JvmtiAddPath.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox * @compile ../../test-classes/JvmtiApp.java - * @run main JvmtiAddPath + * @run driver JvmtiAddPath */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/MainModuleOnly.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/MainModuleOnly.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/MainModuleOnly.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @modules jdk.compiler * jdk.jartool/sun.tools.jar * jdk.jlink - * @run main MainModuleOnly + * @run driver MainModuleOnly * @summary Test some scenarios with a main modular jar specified in the --module-path and -cp options in the command line. */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/ModulePathAndCP.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/ModulePathAndCP.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/modulepath/ModulePathAndCP.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @modules jdk.compiler * jdk.jartool/sun.tools.jar * jdk.jlink - * @run main ModulePathAndCP + * @run driver ModulePathAndCP * @summary 2 sets of tests: one with only --module-path in the command line; * another with both -cp and --module-path in the command line. */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jigsaw/overridetests/OverrideTests.java --- a/test/hotspot/jtreg/runtime/appcds/jigsaw/overridetests/OverrideTests.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jigsaw/overridetests/OverrideTests.java Fri Oct 05 16:14:28 2018 -0700 @@ -28,7 +28,7 @@ * @modules java.base/jdk.internal.misc * @library ../.. * @library /test/lib - * @run main OverrideTests + * @run driver OverrideTests * @summary AppCDS tests for overriding archived classes with -p and --upgrade-module-path */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/jvmti/parallelLoad/ParallelLoadAndTransformTest.java --- a/test/hotspot/jtreg/runtime/appcds/jvmti/parallelLoad/ParallelLoadAndTransformTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/jvmti/parallelLoad/ParallelLoadAndTransformTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, 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 @@ -36,7 +36,7 @@ * jdk.jartool/sun.tools.jar * java.instrument * @build TransformUtil TransformerAgent ParallelLoad - * @run main ParallelLoadAndTransformTest + * @run driver ParallelLoadAndTransformTest */ import java.util.List; import java.util.stream.Collectors; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineBasicTest.java --- a/test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineBasicTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineBasicTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,9 +33,9 @@ * jdk.jartool/sun.tools.jar * java.base/jdk.internal.misc * java.management - * @run main RedefineClassHelper + * @run driver RedefineClassHelper * @build sun.hotspot.WhiteBox RedefineBasic - * @run main RedefineBasicTest + * @run driver RedefineBasicTest */ import jdk.test.lib.process.OutputAnalyzer; @@ -63,7 +63,7 @@ OutputAnalyzer output; TestCommon.testDump(appJar, sharedClasses, useWb); - // redefineagent.jar is created by executing "@run main RedefineClassHelper" + // redefineagent.jar is created by executing "@run driver RedefineClassHelper" // which should be called before executing RedefineBasicTest output = TestCommon.exec(appJar, useWb, "-XX:+UnlockDiagnosticVMOptions", diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineRunningMethods_Shared.java --- a/test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineRunningMethods_Shared.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/redefineClass/RedefineRunningMethods_Shared.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,9 +32,9 @@ * @modules java.compiler * java.instrument * jdk.jartool/sun.tools.jar - * @run main RedefineClassHelper + * @run driver RedefineClassHelper * @build sun.hotspot.WhiteBox RedefineRunningMethods_SharedHelper - * @run main RedefineRunningMethods_Shared + * @run driver RedefineRunningMethods_Shared */ import jdk.test.lib.process.OutputAnalyzer; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/ExerciseGC.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/ExerciseGC.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/ExerciseGC.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @build HelloStringGC sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main ExerciseGC + * @run driver ExerciseGC * @run main/othervm -XX:+UseStringDeduplication ExerciseGC * @run main/othervm -XX:-CompactStrings ExerciseGC */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/FlagCombo.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/FlagCombo.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/FlagCombo.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @modules java.management * jdk.jartool/sun.tools.jar * @build HelloString - * @run main FlagCombo + * @run driver FlagCombo */ /** @@ -44,7 +44,7 @@ * @modules java.management * jdk.jartool/sun.tools.jar * @build HelloString - * @run main FlagCombo noJfr + * @run driver FlagCombo noJfr */ import jdk.test.lib.BuildHelper; diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/InternSharedString.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/InternSharedString.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/InternSharedString.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * @compile InternStringTest.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main InternSharedString + * @run driver InternSharedString * @run main/othervm -XX:+UseStringDeduplication InternSharedString * @run main/othervm -XX:-CompactStrings InternSharedString */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/InvalidFileFormat.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/InvalidFileFormat.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/InvalidFileFormat.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @modules java.management * jdk.jartool/sun.tools.jar * @build HelloString - * @run main InvalidFileFormat + * @run driver InvalidFileFormat * @run main/othervm -XX:+UseStringDeduplication InvalidFileFormat * @run main/othervm -XX:-CompactStrings InvalidFileFormat */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/LargePages.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/LargePages.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/LargePages.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @modules java.management * jdk.jartool/sun.tools.jar * @build HelloString - * @run main LargePages + * @run driver LargePages * @run main/othervm -XX:+UseStringDeduplication LargePages * @run main/othervm -XX:-CompactStrings LargePages */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/LockSharedStrings.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/LockSharedStrings.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/LockSharedStrings.java Fri Oct 05 16:14:28 2018 -0700 @@ -33,7 +33,7 @@ * @compile LockStringTest.java LockStringValueTest.java * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main LockSharedStrings + * @run driver LockSharedStrings * @run main/othervm -XX:+UseStringDeduplication LockSharedStrings * @run main/othervm -XX:-CompactStrings LockSharedStrings */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasic.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasic.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasic.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @modules java.management * jdk.jartool/sun.tools.jar * @build HelloString - * @run main SharedStringsBasic + * @run driver SharedStringsBasic * @run main/othervm -XX:+UseStringDeduplication SharedStringsBasic * @run main/othervm -XX:-CompactStrings SharedStringsBasic */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasicPlus.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasicPlus.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasicPlus.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @build HelloStringPlus sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main SharedStringsBasicPlus + * @run driver SharedStringsBasicPlus * @run main/othervm -XX:+UseStringDeduplication SharedStringsBasicPlus * @run main/othervm -XX:-CompactStrings SharedStringsBasicPlus */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsStress.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsStress.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsStress.java Fri Oct 05 16:14:28 2018 -0700 @@ -29,7 +29,7 @@ * @library /test/hotspot/jtreg/runtime/appcds /test/lib * @modules jdk.jartool/sun.tools.jar * @build HelloString - * @run main SharedStringsStress + * @run driver SharedStringsStress * @run main/othervm -XX:+UseStringDeduplication SharedStringsStress * @run main/othervm -XX:-CompactStrings SharedStringsStress */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsWbTest.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsWbTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsWbTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -32,7 +32,7 @@ * jdk.jartool/sun.tools.jar * @build sun.hotspot.WhiteBox SharedStringsWb * @run driver ClassFileInstaller sun.hotspot.WhiteBox - * @run main SharedStringsWbTest + * @run driver SharedStringsWbTest * @run main/othervm -XX:+UseStringDeduplication SharedStringsWbTest * @run main/othervm -XX:-CompactStrings SharedStringsWbTest */ diff -r 3c92ada330a9 -r e03e5f61c53f test/hotspot/jtreg/runtime/appcds/sharedStrings/SysDictCrash.java --- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/SysDictCrash.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/SysDictCrash.java Fri Oct 05 16:14:28 2018 -0700 @@ -31,7 +31,7 @@ * @library /test/lib /test/hotspot/jtreg/runtime/appcds * @modules java.base/jdk.internal.misc * @modules java.management - * @run main SysDictCrash + * @run driver SysDictCrash * @run main/othervm -XX:+UseStringDeduplication SysDictCrash * @run main/othervm -XX:-CompactStrings SysDictCrash */ diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/ProblemList.txt --- a/test/jdk/ProblemList.txt Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/ProblemList.txt Fri Oct 05 16:14:28 2018 -0700 @@ -102,7 +102,7 @@ # 1. Make sure test passes on all platforms with samevm, or mark it othervm # 2. Make sure test passes on all platforms when run with it's entire group # 3. Make sure both VMs are tested, -server and -client, if possible -# 4. Use a tool like JPRT or something to verify these results +# 4. Use your favorite build and test system to verify these results # 5. Delete lines in this file, include the changes with your test changes # # You may need to repeat your testing 2 or even 3 times to verify good diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/TEST.groups --- a/test/jdk/TEST.groups Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/TEST.groups Fri Oct 05 16:14:28 2018 -0700 @@ -259,11 +259,7 @@ jdk_native_sanity = \ native_sanity -# java launcher specific tests, Note: do not include this group into any groups -# that potentially could be included into a jprt test rule, as the complementary -# closed group includes awt SplashScreen and these tests may not run -# satisfactorily on all platforms and profiles thus this group must always -# be a stand-alone group +# java launcher specific tests. jdk_launcher = \ tools/launcher \ sun/tools @@ -407,9 +403,6 @@ # # These groups specify a subset of Serviceability tests that are supposed to # guard against breakage of Serviceability features by other component teams. -# They are added to the "hotspot" testset in JPRT so that they will run on all -# full-forest pushes through JPRT. -# jdk_svc_sanity = \ :jdk_management_sanity \ diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/com/sun/jdi/cds/CDSJDITest.java --- a/test/jdk/com/sun/jdi/cds/CDSJDITest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/com/sun/jdi/cds/CDSJDITest.java Fri Oct 05 16:14:28 2018 -0700 @@ -46,7 +46,7 @@ // These first three properties are setup by jtreg, and must be passed // to the JDI test subprocess because it needs them in order to // pass them to the subprocess it will create for the debuggee. This - // is how the JPRT -javaopts are passed to the debggee. See + // is how the -javaopts are passed to the debuggee. See // VMConnection.getDebuggeeVMOptions(). getPropOpt("test.classes"), getPropOpt("test.java.opts"), diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/com/sun/net/httpserver/bugs/B8211420.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/com/sun/net/httpserver/bugs/B8211420.java Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8211420 + * @run main/othervm B8211420 + * @summary + */ + +import com.sun.net.httpserver.*; + +import java.util.*; +import java.util.concurrent.*; +import java.util.logging.*; +import java.io.*; +import java.net.*; + +public class B8211420 { + + public static void main (String[] args) throws Exception { + Logger logger = Logger.getLogger ("com.sun.net.httpserver"); + ConsoleHandler c = new ConsoleHandler(); + c.setLevel (Level.WARNING); + logger.addHandler (c); + logger.setLevel (Level.WARNING); + Handler handler = new Handler(); + InetSocketAddress addr = new InetSocketAddress (0); + HttpServer server = HttpServer.create (addr, 0); + HttpContext ctx = server.createContext ("/test", handler); + ExecutorService executor = Executors.newCachedThreadPool(); + server.setExecutor (executor); + server.start (); + + URL url = new URL ("http://localhost:"+server.getAddress().getPort()+"/test/foo.html"); + HttpURLConnection urlc = (HttpURLConnection)url.openConnection (); + try { + InputStream is = urlc.getInputStream(); + while (is.read()!= -1) ; + is.close (); + String prop = urlc.getHeaderField("Content-length"); + System.out.println ("Content-length = " + prop + " should be null"); + if (prop != null) + throw new RuntimeException("Content-length was present"); + + urlc = (HttpURLConnection)url.openConnection(); + is = urlc.getInputStream(); + while (is.read()!= -1) ; + is.close (); + if (urlc.getResponseCode() != 304) // expected for 2nd test + throw new RuntimeException("wrong response code"); + String clen = urlc.getHeaderField("Content-length"); + System.out.println ("Content-length = " + clen + " should be 99"); + System.out.println ("len = " + clen.length()); + if (clen == null || !clen.equals("99")) + throw new RuntimeException("Content-length not present or has wrong value"); + System.out.println ("OK"); + } finally { + server.stop(2); + executor.shutdown(); + } + } + + public static boolean error = false; + + static class Handler implements HttpHandler { + volatile int invocation = 1; + public void handle (HttpExchange t) + throws IOException + { + InputStream is = t.getRequestBody(); + Headers map = t.getRequestHeaders(); + Headers rmap = t.getResponseHeaders(); + while (is.read () != -1) ; + is.close(); + if (invocation++ == 1) { + // send a 204 response with no body + t.sendResponseHeaders(204, -1); + t.close(); + } else { + // send a 304 response with no body but with content - length + rmap.add("Content-length", "99"); + t.sendResponseHeaders(304, -1); + t.close(); + } + } + } +} diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/Character/Scripts.txt --- a/test/jdk/java/lang/Character/Scripts.txt Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/Character/Scripts.txt Fri Oct 05 16:14:28 2018 -0700 @@ -402,6 +402,7 @@ 328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT 32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY 32C0..32CF ; Common # So [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN +32FF ; Common # So SQUARE ERA NAME NEWERA 3358..33FF ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL 4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/Character/UnicodeData.txt --- a/test/jdk/java/lang/Character/UnicodeData.txt Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/Character/UnicodeData.txt Fri Oct 05 16:14:28 2018 -0700 @@ -11729,6 +11729,7 @@ 32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; 32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; 32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; +32FF;SQUARE ERA NAME NEWERA;So;0;L; 5143 53F7;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME NEWERA;;;; 3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; 3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; 3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/Character/charprop00.bin Binary file test/jdk/java/lang/Character/charprop00.bin has changed diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/StackWalker/ReflectionFrames.java --- a/test/jdk/java/lang/StackWalker/ReflectionFrames.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/StackWalker/ReflectionFrames.java Fri Oct 05 16:14:28 2018 -0700 @@ -48,6 +48,16 @@ public class ReflectionFrames { final static boolean verbose = false; + final static Class REFLECT_ACCESS = findClass("java.lang.reflect.ReflectAccess"); + final static Class REFLECTION_FACTORY = findClass("jdk.internal.reflect.ReflectionFactory"); + + private static Class findClass(String cn) { + try { + return Class.forName(cn); + } catch (ClassNotFoundException e) { + throw new AssertionError(e); + } + } /** * This test invokes new StackInspector() directly from @@ -327,6 +337,8 @@ List.of(StackInspector.class.getName() +"::", Constructor.class.getName() + +"::newInstanceWithCaller", + Constructor.class.getName() +"::newInstance", StackInspector.Caller.class.getName() +"::create", @@ -355,6 +367,8 @@ List.of(StackInspector.class.getName() +"::", Constructor.class.getName() + +"::newInstanceWithCaller", + Constructor.class.getName() +"::newInstance", StackInspector.Caller.class.getName() +"::create", @@ -387,6 +401,8 @@ List.of(StackInspector.class.getName() +"::", Constructor.class.getName() + +"::newInstanceWithCaller", + Constructor.class.getName() +"::newInstance", StackInspector.Caller.class.getName() +"::create", @@ -436,15 +452,19 @@ assertEquals(obj.collectedFrames, List.of(StackInspector.class.getName() +"::", + REFLECT_ACCESS.getName() + +"::newInstance", + REFLECTION_FACTORY.getName() + +"::newInstance", Class.class.getName() +"::newInstance", StackInspector.Caller.class.getName() +"::create", ReflectionFrames.class.getName() +"::testNewInstance")); - // Because Class.newInstance is not filtered, then the - // caller is Class.class - assertEquals(obj.cls, Class.class); + // Because implementation frames are not filtered, then the + // caller is ReflectAccess.class + assertEquals(obj.cls, REFLECT_ACCESS); assertEquals(obj.filtered, 0); // Calls the StackInspector.reflect method through reflection @@ -464,6 +484,10 @@ assertEquals(obj.collectedFrames, List.of(StackInspector.class.getName() +"::", + REFLECT_ACCESS.getName() + +"::newInstance", + REFLECTION_FACTORY.getName() + +"::newInstance", Class.class.getName() +"::newInstance", StackInspector.Caller.class.getName() @@ -473,9 +497,9 @@ ReflectionFrames.class.getName() +"::testNewInstance")); - // Because Class.newInstance is not filtered, then the - // caller is Class.class - assertEquals(obj.cls, Class.class); + // Because implementation frames are not filtered, then the + // caller is ReflectAccess.class + assertEquals(obj.cls, REFLECT_ACCESS); assertEquals(obj.filtered, 0); // Calls the StackInspector.handle method through reflection @@ -495,6 +519,10 @@ assertEquals(obj.collectedFrames, List.of(StackInspector.class.getName() +"::", + REFLECT_ACCESS.getName() + +"::newInstance", + REFLECTION_FACTORY.getName() + +"::newInstance", Class.class.getName() +"::newInstance", StackInspector.Caller.class.getName() @@ -504,9 +532,9 @@ ReflectionFrames.class.getName() +"::testNewInstance")); - // Because Class.newInstance is not filtered, then the - // caller is Class.class - assertEquals(obj.cls, Class.class); + // Because implementation frames are not filtered, then the + // caller is ReflectAccess.class + assertEquals(obj.cls, REFLECT_ACCESS); assertEquals(obj.filtered, 0); // Sets a non-default walker configured to show @@ -529,6 +557,8 @@ List.of(StackInspector.class.getName() +"::", Constructor.class.getName() + +"::newInstanceWithCaller", + REFLECT_ACCESS.getName() +"::newInstance", Class.class.getName() +"::newInstance", @@ -538,9 +568,9 @@ +"::invoke", ReflectionFrames.class.getName() +"::testNewInstance")); - // Because Class.newInstance is not filtered, then the - // caller is Class.class - assertEquals(obj.cls, Class.class); + // Because implementation frames are not filtered, then the + // caller is ReflectAccess.class + assertEquals(obj.cls, REFLECT_ACCESS); assertNotEquals(obj.filtered, 0); // Calls the StackInspector.reflect method through reflection @@ -557,10 +587,13 @@ obj = ((StackInspector)StackInspector.Caller.class .getMethod("reflect", How.class) .invoke(null, How.CLASS)); + System.out.println(obj.collectedFrames); assertEquals(obj.collectedFrames, List.of(StackInspector.class.getName() +"::", Constructor.class.getName() + +"::newInstanceWithCaller", + REFLECT_ACCESS.getName() +"::newInstance", Class.class.getName() +"::newInstance", @@ -575,9 +608,9 @@ ReflectionFrames.class.getName() +"::testNewInstance")); - // Because Class.newInstance is not filtered, then the - // caller is Class.class - assertEquals(obj.cls, Class.class); + // Because implementation frames are not filtered, then the + // caller is ReflectAccess.class + assertEquals(obj.cls, REFLECT_ACCESS); assertNotEquals(obj.filtered, 0); // Calls the StackInspector.handle method through reflection @@ -598,6 +631,8 @@ List.of(StackInspector.class.getName() +"::", Constructor.class.getName() + +"::newInstanceWithCaller", + REFLECT_ACCESS.getName() +"::newInstance", Class.class.getName() +"::newInstance", @@ -611,9 +646,9 @@ ReflectionFrames.class.getName() +"::testNewInstance")); - // Because Class.newInstance is not filtered, then the - // caller is Class.class - assertEquals(obj.cls, Class.class); + // Because implementation frames are not filtered, then the + // caller is ReflectAccess.class + assertEquals(obj.cls, REFLECT_ACCESS); assertNotEquals(obj.filtered, 0); } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/String/CompactString/CompactString.java --- a/test/jdk/java/lang/String/CompactString/CompactString.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/String/CompactString/CompactString.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -275,8 +275,7 @@ } /* - * Because right now system default charset in JPRT environment is only - * guaranteed to support ASCII characters in log, so we escape them. + * Escape non-ASCII characters since not all systems support them. */ protected String escapeNonASCIIs(String str) { StringBuilder sb = new StringBuilder(); @@ -292,8 +291,7 @@ } /* - * Because right now system default charset in JPRT environment is only - * guaranteed to support ASCII characters in log, so we escape them. + * Escape non-ASCII characters since not all systems support them. */ protected String escapeNonASCII(char c) { StringBuilder sb = new StringBuilder(); diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/StringBuffer/CompactStringBuffer.java --- a/test/jdk/java/lang/StringBuffer/CompactStringBuffer.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/StringBuffer/CompactStringBuffer.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -471,8 +471,7 @@ } /* - * Because right now system default charset in JPRT environment is only - * guaranteed to support ASCII characters in log, so we escape them. + * Escape non-ASCII characters since not all systems support them. */ private String escapeNonASCIIs(String str) { StringBuilder sb = new StringBuilder(); diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/StringBuilder/CompactStringBuilder.java --- a/test/jdk/java/lang/StringBuilder/CompactStringBuilder.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/StringBuilder/CompactStringBuilder.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -396,8 +396,7 @@ } /* - * Because right now system default charset in JPRT environment is only - * guaranteed to support ASCII characters in log, so we escape them. + * Escape non-ASCII characters since not all systems support them. */ private String escapeNonASCIIs(String str) { StringBuilder sb = new StringBuilder(); diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/reflect/callerCache/AccessTest.java --- a/test/jdk/java/lang/reflect/callerCache/AccessTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/reflect/callerCache/AccessTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -149,4 +149,11 @@ super("privateStaticFinalField"); } } + + public static class NewInstance implements Callable { + public Object call() throws Exception { + return Members.class.newInstance(); + } + } + } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/lang/reflect/callerCache/ReflectionCallerCacheTest.java --- a/test/jdk/java/lang/reflect/callerCache/ReflectionCallerCacheTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/lang/reflect/callerCache/ReflectionCallerCacheTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -77,7 +77,8 @@ { "AccessTest$PublicFinalField"}, { "AccessTest$PrivateFinalField"}, { "AccessTest$PublicStaticFinalField"}, - { "AccessTest$PrivateStaticFinalField"} + { "AccessTest$PrivateStaticFinalField"}, + { "AccessTest$NewInstance"} }; } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/java/time/tck/java/time/format/TCKInstantPrinterParser.java --- a/test/jdk/java/time/tck/java/time/format/TCKInstantPrinterParser.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/java/time/tck/java/time/format/TCKInstantPrinterParser.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, 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 @@ -69,12 +69,18 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; import java.time.format.ResolverStyle; import java.time.temporal.TemporalAccessor; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; +/* + * @test + * @bug 8166138 + */ + /** * Test DateTimeFormatterBuilder.appendInstant(). */ @@ -200,7 +206,10 @@ {0, 0, "1970-01-01T00:00:00Z"}, {0, 0, "1970-01-01T00:00:00.0Z"}, {0, 0, "1970-01-01T00:00:00.000Z"}, - {0, 0, "1970-01-01T00:00:00.000000000Z"}, + + {0, 0, "1970-01-01T00:00:00+00:00"}, + {0, 0, "1970-01-01T05:30:00+05:30"}, + {0, 0, "1970-01-01T01:00:00.0+01:00"}, {-1, 0, "1969-12-31T23:59:59Z"}, {1, 0, "1970-01-01T00:00:01Z"}, @@ -208,16 +217,22 @@ {3600, 0, "1970-01-01T01:00:00Z"}, {86400, 0, "1970-01-02T00:00:00Z"}, + {-1, 0, "1969-12-31T23:59:59+00:00"}, + {1, 0, "1970-01-01T05:30:01+05:30"}, + {60, 0, "1969-12-31T19:01:00-05:00"}, + {3600, 0, "1970-01-01T06:30:00+05:30"}, + {86400, 0, "1970-01-01T19:00:00-05:00"}, + {182, 234000000, "1970-01-01T00:03:02.234Z"}, {182, 234000000, "1970-01-01T00:03:02.2340Z"}, {182, 234000000, "1970-01-01T00:03:02.23400Z"}, {182, 234000000, "1970-01-01T00:03:02.234000Z"}, - {182, 234000000, "1970-01-01T00:03:02.234000000Z"}, - {((23 * 60) + 59) * 60 + 59, 123456789, "1970-01-01T23:59:59.123456789Z"}, + {182, 234000000, "1970-01-01T00:03:02.234+00:00"}, + {182, 234000000, "1970-01-01T05:33:02.2340+05:30"}, + {182, 234000000, "1969-12-31T19:03:02.23400-05:00"}, + {182, 234000000, "1970-01-01T00:03:02.234000+00:00"}, - {Instant.MAX.getEpochSecond(), 999999999, "+1000000000-12-31T23:59:59.999999999Z"}, - {Instant.MIN.getEpochSecond(), 0, "-1000000000-01-01T00:00:00.000000000Z"}, }; } @@ -230,22 +245,46 @@ assertEquals(f.parse(input).query(DateTimeFormatter.parsedLeapSecond()), Boolean.FALSE); } - @Test(dataProvider="parseDigits") + @DataProvider(name="parseNineDigits") + Object[][] data_parse_ninedigits() { + return new Object[][] { + {0, 0, "1970-01-01T00:00:00.000000000Z"}, + {0, 0, "1970-01-01T05:30:00.000000000+05:30"}, + + {182, 234000000, "1970-01-01T00:03:02.234000000Z"}, + {182, 234000000, "1970-01-01T01:03:02.234000000+01:00"}, + + {((23 * 60) + 59) * 60 + 59, 123456789, "1970-01-01T23:59:59.123456789Z"}, + {((23 * 60) + 59) * 60 + 59, 123456789, "1970-01-02T05:29:59.123456789+05:30"}, + + {Instant.MAX.getEpochSecond(), 999999999, "+1000000000-12-31T23:59:59.999999999Z"}, + {Instant.MIN.getEpochSecond(), 0, "-1000000000-01-01T00:00:00.000000000Z"}, + {Instant.MAX.getEpochSecond(), 999999999, "+1000000000-12-31T23:59:59.999999999+00:00"}, + {Instant.MIN.getEpochSecond(), 0, "-1000000000-01-01T00:00:00.000000000+00:00"}, + }; + } + + @Test(dataProvider="parseNineDigits") public void test_parse_digitsNine(long instantSecs, int nano, String input) { DateTimeFormatter f = new DateTimeFormatterBuilder().appendInstant(9).toFormatter(); - if (input.charAt(input.length() - 11) == '.') { - Instant expected = Instant.ofEpochSecond(instantSecs, nano); - assertEquals(f.parse(input, Instant::from), expected); - assertEquals(f.parse(input).query(DateTimeFormatter.parsedExcessDays()), Period.ZERO); - assertEquals(f.parse(input).query(DateTimeFormatter.parsedLeapSecond()), Boolean.FALSE); - } else { - try { - f.parse(input, Instant::from); - fail(); - } catch (DateTimeException ex) { - // expected - } - } + Instant expected = Instant.ofEpochSecond(instantSecs, nano); + assertEquals(f.parse(input, Instant::from), expected); + assertEquals(f.parse(input).query(DateTimeFormatter.parsedExcessDays()), Period.ZERO); + assertEquals(f.parse(input).query(DateTimeFormatter.parsedLeapSecond()), Boolean.FALSE); + } + + @DataProvider(name="parseMaxMinInstant") + Object[][] data_parse_MaxMinInstant() { + return new Object[][] { + {"+1000000000-12-31T23:59:59.999999999-01:00"}, + {"-1000000000-01-01T00:00:00.000000000+01:00"} + }; + } + + @Test(dataProvider="parseMaxMinInstant", expectedExceptions=DateTimeParseException.class) + public void test_invalid_Instant(String input) { + DateTimeFormatter f = new DateTimeFormatterBuilder().appendInstant(-1).toFormatter(); + f.parse(input, Instant::from); } @Test @@ -283,4 +322,12 @@ new DateTimeFormatterBuilder().appendInstant(10); } + //------------------------------------------------------------------------ + @Test + public void test_equality() { + Instant instant1 = Instant.parse("2018-09-12T22:15:51+05:30"); + Instant instant2 = Instant.parse("2018-09-12T16:45:51Z"); + assertEquals(instant2, instant1); + } + } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/jfr/event/compiler/TestAllocInNewTLAB.java --- a/test/jdk/jdk/jfr/event/compiler/TestAllocInNewTLAB.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/jfr/event/compiler/TestAllocInNewTLAB.java Fri Oct 05 16:14:28 2018 -0700 @@ -43,14 +43,12 @@ * @requires vm.hasJFR * @library /test/lib * @run main/othervm -XX:+UseTLAB -XX:TLABSize=100k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=1 jdk.jfr.event.compiler.TestAllocInNewTLAB - * @run main/othervm -XX:+UseTLAB -XX:TLABSize=100k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=1 -XX:-FastTLABRefill jdk.jfr.event.compiler.TestAllocInNewTLAB * @run main/othervm -XX:+UseTLAB -XX:TLABSize=100k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=1 -Xint jdk.jfr.event.compiler.TestAllocInNewTLAB */ /** * Test that when an object is allocated in a new Thread Local Allocation Buffer (TLAB) - * an event will be triggered. The test is done for C1-compiler, - * C2-compiler (-XX:-FastTLABRefill) and interpreted mode (-Xint). + * an event will be triggered. The test is done for default and interpreted mode (-Xint). * * To force objects to be allocated in a new TLAB: * the size of TLAB is set to 100k (-XX:TLABSize=100k); diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/jfr/event/compiler/TestAllocOutsideTLAB.java --- a/test/jdk/jdk/jfr/event/compiler/TestAllocOutsideTLAB.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/jfr/event/compiler/TestAllocOutsideTLAB.java Fri Oct 05 16:14:28 2018 -0700 @@ -42,15 +42,13 @@ * @key jfr * @requires vm.hasJFR * @library /test/lib - * @run main/othervm -XX:+UseTLAB -XX:-FastTLABRefill -XX:TLABSize=90k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=256 jdk.jfr.event.compiler.TestAllocOutsideTLAB - * @run main/othervm -XX:+UseTLAB -XX:-FastTLABRefill -XX:TLABSize=90k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=256 jdk.jfr.event.compiler.TestAllocOutsideTLAB - * @run main/othervm -XX:+UseTLAB -XX:-FastTLABRefill -XX:TLABSize=90k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=256 -Xint jdk.jfr.event.compiler.TestAllocOutsideTLAB + * @run main/othervm -XX:+UseTLAB -XX:TLABSize=90k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=256 jdk.jfr.event.compiler.TestAllocOutsideTLAB + * @run main/othervm -XX:+UseTLAB -XX:TLABSize=90k -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=256 -Xint jdk.jfr.event.compiler.TestAllocOutsideTLAB */ /** * Test that an event is triggered when an object is allocated outside a - * Thread Local Allocation Buffer (TLAB). The test is done for C1-compiler, - * C2-compiler (-XX:-FastTLABRefill) and interpreted mode (-Xint). + * Thread Local Allocation Buffer (TLAB). The test is done for default interpreted mode (-Xint). * * To force objects to be allocated outside TLAB: * the size of TLAB is set to 90k (-XX:TLABSize=90k); diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/jfr/event/oldobject/TestAllocationTime.java --- a/test/jdk/jdk/jfr/event/oldobject/TestAllocationTime.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/jfr/event/oldobject/TestAllocationTime.java Fri Oct 05 16:14:28 2018 -0700 @@ -44,7 +44,7 @@ * @requires vm.gc == "null" * @library /test/lib /test/jdk * @modules jdk.jfr/jdk.jfr.internal.test - * @run main/othervm -XX:TLABSize=2k -XX:-FastTLABRefill jdk.jfr.event.oldobject.TestAllocationTime + * @run main/othervm -XX:TLABSize=2k jdk.jfr.event.oldobject.TestAllocationTime */ public class TestAllocationTime { diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/jfr/event/oldobject/TestLargeRootSet.java --- a/test/jdk/jdk/jfr/event/oldobject/TestLargeRootSet.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/jfr/event/oldobject/TestLargeRootSet.java Fri Oct 05 16:14:28 2018 -0700 @@ -45,7 +45,7 @@ * @requires vm.gc == "null" * @library /test/lib /test/jdk * @modules jdk.jfr/jdk.jfr.internal.test - * @run main/othervm -XX:TLABSize=2k -XX:-FastTLABRefill jdk.jfr.event.oldobject.TestLargeRootSet + * @run main/othervm -XX:TLABSize=2k jdk.jfr.event.oldobject.TestLargeRootSet */ public class TestLargeRootSet { diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/jfr/event/oldobject/TestLastKnownHeapUsage.java --- a/test/jdk/jdk/jfr/event/oldobject/TestLastKnownHeapUsage.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/jfr/event/oldobject/TestLastKnownHeapUsage.java Fri Oct 05 16:14:28 2018 -0700 @@ -44,7 +44,7 @@ * @requires vm.gc == "null" * @library /test/lib /test/jdk * @modules jdk.jfr/jdk.jfr.internal.test - * @run main/othervm -XX:TLABSize=2k -XX:-FastTLABRefill jdk.jfr.event.oldobject.TestLastKnownHeapUsage + * @run main/othervm -XX:TLABSize=2k jdk.jfr.event.oldobject.TestLastKnownHeapUsage */ public class TestLastKnownHeapUsage { diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/jfr/startupargs/TestOldObjectQueueSize.java --- a/test/jdk/jdk/jfr/startupargs/TestOldObjectQueueSize.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/jfr/startupargs/TestOldObjectQueueSize.java Fri Oct 05 16:14:28 2018 -0700 @@ -42,9 +42,9 @@ * @library /test/lib * @key jfr * - * @run main/othervm -XX:TLABSize=2k -XX:-FastTLABRefill -XX:FlightRecorderOptions=old-object-queue-size=0 jdk.jfr.startupargs.TestOldObjectQueueSize off - * @run main/othervm -XX:TLABSize=2k -Xlog:gc+tlab=trace -XX:-FastTLABRefill -XX:FlightRecorderOptions=old-object-queue-size=10000 jdk.jfr.startupargs.TestOldObjectQueueSize many - * @run main/othervm -XX:TLABSize=2k -Xlog:gc+tlab=trace -XX:-FastTLABRefill -XX:FlightRecorderOptions=old-object-queue-size=1000000 jdk.jfr.startupargs.TestOldObjectQueueSize many + * @run main/othervm -XX:TLABSize=2k -XX:FlightRecorderOptions=old-object-queue-size=0 jdk.jfr.startupargs.TestOldObjectQueueSize off + * @run main/othervm -XX:TLABSize=2k -Xlog:gc+tlab=trace -XX:FlightRecorderOptions=old-object-queue-size=10000 jdk.jfr.startupargs.TestOldObjectQueueSize many + * @run main/othervm -XX:TLABSize=2k -Xlog:gc+tlab=trace -XX:FlightRecorderOptions=old-object-queue-size=1000000 jdk.jfr.startupargs.TestOldObjectQueueSize many */ public class TestOldObjectQueueSize { diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/modules/open/Basic.java --- a/test/jdk/jdk/modules/open/Basic.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/modules/open/Basic.java Fri Oct 05 16:14:28 2018 -0700 @@ -98,6 +98,9 @@ ctor.setAccessible(true); ctor.newInstance(); + // Class::newInstance + clazz.newInstance(); + // method handles findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); findNoArgConstructorAndInvoke(clazz, MethodHandles.lookup()); @@ -122,6 +125,12 @@ ctor.setAccessible(true); ctor.newInstance(); + // Class::newInstance + try { + clazz.newInstance(); + assertTrue(false); + } catch (IllegalAccessException expected) { } + // method handles try { findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); @@ -150,6 +159,9 @@ ctor.setAccessible(true); ctor.newInstance(); + // Class::newInstance + clazz.newInstance(); + // method handles findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); findNoArgConstructorAndInvoke(clazz, MethodHandles.lookup()); @@ -174,6 +186,12 @@ ctor.setAccessible(true); ctor.newInstance(); + // Class::newInstance + try { + clazz.newInstance(); + assertTrue(false); + } catch (IllegalAccessException expected) { } + // method handles try { findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); @@ -200,6 +218,7 @@ // core reflection Class clazz = q.PublicType.class; clazz.getConstructor().newInstance(); + clazz.newInstance(); // method handles findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); @@ -226,6 +245,12 @@ ctor.setAccessible(true); ctor.newInstance(); + // Class::newInstance + try { + clazz.newInstance(); + assertTrue(false); + } catch (IllegalAccessException expected) { } + // method handles try { findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); @@ -256,6 +281,12 @@ assertTrue(false); } catch (InaccessibleObjectException expected) { } + // Class::newInstance + try { + clazz.newInstance(); + assertTrue(false); + } catch (IllegalAccessException expected) { } + // method handles try { findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); @@ -288,6 +319,12 @@ assertTrue(false); } catch (InaccessibleObjectException expected) { } + // Class::newInstance + try { + clazz.newInstance(); + assertTrue(false); + } catch (IllegalAccessException expected) { } + // method handles try { findNoArgConstructorAndInvoke(clazz, MethodHandles.publicLookup()); diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jdk/nio/zipfs/Basic.java --- a/test/jdk/jdk/nio/zipfs/Basic.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/jdk/nio/zipfs/Basic.java Fri Oct 05 16:14:28 2018 -0700 @@ -43,7 +43,7 @@ import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; /** * @test - * @bug 8038500 8040059 8150366 8150496 8147539 + * @bug 8038500 8040059 8150366 8150496 8147539 8211385 * @summary Basic test for zip provider * * @modules jdk.zipfs @@ -89,16 +89,30 @@ // Test: DirectoryStream found = false; + try (DirectoryStream stream = Files.newDirectoryStream(fs.getPath("/"))) { for (Path entry: stream) { found = entry.toString().equals("/META-INF"); if (found) break; } } - if (!found) throw new RuntimeException("Expected file not found"); + try (DirectoryStream stream = Files.newDirectoryStream(fs.getPath("META-INF"))) { + for (Path entry: stream) { + if (entry.toString().equals("/META-INF/services")) + throw new RuntimeException("child path should be relative"); + } + } + + try (DirectoryStream stream = Files.newDirectoryStream(fs.getPath("/META-INF"))) { + for (Path entry: stream) { + if (entry.toString().equals("META-INF/services")) + throw new RuntimeException("child path should be absolute"); + } + } + // Test: copy file from zip file to current (scratch) directory Path source = fs.getPath("/META-INF/services/java.nio.file.spi.FileSystemProvider"); if (Files.exists(source)) { @@ -133,6 +147,8 @@ try { fs.provider().checkAccess(fs.getPath("/missing"), AccessMode.READ); } catch (ClosedFileSystemException x) { } + + Files.deleteIfExists(jarFile); } // FileVisitor that pretty prints a file tree diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/jprt.config --- a/test/jdk/jprt.config Fri Oct 05 15:15:56 2018 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -#!echo "This is not a shell script" -############################################################################# -# Copyright (c) 2006, 2007, 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. -############################################################################# -# -# JPRT shell configuration for testing. -# -# Input environment variables: -# Windows Only: -# PATH -# ROOTDIR -# -# Output variable settings: -# make Full path to GNU make -# -# Output environment variables: -# PATH -# -############################################################################# - -############################################################################# -# Error -error() # message -{ - echo "ERROR: $1" - exit 6 -} -# Directory must exist -dirMustExist() # dir name -{ - if [ ! -d "$1" ] ; then - error "Directory for $2 does not exist: $1" - fi -} -# File must exist -fileMustExist() # dir name -{ - if [ ! -f "$1" ] ; then - error "File for $2 does not exist: $1" - fi -} -############################################################################# - -# Should be set by JPRT as the 3 basic inputs -slashjava="${ALT_SLASH_JAVA}" -if [ "${slashjava}" = "" ] ; then - slashjava=/java -fi - -# Check input -dirMustExist "${slashjava}" ALT_SLASH_JAVA - -# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise. -osname=`uname -s` -if [ "${osname}" = SunOS ] ; then - - # SOLARIS: Sparc or X86 - osarch=`uname -p` - if [ "${osarch}" = sparc ] ; then - solaris_arch=sparc - else - solaris_arch=i386 - fi - - # Add basic solaris system paths - path4sdk=/usr/bin:/usr/gnu/bin - - # Find GNU make - make=/usr/bin/gmake - if [ ! -f ${make} ] ; then - make=${slashjava}/devtools/${solaris_arch}/bin/gnumake - fi - fileMustExist "${make}" make - - # File creation mask - umask 002 - -elif [ "${osname}" = Linux ] ; then - - # Add basic paths - path4sdk=/usr/bin:/bin:/usr/sbin:/sbin - - # Find GNU make - make=/usr/bin/make - fileMustExist "${make}" make - - umask 002 - -else - - # Windows: Differs on CYGWIN vs. MKS. - - # We need to determine if we are running a CYGWIN shell or an MKS shell - # (if uname isn't available, then it will be unix_toolset=unknown) - unix_toolset=unknown - if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then - # We kind of assume ROOTDIR is where MKS is and it's ok - unix_toolset=MKS - mkshome=`dosname -s "${ROOTDIR}"` - # Most unix utilities are in the mksnt directory of ROOTDIR - unixcommand_path="${mkshome}/mksnt" - path4sdk="${unixcommand_path}" - devtools_path="${slashjava}/devtools/win32/bin" - path4sdk="${devtools_path};${path4sdk}" - # Find GNU make - make="${devtools_path}/gnumake.exe" - fileMustExist "${make}" make - elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then - # For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist - unix_toolset=CYGWIN - # Most unix utilities are in the /usr/bin - unixcommand_path="/usr/bin" - path4sdk="${unixcommand_path}" - # Find GNU make - make="${unixcommand_path}/make.exe" - fileMustExist "${make}" make - else - echo "WARNING: Cannot figure out if this is MKS or CYGWIN" - fi - - - # For windows, it's hard to know where the system is, so we just add this - # to PATH. - slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`" - path4sdk="${slash_path};${PATH}" - - # Convert path4sdk to cygwin style - if [ "${unix_toolset}" = CYGWIN ] ; then - path4sdk="`/usr/bin/cygpath -p ${path4sdk}`" - fi - -fi - -# Export PATH setting -PATH="${path4sdk}" -export PATH - diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/lib/security/CheckBlacklistedCerts.java --- a/test/jdk/lib/security/CheckBlacklistedCerts.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/lib/security/CheckBlacklistedCerts.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,8 +59,7 @@ // All certs in the pem files Set blacklisted = new HashSet<>(); - // Hopefully src comes with test, but it might be missing if doing - // a -testonly JPRT job. + // Assumes the full src is available File[] blacklists = { new File(System.getProperty("test.src"), "../../../make/data/blacklistedcertsconverter/blacklisted.certs.pem"), diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/DefaultDriverInstaller.java --- a/test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/DefaultDriverInstaller.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/DefaultDriverInstaller.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,8 @@ */ package org.netbeans.jemmy.drivers; +import javax.swing.UIManager; + import org.netbeans.jemmy.ClassReference; import org.netbeans.jemmy.JemmyException; import org.netbeans.jemmy.JemmyProperties; @@ -50,6 +52,7 @@ import org.netbeans.jemmy.drivers.windows.DefaultFrameDriver; import org.netbeans.jemmy.drivers.windows.DefaultInternalFrameDriver; import org.netbeans.jemmy.drivers.windows.DefaultWindowDriver; +import org.netbeans.jemmy.drivers.windows.InternalFramePopupMenuDriver; /** * Installs all necessary drivers for Jemmy operators except low-level drivers @@ -119,9 +122,9 @@ new ChoiceDriver(), new DefaultFrameDriver(), new DefaultWindowDriver(), - new DefaultInternalFrameDriver(), - new DefaultInternalFrameDriver(), - new DefaultInternalFrameDriver(), + "Motif".equals(UIManager.getLookAndFeel().getID())? new InternalFramePopupMenuDriver(): new DefaultInternalFrameDriver(), + "Motif".equals(UIManager.getLookAndFeel().getID())? new InternalFramePopupMenuDriver(): new DefaultInternalFrameDriver(), + "Motif".equals(UIManager.getLookAndFeel().getID())? new InternalFramePopupMenuDriver(): new DefaultInternalFrameDriver(), new APIFocusDriver(), new MouseFocusDriver(), (shortcutEvents ? new QueueJMenuDriver() : new DefaultJMenuDriver()), diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/windows/InternalFramePopupMenuDriver.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/drivers/windows/InternalFramePopupMenuDriver.java Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.netbeans.jemmy.drivers.windows; + +import javax.swing.UIManager; + +import org.netbeans.jemmy.operators.ComponentOperator; +import org.netbeans.jemmy.operators.JInternalFrameOperator; +import org.netbeans.jemmy.operators.JMenuItemOperator; +import org.netbeans.jemmy.operators.JPopupMenuOperator; + +/** + * InternalFrameDriver to do Close, Minimize, Maximize, and Restore actions + * using popup menus. + */ +public class InternalFramePopupMenuDriver extends DefaultInternalFrameDriver { + + @Override + public void requestClose(ComponentOperator oper) { + checkSupported(oper); + pushMenuItem(oper, UIManager.getString( + "InternalFrameTitlePane.closeButtonText")); + } + + @Override + public void iconify(ComponentOperator oper) { + checkSupported(oper); + pushMenuItem(oper, UIManager.getString( + "InternalFrameTitlePane.minimizeButtonText")); + } + + @Override + public void maximize(ComponentOperator oper) { + checkSupported(oper); + if (!((JInternalFrameOperator) oper).isMaximum()) { + if (!((JInternalFrameOperator) oper).isSelected()) { + activate(oper); + } + pushMenuItem(oper, UIManager.getString( + "InternalFrameTitlePane.maximizeButtonText")); + } + } + + @Override + public void demaximize(ComponentOperator oper) { + checkSupported(oper); + if (((JInternalFrameOperator) oper).isMaximum()) { + if (!((JInternalFrameOperator) oper).isSelected()) { + activate(oper); + } + pushMenuItem(oper, UIManager.getString( + "InternalFrameTitlePane.restoreButtonText")); + } + } + + private void pushMenuItem(ComponentOperator oper, + String menuText) { + ((JInternalFrameOperator) oper).getPopupButton().push(); + JPopupMenuOperator popupMenu = new JPopupMenuOperator(); + JMenuItemOperator menuItem = + new JMenuItemOperator(popupMenu, menuText); + menuItem.push(); + } +} \ No newline at end of file diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JInternalFrameOperator.java --- a/test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JInternalFrameOperator.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/operators/JInternalFrameOperator.java Fri Oct 05 16:14:28 2018 -0700 @@ -170,6 +170,8 @@ */ protected JButtonOperator closeOper = null; + protected JButtonOperator popupButtonOper = null; + /** * A title operator. */ @@ -202,9 +204,8 @@ * @param index an index between appropriate ones. */ public JInternalFrameOperator(ContainerOperator cont, ComponentChooser chooser, int index) { - this((JInternalFrame) cont. - waitSubComponent(new JInternalFrameFinder(chooser), - index)); + this(waitJInternalFrame((Container)cont.getSource(), + chooser, index)); copyEnvironment(cont); } @@ -255,7 +256,7 @@ * */ public JInternalFrameOperator(ContainerOperator cont, int index) { - this((JInternalFrame) waitComponent(cont, + this(waitJInternalFrame((Container)cont.getSource(), new JInternalFrameFinder(), index)); copyEnvironment(cont); @@ -667,6 +668,11 @@ return closeOper; } + public JButtonOperator getPopupButton() { + initOperators(); + return popupButtonOper; + } + /** * Waits for the title pane. * @@ -1413,21 +1419,27 @@ return "JInternalFrameOperator.initOperators.ComponentChooser{description = " + getDescription() + '}'; } }) != null) { - minOper = new JButtonOperator(titleOperator, + if("Motif".equals(UIManager.getLookAndFeel().getID())) { + popupButtonOper = new JButtonOperator(titleOperator, 0); + } else { + minOper = new JButtonOperator(titleOperator, new JComponentByTipFinder(MINIMIZE_BUTTON_TOOLTIP)); - if (((JInternalFrame) getSource()).isMaximizable()) { - maxOper = new JButtonOperator(titleOperator, + if (((JInternalFrame) getSource()).isMaximizable()) { + maxOper = new JButtonOperator(titleOperator, new JComponentByTipFinder(MAXIMIZE_BUTTON_TOOLTIP)); - } else { - maxOper = null; + } else { + maxOper = null; + } } } else { minOper = null; maxOper = null; } if (isClosable()) { - closeOper = new JButtonOperator(titleOperator, + if(!"Motif".equals(UIManager.getLookAndFeel().getID())) { + closeOper = new JButtonOperator(titleOperator, new JComponentByTipFinder(CLOSE_BUTTON_TOOLTIP)); + } } else { closeOper = null; } @@ -1588,23 +1600,24 @@ } /** - * Creates an operator for the correspondent intenal frame. + * Creates an operator for the correspondent internal frame. * * @return an operator. */ public JInternalFrame getInternalFrame() { - return ((JInternalFrame) getEventDispatcher(). - invokeExistingMethod("getInternalFrame", - null, - null, - output)); + return (runMapping(new MapAction("getInternalFrame") { + @Override + public JInternalFrame map() { + return ((JInternalFrame.JDesktopIcon) getSource()).getInternalFrame(); + } + })); } /** * Pushs the deiconifying button. */ public void pushButton() { - new JButtonOperator(this).push(); + this.clickMouse(2); } } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/version_info --- a/test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/version_info Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/sanity/client/lib/jemmy/src/org/netbeans/jemmy/version_info Fri Oct 05 16:14:28 2018 -0700 @@ -1,6 +1,6 @@ Manifest-version: 1.0 Main-Class: org.netbeans.jemmy.JemmyProperties Jemmy-MajorVersion: 3.0 -Jemmy-MinorVersion: 4.0 +Jemmy-MinorVersion: 5.0 Jemmy-Build: @BUILD_NUMBER@ diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/tools/jimage/JImageTest.java --- a/test/jdk/tools/jimage/JImageTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/tools/jimage/JImageTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -93,9 +93,9 @@ } File jdkHome = new File(System.getProperty("test.jdk")); - // JPRT not yet ready for jmods Helper helper = Helper.newHelper(); if (helper == null) { + // Skip test if the jmods directory is missing (e.g. exploded image) System.err.println("Test not run, NO jmods directory"); return; } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/tools/jlink/plugins/StringSharingPluginTest.java --- a/test/jdk/tools/jlink/plugins/StringSharingPluginTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/tools/jlink/plugins/StringSharingPluginTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -67,9 +67,9 @@ private static int strID = 1; public static void main(String[] args) throws Exception { - // JPRT not yet ready for jmods Helper helper = Helper.newHelper(); if (helper == null) { + // Skip test if the jmods directory is missing (e.g. exploded image) System.err.println("Test not run, NO jmods directory"); return; } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/tools/jlink/plugins/StripDebugPluginTest.java --- a/test/jdk/tools/jlink/plugins/StripDebugPluginTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/tools/jlink/plugins/StripDebugPluginTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -68,9 +68,9 @@ } public void test() throws Exception { - // JPRT not yet ready for jmods Helper helper = Helper.newHelper(); if (helper == null) { + // Skip test if the jmods directory is missing (e.g. exploded image) System.err.println("Test not run, NO jmods directory"); return; } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/tools/lib/tests/Helper.java --- a/test/jdk/tools/lib/tests/Helper.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/tools/lib/tests/Helper.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, 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 @@ -67,8 +67,8 @@ public static Helper newHelper() throws IOException { Path jdkHome = Paths.get(System.getProperty("test.jdk")); - // JPRT not yet ready for jmods if (!Files.exists(jdkHome.resolve("jmods"))) { + // Skip test if the jmods directory is missing (e.g. exploded image) System.err.println("Test not run, NO jmods directory"); return null; } diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/tools/pack200/Pack200Test.java --- a/test/jdk/tools/pack200/Pack200Test.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/tools/pack200/Pack200Test.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, 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 @@ -133,7 +133,7 @@ */ public static void main(String[] args) throws Exception { // select the jars carefully, adding more jars will increase the - // testing time, especially for jprt. + // testing time. jarList.add(Utils.createRtJar()); jarList.add(Utils.getGoldenJar()); System.out.println(jarList); diff -r 3c92ada330a9 -r e03e5f61c53f test/jdk/tools/pack200/TestExceptions.java --- a/test/jdk/tools/pack200/TestExceptions.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/jdk/tools/pack200/TestExceptions.java Fri Oct 05 16:14:28 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2018, 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 @@ -110,7 +110,7 @@ ti.checkException(e); } } - } finally { // keep jprt happy + } finally { // clean up for (TestInput ti : tlist) { if (ti != null) { ti.close(); @@ -143,7 +143,7 @@ ti.checkException(e); } } - } finally { // keep jprt happy + } finally { // clean up for (PackTestJarInputStream ti : tlist) { if (ti != null) { ti.close(); @@ -177,7 +177,7 @@ ti.checkException(e); } } - } finally { // keep jprt happy + } finally { // clean up for (TestInput ti : tlist) { if (ti != null) { ti.close(); @@ -210,7 +210,7 @@ ti.checkException(e); } } - } finally { // keep jprt happy + } finally { // clean up for (TestInput ti : tlist) { if (ti != null) { ti.close(); diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/Makefile --- a/test/langtools/Makefile Fri Oct 05 15:15:56 2018 -0700 +++ b/test/langtools/Makefile Fri Oct 05 16:14:28 2018 -0700 @@ -12,10 +12,6 @@ # build, and set TESTBOOTCLASSPATH to the compiled langtools classes -- # for example build/classes or dist/lib/classes.jar. -# JPRT -# JPRT may invoke this Makefile directly, as part of a langtools build, -# or indirectly, via FOREST/test/Makefile, as part of a control build. - # Get OS/ARCH specifics OSNAME = $(shell uname -s) ifeq ($(OSNAME), SunOS) @@ -71,12 +67,6 @@ # Root of this test area (important to use full paths in some places) TEST_ROOT := $(shell pwd $(CYGPATH) ) -# Default bundle of all test results (passed or not) (JPRT only) -ifdef JPRT_JOB_ID - JPRT_CLEAN = clean - JPRT_ARCHIVE_BUNDLE = $(TEST_ROOT)/JPRT_ARCHIVE_BUNDLE.zip -endif - ifeq ($(PLATFORM), windows) SLASH_JAVA = J: else @@ -85,9 +75,7 @@ # Default JTREG to run ifndef JTREG_HOME - ifdef JPRT_JTREG_HOME - JTREG_HOME = $(JPRT_JTREG_HOME) - else ifdef JT_HOME + ifdef JT_HOME JTREG_HOME = $(JT_HOME) else JTREG_HOME = $(SLASH_JAVA)/re/jtreg/4.2/promoted/latest/ @@ -108,11 +96,7 @@ # Default JCK to run ifndef JCK_HOME - ifdef JPRT_JCK_HOME - JCK_HOME = $(JPRT_JCK_HOME) - else - JCK_HOME = $(SLASH_JAVA)/re/jck/8/promoted/latest/binaries - endif + JCK_HOME = $(SLASH_JAVA)/re/jck/8/promoted/latest/binaries endif # Default JDK for JTREG and JCK @@ -120,21 +104,13 @@ # JT_JAVA is the version of java used to run jtreg/JCK. # ifndef JT_JAVA - ifdef JPRT_JAVA_HOME - JT_JAVA = $(JPRT_JAVA_HOME) - else - JT_JAVA = $(SLASH_JAVA)/re/jdk/1.9.0/archive/fcs/binaries/$(PLATFORM)-$(ARCH) - endif + JT_JAVA = $(SLASH_JAVA)/re/jdk/1.9.0/archive/fcs/binaries/$(PLATFORM)-$(ARCH) endif # Default JDK to test -ifdef JPRT_IMPORT_PRODUCT_HOME - TESTJAVA = $(JPRT_IMPORT_PRODUCT_HOME) -else - TESTJAVA = $(SLASH_JAVA)/re/jdk/1.9.0/promoted/latest/binaries/$(PLATFORM)-$(ARCH) -endif +TESTJAVA = $(SLASH_JAVA)/re/jdk/1.9.0/promoted/latest/binaries/$(PLATFORM)-$(ARCH) -# PRODUCT_HOME is a JPRT variable pointing to a directory containing the output from +# PRODUCT_HOME is a variable pointing to a directory containing the output from # make/Makefile # For langtools, this is a directory containing build and dist # For a control build, this is build/$(PRODUCT)-$(ARCH)/XYZ-image @@ -199,12 +175,7 @@ ### -jtoptions:-Ejck.env.runtime.testCompile.groupMode.groupSize=$(JCK_GROUP_SIZE) endif -# Timeouts -- by default, increase test timeouts when running on JPRT -ifdef JPRT_JOB_ID - ifndef JTREG_TIMEOUT_FACTOR - JTREG_TIMEOUT_FACTOR = 3 - endif -endif +# Timeouts ifdef JTREG_TIMEOUT_FACTOR JTREG_OPTIONS += -timeoutFactor:$(JTREG_TIMEOUT_FACTOR) endif @@ -266,16 +237,16 @@ endif # Default make rule -- warning, may take a while -all: $(JPRT_CLEAN) jtreg-tests jck-compiler-tests jck-runtime-tests $(JPRT_ARCHIVE_BUNDLE) all-summary +all: jtreg-tests jck-compiler-tests jck-runtime-tests all-summary @echo "Testing completed successfully" -jtreg apt javac javadoc javah javap jdeps: $(JPRT_CLEAN) jtreg-tests $(JPRT_ARCHIVE_BUNDLE) jtreg-summary +jtreg apt javac javadoc javah javap jdeps: jtreg-tests jtreg-summary @echo "Testing completed successfully" -jck-compiler: $(JPRT_CLEAN) jck-compiler-tests $(JPRT_ARCHIVE_BUNDLE) jck-compiler-summary +jck-compiler: jck-compiler-tests jck-compiler-summary @echo "Testing completed successfully" -jck-runtime: $(JPRT_CLEAN) jck-runtime-tests $(JPRT_ARCHIVE_BUNDLE) jck-runtime-summary +jck-runtime: jck-runtime-tests jck-runtime-summary @echo "Testing completed successfully" # a way to select tests from outside @@ -286,7 +257,7 @@ JCK_RUNTIME_TESTDIRS = $(TEST_SELECTION) endif -# for use with JPRT -testrule +# convenience targets all: JTREG_TESTDIRS = . jtreg: JTREG_TESTDIRS ?= . apt: JTREG_TESTDIRS = tools/apt @@ -476,15 +447,8 @@ $(EXIT) 1 fi -# Bundle up the results -$(JPRT_ARCHIVE_BUNDLE): FRC - @rm -f $@ - @mkdir -p $(@D) - ( cd $(TEST_OUTPUT_DIR) && zip -q -r $@ . ) - # Cleanup clean: - rm -f $(JPRT_ARCHIVE_BUNDLE) # Used to force a target rules to run FRC: diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/jdk/javadoc/doclet/testJavaFX/TestJavaFxMode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/jdk/javadoc/doclet/testJavaFX/TestJavaFxMode.java Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8208531 + * @summary -javafx mode should be on by default when JavaFX is available. + * @library /tools/lib ../lib + * @modules jdk.javadoc/jdk.javadoc.internal.tool + * @build JavadocTester + * @run main TestJavaFxMode + */ + +import toolbox.ToolBox; + +import java.nio.file.Path; +import java.nio.file.Paths; + +public class TestJavaFxMode extends JavadocTester { + + final ToolBox tb; + + public static void main(String... args) throws Exception { + TestJavaFxMode tester = new TestJavaFxMode(); + if (tester.sanity()) { + tester.runTests(m -> new Object[]{Paths.get(m.getName())}); + } + } + + TestJavaFxMode() { + tb = new ToolBox(); + } + + // Check if FX modules are available. + boolean sanity() { + try { + Class.forName("javafx.beans.Observable"); + } catch (ClassNotFoundException cnfe) { + System.out.println("Note: javafx.beans.Observable: not found, test passes vacuously"); + return false; + } + return true; + } + + @Test + void test(Path base) throws Exception { + Path src = base.resolve("src"); + createTestClass(src); + Path outDir = base.resolve("out"); + + javadoc("-d", outDir.toString(), + "-sourcepath", src.toString(), + "pkg"); + + checkExit(Exit.OK); + checkOrder("pkg/A.html", + "Property Summary", + "javafx.beans.property.Property", "prop", + "Field Summary", + "javafx.beans.property.Property", "prop", + "Method Summary", + "getProp", "Gets the value of the property prop.", + "propProperty", "Sets the value of the property prop."); + } + + void createTestClass(Path src) throws Exception { + tb.writeJavaFiles(src, + "package pkg;\n" + + "import javafx.beans.property.Property;\n" + + "public class A {\n" + + " public Property prop;\n" + + " public Property propProperty(){return null;}\n" + + " public Property getProp(){return null;}\n" + + " public void setProp(Property prop){}\n" + + "}"); + } + +} diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/tools/javac/T8152616.java --- a/test/langtools/tools/javac/T8152616.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/langtools/tools/javac/T8152616.java Fri Oct 05 16:14:28 2018 -0700 @@ -25,8 +25,8 @@ * @test * @bug 8152616 * @summary Unit test for corner case of PrettyPrinting when SourceOutput is false - * @run compile --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED T8152616.java - * @run main T8152616 + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.tree */ import java.io.File; diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/tools/javac/diags/examples/VarInImplicitLambda.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/diags/examples/VarInImplicitLambda.java Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018, 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. + */ + +// key: compiler.misc.feature.var.syntax.in.implicit.lambda +// key: compiler.err.feature.not.supported.in.source.plural +// options: -source 10 -Xlint:-options + +import java.util.function.*; + +class VarInImplicitLambda { + IntBinaryOperator f2 = (var x, y) -> x + y; +} diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/tools/javac/lambda/LambdaParserTest.java --- a/test/langtools/tools/javac/lambda/LambdaParserTest.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/langtools/tools/javac/lambda/LambdaParserTest.java Fri Oct 05 16:14:28 2018 -0700 @@ -107,8 +107,8 @@ } enum SourceKind { - SOURCE_9("9"), - SOURCE_10("10"); + SOURCE_10("10"), + SOURCE_11("11"); String sourceNumber; @@ -121,9 +121,9 @@ IMPLICIT_1("", ExplicitKind.IMPLICIT), IMPLICIT_2("var", ExplicitKind.IMPLICIT_VAR), - EXPLIICT_SIMPLE("A", ExplicitKind.EXPLICIT), - EXPLIICT_SIMPLE_ARR1("A[]", ExplicitKind.EXPLICIT), - EXPLIICT_SIMPLE_ARR2("A[][]", ExplicitKind.EXPLICIT), + EXPLICIT_SIMPLE("A", ExplicitKind.EXPLICIT), + EXPLICIT_SIMPLE_ARR1("A[]", ExplicitKind.EXPLICIT), + EXPLICIT_SIMPLE_ARR2("A[][]", ExplicitKind.EXPLICIT), EXPLICIT_VARARGS("A...", ExplicitKind.EXPLICIT), EXPLICIT_GENERIC1("A", ExplicitKind.EXPLICIT), EXPLICIT_GENERIC2("A", ExplicitKind.EXPLICIT), @@ -157,13 +157,7 @@ } ExplicitKind explicitKind(SourceKind sk) { - switch (explicitKind) { - case IMPLICIT_VAR: - return (sk == SourceKind.SOURCE_9) ? - ExplicitKind.EXPLICIT : ExplicitKind.IMPLICIT_VAR; - default: - return explicitKind; - } + return explicitKind; } } @@ -299,6 +293,15 @@ errorExpected |= pn == LambdaParameterName.UNDERSCORE && lk.arity() > 0; + for (int i = 0; i < lk.arity(); i++) { + if (!lk.isShort() && + pks[i].explicitKind(sk) == LambdaParameterKind.ExplicitKind.IMPLICIT_VAR && + sk == SourceKind.SOURCE_10) { + errorExpected = true; + break; + } + } + if (errorExpected != res.hasErrors()) { fail("invalid diagnostics for source:\n" + res.compilationInfo() + diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01.java --- a/test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01.java Fri Oct 05 15:15:56 2018 -0700 +++ b/test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01.java Fri Oct 05 16:14:28 2018 -0700 @@ -3,6 +3,7 @@ * @bug 8198512 8199327 * @summary compiler support for local-variable syntax for lambda parameters * @compile/fail/ref=VarInImplicitLambdaNegTest01.out -XDrawDiagnostics VarInImplicitLambdaNegTest01.java + * @compile/fail/ref=VarInImplicitLambdaNegTest01_source10.out -source 10 -XDrawDiagnostics VarInImplicitLambdaNegTest01.java */ import java.util.function.*; diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01.out --- a/test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01.out Fri Oct 05 15:15:56 2018 -0700 +++ b/test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01.out Fri Oct 05 16:14:28 2018 -0700 @@ -1,6 +1,6 @@ -VarInImplicitLambdaNegTest01.java:11:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.var.and.implicit.not.allowed) VarInImplicitLambdaNegTest01.java:12:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.var.and.implicit.not.allowed) -VarInImplicitLambdaNegTest01.java:13:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.var.and.explicit.not.allowed) -VarInImplicitLambdaNegTest01.java:14:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.implicit.and.explicit.not.allowed) -VarInImplicitLambdaNegTest01.java:16:52: compiler.err.var.not.allowed.array +VarInImplicitLambdaNegTest01.java:13:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.var.and.implicit.not.allowed) +VarInImplicitLambdaNegTest01.java:14:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.var.and.explicit.not.allowed) +VarInImplicitLambdaNegTest01.java:15:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.implicit.and.explicit.not.allowed) +VarInImplicitLambdaNegTest01.java:17:52: compiler.err.var.not.allowed.array 5 errors diff -r 3c92ada330a9 -r e03e5f61c53f test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01_source10.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/var_implicit_lambda/VarInImplicitLambdaNegTest01_source10.out Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,6 @@ +- compiler.warn.source.no.bootclasspath: 10 +VarInImplicitLambdaNegTest01.java:12:36: compiler.err.feature.not.supported.in.source.plural: (compiler.misc.feature.var.syntax.in.implicit.lambda), 10, 11 +VarInImplicitLambdaNegTest01.java:15:28: compiler.err.invalid.lambda.parameter.declaration: (compiler.misc.implicit.and.explicit.not.allowed) +VarInImplicitLambdaNegTest01.java:17:52: compiler.err.var.not.allowed.here +3 errors +1 warning diff -r 3c92ada330a9 -r e03e5f61c53f test/make/TestCompileCommands.gmk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/make/TestCompileCommands.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -0,0 +1,54 @@ + +# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +include $(SPEC) +include MakeBase.gmk + +default: all + +COMPILE_COMMANDS := $(OUTPUTDIR)/compile_commands.json + +# Perform basic compile_commands.json validation: +# - should start with [ and end with ] +# - should contain at least one entry (opening {) +# - last entry should not have a trailing comma (end with }) +verify-compile-commands-json: + $(HEAD) -n 1 $(COMPILE_COMMANDS) | $(GREP) -q -e "^\[$$" + $(TAIL) -1 $(COMPILE_COMMANDS) | $(GREP) -q -e "^\]$$" + $(HEAD) -n 2 $(COMPILE_COMMANDS) | $(GREP) -q -e "{" + $(TAIL) -2 $(COMPILE_COMMANDS) | $(GREP) -q -e "}$$" + +# Ensure that no native shared library for hotspot was created during the +# build. Checking hotspot only since on Windows the jdk folders are prepopulated +# with CRT DLLs. Also note that this test requires a clean build folder. +verify-no-shared-libraries: + $(FIND) $(OUTPUTDIR)/hotspot -type f -name "*$(SHARED_LIBRARY_SUFFIX)" \ + -exec false {} + + +TEST_TARGETS += verify-compile-commands-json verify-no-shared-libraries + +all: $(TEST_TARGETS) + +.PHONY: default all verify-compile-commands diff -r 3c92ada330a9 -r e03e5f61c53f test/make/TestMake.gmk --- a/test/make/TestMake.gmk Fri Oct 05 15:15:56 2018 -0700 +++ b/test/make/TestMake.gmk Fri Oct 05 16:14:28 2018 -0700 @@ -39,7 +39,10 @@ test-idea: +$(MAKE) -f TestIdea.gmk $(TEST_SUBTARGET) +test-compile-commands: + +$(MAKE) -f TestCompileCommands.gmk $(TEST_SUBTARGET) + all: make-base java-compilation copy-files test-idea -.PHONY: default all make-base java-compilation copy-files test-idea +.PHONY: default all make-base java-compilation copy-files test-idea test-compile-commands