This commit is contained in:
J. Duke 2017-07-05 19:24:20 +02:00
commit eefa103320
1614 changed files with 6417 additions and 68260 deletions

View File

@ -239,3 +239,4 @@ d086227bfc45d124f09b3bd72a07956b4073bf71 jdk8-b111
763ada2a1d8c5962bc8c3d297e57c562d2e95338 jdk8-b115
cbfe5da942c63ef865cab4a7159e01eff7d7fcf5 jdk8-b116
a4afb0a8d55ef75aef5b0d77b434070468fb89f8 jdk8-b117
0a6db1aac998cdc88e52f9adb97d40ca5b0f1da6 jdk8-b118

635
Makefile
View File

@ -1,5 +1,5 @@
#
# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -23,549 +23,112 @@
# questions.
#
# If NEWBUILD is defined, use the new build-infra Makefiles and configure.
# See NewMakefile.gmk for more information.
# This must be the first rule
default:
# If not specified, select what the default build is
ifndef NEWBUILD
NEWBUILD=true
# Inclusion of this pseudo-target will cause make to execute this file
# serially, regardless of -j. Recursively called makefiles will not be
# affected, however. This is required for correct dependency management.
.NOTPARALLEL:
# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make.
# /usr/ccs/bin/make lacks basically every other flow control mechanism.
TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
# Assume we have GNU make, but check version.
ifeq ($(strip $(foreach v, 3.81% 3.82% 4.%, $(filter $v, $(MAKE_VERSION)))), )
$(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.)
endif
ifeq ($(NEWBUILD),true)
# The new top level Makefile
include NewMakefile.gmk
else # Original Makefile logic
BUILD_PARENT_DIRECTORY=.
# Basename of any originally supplied ALT_OUTPUTDIR directory
ifndef ORIG_OUTPUTDIR_BASENAME
ifdef ALT_OUTPUTDIR
ORIG_OUTPUTDIR_BASENAME := $(shell basename $(ALT_OUTPUTDIR))
else
ORIG_OUTPUTDIR_BASENAME = $(PLATFORM)-$(ARCH)
endif
endif
export ORIG_OUTPUTDIR_BASENAME
# The three possible directories created for output (3 build flavors)
OUTPUTDIR_BASENAME- = $(ORIG_OUTPUTDIR_BASENAME)
OUTPUTDIR_BASENAME-debug = $(ORIG_OUTPUTDIR_BASENAME)-debug
OUTPUTDIR_BASENAME-fastdebug = $(ORIG_OUTPUTDIR_BASENAME)-fastdebug
# Relative path to a debug output area
REL_JDK_OUTPUTDIR = ../$(OUTPUTDIR_BASENAME-$(DEBUG_NAME))
# The created jdk image directory
JDK_IMAGE_DIRNAME = j2sdk-image
JDK_IMAGE_DIR = $(OUTPUTDIR)/$(JDK_IMAGE_DIRNAME)
ABS_JDK_IMAGE_DIR = $(ABS_OUTPUTDIR)/$(JDK_IMAGE_DIRNAME)
# Relative path from an output directory to the image directory
REL_JDK_IMAGE_DIR = ../$(OUTPUTDIR_BASENAME-$(DEBUG_NAME))/$(JDK_IMAGE_DIRNAME)
REL_JDK_DEBUG_IMAGE_DIR = ../$(OUTPUTDIR_BASENAME-debug)/$(JDK_IMAGE_DIRNAME)
REL_JDK_FASTDEBUG_IMAGE_DIR = ../$(OUTPUTDIR_BASENAME-fastdebug)/$(JDK_IMAGE_DIRNAME)
ifndef TOPDIR
TOPDIR:=.
endif
ifndef JDK_TOPDIR
JDK_TOPDIR=$(TOPDIR)/jdk
endif
ifndef JDK_MAKE_SHARED_DIR
JDK_MAKE_SHARED_DIR=$(JDK_TOPDIR)/make/common/shared
endif
default: all
include $(JDK_MAKE_SHARED_DIR)/Defs-control.gmk
include ./make/Defs-internal.gmk
include ./make/sanity-rules.gmk
include ./make/hotspot-rules.gmk
include ./make/langtools-rules.gmk
include ./make/corba-rules.gmk
include ./make/jaxp-rules.gmk
include ./make/jaxws-rules.gmk
include ./make/jdk-rules.gmk
include ./make/nashorn-rules.gmk
include ./make/install-rules.gmk
include ./make/sponsors-rules.gmk
include ./make/deploy-rules.gmk
all:: sanity
ifeq ($(SKIP_FASTDEBUG_BUILD), false)
all:: fastdebug_build
endif
ifeq ($(SKIP_DEBUG_BUILD), false)
all:: debug_build
endif
all:: all_product_build
all_product_build::
# Everything for a full product build
ifeq ($(SKIP_PRODUCT_BUILD), false)
all_product_build:: product_build
ifeq ($(BUILD_INSTALL), true)
all_product_build:: $(INSTALL)
clobber:: install-clobber
endif
ifeq ($(BUILD_SPONSORS), true)
all_product_build:: $(SPONSORS)
clobber:: sponsors-clobber
endif
ifneq ($(SKIP_COMPARE_IMAGES), true)
all_product_build:: compare-image
endif
endif
define StartTimer
$(MKDIR) -p $(BUILDTIMESDIR)
$(RM) $(BUILDTIMESDIR)/build_time_*
$(call RecordStartTime,TOTAL)
endef
define StopTimer
$(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),)
endef
# Generic build of basic repo series
generic_build_repo_series:: $(SOURCE_TIPS)
$(MKDIR) -p $(JDK_IMAGE_DIR)
@$(call StartTimer)
ifeq ($(BUILD_LANGTOOLS), true)
generic_build_repo_series:: langtools
clobber:: langtools-clobber
endif
ifeq ($(BUILD_CORBA), true)
generic_build_repo_series:: corba
clobber:: corba-clobber
endif
ifeq ($(BUILD_JAXP), true)
generic_build_repo_series:: jaxp
clobber:: jaxp-clobber
endif
ifeq ($(BUILD_JAXWS), true)
generic_build_repo_series:: jaxws
clobber:: jaxws-clobber
endif
ifeq ($(BUILD_HOTSPOT), true)
generic_build_repo_series:: $(HOTSPOT)
clobber:: hotspot-clobber
endif
ifeq ($(BUILD_JDK), true)
generic_build_repo_series:: $(JDK_JAVA_EXE)
clobber:: jdk-clobber
endif
ifeq ($(BUILD_NASHORN), true)
generic_build_repo_series:: $(NASHORN)
clobber:: nashorn-clobber
endif
ifeq ($(BUILD_DEPLOY), true)
generic_build_repo_series:: $(DEPLOY)
clobber:: deploy-clobber
endif
generic_build_repo_series::
@$(call StopTimer,$(if $(DEBUG_NAME),$(DEBUG_NAME)_build,all_product_build))
# The debug build, fastdebug or debug. Needs special handling.
# Note that debug builds do NOT do INSTALL steps, but must be done
# after the product build and before the INSTALL step of the product build.
#
# DEBUG_NAME is fastdebug or debug
# ALT_OUTPUTDIR is changed to have -debug or -fastdebug suffix
# The resulting image directory (j2sdk-image) is used by the install makefiles
# to create a debug install bundle jdk-*-debug-** bundle (tar or zip)
# which will install in the debug or fastdebug subdirectory of the
# normal product install area.
# The install process needs to know what the DEBUG_NAME is, so
# look for INSTALL_DEBUG_NAME in the install rules.
#
# NOTE: On windows, do not use $(ABS_BOOTDIR_OUTPUTDIR)-$(DEBUG_NAME).
# Due to the use of short paths in $(ABS_OUTPUTDIR), this may
# not be the same location.
#
# Location of fresh bootdir output
ABS_BOOTDIR_OUTPUTDIR=$(ABS_OUTPUTDIR)/bootjdk
FRESH_BOOTDIR=$(ABS_BOOTDIR_OUTPUTDIR)/$(JDK_IMAGE_DIRNAME)
FRESH_DEBUG_BOOTDIR=$(ABS_BOOTDIR_OUTPUTDIR)/$(REL_JDK_IMAGE_DIR)
create_fresh_product_bootdir: FRC
$(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \
GENERATE_DOCS=false \
BOOT_CYCLE_SETTINGS= \
build_product_image
create_fresh_debug_bootdir: FRC
$(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \
GENERATE_DOCS=false \
BOOT_CYCLE_DEBUG_SETTINGS= \
build_debug_image
create_fresh_fastdebug_bootdir: FRC
$(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \
GENERATE_DOCS=false \
BOOT_CYCLE_DEBUG_SETTINGS= \
build_fastdebug_image
# Create boot image?
ifeq ($(SKIP_BOOT_CYCLE),false)
ifneq ($(PLATFORM)$(ARCH_DATA_MODEL),solaris64)
DO_BOOT_CYCLE=true
endif
endif
ifeq ($(DO_BOOT_CYCLE),true)
# Create the bootdir to use in the build
product_build:: create_fresh_product_bootdir
debug_build:: create_fresh_debug_bootdir
fastdebug_build:: create_fresh_fastdebug_bootdir
# Define variables to be used now for the boot jdk
BOOT_CYCLE_SETTINGS= \
ALT_BOOTDIR=$(FRESH_BOOTDIR) \
ALT_JDK_IMPORT_PATH=$(FRESH_BOOTDIR)
BOOT_CYCLE_DEBUG_SETTINGS= \
ALT_BOOTDIR=$(FRESH_DEBUG_BOOTDIR) \
ALT_JDK_IMPORT_PATH=$(FRESH_DEBUG_BOOTDIR)
# Locate this Makefile
ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST))
else
makefile_path:=$(lastword $(MAKEFILE_LIST))
endif
root_dir:=$(dir $(makefile_path))
# Use the supplied ALT_BOOTDIR as the boot
BOOT_CYCLE_SETTINGS=
BOOT_CYCLE_DEBUG_SETTINGS=
# ... and then we can include our helper functions
include $(root_dir)/make/MakeHelpers.gmk
$(eval $(call ParseLogLevel))
$(eval $(call ParseConfAndSpec))
# Now determine if we have zero, one or several configurations to build.
ifeq ($(SPEC),)
# Since we got past ParseConfAndSpec, we must be building a global target. Do nothing.
else
ifeq ($(words $(SPEC)),1)
# We are building a single configuration. This is the normal case. Execute the Main.gmk file.
include $(root_dir)/make/Main.gmk
else
# We are building multiple configurations.
# First, find out the valid targets
# Run the makefile with an arbitrary SPEC using -p -q (quiet dry-run and dump rules) to find
# available PHONY targets. Use this list as valid targets to pass on to the repeated calls.
all_phony_targets=$(filter-out $(global_targets) bundles-only, $(strip $(shell \
$(MAKE) -p -q -f make/Main.gmk FRC SPEC=$(firstword $(SPEC)) | \
grep ^.PHONY: | head -n 1 | cut -d " " -f 2-)))
$(all_phony_targets):
@$(foreach spec,$(SPEC),($(MAKE) -f NewMakefile.gmk SPEC=$(spec) \
$(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) $@) &&) true
.PHONY: $(all_phony_targets)
endif
endif
build_product_image:
$(MAKE) \
SKIP_FASTDEBUG_BUILD=true \
SKIP_DEBUG_BUILD=true \
$(BOOT_CYCLE_SETTINGS) \
generic_build_repo_series
# Include this after a potential spec file has been included so that the bundles target
# has access to the spec variables.
include $(root_dir)/make/Jprt.gmk
# NOTE: On windows, do not use $(ABS_OUTPUTDIR)-$(DEBUG_NAME).
# Due to the use of short paths in $(ABS_OUTPUTDIR), this may
# not be the same location.
# Here are "global" targets, i.e. targets that can be executed without specifying a single configuration.
# If you addd more global targets, please update the variable global_targets in MakeHelpers.
generic_debug_build:
$(MAKE) \
ALT_OUTPUTDIR=$(ABS_OUTPUTDIR)/$(REL_JDK_OUTPUTDIR) \
DEBUG_NAME=$(DEBUG_NAME) \
GENERATE_DOCS=false \
$(BOOT_CYCLE_DEBUG_SETTINGS) \
generic_build_repo_series
build_debug_image:
$(MAKE) DEBUG_NAME=debug generic_debug_build
build_fastdebug_image:
$(MAKE) DEBUG_NAME=fastdebug generic_debug_build
# Build final image
product_build:: build_product_image
debug_build:: build_debug_image
fastdebug_build:: build_fastdebug_image
# The source tips are stored with the relative path to the repo.
# This file will be used when constructing the jdk image.
source_tips: $(SOURCE_TIPS)
$(CAT) $<
$(SOURCE_TIPS): FRC
@$(prep-target)
@$(call GetSourceTips)
clobber:: REPORT_BUILD_TIMES=
clobber::
$(RM) -r $(OUTPUTDIR)/*
-($(RMDIR) -p $(OUTPUTDIR) > $(DEV_NULL) 2>&1; $(TRUE))
clean: clobber
#
# Dev builds
#
dev : dev-build
dev-build:
$(MAKE) DEV_ONLY=true all
dev-sanity:
$(MAKE) DEV_ONLY=true sanity
dev-clobber:
$(MAKE) DEV_ONLY=true clobber
#
# Quick jdk verification build
#
jdk_only:
$(MAKE) SKIP_FASTDEBUG_BUILD=true BUILD_HOTSPOT=false all
#
# Quick jdk verification fastdebug build
#
jdk_fastdebug_only:
$(MAKE) DEBUG_NAME=fastdebug BUILD_HOTSPOT=false BUILD_DEPLOY=false \
BUILD_INSTALL=false BUILD_SPONSORS=false generic_debug_build
#
# Quick deploy verification fastdebug build
#
deploy_fastdebug_only:
$(MAKE) \
DEBUG_NAME=fastdebug \
BUILD_HOTSPOT=false \
BUILD_JDK=false \
BUILD_LANGTOOLS=false \
BUILD_NASHORN=false \
BUILD_CORBA=false \
BUILD_JAXP=false \
BUILD_JAXWS=false \
BUILD_INSTALL=false \
BUILD_SPONSORS=false \
generic_debug_build
#
# Product build (skip debug builds)
#
product_only:
$(MAKE) SKIP_FASTDEBUG_BUILD=true all
#
# Check target
#
check: variable_check
#
# Help target
#
help: intro_help target_help variable_help notes_help examples_help
# Intro help message
intro_help:
@$(ECHO) "\
Makefile for the JDK builds (all the JDK). \n\
"
# Target help
target_help:
@$(ECHO) "\
--- Common Targets --- \n\
all -- build the core JDK (default target) \n\
help -- Print out help information \n\
check -- Check make variable values for correctness \n\
sanity -- Perform detailed sanity checks on system and settings \n\
fastdebug_build -- build the core JDK in 'fastdebug' mode (-g -O) \n\
debug_build -- build the core JDK in 'debug' mode (-g) \n\
clean -- remove all built and imported files \n\
clobber -- same as clean \n\
"
# Variable help (only common ones used by this Makefile)
variable_help: variable_help_intro variable_list variable_help_end
variable_help_intro:
@$(ECHO) "--- Common Variables ---"
variable_help_end:
@$(ECHO) " "
# One line descriptions for the variables
OUTPUTDIR.desc = Output directory
PARALLEL_COMPILE_JOBS.desc = Solaris/Linux parallel compile run count
SLASH_JAVA.desc = Root of all build tools, e.g. /java or J:
BOOTDIR.desc = JDK used to boot the build
JDK_IMPORT_PATH.desc = JDK used to import components of the build
COMPILER_PATH.desc = Compiler install directory
CACERTS_FILE.desc = Location of certificates file
DEVTOOLS_PATH.desc = Directory containing zip and gnumake
CUPS_HEADERS_PATH.desc = Include directory location for CUPS header files
# Make variables to print out (description and value)
VARIABLE_PRINTVAL_LIST += \
OUTPUTDIR \
PARALLEL_COMPILE_JOBS \
SLASH_JAVA \
BOOTDIR \
JDK_IMPORT_PATH \
COMPILER_PATH \
CACERTS_FILE \
DEVTOOLS_PATH
# Make variables that should refer to directories that exist
VARIABLE_CHECKDIR_LIST += \
SLASH_JAVA \
BOOTDIR \
JDK_IMPORT_PATH \
COMPILER_PATH \
DEVTOOLS_PATH
# Make variables that should refer to files that exist
VARIABLE_CHECKFIL_LIST += \
CACERTS_FILE
# For pattern rules below, so all are treated the same
DO_PRINTVAL_LIST=$(VARIABLE_PRINTVAL_LIST:%=%.printval)
DO_CHECKDIR_LIST=$(VARIABLE_CHECKDIR_LIST:%=%.checkdir)
DO_CHECKFIL_LIST=$(VARIABLE_CHECKFIL_LIST:%=%.checkfil)
# Complete variable check
variable_check: $(DO_CHECKDIR_LIST) $(DO_CHECKFIL_LIST)
variable_list: $(DO_PRINTVAL_LIST) variable_check
# Pattern rule for printing out a variable
%.printval:
@$(ECHO) " ALT_$* - $($*.desc)"
@$(ECHO) " \t $*=$($*)"
# Pattern rule for checking to see if a variable with a directory exists
%.checkdir:
@if [ ! -d $($*) ] ; then \
$(ECHO) "WARNING: $* does not exist, try $(MAKE) sanity"; \
fi
# Pattern rule for checking to see if a variable with a file exists
%.checkfil:
@if [ ! -f $($*) ] ; then \
$(ECHO) "WARNING: $* does not exist, try $(MAKE) sanity"; \
fi
# Misc notes on help
notes_help:
@$(ECHO) "\
--- Notes --- \n\
- All builds use same output directory unless overridden with \n\
\t ALT_OUTPUTDIR=<dir>, changing from product to fastdebug you may want \n\
\t to use the clean target first. \n\
- JDK_IMPORT_PATH must refer to a compatible build, not all past promoted \n\
\t builds or previous release JDK builds will work. \n\
- The fastest builds have been when the sources and the BOOTDIR are on \n\
\t local disk. \n\
"
examples_help:
@$(ECHO) "\
--- Examples --- \n\
$(MAKE) fastdebug_build \n\
$(MAKE) ALT_OUTPUTDIR=/tmp/foobar all \n\
$(MAKE) ALT_OUTPUTDIR=/tmp/foobar fastdebug_build \n\
$(MAKE) ALT_OUTPUTDIR=/tmp/foobar all \n\
$(MAKE) ALT_BOOTDIR=/opt/java/jdk1.5.0 \n\
$(MAKE) ALT_JDK_IMPORT_PATH=/opt/java/jdk1.6.0 \n\
"
################################################################
# Source bundling
################################################################
ifeq ($(BUNDLE_RULES_AVAILABLE), true)
include $(BUNDLE_RULES)
endif
################################################################
# rule to test
################################################################
.NOTPARALLEL: test_run
test:
$(MAKE) test_run
test_run: test_clean test_start test_summary
test_start:
@$(ECHO) "Tests started at `$(DATE)`"
test_clean:
$(RM) $(OUTPUTDIR)/test_failures.txt $(OUTPUTDIR)/test_log.txt
test_summary: $(OUTPUTDIR)/test_failures.txt
@$(ECHO) "#################################################"
@$(ECHO) "Tests completed at `$(DATE)`"
@( $(EGREP) '^TEST STATS:' $(OUTPUTDIR)/test_log.txt \
|| $(ECHO) "No TEST STATS seen in log" )
@$(ECHO) "For complete details see: $(OUTPUTDIR)/test_log.txt"
@$(ECHO) "#################################################"
@if [ -s $< ] ; then \
$(ECHO) "ERROR: Test failure count: `$(CAT) $< | $(WC) -l`"; \
$(CAT) $<; \
exit 1; \
else \
$(ECHO) "Success! No failures detected"; \
fi
# Get failure list from log
$(OUTPUTDIR)/test_failures.txt: $(OUTPUTDIR)/test_log.txt
@$(RM) $@
@( $(EGREP) '^FAILED:' $< || $(ECHO) "" ) | $(NAWK) 'length>0' > $@
# Get log file of all tests run
JDK_TO_TEST := $(shell \
if [ -d "$(ABS_JDK_IMAGE_DIR)" ] ; then \
$(ECHO) "$(ABS_JDK_IMAGE_DIR)"; \
elif [ -d "$(ABS_OUTPUTDIR)/bin" ] ; then \
$(ECHO) "$(ABS_OUTPUTDIR)"; \
elif [ "$(PRODUCT_HOME)" != "" -a -d "$(PRODUCT_HOME)/bin" ] ; then \
$(ECHO) "$(PRODUCT_HOME)"; \
fi \
)
TEST_TARGETS=all
$(OUTPUTDIR)/test_log.txt:
$(RM) $@
( $(CD) test && \
$(MAKE) NO_STOPPING=- PRODUCT_HOME=$(JDK_TO_TEST) $(TEST_TARGETS) \
) | tee $@
################################################################
# JPRT rule to build
################################################################
include ./make/jprt.gmk
################################################################
# PHONY
################################################################
.PHONY: all test test_run test_start test_summary test_clean \
generic_build_repo_series \
what clobber insane \
dev dev-build dev-sanity dev-clobber \
product_build \
fastdebug_build \
debug_build \
build_product_image \
build_debug_image \
build_fastdebug_image \
create_fresh_product_bootdir \
create_fresh_debug_bootdir \
create_fresh_fastdebug_bootdir \
generic_debug_build
# Force target
FRC:
endif # Original Makefile logic
help:
$(info )
$(info OpenJDK Makefile help)
$(info =====================)
$(info )
$(info Common make targets)
$(info . make [default] # Compile all product in langtools, hotspot, jaxp, jaxws,)
$(info . # corba and jdk)
$(info . make all # Compile everything, all repos and images)
$(info . make images # Create complete j2sdk and j2re images)
$(info . make docs # Create javadocs)
$(info . make overlay-images # Create limited images for sparc 64 bit platforms)
$(info . make profiles # Create complete j2re compact profile images)
$(info . make bootcycle-images # Build images twice, second time with newly build JDK)
$(info . make install # Install the generated images locally)
$(info . make clean # Remove all files generated by make, but not those)
$(info . # generated by configure)
$(info . make dist-clean # Remove all files, including configuration)
$(info . make help # Give some help on using make)
$(info . make test # Run tests, default is all tests (see TEST below))
$(info )
$(info Targets for specific components)
$(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk, nashorn, images, overlay-images, docs or test))
$(info . make <component> # Build <component> and everything it depends on. )
$(info . make <component>-only # Build <component> only, without dependencies. This)
$(info . # is faster but can result in incorrect build results!)
$(info . make clean-<component> # Remove files generated by make for <component>)
$(info )
$(info Useful make variables)
$(info . make CONF= # Build all configurations (note, assignment is empty))
$(info . make CONF=<substring> # Build the configuration(s) with a name matching)
$(info . # <substring>)
$(info )
$(info . make LOG=<loglevel> # Change the log level from warn to <loglevel>)
$(info . # Available log levels are:)
$(info . # 'warn' (default), 'info', 'debug' and 'trace')
$(info . # To see executed command lines, use LOG=debug)
$(info )
$(info . make JOBS=<n> # Run <n> parallel make jobs)
$(info . # Note that -jN does not work as expected!)
$(info )
$(info . make test TEST=<test> # Only run the given test or tests, e.g.)
$(info . # make test TEST="jdk_lang jdk_net")
$(info )
.PHONY: help

View File

@ -1,134 +0,0 @@
#
# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# This must be the first rule
default:
# Inclusion of this pseudo-target will cause make to execute this file
# serially, regardless of -j. Recursively called makefiles will not be
# affected, however. This is required for correct dependency management.
.NOTPARALLEL:
# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make.
# /usr/ccs/bin/make lacks basically every other flow control mechanism.
TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
# Assume we have GNU make, but check version.
ifeq ($(strip $(foreach v, 3.81% 3.82% 4.%, $(filter $v, $(MAKE_VERSION)))), )
$(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.)
endif
# Locate this Makefile
ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST))
else
makefile_path:=$(lastword $(MAKEFILE_LIST))
endif
root_dir:=$(dir $(makefile_path))
# ... and then we can include our helper functions
include $(root_dir)/common/makefiles/MakeHelpers.gmk
$(eval $(call ParseLogLevel))
$(eval $(call ParseConfAndSpec))
# Now determine if we have zero, one or several configurations to build.
ifeq ($(SPEC),)
# Since we got past ParseConfAndSpec, we must be building a global target. Do nothing.
else
ifeq ($(words $(SPEC)),1)
# We are building a single configuration. This is the normal case. Execute the Main.gmk file.
include $(root_dir)/common/makefiles/Main.gmk
else
# We are building multiple configurations.
# First, find out the valid targets
# Run the makefile with an arbitrary SPEC using -p -q (quiet dry-run and dump rules) to find
# available PHONY targets. Use this list as valid targets to pass on to the repeated calls.
all_phony_targets=$(filter-out $(global_targets) bundles-only, $(strip $(shell \
$(MAKE) -p -q -f common/makefiles/Main.gmk FRC SPEC=$(firstword $(SPEC)) | \
grep ^.PHONY: | head -n 1 | cut -d " " -f 2-)))
$(all_phony_targets):
@$(foreach spec,$(SPEC),($(MAKE) -f NewMakefile.gmk SPEC=$(spec) \
$(VERBOSE) VERBOSE=$(VERBOSE) LOG_LEVEL=$(LOG_LEVEL) $@) &&) true
.PHONY: $(all_phony_targets)
endif
endif
# Include this after a potential spec file has been included so that the bundles target
# has access to the spec variables.
include $(root_dir)/common/makefiles/Jprt.gmk
# Here are "global" targets, i.e. targets that can be executed without specifying a single configuration.
# If you addd more global targets, please update the variable global_targets in MakeHelpers.
help:
$(info )
$(info OpenJDK Makefile help)
$(info =====================)
$(info )
$(info Common make targets)
$(info . make [default] # Compile all product in langtools, hotspot, jaxp, jaxws,)
$(info . # corba and jdk)
$(info . make all # Compile everything, all repos and images)
$(info . make images # Create complete j2sdk and j2re images)
$(info . make docs # Create javadocs)
$(info . make overlay-images # Create limited images for sparc 64 bit platforms)
$(info . make profiles # Create complete j2re compact profile images)
$(info . make bootcycle-images # Build images twice, second time with newly build JDK)
$(info . make install # Install the generated images locally)
$(info . make clean # Remove all files generated by make, but not those)
$(info . # generated by configure)
$(info . make dist-clean # Remove all files, including configuration)
$(info . make help # Give some help on using make)
$(info . make test # Run tests, default is all tests (see TEST below))
$(info )
$(info Targets for specific components)
$(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk, nashorn, images, overlay-images, docs or test))
$(info . make <component> # Build <component> and everything it depends on. )
$(info . make <component>-only # Build <component> only, without dependencies. This)
$(info . # is faster but can result in incorrect build results!)
$(info . make clean-<component> # Remove files generated by make for <component>)
$(info )
$(info Useful make variables)
$(info . make CONF= # Build all configurations (note, assignment is empty))
$(info . make CONF=<substring> # Build the configuration(s) with a name matching)
$(info . # <substring>)
$(info )
$(info . make LOG=<loglevel> # Change the log level from warn to <loglevel>)
$(info . # Available log levels are:)
$(info . # 'warn' (default), 'info', 'debug' and 'trace')
$(info . # To see executed command lines, use LOG=debug)
$(info )
$(info . make JOBS=<n> # Run <n> parallel make jobs)
$(info . # Note that -jN does not work as expected!)
$(info )
$(info . make test TEST=<test> # Only run the given test or tests, e.g.)
$(info . # make test TEST="jdk_lang jdk_net")
$(info )
.PHONY: help

View File

@ -24,4 +24,4 @@
# This Makefile was generated by configure @DATE_WHEN_CONFIGURED@
# GENERATED FILE, DO NOT EDIT
SPEC:=@OUTPUT_ROOT@/spec.gmk
include @SRC_ROOT@/NewMakefile.gmk
include @SRC_ROOT@/Makefile

View File

@ -412,7 +412,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_OUTPUT_DIR],
# Test from where we are running configure, in or outside of src root.
if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" \
|| test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" \
|| test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then
|| test "x$CURDIR" = "x$SRC_ROOT/make" ; then
# We are running configure from the src root.
# Create a default ./build/target-variant-debuglevel output root.
if test "x${CONF_NAME}" = x; then

View File

@ -3865,7 +3865,7 @@ fi
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
DATE_WHEN_GENERATED=1383151988
DATE_WHEN_GENERATED=1384422786
###############################################################################
#
@ -8042,7 +8042,7 @@ fi
# Test from where we are running configure, in or outside of src root.
if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" \
|| test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" \
|| test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then
|| test "x$CURDIR" = "x$SRC_ROOT/make" ; then
# We are running configure from the src root.
# Create a default ./build/target-variant-debuglevel output root.
if test "x${CONF_NAME}" = x; then
@ -16201,32 +16201,25 @@ fi
cd "$CURDIR"
# Verify that the addon source root does not have any root makefiles.
# If it does, then it is usually an error, prevent this.
if test -f $with_add_source_root/langtools/makefiles/Makefile || \
test -f $with_add_source_root/langtools/make/Makefile; then
if test -f $with_add_source_root/langtools/make/Makefile; then
as_fn_error $? "Your add source root seems to contain a full langtools repo! An add source root should only contain additional sources." "$LINENO" 5
fi
if test -f $with_add_source_root/corba/makefiles/Makefile || \
test -f $with_add_source_root/corba/make/Makefile; then
if test -f $with_add_source_root/corba/make/Makefile; then
as_fn_error $? "Your add source root seems to contain a full corba repo! An add source root should only contain additional sources." "$LINENO" 5
fi
if test -f $with_add_source_root/jaxp/makefiles/Makefile || \
test -f $with_add_source_root/jaxp/make/Makefile; then
if test -f $with_add_source_root/jaxp/make/Makefile; then
as_fn_error $? "Your add source root seems to contain a full jaxp repo! An add source root should only contain additional sources." "$LINENO" 5
fi
if test -f $with_add_source_root/jaxws/makefiles/Makefile || \
test -f $with_add_source_root/jaxws/make/Makefile; then
if test -f $with_add_source_root/jaxws/make/Makefile; then
as_fn_error $? "Your add source root seems to contain a full jaxws repo! An add source root should only contain additional sources." "$LINENO" 5
fi
if test -f $with_add_source_root/hotspot/makefiles/Makefile || \
test -f $with_add_source_root/hotspot/make/Makefile; then
if test -f $with_add_source_root/hotspot/make/Makefile; then
as_fn_error $? "Your add source root seems to contain a full hotspot repo! An add source root should only contain additional sources." "$LINENO" 5
fi
if test -f $with_add_source_root/nashorn/makefiles/Makefile || \
test -f $with_add_source_root/nashorn/make/Makefile; then
if test -f $with_add_source_root/nashorn/make/Makefile; then
as_fn_error $? "Your add source root seems to contain a full nashorn repo! An add source root should only contain additional sources." "$LINENO" 5
fi
if test -f $with_add_source_root/jdk/makefiles/Makefile || \
test -f $with_add_source_root/jdk/make/Makefile; then
if test -f $with_add_source_root/jdk/make/Makefile; then
as_fn_error $? "Your add source root seems to contain a full JDK repo! An add source root should only contain additional sources." "$LINENO" 5
fi
fi
@ -16240,32 +16233,25 @@ fi
cd "$with_override_source_root"
OVERRIDE_SRC_ROOT="`pwd`"
cd "$CURDIR"
if test -f $with_override_source_root/langtools/makefiles/Makefile || \
test -f $with_override_source_root/langtools/make/Makefile; then
if test -f $with_override_source_root/langtools/make/Makefile; then
as_fn_error $? "Your override source root seems to contain a full langtools repo! An override source root should only contain sources that override." "$LINENO" 5
fi
if test -f $with_override_source_root/corba/makefiles/Makefile || \
test -f $with_override_source_root/corba/make/Makefile; then
if test -f $with_override_source_root/corba/make/Makefile; then
as_fn_error $? "Your override source root seems to contain a full corba repo! An override source root should only contain sources that override." "$LINENO" 5
fi
if test -f $with_override_source_root/jaxp/makefiles/Makefile || \
test -f $with_override_source_root/jaxp/make/Makefile; then
if test -f $with_override_source_root/jaxp/make/Makefile; then
as_fn_error $? "Your override source root seems to contain a full jaxp repo! An override source root should only contain sources that override." "$LINENO" 5
fi
if test -f $with_override_source_root/jaxws/makefiles/Makefile || \
test -f $with_override_source_root/jaxws/make/Makefile; then
if test -f $with_override_source_root/jaxws/make/Makefile; then
as_fn_error $? "Your override source root seems to contain a full jaxws repo! An override source root should only contain sources that override." "$LINENO" 5
fi
if test -f $with_override_source_root/hotspot/makefiles/Makefile || \
test -f $with_override_source_root/hotspot/make/Makefile; then
if test -f $with_override_source_root/hotspot/make/Makefile; then
as_fn_error $? "Your override source root seems to contain a full hotspot repo! An override source root should only contain sources that override." "$LINENO" 5
fi
if test -f $with_override_source_root/nashorn/makefiles/Makefile || \
test -f $with_override_source_root/nashorn/make/Makefile; then
if test -f $with_override_source_root/nashorn/make/Makefile; then
as_fn_error $? "Your override source root seems to contain a full nashorn repo! An override source root should only contain sources that override." "$LINENO" 5
fi
if test -f $with_override_source_root/jdk/makefiles/Makefile || \
test -f $with_override_source_root/jdk/make/Makefile; then
if test -f $with_override_source_root/jdk/make/Makefile; then
as_fn_error $? "Your override source root seems to contain a full JDK repo! An override source root should only contain sources that override." "$LINENO" 5
fi
fi
@ -16344,7 +16330,7 @@ fi
cd "$with_override_langtools"
LANGTOOLS_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $LANGTOOLS_TOPDIR/makefiles/Makefile; then
if ! test -f $LANGTOOLS_TOPDIR/make/Makefile; then
as_fn_error $? "You have to override langtools with a full langtools repo!" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if langtools should be overridden" >&5
@ -16357,7 +16343,7 @@ $as_echo "yes with $LANGTOOLS_TOPDIR" >&6; }
cd "$with_override_corba"
CORBA_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $CORBA_TOPDIR/makefiles/Makefile; then
if ! test -f $CORBA_TOPDIR/make/Makefile; then
as_fn_error $? "You have to override corba with a full corba repo!" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if corba should be overridden" >&5
@ -16370,7 +16356,7 @@ $as_echo "yes with $CORBA_TOPDIR" >&6; }
cd "$with_override_jaxp"
JAXP_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $JAXP_TOPDIR/makefiles/Makefile; then
if ! test -f $JAXP_TOPDIR/make/Makefile; then
as_fn_error $? "You have to override jaxp with a full jaxp repo!" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if jaxp should be overridden" >&5
@ -16383,7 +16369,7 @@ $as_echo "yes with $JAXP_TOPDIR" >&6; }
cd "$with_override_jaxws"
JAXWS_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $JAXWS_TOPDIR/makefiles/Makefile; then
if ! test -f $JAXWS_TOPDIR/make/Makefile; then
as_fn_error $? "You have to override jaxws with a full jaxws repo!" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if jaxws should be overridden" >&5
@ -16396,8 +16382,7 @@ $as_echo "yes with $JAXWS_TOPDIR" >&6; }
cd "$with_override_hotspot"
HOTSPOT_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $HOTSPOT_TOPDIR/make/Makefile && \
! test -f $HOTSPOT_TOPDIR/makefiles/Makefile; then
if ! test -f $HOTSPOT_TOPDIR/make/Makefile; then
as_fn_error $? "You have to override hotspot with a full hotspot repo!" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if hotspot should be overridden" >&5
@ -16410,7 +16395,7 @@ $as_echo "yes with $HOTSPOT_TOPDIR" >&6; }
cd "$with_override_nashorn"
NASHORN_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $NASHORN_TOPDIR/makefiles/Makefile; then
if ! test -f $NASHORN_TOPDIR/make/Makefile; then
as_fn_error $? "You have to override nashorn with a full nashorn repo!" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if nashorn should be overridden" >&5
@ -16423,7 +16408,7 @@ $as_echo "yes with $NASHORN_TOPDIR" >&6; }
cd "$with_override_jdk"
JDK_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $JDK_TOPDIR/makefiles/Makefile; then
if ! test -f $JDK_TOPDIR/make/Makefile; then
as_fn_error $? "You have to override JDK with a full JDK repo!" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if JDK should be overridden" >&5

View File

@ -129,4 +129,4 @@ endif
# Sneak this in via the spec.gmk file, since we don't want to mess around too much with the Hotspot make files.
# This is needed to get the LOG setting to work properly.
include $(SRC_ROOT)/common/makefiles/MakeBase.gmk
include $(SRC_ROOT)/make/common/MakeBase.gmk

View File

@ -80,32 +80,25 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$CURDIR"
# Verify that the addon source root does not have any root makefiles.
# If it does, then it is usually an error, prevent this.
if test -f $with_add_source_root/langtools/makefiles/Makefile || \
test -f $with_add_source_root/langtools/make/Makefile; then
if test -f $with_add_source_root/langtools/make/Makefile; then
AC_MSG_ERROR([Your add source root seems to contain a full langtools repo! An add source root should only contain additional sources.])
fi
if test -f $with_add_source_root/corba/makefiles/Makefile || \
test -f $with_add_source_root/corba/make/Makefile; then
if test -f $with_add_source_root/corba/make/Makefile; then
AC_MSG_ERROR([Your add source root seems to contain a full corba repo! An add source root should only contain additional sources.])
fi
if test -f $with_add_source_root/jaxp/makefiles/Makefile || \
test -f $with_add_source_root/jaxp/make/Makefile; then
if test -f $with_add_source_root/jaxp/make/Makefile; then
AC_MSG_ERROR([Your add source root seems to contain a full jaxp repo! An add source root should only contain additional sources.])
fi
if test -f $with_add_source_root/jaxws/makefiles/Makefile || \
test -f $with_add_source_root/jaxws/make/Makefile; then
if test -f $with_add_source_root/jaxws/make/Makefile; then
AC_MSG_ERROR([Your add source root seems to contain a full jaxws repo! An add source root should only contain additional sources.])
fi
if test -f $with_add_source_root/hotspot/makefiles/Makefile || \
test -f $with_add_source_root/hotspot/make/Makefile; then
if test -f $with_add_source_root/hotspot/make/Makefile; then
AC_MSG_ERROR([Your add source root seems to contain a full hotspot repo! An add source root should only contain additional sources.])
fi
if test -f $with_add_source_root/nashorn/makefiles/Makefile || \
test -f $with_add_source_root/nashorn/make/Makefile; then
if test -f $with_add_source_root/nashorn/make/Makefile; then
AC_MSG_ERROR([Your add source root seems to contain a full nashorn repo! An add source root should only contain additional sources.])
fi
if test -f $with_add_source_root/jdk/makefiles/Makefile || \
test -f $with_add_source_root/jdk/make/Makefile; then
if test -f $with_add_source_root/jdk/make/Makefile; then
AC_MSG_ERROR([Your add source root seems to contain a full JDK repo! An add source root should only contain additional sources.])
fi
fi
@ -119,32 +112,25 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_source_root"
OVERRIDE_SRC_ROOT="`pwd`"
cd "$CURDIR"
if test -f $with_override_source_root/langtools/makefiles/Makefile || \
test -f $with_override_source_root/langtools/make/Makefile; then
if test -f $with_override_source_root/langtools/make/Makefile; then
AC_MSG_ERROR([Your override source root seems to contain a full langtools repo! An override source root should only contain sources that override.])
fi
if test -f $with_override_source_root/corba/makefiles/Makefile || \
test -f $with_override_source_root/corba/make/Makefile; then
if test -f $with_override_source_root/corba/make/Makefile; then
AC_MSG_ERROR([Your override source root seems to contain a full corba repo! An override source root should only contain sources that override.])
fi
if test -f $with_override_source_root/jaxp/makefiles/Makefile || \
test -f $with_override_source_root/jaxp/make/Makefile; then
if test -f $with_override_source_root/jaxp/make/Makefile; then
AC_MSG_ERROR([Your override source root seems to contain a full jaxp repo! An override source root should only contain sources that override.])
fi
if test -f $with_override_source_root/jaxws/makefiles/Makefile || \
test -f $with_override_source_root/jaxws/make/Makefile; then
if test -f $with_override_source_root/jaxws/make/Makefile; then
AC_MSG_ERROR([Your override source root seems to contain a full jaxws repo! An override source root should only contain sources that override.])
fi
if test -f $with_override_source_root/hotspot/makefiles/Makefile || \
test -f $with_override_source_root/hotspot/make/Makefile; then
if test -f $with_override_source_root/hotspot/make/Makefile; then
AC_MSG_ERROR([Your override source root seems to contain a full hotspot repo! An override source root should only contain sources that override.])
fi
if test -f $with_override_source_root/nashorn/makefiles/Makefile || \
test -f $with_override_source_root/nashorn/make/Makefile; then
if test -f $with_override_source_root/nashorn/make/Makefile; then
AC_MSG_ERROR([Your override source root seems to contain a full nashorn repo! An override source root should only contain sources that override.])
fi
if test -f $with_override_source_root/jdk/makefiles/Makefile || \
test -f $with_override_source_root/jdk/make/Makefile; then
if test -f $with_override_source_root/jdk/make/Makefile; then
AC_MSG_ERROR([Your override source root seems to contain a full JDK repo! An override source root should only contain sources that override.])
fi
fi
@ -195,7 +181,7 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_langtools"
LANGTOOLS_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $LANGTOOLS_TOPDIR/makefiles/Makefile; then
if ! test -f $LANGTOOLS_TOPDIR/make/Makefile; then
AC_MSG_ERROR([You have to override langtools with a full langtools repo!])
fi
AC_MSG_CHECKING([if langtools should be overridden])
@ -206,7 +192,7 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_corba"
CORBA_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $CORBA_TOPDIR/makefiles/Makefile; then
if ! test -f $CORBA_TOPDIR/make/Makefile; then
AC_MSG_ERROR([You have to override corba with a full corba repo!])
fi
AC_MSG_CHECKING([if corba should be overridden])
@ -217,7 +203,7 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_jaxp"
JAXP_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $JAXP_TOPDIR/makefiles/Makefile; then
if ! test -f $JAXP_TOPDIR/make/Makefile; then
AC_MSG_ERROR([You have to override jaxp with a full jaxp repo!])
fi
AC_MSG_CHECKING([if jaxp should be overridden])
@ -228,7 +214,7 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_jaxws"
JAXWS_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $JAXWS_TOPDIR/makefiles/Makefile; then
if ! test -f $JAXWS_TOPDIR/make/Makefile; then
AC_MSG_ERROR([You have to override jaxws with a full jaxws repo!])
fi
AC_MSG_CHECKING([if jaxws should be overridden])
@ -239,8 +225,7 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_hotspot"
HOTSPOT_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $HOTSPOT_TOPDIR/make/Makefile && \
! test -f $HOTSPOT_TOPDIR/makefiles/Makefile; then
if ! test -f $HOTSPOT_TOPDIR/make/Makefile; then
AC_MSG_ERROR([You have to override hotspot with a full hotspot repo!])
fi
AC_MSG_CHECKING([if hotspot should be overridden])
@ -251,7 +236,7 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_nashorn"
NASHORN_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $NASHORN_TOPDIR/makefiles/Makefile; then
if ! test -f $NASHORN_TOPDIR/make/Makefile; then
AC_MSG_ERROR([You have to override nashorn with a full nashorn repo!])
fi
AC_MSG_CHECKING([if nashorn should be overridden])
@ -262,7 +247,7 @@ AC_DEFUN_ONCE([SRCDIRS_SETUP_ALTERNATIVE_TOPDIRS],
cd "$with_override_jdk"
JDK_TOPDIR="`pwd`"
cd "$CURDIR"
if ! test -f $JDK_TOPDIR/makefiles/Makefile; then
if ! test -f $JDK_TOPDIR/make/Makefile; then
AC_MSG_ERROR([You have to override JDK with a full JDK repo!])
fi
AC_MSG_CHECKING([if JDK should be overridden])

View File

@ -65,8 +65,8 @@ ifeq (,$(findstring -R,$(MAKE)))
endif
# Specify where the common include directory for makefiles is.
ifeq (,$(findstring -I @SRC_ROOT@/common/makefiles,$(MAKE)))
MAKE:=$(MAKE) -I @SRC_ROOT@/common/makefiles
ifeq (,$(findstring -I @SRC_ROOT@/make/common,$(MAKE)))
MAKE:=$(MAKE) -I @SRC_ROOT@/make/common
endif
# The "human readable" name of this configuration

View File

@ -1113,14 +1113,15 @@ fi
if [ -d "$THIS/install/j2sdk-image" ]; then
THIS_J2SDK="$THIS/install/j2sdk-image"
THIS_J2RE="$THIS/install/j2re-image"
echo "Comparing install images"
echo "Selecting install images in this build"
elif [ -d "$THIS/deploy/j2sdk-image" ]; then
THIS_J2SDK="$THIS/deploy/j2sdk-image"
THIS_J2RE="$THIS/deploy/j2re-image"
echo "Comparing deploy images"
echo "Selecting deploy images in this build"
elif [ -d "$THIS/images/j2sdk-image" ]; then
THIS_J2SDK="$THIS/images/j2sdk-image"
THIS_J2RE="$THIS/images/j2re-image"
echo "Selecting jdk images in this build"
fi
if [ -d "$THIS/images/j2sdk-overlay-image" ]; then
@ -1128,15 +1129,18 @@ if [ -d "$THIS/images/j2sdk-overlay-image" ]; then
# If there is an install image, prefer that, it's also overlay
THIS_J2SDK_OVERLAY="$THIS/install/j2sdk-image"
THIS_J2RE_OVERLAY="$THIS/install/j2re-image"
echo "Selecting install overlay images in this build"
else
THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image"
THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image"
echo "Selecting jdk overlay images in this build"
fi
fi
if [ -d "$THIS/images/j2sdk-bundle" ]; then
THIS_J2SDK_BUNDLE="$THIS/images/j2sdk-bundle"
THIS_J2RE_BUNDLE="$THIS/images/j2re-bundle"
echo "Selecting bundles in this build"
fi
# Figure out the layout of the other build (old or new, normal or overlay image)
@ -1144,21 +1148,34 @@ if [ -d "$OTHER/j2sdk-image" ]; then
if [ -f "$OTHER/j2sdk-image/LICENSE" ]; then
OTHER_J2SDK="$OTHER/j2sdk-image"
OTHER_J2RE="$OTHER/j2re-image"
echo "Selecting old-style images in other build"
else
OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image"
OTHER_J2RE_OVERLAY="$OTHER/j2re-image"
echo "Selecting overlay images in other build"
fi
elif [ -d "$OTHER/install/j2sdk-image" ]; then
OTHER_J2SDK="$OTHER/install/j2sdk-image"
OTHER_J2RE="$OTHER/install/j2re-image"
echo "Selecting install images in other build"
elif [ -d "$OTHER/deploy/j2sdk-image" ]; then
OTHER_J2SDK="$OTHER/deploy/j2sdk-image"
OTHER_J2RE="$OTHER/deploy/j2re-image"
echo "Selecting deploy images in other build"
elif [ -d "$OTHER/images/j2sdk-image" ]; then
OTHER_J2SDK="$OTHER/images/j2sdk-image"
OTHER_J2RE="$OTHER/images/j2re-image"
echo "Selecting jdk images in other build"
fi
if [ -d "$OTHER/j2sdk-bundle" ]; then
OTHER_J2SDK_BUNDLE="$OTHER/j2sdk-bundle"
OTHER_J2RE_BUNDLE="$OTHER/j2re-bundle"
echo "Selecting bundles in other build"
elif [ -d "$OTHER/images/j2sdk-bundle" ]; then
OTHER_J2SDK_BUNDLE="$OTHER/images/j2sdk-bundle"
OTHER_J2RE_BUNDLE="$OTHER/images/j2re-bundle"
echo "Selecting jdk bundles in other build"
fi
if [ -z "$THIS_J2SDK" ] || [ -z "$THIS_J2RE" ]; then

View File

@ -1,26 +0,0 @@
#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
include ../../NewMakefile.gmk

View File

@ -1,49 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Doc Process Notes</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<h3><a name="REGEXP"></a><br>
REGEXP</h3>
<p> REGEXP is a list of wildcard patterns that determines which packages listed
in CORE_PKGS.gmk go into which summary-table on the main API index page. It
was motivated by the need to divide the world into &quot;core packages&quot;
(java.*) and &quot;extension packages&quot; (javax.*). In time, the distinction
went away. The whole table is now called &quot;Platform Packages&quot;--which
eliminated the need for this list of regular expressions. But it lingered on,
accreting all of the packages in the JVM, one by one. I pruned it back to &quot;*&quot;,
so it now covers every package in the Java platform API docs. If some separation
is needed in the future, it can grow back into a colon-separated list, starting
with this, which is in all respects equivalent to &quot;*&quot; at this point
in time:</p>
<blockquote>
<pre>REGEXP = &quot;java.*:javax.*:org.ietf*:org.omg.</pre>
</blockquote>
<h3><a name="releaseTargets"></a><br>
Release Targets</h3>
<p> (Thanks to Kelly O'Hair for this info.)</p>
<p> The <tt>rel-coredocs</tt> and <tt>rel-docs</tt> targets were added by Eric
Armstrong. <tt>rel-coredocs</tt> assumes the kind of large, 32-bit machine used
in the javapubs group's docs-release process. It specifies memory settings accordingly
to maximize performance.</p>
<p> The performance settings, like the sanity check, are most important for the
core docs--the platform APIs. Running javadoc on those APIs takes a significant
amount of time and memory. Setting the initial heap size as large as possible
is important to prevent thrashing as the heap grows. Setting the maximum as
large as necessary is also important to keep the job from failing.</p>
<blockquote>
<p> <tt>-J-Xmx512</tt> sets a maximum of 512, which became necessary in 6.0<br>
<tt>-J-Xms256</tt> sets starting size to 256 (default is 8)</p>
</blockquote>
<p> <tt>rel-coredocs</tt> also includes a sanity check to help ensure that <tt>BUILD_NUMBER</tt>
and <tt>MILESTONE</tt> are specified properly when docs are built outside of
the normal release engineering process, with the intention of releasing them
on the web or in a downloaded docs bundle. (When invoked in release engineering's
control build, the values are always set properly. But when the targets are
run by themselves, they default to b00 and &quot;internal&quot;--which silently
sabotage the result of a build that can take many hours to complete.</p>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -397,3 +397,5 @@ e510dfdec6dd701410f3398ed86ebcdff0cca63a hs25-b58
c78d517c7ea47501b456e707afd4b78e7b5b202e hs25-b59
f573d00213b7170c2ff856f9cd83cd148437f5b9 jdk8-b117
abad3b2d905d9e1ad767c94baa94aba6ed5b207b hs25-b60
c9f439732b18ea16f7e65815327d5ea7092cc258 jdk8-b118
b2426da30009cd3069d03de073f351e6432c7682 hs25-b61

View File

@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
HS_MAJOR_VER=25
HS_MINOR_VER=0
HS_BUILD_NUMBER=60
HS_BUILD_NUMBER=61
JDK_MAJOR_VER=1
JDK_MINOR_VER=8

View File

@ -4483,8 +4483,8 @@ void ClassFileParser::check_final_method_override(instanceKlassHandle this_klass
for (int index = 0; index < num_methods; index++) {
Method* m = methods->at(index);
// skip static and <init> methods
if ((!m->is_static()) &&
// skip private, static, and <init> methods
if ((!m->is_private() && !m->is_static()) &&
(m->name() != vmSymbols::object_initializer_name())) {
Symbol* name = m->name();

View File

@ -62,13 +62,13 @@
#include "runtime/safepoint.hpp"
#include "runtime/synchronizer.hpp"
#include "utilities/growableArray.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
#if INCLUDE_TRACE
#include "trace/tracing.hpp"
#endif
ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) :
@ -754,7 +754,7 @@ void ClassLoaderDataGraph::post_class_unload_events(void) {
if (Tracing::enabled()) {
if (Tracing::is_event_enabled(TraceClassUnloadEvent)) {
assert(_unloading != NULL, "need class loader data unload list!");
_class_unload_time = Tracing::time();
_class_unload_time = Ticks::now();
classes_unloading_do(&class_unload_event);
}
Tracing::on_unloading_classes();
@ -832,7 +832,7 @@ void ClassLoaderData::print_value_on(outputStream* out) const {
#if INCLUDE_TRACE
TracingTime ClassLoaderDataGraph::_class_unload_time;
Ticks ClassLoaderDataGraph::_class_unload_time;
void ClassLoaderDataGraph::class_unload_event(Klass* const k) {

View File

@ -33,7 +33,7 @@
#include "utilities/growableArray.hpp"
#if INCLUDE_TRACE
# include "trace/traceTime.hpp"
# include "utilities/ticks.hpp"
#endif
//
@ -98,7 +98,7 @@ class ClassLoaderDataGraph : public AllStatic {
#if INCLUDE_TRACE
private:
static TracingTime _class_unload_time;
static Ticks _class_unload_time;
static void class_unload_event(Klass* const k);
#endif
};

View File

@ -55,13 +55,13 @@
#include "runtime/signature.hpp"
#include "services/classLoadingService.hpp"
#include "services/threadService.hpp"
#include "utilities/macros.hpp"
#include "utilities/ticks.hpp"
#if INCLUDE_TRACE
#include "trace/tracing.hpp"
#include "trace/traceMacros.hpp"
#endif
Dictionary* SystemDictionary::_dictionary = NULL;
PlaceholderTable* SystemDictionary::_placeholders = NULL;
Dictionary* SystemDictionary::_shared_dictionary = NULL;
@ -598,7 +598,7 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name,
assert(name != NULL && !FieldType::is_array(name) &&
!FieldType::is_obj(name), "invalid class name");
TracingTime class_load_start_time = Tracing::time();
Ticks class_load_start_time = Ticks::now();
// UseNewReflection
// Fix for 4474172; see evaluation for more details
@ -1006,7 +1006,7 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
TRAPS) {
TempNewSymbol parsed_name = NULL;
TracingTime class_load_start_time = Tracing::time();
Ticks class_load_start_time = Ticks::now();
ClassLoaderData* loader_data;
if (host_klass.not_null()) {
@ -2665,13 +2665,12 @@ void SystemDictionary::verify_obj_klass_present(Symbol* class_name,
}
// utility function for class load event
void SystemDictionary::post_class_load_event(TracingTime start_time,
void SystemDictionary::post_class_load_event(const Ticks& start_time,
instanceKlassHandle k,
Handle initiating_loader) {
#if INCLUDE_TRACE
EventClassLoad event(UNTIMED);
if (event.should_commit()) {
event.set_endtime(Tracing::time());
event.set_starttime(start_time);
event.set_loadedClass(k());
oop defining_class_loader = k->class_loader();

View File

@ -31,7 +31,6 @@
#include "oops/symbol.hpp"
#include "runtime/java.hpp"
#include "runtime/reflectionUtils.hpp"
#include "trace/traceTime.hpp"
#include "utilities/hashtable.hpp"
#include "utilities/hashtable.inline.hpp"
@ -78,6 +77,7 @@ class LoaderConstraintTable;
template <MEMFLAGS F> class HashtableBucket;
class ResolutionErrorTable;
class SymbolPropertyTable;
class Ticks;
// Certain classes are preloaded, such as java.lang.Object and java.lang.String.
// They are all "well-known", in the sense that no class loader is allowed
@ -165,6 +165,7 @@ class SymbolPropertyTable;
\
do_klass(StringBuffer_klass, java_lang_StringBuffer, Pre ) \
do_klass(StringBuilder_klass, java_lang_StringBuilder, Pre ) \
do_klass(misc_Unsafe_klass, sun_misc_Unsafe, Pre ) \
\
/* It's NULL in non-1.4 JDKs. */ \
do_klass(StackTraceElement_klass, java_lang_StackTraceElement, Opt ) \
@ -637,7 +638,7 @@ private:
static void add_to_hierarchy(instanceKlassHandle k, TRAPS);
// event based tracing
static void post_class_load_event(TracingTime start_time, instanceKlassHandle k,
static void post_class_load_event(const Ticks& start_time, instanceKlassHandle k,
Handle initiating_loader);
// We pass in the hashtable index so we can calculate it outside of
// the SystemDictionary_lock.

View File

@ -2302,6 +2302,24 @@ void ClassVerifier::verify_invoke_init(
}
}
bool ClassVerifier::is_same_or_direct_interface(
instanceKlassHandle klass,
VerificationType klass_type,
VerificationType ref_class_type) {
if (ref_class_type.equals(klass_type)) return true;
Array<Klass*>* local_interfaces = klass->local_interfaces();
if (local_interfaces != NULL) {
for (int x = 0; x < local_interfaces->length(); x++) {
Klass* k = local_interfaces->at(x);
assert (k != NULL && k->is_interface(), "invalid interface");
if (ref_class_type.equals(VerificationType::reference_type(k->name()))) {
return true;
}
}
}
return false;
}
void ClassVerifier::verify_invoke_instructions(
RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame,
bool *this_uninit, VerificationType return_type,
@ -2432,23 +2450,38 @@ void ClassVerifier::verify_invoke_instructions(
return;
}
} else if (opcode == Bytecodes::_invokespecial
&& !ref_class_type.equals(current_type())
&& !is_same_or_direct_interface(current_class(), current_type(), ref_class_type)
&& !ref_class_type.equals(VerificationType::reference_type(
current_class()->super()->name()))) {
bool subtype = false;
bool have_imr_indirect = cp->tag_at(index).value() == JVM_CONSTANT_InterfaceMethodref;
if (!current_class()->is_anonymous()) {
subtype = ref_class_type.is_assignable_from(
current_type(), this, CHECK_VERIFY(this));
} else {
subtype = ref_class_type.is_assignable_from(VerificationType::reference_type(
current_class()->host_klass()->name()), this, CHECK_VERIFY(this));
VerificationType host_klass_type =
VerificationType::reference_type(current_class()->host_klass()->name());
subtype = ref_class_type.is_assignable_from(host_klass_type, this, CHECK_VERIFY(this));
// If invokespecial of IMR, need to recheck for same or
// direct interface relative to the host class
have_imr_indirect = (have_imr_indirect &&
!is_same_or_direct_interface(
InstanceKlass::cast(current_class()->host_klass()),
host_klass_type, ref_class_type));
}
if (!subtype) {
verify_error(ErrorContext::bad_code(bci),
"Bad invokespecial instruction: "
"current class isn't assignable to reference class.");
return;
} else if (have_imr_indirect) {
verify_error(ErrorContext::bad_code(bci),
"Bad invokespecial instruction: "
"interface method reference is in an indirect superinterface.");
return;
}
}
// Match method descriptor with operand stack
for (int i = nargs - 1; i >= 0; i--) { // Run backwards

View File

@ -345,6 +345,9 @@ class ClassVerifier : public StackObj {
// that a class has been verified and prepared for execution.
bool was_recursively_verified() { return _klass->is_rewritten(); }
bool is_same_or_direct_interface(instanceKlassHandle klass,
VerificationType klass_type, VerificationType ref_class_type);
public:
enum {
BYTECODE_OFFSET = 1,

View File

@ -331,6 +331,7 @@
template(findNative_name, "findNative") \
template(deadChild_name, "deadChild") \
template(addClass_name, "addClass") \
template(throwIllegalAccessError_name, "throwIllegalAccessError") \
template(getFromClass_name, "getFromClass") \
template(dispatch_name, "dispatch") \
template(getSystemClassLoader_name, "getSystemClassLoader") \

View File

@ -1993,7 +1993,7 @@ void CMSCollector::do_compaction_work(bool clear_all_soft_refs) {
GenCollectedHeap* gch = GenCollectedHeap::heap();
STWGCTimer* gc_timer = GenMarkSweep::gc_timer();
gc_timer->register_gc_start(os::elapsed_counter());
gc_timer->register_gc_start();
SerialOldTracer* gc_tracer = GenMarkSweep::gc_tracer();
gc_tracer->report_gc_start(gch->gc_cause(), gc_timer->gc_start());
@ -2089,7 +2089,7 @@ void CMSCollector::do_compaction_work(bool clear_all_soft_refs) {
size_policy()->msc_collection_end(gch->gc_cause());
}
gc_timer->register_gc_end(os::elapsed_counter());
gc_timer->register_gc_end();
gc_tracer->report_gc_end(gc_timer->gc_end(), gc_timer->time_partitions());
@ -2475,7 +2475,7 @@ void CMSCollector::register_foreground_gc_start(GCCause::Cause cause) {
void CMSCollector::register_gc_start(GCCause::Cause cause) {
_cms_start_registered = true;
_gc_timer_cm->register_gc_start(os::elapsed_counter());
_gc_timer_cm->register_gc_start();
_gc_tracer_cm->report_gc_start(cause, _gc_timer_cm->gc_start());
}
@ -2483,7 +2483,7 @@ void CMSCollector::register_gc_end() {
if (_cms_start_registered) {
report_heap_summary(GCWhen::AfterGC);
_gc_timer_cm->register_gc_end(os::elapsed_counter());
_gc_timer_cm->register_gc_end();
_gc_tracer_cm->report_gc_end(_gc_timer_cm->gc_end(), _gc_timer_cm->time_partitions());
_cms_start_registered = false;
}

View File

@ -145,7 +145,7 @@ void VM_CMS_Initial_Mark::doit() {
);
#endif /* USDT2 */
_collector->_gc_timer_cm->register_gc_pause_start("Initial Mark", os::elapsed_counter());
_collector->_gc_timer_cm->register_gc_pause_start("Initial Mark");
GenCollectedHeap* gch = GenCollectedHeap::heap();
GCCauseSetter gccs(gch, GCCause::_cms_initial_mark);
@ -157,7 +157,7 @@ void VM_CMS_Initial_Mark::doit() {
VM_CMS_Operation::verify_after_gc();
_collector->_gc_timer_cm->register_gc_pause_end(os::elapsed_counter());
_collector->_gc_timer_cm->register_gc_pause_end();
#ifndef USDT2
HS_DTRACE_PROBE(hs_private, cms__initmark__end);
@ -182,7 +182,7 @@ void VM_CMS_Final_Remark::doit() {
);
#endif /* USDT2 */
_collector->_gc_timer_cm->register_gc_pause_start("Final Mark", os::elapsed_counter());
_collector->_gc_timer_cm->register_gc_pause_start("Final Mark");
GenCollectedHeap* gch = GenCollectedHeap::heap();
GCCauseSetter gccs(gch, GCCause::_cms_final_remark);
@ -195,7 +195,7 @@ void VM_CMS_Final_Remark::doit() {
VM_CMS_Operation::verify_after_gc();
_collector->save_heap_summary();
_collector->_gc_timer_cm->register_gc_pause_end(os::elapsed_counter());
_collector->_gc_timer_cm->register_gc_pause_end();
#ifndef USDT2
HS_DTRACE_PROBE(hs_private, cms__remark__end);

View File

@ -56,6 +56,7 @@
#include "oops/oop.inline.hpp"
#include "oops/oop.pcgc.inline.hpp"
#include "runtime/vmThread.hpp"
#include "utilities/ticks.hpp"
size_t G1CollectedHeap::_humongous_object_threshold_in_words = 0;
@ -1284,7 +1285,7 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
}
STWGCTimer* gc_timer = G1MarkSweep::gc_timer();
gc_timer->register_gc_start(os::elapsed_counter());
gc_timer->register_gc_start();
SerialOldTracer* gc_tracer = G1MarkSweep::gc_tracer();
gc_tracer->report_gc_start(gc_cause(), gc_timer->gc_start());
@ -1552,7 +1553,7 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
post_full_gc_dump(gc_timer);
gc_timer->register_gc_end(os::elapsed_counter());
gc_timer->register_gc_end();
gc_tracer->report_gc_end(gc_timer->gc_end(), gc_timer->time_partitions());
}
@ -2482,7 +2483,7 @@ void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) {
FullGCCount_lock->notify_all();
}
void G1CollectedHeap::register_concurrent_cycle_start(jlong start_time) {
void G1CollectedHeap::register_concurrent_cycle_start(const Ticks& start_time) {
_concurrent_cycle_started = true;
_gc_timer_cm->register_gc_start(start_time);
@ -2496,7 +2497,7 @@ void G1CollectedHeap::register_concurrent_cycle_end() {
_gc_tracer_cm->report_concurrent_mode_failure();
}
_gc_timer_cm->register_gc_end(os::elapsed_counter());
_gc_timer_cm->register_gc_end();
_gc_tracer_cm->report_gc_end(_gc_timer_cm->gc_end(), _gc_timer_cm->time_partitions());
_concurrent_cycle_started = false;
@ -3887,7 +3888,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
return false;
}
_gc_timer_stw->register_gc_start(os::elapsed_counter());
_gc_timer_stw->register_gc_start();
_gc_tracer_stw->report_gc_start(gc_cause(), _gc_timer_stw->gc_start());
@ -4265,7 +4266,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
_gc_tracer_stw->report_evacuation_info(&evacuation_info);
_gc_tracer_stw->report_tenuring_threshold(_g1_policy->tenuring_threshold());
_gc_timer_stw->register_gc_end(os::elapsed_counter());
_gc_timer_stw->register_gc_end();
_gc_tracer_stw->report_gc_end(_gc_timer_stw->gc_end(), _gc_timer_stw->time_partitions());
}
// It should now be safe to tell the concurrent mark thread to start

View File

@ -72,6 +72,7 @@ class G1NewTracer;
class G1OldTracer;
class EvacuationFailedInfo;
class nmethod;
class Ticks;
typedef OverflowTaskQueue<StarTask, mtGC> RefToScanQueue;
typedef GenericTaskQueueSet<RefToScanQueue, mtGC> RefToScanQueueSet;
@ -746,7 +747,7 @@ public:
return _old_marking_cycles_completed;
}
void register_concurrent_cycle_start(jlong start_time);
void register_concurrent_cycle_start(const Ticks& start_time);
void register_concurrent_cycle_end();
void trace_heap_after_concurrent_cycle();

View File

@ -915,7 +915,7 @@ void ParNewGeneration::collect(bool full,
GenCollectedHeap* gch = GenCollectedHeap::heap();
_gc_timer->register_gc_start(os::elapsed_counter());
_gc_timer->register_gc_start();
assert(gch->kind() == CollectedHeap::GenCollectedHeap,
"not a CMS generational heap");
@ -1091,7 +1091,7 @@ void ParNewGeneration::collect(bool full,
gch->trace_heap_after_gc(&gc_tracer);
gc_tracer.report_tenuring_threshold(tenuring_threshold());
_gc_timer->register_gc_end(os::elapsed_counter());
_gc_timer->register_gc_end();
gc_tracer.report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
}

View File

@ -114,7 +114,7 @@ bool PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) {
assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
GCCause::Cause gc_cause = heap->gc_cause();
_gc_timer->register_gc_start(os::elapsed_counter());
_gc_timer->register_gc_start();
_gc_tracer->report_gc_start(gc_cause, _gc_timer->gc_start());
PSAdaptiveSizePolicy* size_policy = heap->size_policy();
@ -390,7 +390,7 @@ bool PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) {
ParallelTaskTerminator::print_termination_counts();
#endif
_gc_timer->register_gc_end(os::elapsed_counter());
_gc_timer->register_gc_end();
_gc_tracer->report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());

View File

@ -2006,7 +2006,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
ParallelScavengeHeap* heap = gc_heap();
_gc_timer.register_gc_start(os::elapsed_counter());
_gc_timer.register_gc_start();
_gc_tracer.report_gc_start(heap->gc_cause(), _gc_timer.gc_start());
TimeStamp marking_start;
@ -2244,7 +2244,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
ParallelTaskTerminator::print_termination_counts();
#endif
_gc_timer.register_gc_end(os::elapsed_counter());
_gc_timer.register_gc_end();
_gc_tracer.report_dense_prefix(dense_prefix(old_space_id));
_gc_tracer.report_gc_end(_gc_timer.gc_end(), _gc_timer.time_partitions());

View File

@ -263,7 +263,7 @@ bool PSScavenge::invoke_no_policy() {
assert(_preserved_mark_stack.is_empty(), "should be empty");
assert(_preserved_oop_stack.is_empty(), "should be empty");
_gc_timer.register_gc_start(os::elapsed_counter());
_gc_timer.register_gc_start();
TimeStamp scavenge_entry;
TimeStamp scavenge_midpoint;
@ -691,7 +691,7 @@ bool PSScavenge::invoke_no_policy() {
#endif
_gc_timer.register_gc_end(os::elapsed_counter());
_gc_timer.register_gc_end();
_gc_tracer.report_gc_end(_gc_timer.gc_end(), _gc_timer.time_partitions());

View File

@ -25,52 +25,55 @@
#include "precompiled.hpp"
#include "gc_implementation/shared/gcTimer.hpp"
#include "utilities/growableArray.hpp"
#include "utilities/ticks.inline.hpp"
void GCTimer::register_gc_start(jlong time) {
// the "time" parameter for most functions
// has a default value set by Ticks::now()
void GCTimer::register_gc_start(const Ticks& time) {
_time_partitions.clear();
_gc_start = time;
}
void GCTimer::register_gc_end(jlong time) {
void GCTimer::register_gc_end(const Ticks& time) {
assert(!_time_partitions.has_active_phases(),
"We should have ended all started phases, before ending the GC");
_gc_end = time;
}
void GCTimer::register_gc_pause_start(const char* name, jlong time) {
void GCTimer::register_gc_pause_start(const char* name, const Ticks& time) {
_time_partitions.report_gc_phase_start(name, time);
}
void GCTimer::register_gc_pause_end(jlong time) {
void GCTimer::register_gc_pause_end(const Ticks& time) {
_time_partitions.report_gc_phase_end(time);
}
void GCTimer::register_gc_phase_start(const char* name, jlong time) {
void GCTimer::register_gc_phase_start(const char* name, const Ticks& time) {
_time_partitions.report_gc_phase_start(name, time);
}
void GCTimer::register_gc_phase_end(jlong time) {
void GCTimer::register_gc_phase_end(const Ticks& time) {
_time_partitions.report_gc_phase_end(time);
}
void STWGCTimer::register_gc_start(jlong time) {
void STWGCTimer::register_gc_start(const Ticks& time) {
GCTimer::register_gc_start(time);
register_gc_pause_start("GC Pause", time);
}
void STWGCTimer::register_gc_end(jlong time) {
void STWGCTimer::register_gc_end(const Ticks& time) {
register_gc_pause_end(time);
GCTimer::register_gc_end(time);
}
void ConcurrentGCTimer::register_gc_pause_start(const char* name, jlong time) {
GCTimer::register_gc_pause_start(name, time);
void ConcurrentGCTimer::register_gc_pause_start(const char* name) {
GCTimer::register_gc_pause_start(name);
}
void ConcurrentGCTimer::register_gc_pause_end(jlong time) {
GCTimer::register_gc_pause_end(time);
void ConcurrentGCTimer::register_gc_pause_end() {
GCTimer::register_gc_pause_end();
}
void PhasesStack::clear() {
@ -111,11 +114,11 @@ TimePartitions::~TimePartitions() {
void TimePartitions::clear() {
_phases->clear();
_active_phases.clear();
_sum_of_pauses = 0;
_longest_pause = 0;
_sum_of_pauses = Tickspan();
_longest_pause = Tickspan();
}
void TimePartitions::report_gc_phase_start(const char* name, jlong time) {
void TimePartitions::report_gc_phase_start(const char* name, const Ticks& time) {
assert(_phases->length() <= 1000, "Too many recored phases?");
int level = _active_phases.count();
@ -133,13 +136,13 @@ void TimePartitions::report_gc_phase_start(const char* name, jlong time) {
void TimePartitions::update_statistics(GCPhase* phase) {
// FIXME: This should only be done for pause phases
if (phase->level() == 0) {
jlong pause = phase->end() - phase->start();
const Tickspan pause = phase->end() - phase->start();
_sum_of_pauses += pause;
_longest_pause = MAX2(pause, _longest_pause);
}
}
void TimePartitions::report_gc_phase_end(jlong time) {
void TimePartitions::report_gc_phase_end(const Ticks& time) {
int phase_index = _active_phases.pop();
GCPhase* phase = _phases->adr_at(phase_index);
phase->set_end(time);
@ -157,14 +160,6 @@ GCPhase* TimePartitions::phase_at(int index) const {
return _phases->adr_at(index);
}
jlong TimePartitions::sum_of_pauses() {
return _sum_of_pauses;
}
jlong TimePartitions::longest_pause() {
return _longest_pause;
}
bool TimePartitions::has_active_phases() {
return _active_phases.count() > 0;
}
@ -194,7 +189,7 @@ class TimePartitionPhasesIteratorTest {
max_nested_pause_phases();
}
static void validate_pause_phase(GCPhase* phase, int level, const char* name, jlong start, jlong end) {
static void validate_pause_phase(GCPhase* phase, int level, const char* name, const Ticks& start, const Ticks& end) {
assert(phase->level() == level, "Incorrect level");
assert(strcmp(phase->name(), name) == 0, "Incorrect name");
assert(phase->start() == start, "Incorrect start");
@ -209,8 +204,8 @@ class TimePartitionPhasesIteratorTest {
TimePartitionPhasesIterator iter(&time_partitions);
validate_pause_phase(iter.next(), 0, "PausePhase", 2, 8);
assert(time_partitions.sum_of_pauses() == 8-2, "Incorrect");
assert(time_partitions.longest_pause() == 8-2, "Incorrect");
assert(time_partitions.sum_of_pauses() == Ticks(8) - Ticks(2), "Incorrect");
assert(time_partitions.longest_pause() == Ticks(8) - Ticks(2), "Incorrect");
assert(!iter.has_next(), "Too many elements");
}
@ -227,8 +222,8 @@ class TimePartitionPhasesIteratorTest {
validate_pause_phase(iter.next(), 0, "PausePhase1", 2, 3);
validate_pause_phase(iter.next(), 0, "PausePhase2", 4, 6);
assert(time_partitions.sum_of_pauses() == 3, "Incorrect");
assert(time_partitions.longest_pause() == 2, "Incorrect");
assert(time_partitions.sum_of_pauses() == Ticks(3) - Ticks(0), "Incorrect");
assert(time_partitions.longest_pause() == Ticks(2) - Ticks(0), "Incorrect");
assert(!iter.has_next(), "Too many elements");
}
@ -245,8 +240,8 @@ class TimePartitionPhasesIteratorTest {
validate_pause_phase(iter.next(), 0, "PausePhase", 2, 5);
validate_pause_phase(iter.next(), 1, "SubPhase", 3, 4);
assert(time_partitions.sum_of_pauses() == 3, "Incorrect");
assert(time_partitions.longest_pause() == 3, "Incorrect");
assert(time_partitions.sum_of_pauses() == Ticks(3) - Ticks(0), "Incorrect");
assert(time_partitions.longest_pause() == Ticks(3) - Ticks(0), "Incorrect");
assert(!iter.has_next(), "Too many elements");
}
@ -269,8 +264,8 @@ class TimePartitionPhasesIteratorTest {
validate_pause_phase(iter.next(), 2, "SubPhase2", 4, 7);
validate_pause_phase(iter.next(), 3, "SubPhase3", 5, 6);
assert(time_partitions.sum_of_pauses() == 7, "Incorrect");
assert(time_partitions.longest_pause() == 7, "Incorrect");
assert(time_partitions.sum_of_pauses() == Ticks(7) - Ticks(0), "Incorrect");
assert(time_partitions.longest_pause() == Ticks(7) - Ticks(0), "Incorrect");
assert(!iter.has_next(), "Too many elements");
}
@ -298,8 +293,8 @@ class TimePartitionPhasesIteratorTest {
validate_pause_phase(iter.next(), 1, "SubPhase3", 7, 8);
validate_pause_phase(iter.next(), 1, "SubPhase4", 9, 10);
assert(time_partitions.sum_of_pauses() == 9, "Incorrect");
assert(time_partitions.longest_pause() == 9, "Incorrect");
assert(time_partitions.sum_of_pauses() == Ticks(9) - Ticks(0), "Incorrect");
assert(time_partitions.longest_pause() == Ticks(9) - Ticks(0), "Incorrect");
assert(!iter.has_next(), "Too many elements");
}
@ -336,8 +331,8 @@ class TimePartitionPhasesIteratorTest {
validate_pause_phase(iter.next(), 2, "SubPhase22", 12, 13);
validate_pause_phase(iter.next(), 1, "SubPhase3", 15, 16);
assert(time_partitions.sum_of_pauses() == 15, "Incorrect");
assert(time_partitions.longest_pause() == 15, "Incorrect");
assert(time_partitions.sum_of_pauses() == Ticks(15) - Ticks(0), "Incorrect");
assert(time_partitions.longest_pause() == Ticks(15) - Ticks(0), "Incorrect");
assert(!iter.has_next(), "Too many elements");
}

View File

@ -28,6 +28,7 @@
#include "memory/allocation.hpp"
#include "prims/jni_md.h"
#include "utilities/macros.hpp"
#include "utilities/ticks.hpp"
class ConcurrentPhase;
class GCPhase;
@ -45,21 +46,21 @@ class PhaseVisitor {
class GCPhase {
const char* _name;
int _level;
jlong _start;
jlong _end;
Ticks _start;
Ticks _end;
public:
void set_name(const char* name) { _name = name; }
const char* name() { return _name; }
const char* name() const { return _name; }
int level() { return _level; }
int level() const { return _level; }
void set_level(int level) { _level = level; }
jlong start() { return _start; }
void set_start(jlong time) { _start = time; }
const Ticks start() const { return _start; }
void set_start(const Ticks& time) { _start = time; }
jlong end() { return _end; }
void set_end(jlong time) { _end = time; }
const Ticks end() const { return _end; }
void set_end(const Ticks& time) { _end = time; }
virtual void accept(PhaseVisitor* visitor) = 0;
};
@ -102,22 +103,22 @@ class TimePartitions {
GrowableArray<PausePhase>* _phases;
PhasesStack _active_phases;
jlong _sum_of_pauses;
jlong _longest_pause;
Tickspan _sum_of_pauses;
Tickspan _longest_pause;
public:
TimePartitions();
~TimePartitions();
void clear();
void report_gc_phase_start(const char* name, jlong time);
void report_gc_phase_end(jlong time);
void report_gc_phase_start(const char* name, const Ticks& time);
void report_gc_phase_end(const Ticks& time);
int num_phases() const;
GCPhase* phase_at(int index) const;
jlong sum_of_pauses();
jlong longest_pause();
const Tickspan sum_of_pauses() const { return _sum_of_pauses; }
const Tickspan longest_pause() const { return _longest_pause; }
bool has_active_phases();
private:
@ -133,40 +134,37 @@ class PhasesIterator {
class GCTimer : public ResourceObj {
NOT_PRODUCT(friend class GCTimerTest;)
protected:
jlong _gc_start;
jlong _gc_end;
Ticks _gc_start;
Ticks _gc_end;
TimePartitions _time_partitions;
public:
virtual void register_gc_start(jlong time);
virtual void register_gc_end(jlong time);
virtual void register_gc_start(const Ticks& time = Ticks::now());
virtual void register_gc_end(const Ticks& time = Ticks::now());
void register_gc_phase_start(const char* name, jlong time);
void register_gc_phase_end(jlong time);
void register_gc_phase_start(const char* name, const Ticks& time);
void register_gc_phase_end(const Ticks& time);
jlong gc_start() { return _gc_start; }
jlong gc_end() { return _gc_end; }
const Ticks gc_start() const { return _gc_start; }
const Ticks gc_end() const { return _gc_end; }
TimePartitions* time_partitions() { return &_time_partitions; }
long longest_pause();
long sum_of_pauses();
protected:
void register_gc_pause_start(const char* name, jlong time);
void register_gc_pause_end(jlong time);
void register_gc_pause_start(const char* name, const Ticks& time = Ticks::now());
void register_gc_pause_end(const Ticks& time = Ticks::now());
};
class STWGCTimer : public GCTimer {
public:
virtual void register_gc_start(jlong time);
virtual void register_gc_end(jlong time);
virtual void register_gc_start(const Ticks& time = Ticks::now());
virtual void register_gc_end(const Ticks& time = Ticks::now());
};
class ConcurrentGCTimer : public GCTimer {
public:
void register_gc_pause_start(const char* name, jlong time);
void register_gc_pause_end(jlong time);
void register_gc_pause_start(const char* name);
void register_gc_pause_end();
};
class TimePartitionPhasesIterator {

View File

@ -32,6 +32,7 @@
#include "memory/referenceProcessorStats.hpp"
#include "runtime/os.hpp"
#include "utilities/globalDefinitions.hpp"
#include "utilities/ticks.inline.hpp"
#if INCLUDE_ALL_GCS
#include "gc_implementation/g1/evacuationInfo.hpp"
@ -45,7 +46,7 @@ static GCId create_new_gc_id() {
return GCTracer_next_gc_id++;
}
void GCTracer::report_gc_start_impl(GCCause::Cause cause, jlong timestamp) {
void GCTracer::report_gc_start_impl(GCCause::Cause cause, const Ticks& timestamp) {
assert_unset_gc_id();
GCId gc_id = create_new_gc_id();
@ -54,7 +55,7 @@ void GCTracer::report_gc_start_impl(GCCause::Cause cause, jlong timestamp) {
_shared_gc_info.set_start_timestamp(timestamp);
}
void GCTracer::report_gc_start(GCCause::Cause cause, jlong timestamp) {
void GCTracer::report_gc_start(GCCause::Cause cause, const Ticks& timestamp) {
assert_unset_gc_id();
report_gc_start_impl(cause, timestamp);
@ -64,7 +65,7 @@ bool GCTracer::has_reported_gc_start() const {
return _shared_gc_info.id() != SharedGCInfo::UNSET_GCID;
}
void GCTracer::report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions) {
void GCTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) {
assert_set_gc_id();
_shared_gc_info.set_sum_of_pauses(time_partitions->sum_of_pauses());
@ -75,7 +76,7 @@ void GCTracer::report_gc_end_impl(jlong timestamp, TimePartitions* time_partitio
send_garbage_collection_event();
}
void GCTracer::report_gc_end(jlong timestamp, TimePartitions* time_partitions) {
void GCTracer::report_gc_end(const Ticks& timestamp, TimePartitions* time_partitions) {
assert_set_gc_id();
report_gc_end_impl(timestamp, time_partitions);
@ -97,10 +98,10 @@ class ObjectCountEventSenderClosure : public KlassInfoClosure {
const GCId _gc_id;
const double _size_threshold_percentage;
const size_t _total_size_in_words;
const jlong _timestamp;
const Ticks _timestamp;
public:
ObjectCountEventSenderClosure(GCId gc_id, size_t total_size_in_words, jlong timestamp) :
ObjectCountEventSenderClosure(GCId gc_id, size_t total_size_in_words, const Ticks& timestamp) :
_gc_id(gc_id),
_size_threshold_percentage(ObjectCountCutOffPercent / 100),
_total_size_in_words(total_size_in_words),
@ -131,9 +132,7 @@ void GCTracer::report_object_count_after_gc(BoolObjectClosure* is_alive_cl) {
if (!cit.allocation_failed()) {
HeapInspection hi(false, false, false, NULL);
hi.populate_table(&cit, is_alive_cl);
jlong timestamp = os::elapsed_counter();
ObjectCountEventSenderClosure event_sender(_shared_gc_info.id(), cit.size_of_instances_in_words(), timestamp);
ObjectCountEventSenderClosure event_sender(_shared_gc_info.id(), cit.size_of_instances_in_words(), Ticks::now());
cit.iterate(&event_sender);
}
}
@ -147,7 +146,7 @@ void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& he
send_meta_space_summary_event(when, meta_space_summary);
}
void YoungGCTracer::report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions) {
void YoungGCTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) {
assert_set_gc_id();
assert(_tenuring_threshold != UNSET_TENURING_THRESHOLD, "Tenuring threshold has not been reported");
@ -167,14 +166,14 @@ void YoungGCTracer::report_tenuring_threshold(const uint tenuring_threshold) {
_tenuring_threshold = tenuring_threshold;
}
void OldGCTracer::report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions) {
void OldGCTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) {
assert_set_gc_id();
GCTracer::report_gc_end_impl(timestamp, time_partitions);
send_old_gc_event();
}
void ParallelOldTracer::report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions) {
void ParallelOldTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) {
assert_set_gc_id();
OldGCTracer::report_gc_end_impl(timestamp, time_partitions);
@ -200,7 +199,7 @@ void G1NewTracer::report_yc_type(G1YCType type) {
_g1_young_gc_info.set_type(type);
}
void G1NewTracer::report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions) {
void G1NewTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) {
assert_set_gc_id();
YoungGCTracer::report_gc_end_impl(timestamp, time_partitions);

View File

@ -35,6 +35,7 @@
#include "gc_implementation/g1/g1YCTypes.hpp"
#endif
#include "utilities/macros.hpp"
#include "utilities/ticks.hpp"
typedef uint GCId;
@ -47,8 +48,6 @@ class TimePartitions;
class BoolObjectClosure;
class SharedGCInfo VALUE_OBJ_CLASS_SPEC {
static const jlong UNSET_TIMESTAMP = -1;
public:
static const GCId UNSET_GCID = (GCId)-1;
@ -56,23 +55,30 @@ class SharedGCInfo VALUE_OBJ_CLASS_SPEC {
GCId _id;
GCName _name;
GCCause::Cause _cause;
jlong _start_timestamp;
jlong _end_timestamp;
jlong _sum_of_pauses;
jlong _longest_pause;
Ticks _start_timestamp;
Ticks _end_timestamp;
Tickspan _sum_of_pauses;
Tickspan _longest_pause;
public:
SharedGCInfo(GCName name) : _id(UNSET_GCID), _name(name), _cause(GCCause::_last_gc_cause),
_start_timestamp(UNSET_TIMESTAMP), _end_timestamp(UNSET_TIMESTAMP), _sum_of_pauses(0), _longest_pause(0) {}
SharedGCInfo(GCName name) :
_id(UNSET_GCID),
_name(name),
_cause(GCCause::_last_gc_cause),
_start_timestamp(),
_end_timestamp(),
_sum_of_pauses(),
_longest_pause() {
}
void set_id(GCId id) { _id = id; }
GCId id() const { return _id; }
void set_start_timestamp(jlong timestamp) { _start_timestamp = timestamp; }
jlong start_timestamp() const { return _start_timestamp; }
void set_start_timestamp(const Ticks& timestamp) { _start_timestamp = timestamp; }
const Ticks start_timestamp() const { return _start_timestamp; }
void set_end_timestamp(jlong timestamp) { _end_timestamp = timestamp; }
jlong end_timestamp() const { return _end_timestamp; }
void set_end_timestamp(const Ticks& timestamp) { _end_timestamp = timestamp; }
const Ticks end_timestamp() const { return _end_timestamp; }
void set_name(GCName name) { _name = name; }
GCName name() const { return _name; }
@ -80,11 +86,11 @@ class SharedGCInfo VALUE_OBJ_CLASS_SPEC {
void set_cause(GCCause::Cause cause) { _cause = cause; }
GCCause::Cause cause() const { return _cause; }
void set_sum_of_pauses(jlong duration) { _sum_of_pauses = duration; }
jlong sum_of_pauses() const { return _sum_of_pauses; }
void set_sum_of_pauses(const Tickspan& duration) { _sum_of_pauses = duration; }
const Tickspan sum_of_pauses() const { return _sum_of_pauses; }
void set_longest_pause(jlong duration) { _longest_pause = duration; }
jlong longest_pause() const { return _longest_pause; }
void set_longest_pause(const Tickspan& duration) { _longest_pause = duration; }
const Tickspan longest_pause() const { return _longest_pause; }
};
class ParallelOldGCInfo VALUE_OBJ_CLASS_SPEC {
@ -116,8 +122,8 @@ class GCTracer : public ResourceObj {
SharedGCInfo _shared_gc_info;
public:
void report_gc_start(GCCause::Cause cause, jlong timestamp);
void report_gc_end(jlong timestamp, TimePartitions* time_partitions);
void report_gc_start(GCCause::Cause cause, const Ticks& timestamp);
void report_gc_end(const Ticks& timestamp, TimePartitions* time_partitions);
void report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const MetaspaceSummary& meta_space_summary) const;
void report_gc_reference_stats(const ReferenceProcessorStats& rp) const;
void report_object_count_after_gc(BoolObjectClosure* object_filter) NOT_SERVICES_RETURN;
@ -125,8 +131,8 @@ class GCTracer : public ResourceObj {
protected:
GCTracer(GCName name) : _shared_gc_info(name) {}
virtual void report_gc_start_impl(GCCause::Cause cause, jlong timestamp);
virtual void report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions);
virtual void report_gc_start_impl(GCCause::Cause cause, const Ticks& timestamp);
virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions);
private:
void send_garbage_collection_event() const;
@ -143,7 +149,7 @@ class YoungGCTracer : public GCTracer {
protected:
YoungGCTracer(GCName name) : GCTracer(name), _tenuring_threshold(UNSET_TENURING_THRESHOLD) {}
virtual void report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions);
virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions);
public:
void report_promotion_failed(const PromotionFailedInfo& pf_info);
@ -157,7 +163,7 @@ class YoungGCTracer : public GCTracer {
class OldGCTracer : public GCTracer {
protected:
OldGCTracer(GCName name) : GCTracer(name) {}
virtual void report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions);
virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions);
public:
void report_concurrent_mode_failure();
@ -175,7 +181,7 @@ class ParallelOldTracer : public OldGCTracer {
void report_dense_prefix(void* dense_prefix);
protected:
void report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions);
void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions);
private:
void send_parallel_old_event() const;
@ -209,7 +215,7 @@ class G1NewTracer : public YoungGCTracer {
G1NewTracer() : YoungGCTracer(G1New) {}
void report_yc_type(G1YCType type);
void report_gc_end_impl(jlong timestamp, TimePartitions* time_partitions);
void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions);
void report_evacuation_info(EvacuationInfo* info);
void report_evacuation_failed(EvacuationFailedInfo& ef_info);

View File

@ -55,12 +55,11 @@ void GCTracer::send_garbage_collection_event() const {
}
void GCTracer::send_reference_stats_event(ReferenceType type, size_t count) const {
EventGCReferenceStatistics e(UNTIMED);
EventGCReferenceStatistics e;
if (e.should_commit()) {
e.set_gcId(_shared_gc_info.id());
e.set_type((u1)type);
e.set_count(count);
e.set_endtime(os::elapsed_counter());
e.commit();
}
}
@ -107,22 +106,20 @@ static TraceStructCopyFailed to_trace_struct(const CopyFailedInfo& cf_info) {
}
void YoungGCTracer::send_promotion_failed_event(const PromotionFailedInfo& pf_info) const {
EventPromotionFailed e(UNTIMED);
EventPromotionFailed e;
if (e.should_commit()) {
e.set_gcId(_shared_gc_info.id());
e.set_data(to_trace_struct(pf_info));
e.set_thread(pf_info.thread()->thread_id());
e.set_endtime(os::elapsed_counter());
e.commit();
}
}
// Common to CMS and G1
void OldGCTracer::send_concurrent_mode_failure_event() {
EventConcurrentModeFailure e(UNTIMED);
EventConcurrentModeFailure e;
if (e.should_commit()) {
e.set_gcId(_shared_gc_info.id());
e.set_endtime(os::elapsed_counter());
e.commit();
}
}
@ -140,7 +137,7 @@ void G1NewTracer::send_g1_young_gc_event() {
}
void G1NewTracer::send_evacuation_info_event(EvacuationInfo* info) {
EventEvacuationInfo e(UNTIMED);
EventEvacuationInfo e;
if (e.should_commit()) {
e.set_gcId(_shared_gc_info.id());
e.set_cSetRegions(info->collectionset_regions());
@ -151,17 +148,15 @@ void G1NewTracer::send_evacuation_info_event(EvacuationInfo* info) {
e.set_allocRegionsUsedAfter(info->alloc_regions_used_before() + info->bytes_copied());
e.set_bytesCopied(info->bytes_copied());
e.set_regionsFreed(info->regions_freed());
e.set_endtime(os::elapsed_counter());
e.commit();
}
}
void G1NewTracer::send_evacuation_failed_event(const EvacuationFailedInfo& ef_info) const {
EventEvacuationFailed e(UNTIMED);
EventEvacuationFailed e;
if (e.should_commit()) {
e.set_gcId(_shared_gc_info.id());
e.set_data(to_trace_struct(ef_info));
e.set_endtime(os::elapsed_counter());
e.commit();
}
}
@ -195,13 +190,12 @@ class GCHeapSummaryEventSender : public GCHeapSummaryVisitor {
void visit(const GCHeapSummary* heap_summary) const {
const VirtualSpaceSummary& heap_space = heap_summary->heap();
EventGCHeapSummary e(UNTIMED);
EventGCHeapSummary e;
if (e.should_commit()) {
e.set_gcId(_id);
e.set_when((u1)_when);
e.set_heapSpace(to_trace_struct(heap_space));
e.set_heapUsed(heap_summary->used());
e.set_endtime(os::elapsed_counter());
e.commit();
}
}
@ -216,7 +210,7 @@ class GCHeapSummaryEventSender : public GCHeapSummaryVisitor {
const SpaceSummary& from_space = ps_heap_summary->from();
const SpaceSummary& to_space = ps_heap_summary->to();
EventPSHeapSummary e(UNTIMED);
EventPSHeapSummary e;
if (e.should_commit()) {
e.set_gcId(_id);
e.set_when((u1)_when);
@ -227,7 +221,6 @@ class GCHeapSummaryEventSender : public GCHeapSummaryVisitor {
e.set_edenSpace(to_trace_struct(ps_heap_summary->eden()));
e.set_fromSpace(to_trace_struct(ps_heap_summary->from()));
e.set_toSpace(to_trace_struct(ps_heap_summary->to()));
e.set_endtime(os::elapsed_counter());
e.commit();
}
}
@ -249,14 +242,13 @@ static TraceStructMetaspaceSizes to_trace_struct(const MetaspaceSizes& sizes) {
}
void GCTracer::send_meta_space_summary_event(GCWhen::Type when, const MetaspaceSummary& meta_space_summary) const {
EventMetaspaceSummary e(UNTIMED);
EventMetaspaceSummary e;
if (e.should_commit()) {
e.set_gcId(_shared_gc_info.id());
e.set_when((u1) when);
e.set_metaspace(to_trace_struct(meta_space_summary.meta_space()));
e.set_dataSpace(to_trace_struct(meta_space_summary.data_space()));
e.set_classSpace(to_trace_struct(meta_space_summary.class_space()));
e.set_endtime(os::elapsed_counter());
e.commit();
}
}

View File

@ -31,12 +31,13 @@
#include "runtime/thread.inline.hpp"
#include "runtime/timer.hpp"
#include "utilities/ostream.hpp"
#include "utilities/ticks.inline.hpp"
GCTraceTime::GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* timer) :
_title(title), _doit(doit), _print_cr(print_cr), _timer(timer) {
_title(title), _doit(doit), _print_cr(print_cr), _timer(timer), _start_counter() {
if (_doit || _timer != NULL) {
_start_counter = os::elapsed_counter();
_start_counter.stamp();
}
if (_timer != NULL) {
@ -57,10 +58,10 @@ GCTraceTime::GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* t
}
GCTraceTime::~GCTraceTime() {
jlong stop_counter = 0;
Ticks stop_counter;
if (_doit || _timer != NULL) {
stop_counter = os::elapsed_counter();
stop_counter.stamp();
}
if (_timer != NULL) {
@ -68,11 +69,12 @@ GCTraceTime::~GCTraceTime() {
}
if (_doit) {
double seconds = TimeHelper::counter_to_seconds(stop_counter - _start_counter);
const Tickspan duration = stop_counter - _start_counter;
double duration_in_seconds = TicksToTimeHelper::seconds(duration);
if (_print_cr) {
gclog_or_tty->print_cr(", %3.7f secs]", seconds);
gclog_or_tty->print_cr(", %3.7f secs]", duration_in_seconds);
} else {
gclog_or_tty->print(", %3.7f secs]", seconds);
gclog_or_tty->print(", %3.7f secs]", duration_in_seconds);
}
gclog_or_tty->flush();
}

View File

@ -26,6 +26,7 @@
#define SHARE_VM_GC_IMPLEMENTATION_SHARED_GCTRACETIME_HPP
#include "prims/jni_md.h"
#include "utilities/ticks.hpp"
class GCTimer;
@ -34,7 +35,7 @@ class GCTraceTime {
bool _doit;
bool _print_cr;
GCTimer* _timer;
jlong _start_counter;
Ticks _start_counter;
public:
GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* timer);

View File

@ -28,10 +28,11 @@
#include "memory/heapInspection.hpp"
#include "trace/tracing.hpp"
#include "utilities/globalDefinitions.hpp"
#include "utilities/ticks.hpp"
#if INCLUDE_SERVICES
void ObjectCountEventSender::send(const KlassInfoEntry* entry, GCId gc_id, jlong timestamp) {
void ObjectCountEventSender::send(const KlassInfoEntry* entry, GCId gc_id, const Ticks& timestamp) {
#if INCLUDE_TRACE
assert(Tracing::is_event_enabled(EventObjectCountAfterGC::eventId),
"Only call this method if the event is enabled");

View File

@ -32,10 +32,11 @@
#if INCLUDE_SERVICES
class KlassInfoEntry;
class Ticks;
class ObjectCountEventSender : public AllStatic {
public:
static void send(const KlassInfoEntry* entry, GCId gc_id, jlong timestamp);
static void send(const KlassInfoEntry* entry, GCId gc_id, const Ticks& timestamp);
static bool should_send_event();
};

View File

@ -915,6 +915,25 @@ void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method
return;
}
// check if invokespecial's interface method reference is in an indirect superinterface
if (!current_klass.is_null() && resolved_klass->is_interface()) {
Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
current_klass() :
InstanceKlass::cast(current_klass())->host_klass();
if (!InstanceKlass::cast(klass_to_check)->is_same_or_direct_interface(resolved_klass())) {
ResourceMark rm(THREAD);
char buf[200];
jio_snprintf(buf, sizeof(buf),
"Interface method reference: %s, is in an indirect superinterface of %s",
Method::name_and_sig_as_C_string(resolved_klass(),
resolved_method->name(),
resolved_method->signature()),
current_klass->external_name());
THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
}
// check if not static
if (resolved_method->is_static()) {
ResourceMark rm(THREAD);

View File

@ -562,7 +562,7 @@ void DefNewGeneration::collect(bool full,
GenCollectedHeap* gch = GenCollectedHeap::heap();
_gc_timer->register_gc_start(os::elapsed_counter());
_gc_timer->register_gc_start();
DefNewTracer gc_tracer;
gc_tracer.report_gc_start(gch->gc_cause(), _gc_timer->gc_start());
@ -709,7 +709,7 @@ void DefNewGeneration::collect(bool full,
gch->trace_heap_after_gc(&gc_tracer);
gc_tracer.report_tenuring_threshold(tenuring_threshold());
_gc_timer->register_gc_end(os::elapsed_counter());
_gc_timer->register_gc_end();
gc_tracer.report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions());
}

View File

@ -635,16 +635,16 @@ void OneContigSpaceCardGeneration::collect(bool full,
x(ref_processor(), gch->reserved_region());
STWGCTimer* gc_timer = GenMarkSweep::gc_timer();
gc_timer->register_gc_start(os::elapsed_counter());
gc_timer->register_gc_start();
SerialOldTracer* gc_tracer = GenMarkSweep::gc_tracer();
gc_tracer->report_gc_start(gch->gc_cause(), gc_timer->gc_start());
GenMarkSweep::invoke_at_safepoint(_level, ref_processor(), clear_all_soft_refs);
gc_timer->register_gc_end(os::elapsed_counter());
gc_timer->register_gc_end();
gc_tracer->report_gc_end(os::elapsed_counter(), gc_timer->time_partitions());
gc_tracer->report_gc_end(gc_timer->gc_end(), gc_timer->time_partitions());
SpecializationStats::print();
}

View File

@ -120,6 +120,7 @@ oop Universe::_null_ptr_exception_instance = NULL;
oop Universe::_arithmetic_exception_instance = NULL;
oop Universe::_virtual_machine_error_instance = NULL;
oop Universe::_vm_exception = NULL;
Method* Universe::_throw_illegal_access_error = NULL;
Array<int>* Universe::_the_empty_int_array = NULL;
Array<u2>* Universe::_the_empty_short_array = NULL;
Array<Klass*>* Universe::_the_empty_klass_array = NULL;
@ -1096,6 +1097,18 @@ bool universe_post_init() {
Universe::_finalizer_register_cache->init(
SystemDictionary::Finalizer_klass(), m);
InstanceKlass::cast(SystemDictionary::misc_Unsafe_klass())->link_class(CHECK_false);
m = InstanceKlass::cast(SystemDictionary::misc_Unsafe_klass())->find_method(
vmSymbols::throwIllegalAccessError_name(),
vmSymbols::void_method_signature());
if (m != NULL && !m->is_static()) {
// Note null is okay; this method is used in itables, and if it is null,
// then AbstractMethodError is thrown instead.
tty->print_cr("Unable to link/verify Unsafe.throwIllegalAccessError method");
return false; // initialization failed (cannot throw exception yet)
}
Universe::_throw_illegal_access_error = m;
// Setup method for registering loaded classes in class loader vector
InstanceKlass::cast(SystemDictionary::ClassLoader_klass())->link_class(CHECK_false);
m = InstanceKlass::cast(SystemDictionary::ClassLoader_klass())->find_method(vmSymbols::addClass_name(), vmSymbols::class_void_signature());

View File

@ -149,6 +149,8 @@ class Universe: AllStatic {
static LatestMethodCache* _loader_addClass_cache; // method for registering loaded classes in class loader vector
static LatestMethodCache* _pd_implies_cache; // method for checking protection domain attributes
static Method* _throw_illegal_access_error;
// preallocated error objects (no backtrace)
static oop _out_of_memory_error_java_heap;
static oop _out_of_memory_error_metaspace;
@ -305,6 +307,7 @@ class Universe: AllStatic {
static oop arithmetic_exception_instance() { return _arithmetic_exception_instance; }
static oop virtual_machine_error_instance() { return _virtual_machine_error_instance; }
static oop vm_exception() { return _vm_exception; }
static Method* throw_illegal_access_error() { return _throw_illegal_access_error; }
static Array<int>* the_empty_int_array() { return _the_empty_int_array; }
static Array<u2>* the_empty_short_array() { return _the_empty_short_array; }

View File

@ -1051,6 +1051,18 @@ bool InstanceKlass::implements_interface(Klass* k) const {
return false;
}
bool InstanceKlass::is_same_or_direct_interface(Klass *k) const {
// Verify direct super interface
if (this == k) return true;
assert(k->is_interface(), "should be an interface class");
for (int i = 0; i < local_interfaces()->length(); i++) {
if (local_interfaces()->at(i) == k) {
return true;
}
}
return false;
}
objArrayOop InstanceKlass::allocate_objArray(int n, int length, TRAPS) {
if (length < 0) THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
if (length > arrayOopDesc::max_array_length(T_OBJECT)) {

View File

@ -777,6 +777,7 @@ class InstanceKlass: public Klass {
// subclass/subinterface checks
bool implements_interface(Klass* k) const;
bool is_same_or_direct_interface(Klass* k) const;
// Access to the implementor of an interface.
Klass* implementor() const

View File

@ -1076,7 +1076,12 @@ void klassItable::initialize_itable_for_interface(int method_table_offset, Klass
LinkResolver::lookup_instance_method_in_klasses(target, _klass, m->name(), m->signature(), CHECK);
}
if (target == NULL || !target->is_public() || target->is_abstract()) {
// Entry do not resolve. Leave it empty
// Entry does not resolve. Leave it empty for AbstractMethodError.
if (!(target == NULL) && !target->is_public()) {
// Stuff an IllegalAccessError throwing method in there instead.
itableOffsetEntry::method_entry(_klass(), method_table_offset)[m->itable_index()].
initialize(Universe::throw_illegal_access_error());
}
} else {
// Entry did resolve, check loader constraints before initializing
// if checkconstraints requested

View File

@ -42,6 +42,7 @@
#include "runtime/deoptimization.hpp"
#include "runtime/vmThread.hpp"
#include "trace/tracing.hpp"
#include "utilities/ticks.hpp"
class Block;
class Bundle;
@ -597,20 +598,19 @@ class Compile : public Phase {
bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
jlong _latest_stage_start_counter;
Ticks _latest_stage_start_counter;
void begin_method() {
#ifndef PRODUCT
if (_printer) _printer->begin_method(this);
#endif
C->_latest_stage_start_counter = os::elapsed_counter();
C->_latest_stage_start_counter.stamp();
}
void print_method(CompilerPhaseType cpt, int level = 1) {
EventCompilerPhase event(UNTIMED);
EventCompilerPhase event;
if (event.should_commit()) {
event.set_starttime(C->_latest_stage_start_counter);
event.set_endtime(os::elapsed_counter());
event.set_phase((u1) cpt);
event.set_compileID(C->_compile_id);
event.set_phaseLevel(level);
@ -621,14 +621,13 @@ class Compile : public Phase {
#ifndef PRODUCT
if (_printer) _printer->print_method(this, CompilerPhaseTypeHelper::to_string(cpt), level);
#endif
C->_latest_stage_start_counter = os::elapsed_counter();
C->_latest_stage_start_counter.stamp();
}
void end_method(int level = 1) {
EventCompilerPhase event(UNTIMED);
EventCompilerPhase event;
if (event.should_commit()) {
event.set_starttime(C->_latest_stage_start_counter);
event.set_endtime(os::elapsed_counter());
event.set_phase((u1) PHASE_END);
event.set_compileID(C->_compile_id);
event.set_phaseLevel(level);

View File

@ -38,6 +38,7 @@
#include "runtime/vm_operations.hpp"
#include "trace/tracing.hpp"
#include "utilities/events.hpp"
#include "utilities/ticks.inline.hpp"
#include "utilities/xmlstream.hpp"
#ifdef ASSERT
@ -144,10 +145,10 @@ volatile int NMethodSweeper::_bytes_changed = 0; // Counts the tot
// 3) zombie -> marked_for_reclamation
int NMethodSweeper::_total_nof_methods_reclaimed = 0; // Accumulated nof methods flushed
jlong NMethodSweeper::_total_time_sweeping = 0; // Accumulated time sweeping
jlong NMethodSweeper::_total_time_this_sweep = 0; // Total time this sweep
jlong NMethodSweeper::_peak_sweep_time = 0; // Peak time for a full sweep
jlong NMethodSweeper::_peak_sweep_fraction_time = 0; // Peak time sweeping one fraction
Tickspan NMethodSweeper::_total_time_sweeping; // Accumulated time sweeping
Tickspan NMethodSweeper::_total_time_this_sweep; // Total time this sweep
Tickspan NMethodSweeper::_peak_sweep_time; // Peak time for a full sweep
Tickspan NMethodSweeper::_peak_sweep_fraction_time; // Peak time sweeping one fraction
int NMethodSweeper::_hotness_counter_reset_val = 0;
@ -209,7 +210,7 @@ void NMethodSweeper::mark_active_nmethods() {
_sweep_fractions_left = NmethodSweepFraction;
_current = CodeCache::first_nmethod();
_traversals += 1;
_total_time_this_sweep = 0;
_total_time_this_sweep = Tickspan();
if (PrintMethodFlushing) {
tty->print_cr("### Sweep: stack traversal %d", _traversals);
@ -303,7 +304,7 @@ void NMethodSweeper::possibly_sweep() {
}
void NMethodSweeper::sweep_code_cache() {
jlong sweep_start_counter = os::elapsed_counter();
Ticks sweep_start_counter = Ticks::now();
_flushed_count = 0;
_zombified_count = 0;
@ -367,8 +368,8 @@ void NMethodSweeper::sweep_code_cache() {
assert(_sweep_fractions_left > 1 || _current == NULL, "must have scanned the whole cache");
jlong sweep_end_counter = os::elapsed_counter();
jlong sweep_time = sweep_end_counter - sweep_start_counter;
const Ticks sweep_end_counter = Ticks::now();
const Tickspan sweep_time = sweep_end_counter - sweep_start_counter;
_total_time_sweeping += sweep_time;
_total_time_this_sweep += sweep_time;
_peak_sweep_fraction_time = MAX2(sweep_time, _peak_sweep_fraction_time);
@ -389,7 +390,8 @@ void NMethodSweeper::sweep_code_cache() {
#ifdef ASSERT
if(PrintMethodFlushing) {
tty->print_cr("### sweeper: sweep time(%d): " INT64_FORMAT, _sweep_fractions_left, (jlong)sweep_time);
tty->print_cr("### sweeper: sweep time(%d): "
INT64_FORMAT, _sweep_fractions_left, (jlong)sweep_time.value());
}
#endif

View File

@ -25,6 +25,7 @@
#ifndef SHARE_VM_RUNTIME_SWEEPER_HPP
#define SHARE_VM_RUNTIME_SWEEPER_HPP
#include "utilities/ticks.hpp"
// An NmethodSweeper is an incremental cleaner for:
// - cleanup inline caches
// - reclamation of nmethods
@ -71,10 +72,10 @@ class NMethodSweeper : public AllStatic {
// 3) zombie -> marked_for_reclamation
// Stat counters
static int _total_nof_methods_reclaimed; // Accumulated nof methods flushed
static jlong _total_time_sweeping; // Accumulated time sweeping
static jlong _total_time_this_sweep; // Total time this sweep
static jlong _peak_sweep_time; // Peak time for a full sweep
static jlong _peak_sweep_fraction_time; // Peak time sweeping one fraction
static Tickspan _total_time_sweeping; // Accumulated time sweeping
static Tickspan _total_time_this_sweep; // Total time this sweep
static Tickspan _peak_sweep_time; // Peak time for a full sweep
static Tickspan _peak_sweep_fraction_time; // Peak time sweeping one fraction
static int process_nmethod(nmethod *nm);
static void release_nmethod(nmethod* nm);
@ -87,9 +88,9 @@ class NMethodSweeper : public AllStatic {
public:
static long traversal_count() { return _traversals; }
static int total_nof_methods_reclaimed() { return _total_nof_methods_reclaimed; }
static jlong total_time_sweeping() { return _total_time_sweeping; }
static jlong peak_sweep_time() { return _peak_sweep_time; }
static jlong peak_sweep_fraction_time() { return _peak_sweep_fraction_time; }
static const Tickspan total_time_sweeping() { return _total_time_sweeping; }
static const Tickspan peak_sweep_time() { return _peak_sweep_time; }
static const Tickspan peak_sweep_fraction_time() { return _peak_sweep_fraction_time; }
static void log_sweep(const char* msg, const char* format = NULL, ...);

View File

@ -25,9 +25,7 @@
#define SHARE_VM_TRACE_NOTRACEBACKEND_HPP
#include "prims/jni.h"
typedef jlong TracingTime;
typedef jlong RelativeTracingTime;
#include "trace/traceTime.hpp"
class NoTraceBackend {
public:
@ -44,5 +42,3 @@ public:
typedef NoTraceBackend Tracing;
#endif

View File

@ -176,8 +176,8 @@ Declares a structure type that can be used in other events.
<value type="UINT" field="gcId" label="GC ID" relation="GC_ID" />
<value type="GCNAME" field="name" label="Name" description="The name of the Garbage Collector" />
<value type="GCCAUSE" field="cause" label="Cause" description="The reason for triggering this Garbage Collection" />
<value type="RELATIVE_TICKS" field="sumOfPauses" label="Sum of Pauses" description="Sum of all the times in which Java execution was paused during the garbage collection" />
<value type="RELATIVE_TICKS" field="longestPause" label="Longest Pause" description="Longest individual pause during the garbage collection" />
<value type="TICKSPAN" field="sumOfPauses" label="Sum of Pauses" description="Sum of all the times in which Java execution was paused during the garbage collection" />
<value type="TICKSPAN" field="longestPause" label="Longest Pause" description="Longest individual pause during the garbage collection" />
</event>
<event id="GCParallelOld" path="vm/gc/collector/parold_garbage_collection" label="Parallel Old Garbage Collection"

View File

@ -47,10 +47,6 @@ public:
return os::elapsed_counter();
}
static TracingTime time_adjustment(jlong time) {
return time;
}
static void on_unloading_classes(void) {
}
};

View File

@ -25,26 +25,23 @@
#ifndef SHARE_VM_TRACE_TRACEEVENT_HPP
#define SHARE_VM_TRACE_TRACEEVENT_HPP
#include "utilities/macros.hpp"
enum EventStartTime {
UNTIMED,
TIMED
};
#include "utilities/macros.hpp"
#if INCLUDE_TRACE
#include "trace/traceBackend.hpp"
#include "trace/tracing.hpp"
#include "tracefiles/traceEventIds.hpp"
#include "tracefiles/traceTypes.hpp"
#include "utilities/ticks.hpp"
template<typename T>
class TraceEvent : public StackObj {
protected:
jlong _startTime;
jlong _endTime;
private:
bool _started;
#ifdef ASSERT
@ -54,6 +51,18 @@ class TraceEvent : public StackObj {
bool _ignore_check;
#endif
protected:
jlong _startTime;
jlong _endTime;
void set_starttime(const TracingTime& time) {
_startTime = time;
}
void set_endtime(const TracingTime& time) {
_endTime = time;
}
public:
TraceEvent(EventStartTime timing=TIMED) :
_startTime(0),
@ -100,12 +109,12 @@ class TraceEvent : public StackObj {
set_commited();
}
void set_starttime(jlong time) {
_startTime = time;
void set_starttime(const Ticks& time) {
_startTime = time.value();
}
void set_endtime(jlong time) {
_endTime = time;
void set_endtime(const Ticks& time) {
_endTime = time.value();
}
TraceEventId id() const {

View File

@ -40,6 +40,7 @@
#include "tracefiles/traceTypes.hpp"
#include "trace/traceEvent.hpp"
#include "utilities/macros.hpp"
#include "utilities/ticks.hpp"
#if INCLUDE_TRACE
@ -55,8 +56,8 @@
class TraceEvent {
public:
TraceEvent() {}
void set_starttime(jlong time) const {}
void set_endtime(jlong time) const {}
void set_starttime(const Ticks&amp; time) {}
void set_endtime(const Ticks&amp; time) {}
bool should_commit() const { return false; }
void commit() const {}
};
@ -170,23 +171,23 @@ public:
</xsl:if>
</xsl:template>
<xsl:template match="value[@type='TICKS']" mode="write-setters">
#if INCLUDE_TRACE
<xsl:value-of select="concat('void set_', @field, '(jlong time) { _', @field, ' = time; }')"/>
<xsl:value-of select="concat(' void set_', @field, '(const Ticks&amp; time) { _', @field, ' = time; }')"/>
#else
<xsl:value-of select="concat('void set_', @field, '(jlong ignore) {}')"/>
<xsl:value-of select="concat(' void set_', @field, '(const Ticks&amp; ignore) {}')"/>
#endif
</xsl:template>
<xsl:template match="value[@type='RELATIVE_TICKS']" mode="write-setters">
<xsl:template match="value[@type='TICKSPAN']" mode="write-setters">
#if INCLUDE_TRACE
<xsl:value-of select="concat('void set_', @field, '(jlong time) { _', @field, ' = time; }')"/>
<xsl:value-of select="concat(' void set_', @field, '(const Tickspan&amp; time) { _', @field, ' = time; }')"/>
#else
<xsl:value-of select="concat('void set_', @field, '(jlong ignore) {}')"/>
<xsl:value-of select="concat(' void set_', @field, '(const Tickspan&amp; ignore) {}')"/>
#endif
</xsl:template>
<xsl:template match="value" mode="write-fields">
<xsl:variable name="type" select="@type"/>
<xsl:variable name="wt" select="//primary_type[@symbol=$type]/@type"/>
@ -226,7 +227,17 @@ public:
<xsl:template match="value" mode="write-data">
<xsl:variable name="type" select="@type"/>
<xsl:variable name="wt" select="//primary_type[@symbol=$type]/@writetype"/>
<xsl:value-of select="concat(' ts.print_val(&quot;', @label, '&quot;, _', @field, ');')"/>
<xsl:choose>
<xsl:when test="@type='TICKSPAN'">
<xsl:value-of select="concat(' ts.print_val(&quot;', @label, '&quot;, _', @field, '.value());')"/>
</xsl:when>
<xsl:when test="@type='TICKS'">
<xsl:value-of select="concat(' ts.print_val(&quot;', @label, '&quot;, _', @field, '.value());')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat(' ts.print_val(&quot;', @label, '&quot;, _', @field, ');')"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position() != last()">
<xsl:text>
ts.print(", ");

View File

@ -28,6 +28,5 @@
#include "prims/jni.h"
typedef jlong TracingTime;
typedef jlong RelativeTracingTime;
#endif
#endif // SHARE_VM_TRACE_TRACETIME_HPP

View File

@ -32,9 +32,11 @@
#ifndef TRACEFILES_JFRTYPES_HPP
#define TRACEFILES_JFRTYPES_HPP
#include "oops/symbol.hpp"
#include "trace/traceDataTypes.hpp"
#include "utilities/globalDefinitions.hpp"
#include "oops/symbol.hpp"
#include "utilities/ticks.hpp"
enum JVMContentType {
_not_a_content_type = (JVM_CONTENT_TYPES_START - 1),

View File

@ -249,13 +249,13 @@ Now we can use the content + data type in declaring event fields.
<primary_type symbol="NANOS" datatype="LONG" contenttype="NANOS"
type="s8" sizeop="sizeof(s8)"/>
<!-- 64-bit signed integer, SEMANTIC value ABSOLUTE TICKS -->
<!-- 64-bit signed integer, SEMANTIC value TICKS -->
<primary_type symbol="TICKS" datatype="LONG" contenttype="TICKS"
type="s8" sizeop="sizeof(s8)"/>
type="Ticks" sizeop="sizeof(s8)"/>
<!-- 64-bit signed integer, SEMANTIC value RELATIVE TICKS -->
<primary_type symbol="RELATIVE_TICKS" datatype="LONG" contenttype="TICKS"
type="s8" sizeop="sizeof(s8)"/>
<!-- 64-bit signed integer, SEMANTIC value TICKS duration -->
<primary_type symbol="TICKSPAN" datatype="LONG" contenttype="TICKS"
type="Tickspan" sizeop="sizeof(s8)"/>
<!-- 64-bit unsigned integer, SEMANTIC value ADDRESS (mem loc) -->
<primary_type symbol="ADDRESS" datatype="U8" contenttype="ADDRESS"

View File

@ -0,0 +1,68 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#include "precompiled.hpp"
#include "runtime/os.hpp"
#include "utilities/ticks.inline.hpp"
#ifdef ASSERT
const jlong Ticks::invalid_time_stamp = -2; // 0xFFFF FFFF`FFFF FFFE
#endif
void Ticks::stamp() {
_stamp_ticks = os::elapsed_counter();
}
const Ticks Ticks::now() {
Ticks t;
t.stamp();
return t;
}
Tickspan::Tickspan(const Ticks& end, const Ticks& start) {
assert(end.value() != Ticks::invalid_time_stamp, "end is unstamped!");
assert(start.value() != Ticks::invalid_time_stamp, "start is unstamped!");
assert(end >= start, "negative time!");
_span_ticks = end.value() - start.value();
}
template <typename ReturnType>
static ReturnType time_conversion(const Tickspan& span, TicksToTimeHelper::Unit unit) {
assert(TicksToTimeHelper::SECONDS == unit ||
TicksToTimeHelper::MILLISECONDS == unit, "invalid unit!");
ReturnType frequency_per_unit = (ReturnType)os::elapsed_frequency() / (ReturnType)unit;
return (ReturnType) ((ReturnType)span.value() / frequency_per_unit);
}
double TicksToTimeHelper::seconds(const Tickspan& span) {
return time_conversion<double>(span, SECONDS);
}
jlong TicksToTimeHelper::milliseconds(const Tickspan& span) {
return time_conversion<jlong>(span, MILLISECONDS);
}

View File

@ -0,0 +1,111 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#ifndef SHARE_VM_UTILITIES_TICKS_HPP
#define SHARE_VM_UTILITIES_TICKS_HPP
#include "memory/allocation.hpp"
#include "utilities/globalDefinitions.hpp"
class Ticks;
class Tickspan VALUE_OBJ_CLASS_SPEC {
friend class Ticks;
friend Tickspan operator-(const Ticks& end, const Ticks& start);
private:
jlong _span_ticks;
Tickspan(const Ticks& end, const Ticks& start);
public:
Tickspan() : _span_ticks(0) {}
Tickspan& operator+=(const Tickspan& rhs) {
_span_ticks += rhs._span_ticks;
return *this;
}
jlong value() const {
return _span_ticks;
}
};
class Ticks VALUE_OBJ_CLASS_SPEC {
private:
jlong _stamp_ticks;
public:
Ticks() : _stamp_ticks(0) {
assert((_stamp_ticks = invalid_time_stamp) == invalid_time_stamp,
"initial unstamped time value assignment");
}
Ticks& operator+=(const Tickspan& span) {
_stamp_ticks += span.value();
return *this;
}
Ticks& operator-=(const Tickspan& span) {
_stamp_ticks -= span.value();
return *this;
}
void stamp();
jlong value() const {
return _stamp_ticks;
}
static const Ticks now();
#ifdef ASSERT
static const jlong invalid_time_stamp;
#endif
#ifndef PRODUCT
// only for internal use by GC VM tests
friend class TimePartitionPhasesIteratorTest;
friend class GCTimerTest;
private:
// implicit type conversion
Ticks(int ticks) : _stamp_ticks(ticks) {}
#endif // !PRODUCT
};
class TicksToTimeHelper : public AllStatic {
public:
enum Unit {
SECONDS = 1,
MILLISECONDS = 1000
};
static double seconds(const Tickspan& span);
static jlong milliseconds(const Tickspan& span);
};
#endif // SHARE_VM_UTILITIES_TICKS_HPP

View File

@ -0,0 +1,97 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#ifndef SHARE_VM_UTILITIES_TICKS_INLINE_HPP
#define SHARE_VM_UTILITIES_TICKS_INLINE_HPP
#include "utilities/ticks.hpp"
inline Tickspan operator+(Tickspan lhs, const Tickspan& rhs) {
lhs += rhs;
return lhs;
}
inline bool operator==(const Tickspan& lhs, const Tickspan& rhs) {
return lhs.value() == rhs.value();
}
inline bool operator!=(const Tickspan& lhs, const Tickspan& rhs) {
return !operator==(lhs,rhs);
}
inline bool operator<(const Tickspan& lhs, const Tickspan& rhs) {
return lhs.value() < rhs.value();
}
inline bool operator>(const Tickspan& lhs, const Tickspan& rhs) {
return operator<(rhs,lhs);
}
inline bool operator<=(const Tickspan& lhs, const Tickspan& rhs) {
return !operator>(lhs,rhs);
}
inline bool operator>=(const Tickspan& lhs, const Tickspan& rhs) {
return !operator<(lhs,rhs);
}
inline Ticks operator+(Ticks lhs, const Tickspan& span) {
lhs += span;
return lhs;
}
inline Ticks operator-(Ticks lhs, const Tickspan& span) {
lhs -= span;
return lhs;
}
inline Tickspan operator-(const Ticks& end, const Ticks& start) {
return Tickspan(end, start);
}
inline bool operator==(const Ticks& lhs, const Ticks& rhs) {
return lhs.value() == rhs.value();
}
inline bool operator!=(const Ticks& lhs, const Ticks& rhs) {
return !operator==(lhs,rhs);
}
inline bool operator<(const Ticks& lhs, const Ticks& rhs) {
return lhs.value() < rhs.value();
}
inline bool operator>(const Ticks& lhs, const Ticks& rhs) {
return operator<(rhs,lhs);
}
inline bool operator<=(const Ticks& lhs, const Ticks& rhs) {
return !operator>(lhs,rhs);
}
inline bool operator>=(const Ticks& lhs, const Ticks& rhs) {
return !operator<(lhs,rhs);
}
#endif // SHARE_VM_UTILITIES_TICKS_INLINE_HPP

View File

@ -1,3 +1,12 @@
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@ -23,12 +32,63 @@
*/
/**
* A minimal classloader for loading bytecodes that could not result from
* properly compiled Java.
* A ByteClassLoader is used to define classes from collections of bytes, as
* well as loading classes in the usual way. It includes options to write the
* classes to files in a jar, or to read the classes from jars in a later or
* debugging run.
*
* If Boolean property byteclassloader.verbose is true, be chatty about jar
* file operations.
*
* @author dr2chase
*/
public class ByteClassLoader extends ClassLoader {
public class ByteClassLoader extends URLClassLoader {
final static boolean verbose
= Boolean.getBoolean("byteclassloader.verbose");
final boolean read;
final JarOutputStream jos;
final String jar_name;
/**
* Make a new ByteClassLoader.
*
* @param jar_name Basename of jar file to be read/written by this classloader.
* @param read If true, read classes from jar file instead of from parameter.
* @param write If true, write classes to jar files for offline study/use.
*
* @throws FileNotFoundException
* @throws IOException
*/
public ByteClassLoader(String jar_name, boolean read, boolean write)
throws FileNotFoundException, IOException {
super(read
? new URL[]{new URL("file:" + jar_name + ".jar")}
: new URL[0]);
this.read = read;
this.jar_name = jar_name;
this.jos = write
? new JarOutputStream(
new BufferedOutputStream(
new FileOutputStream(jar_name + ".jar"))) : null;
if (read && write) {
throw new Error("At most one of read and write may be true.");
}
}
private static void writeJarredFile(JarOutputStream jos, String file, String suffix, byte[] bytes) {
String fileName = file.replace(".", "/") + "." + suffix;
JarEntry ze = new JarEntry(fileName);
try {
ze.setSize(bytes.length);
jos.putNextEntry(ze);
jos.write(bytes);
jos.closeEntry();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* (pre)load class name using classData for the definition.
*
@ -36,9 +96,36 @@ public class ByteClassLoader extends ClassLoader {
* @param classData
* @return
*/
public Class<?> loadBytes(String name, byte[] classData) {
Class<?> clazz = defineClass(name, classData, 0, classData.length);
resolveClass(clazz);
return clazz;
public Class<?> loadBytes(String name, byte[] classData) throws ClassNotFoundException {
if (jos != null) {
if (verbose) {
System.out.println("ByteClassLoader: writing " + name);
}
writeJarredFile(jos, name, "class", classData);
}
Class<?> clazz = null;
if (read) {
if (verbose) {
System.out.println("ByteClassLoader: reading " + name + " from " + jar_name);
}
clazz = loadClass(name);
} else {
clazz = defineClass(name, classData, 0, classData.length);
resolveClass(clazz);
}
return clazz;
}
public void close() {
if (jos != null) {
try {
if (verbose) {
System.out.println("ByteClassLoader: closing " + jar_name);
}
jos.close();
} catch (IOException ex) {
}
}
}
}

View File

@ -21,50 +21,127 @@
* questions.
*
*/
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Handle;
import jdk.internal.org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes;
import p.Dok;
/**
* @test
* @bug 8025260
* @summary Ensure that AbstractMethodError is thrown, not NullPointerException, through MethodHandles::jump_from_method_handle code path
* @test @bug 8025260 8016839
* @summary Ensure that AbstractMethodError and IllegalAccessError are thrown appropriately, not NullPointerException
*
* @compile -XDignore.symbol.file TestAMEnotNPE.java ByteClassLoader.java p/C.java p/Dok.java p/E.java p/F.java p/I.java p/Tdirect.java p/Treflect.java
*
* @compile -XDignore.symbol.file ByteClassLoader.java I.java C.java TestAMEnotNPE.java
* @run main/othervm TestAMEnotNPE
* @run main/othervm -Xint TestAMEnotNPE
* @run main/othervm -Xcomp TestAMEnotNPE
*/
public class TestAMEnotNPE implements Opcodes {
static boolean writeJarFiles = false;
static boolean readJarFiles = false;
/**
* The bytes for D, a NOT abstract class extending abstract class C
* without supplying an implementation for abstract method m.
* There is a default method in the interface I, but it should lose to
* the abstract class.
* Optional command line parameter (any case-insensitive prefix of)
* "writejarfiles" or "readjarfiles".
*
* "Writejarfiles" creates a jar file for each different set of tested classes.
* "Readjarfiles" causes the classloader to use the copies of the classes
* found in the corresponding jar files.
*
* Jarfilenames look something like pD_ext_pF (p.D extends p.F)
* and qD_m_pp_imp_pI (q.D with package-private m implements p.I)
*
*/
public static void main(String args[]) throws Throwable {
ArrayList<Throwable> lt = new ArrayList<Throwable>();
class D extends C {
D() { super(); }
// does not define m
}
if (args.length > 0) {
String a0 = args[0].toLowerCase();
if (a0.length() > 0) {
writeJarFiles = ("writejarfiles").startsWith(a0);
readJarFiles = ("readjarfiles").startsWith(a0);
}
if (!(writeJarFiles || readJarFiles)) {
throw new Error("Command line parameter (if any) should be prefix of writeJarFiles or readJarFiles");
}
}
try {
System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m, p.D extends p.F, p.F.m FINAL");
tryAndCheckThrown(lt, bytesForDprivateSubWhat("p/F"),
"p.D extends p.F (p.F implements p.I, FINAL public m), private m",
IllegalAccessError.class, "pD_ext_pF");
// We'll take either a VerifyError (pre 2013-11-30)
// or an IllegalAccessError (post 2013-11-22)
} catch (VerifyError ve) {
System.out.println("Saw expected VerifyError " + ve);
}
System.out.println();
System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m, p.D extends p.E");
tryAndCheckThrown(lt, bytesForDprivateSubWhat("p/E"),
"p.D extends p.E (p.E implements p.I, public m), private m",
IllegalAccessError.class, "pD_ext_pE");
System.out.println("TRYING p.D.m ABSTRACT interface-invoked as p.I.m");
tryAndCheckThrown(lt, bytesForD(),
"D extends abstract C, no m",
AbstractMethodError.class, "pD_ext_pC");
System.out.println("TRYING q.D.m PACKAGE interface-invoked as p.I.m");
tryAndCheckThrown(lt, "q.D", bytesForDsomeAccess("q/D", 0),
"q.D implements p.I, protected m", IllegalAccessError.class,
"qD_m_pp_imp_pI");
// Note jar file name is used in the plural-arg case.
System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m");
tryAndCheckThrown(lt, bytesForDsomeAccess("p/D", ACC_PRIVATE),
"p.D implements p.I, private m",
IllegalAccessError.class, "pD_m_pri_imp_pI");
// Plural-arg test.
System.out.println("TRYING p.D.m PRIVATE MANY ARG interface-invoked as p.I.m");
tryAndCheckThrownMany(lt, bytesForDsomeAccess("p/D", ACC_PRIVATE),
"p.D implements p.I, private m", IllegalAccessError.class);
if (lt.size() > 0) {
System.out.flush();
Thread.sleep(250); // This de-interleaves output and error in Netbeans, sigh.
for (Throwable th : lt)
System.err.println(th);
throw new Error("Test failed, there were " + lt.size() + " failures listed above");
} else {
System.out.println("ALL PASS, HOORAY!");
}
}
/**
* The bytes for D, a NOT abstract class extending abstract class C without
* supplying an implementation for abstract method m. There is a default
* method in the interface I, but it should lose to the abstract class.
*
* @return
* @throws Exception
*/
public static byte[] bytesForD() throws Exception {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES
| ClassWriter.COMPUTE_MAXS);
MethodVisitor mv;
cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "D", null, "C", null);
cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "p/D", null, "p/C", null);
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "C", "<init>", "()V");
mv.visitMethodInsn(INVOKESPECIAL, "p/C", "<init>", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
@ -74,70 +151,346 @@ public class TestAMEnotNPE implements Opcodes {
return cw.toByteArray();
}
/**
* The bytecodes for an invokeExact of a particular methodHandle, I.m, invoked on a D
class T {
T() { super(); } // boring constructor
int test() {
MethodHandle mh = `I.m():int`;
D d = new D();
return mh.invokeExact(d); // Should explode here, AbstractMethodError
}
}
* The bytes for D, implements I, does not extend C, declares m()I with
* access method_acc.
*
* @param d_name Name of class defined
* @param method_acc Accessibility of that class's method m.
* @return
* @throws Exception
*/
public static byte[] bytesForT() throws Exception {
public static byte[] bytesForDsomeAccess(String d_name, int method_acc) throws Exception {
return bytesForSomeDsubSomethingSomeAccess(d_name, "java/lang/Object", method_acc);
}
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
/**
* The bytes for D implements I, extends some class, declares m()I as
* private.
*
* Invokeinterface of I.m applied to this D should throw IllegalAccessError
*
* @param sub_what The name of the class that D will extend.
* @return
* @throws Exception
*/
public static byte[] bytesForDprivateSubWhat(String sub_what) throws Exception {
return bytesForSomeDsubSomethingSomeAccess("p/D", sub_what, ACC_PRIVATE);
}
/**
* Returns the bytes for a class with name d_name (presumably "D" in some
* package), extending some class with name sub_what, implementing p.I,
* and defining two methods m() and m(11args) with access method_acc.
*
* @param d_name Name of class that is defined
* @param sub_what Name of class that it extends
* @param method_acc Accessibility of method(s) m in defined class.
* @return
* @throws Exception
*/
public static byte[] bytesForSomeDsubSomethingSomeAccess
(String d_name, String sub_what, int method_acc)
throws Exception {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES
| ClassWriter.COMPUTE_MAXS);
MethodVisitor mv;
String[] interfaces = {"p/I"};
cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "T", null, "java/lang/Object", null);
cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, d_name, null, sub_what, interfaces);
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitMethodInsn(INVOKESPECIAL, sub_what, "<init>", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(0,0);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
// int m() {return 3;}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "test", "()I", null, null);
mv = cw.visitMethod(method_acc, "m", "()I", null, null);
mv.visitCode();
mv.visitLdcInsn(new Handle(Opcodes.H_INVOKEINTERFACE, "I", "m", "()I"));
mv.visitTypeInsn(NEW, "D");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "D", "<init>", "()V");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact", "(LI;)I");
mv.visitLdcInsn(new Integer(3));
mv.visitInsn(IRETURN);
mv.visitMaxs(0,0);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
// int m(11args) {return 3;}
{
mv = cw.visitMethod(method_acc, "m", "(BCSIJ"
+ "Ljava/lang/Object;"
+ "Ljava/lang/Object;"
+ "Ljava/lang/Object;"
+ "Ljava/lang/Object;"
+ "Ljava/lang/Object;"
+ "Ljava/lang/Object;"
+ ")I", null, null);
mv.visitCode();
mv.visitLdcInsn(new Integer(3));
mv.visitInsn(IRETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
public static void main(String args[] ) throws Throwable {
ByteClassLoader bcl = new ByteClassLoader();
Class<?> d = bcl.loadBytes("D", bytesForD());
Class<?> t = bcl.loadBytes("T", bytesForT());
/**
* The bytecodes for a class p/T defining a methods test() and test(11args)
* that contain an invokeExact of a particular methodHandle, I.m.
*
* Test will be passed values that may imperfectly implement I,
* and thus may in turn throw exceptions.
*
* @return
* @throws Exception
*/
public static byte[] bytesForT() throws Exception {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES
| ClassWriter.COMPUTE_MAXS);
MethodVisitor mv;
cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "p/T", null, "java/lang/Object", null);
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
// static int test(I)
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "test", "(Lp/I;)I", null, null);
mv.visitCode();
mv.visitLdcInsn(new Handle(Opcodes.H_INVOKEINTERFACE, "p/I", "m", "()I"));
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle",
"invokeExact", "(Lp/I;)I");
mv.visitInsn(IRETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
// static int test(I,11args)
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "test", "(Lp/I;BCSIJLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)I", null, null);
mv.visitCode();
mv.visitLdcInsn(new Handle(Opcodes.H_INVOKEINTERFACE, "p/I", "m", "(BCSIJLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)I"));
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ILOAD, 1);
mv.visitVarInsn(ILOAD, 2);
mv.visitVarInsn(ILOAD, 3);
mv.visitVarInsn(ILOAD, 4);
mv.visitVarInsn(LLOAD, 5);
mv.visitVarInsn(ALOAD, 7);
mv.visitVarInsn(ALOAD, 8);
mv.visitVarInsn(ALOAD, 9);
mv.visitVarInsn(ALOAD, 10);
mv.visitVarInsn(ALOAD, 11);
mv.visitVarInsn(ALOAD, 12);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle",
"invokeExact", "(Lp/I;BCSIJLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)I");
mv.visitInsn(IRETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
private static void tryAndCheckThrown(
List<Throwable> lt, byte[] dBytes, String what, Class<?> expected, String jar_name)
throws Throwable {
tryAndCheckThrown(lt, "p.D", dBytes, what, expected, jar_name);
}
private static void tryAndCheckThrown(List<Throwable> lt, String d_name, byte[] dBytes, String what, Class<?> expected, String jar_name)
throws Throwable {
System.out.println("Methodhandle invokeExact I.m() for instance of " + what);
ByteClassLoader bcl1 = new ByteClassLoader(jar_name, readJarFiles, writeJarFiles);
try {
Object result = t.getMethod("test").invoke(null);
System.out.println("Expected AbstractMethodError wrapped in InvocationTargetException, saw no exception");
throw new Error("Missing expected exception");
Class<?> d1 = bcl1.loadBytes(d_name, dBytes);
Class<?> t1 = bcl1.loadBytes("p.T", bytesForT());
invokeTest(t1, d1, expected, lt);
} finally {
// Not necessary for others -- all class files are written in this call.
// (unless the VM crashes first).
bcl1.close();
}
System.out.println("Reflection invoke I.m() for instance of " + what);
ByteClassLoader bcl3 = new ByteClassLoader(jar_name, readJarFiles, false);
Class<?> d3 = bcl3.loadBytes(d_name, dBytes);
Class<?> t3 = bcl3.loadClass("p.Treflect");
invokeTest(t3, d3, expected, lt);
System.out.println("Bytecode invokeInterface I.m() for instance of " + what);
ByteClassLoader bcl2 = new ByteClassLoader(jar_name, readJarFiles, false);
Class<?> d2 = bcl2.loadBytes(d_name, dBytes);
Class<?> t2 = bcl2.loadClass("p.Tdirect");
badGoodBadGood(t2, d2, expected, lt);
}
private static void invokeTest(Class<?> t, Class<?> d, Class<?> expected, List<Throwable> lt)
throws Throwable {
try {
Method m = t.getMethod("test", p.I.class);
Object o = d.newInstance();
Object result = m.invoke(null, o);
if (expected != null) {
System.out.println("FAIL, Expected " + expected.getName()
+ " wrapped in InvocationTargetException, but nothing was thrown");
lt.add(new Error("Exception " + expected.getName() + " was not thrown"));
} else {
System.out.println("PASS, saw expected return.");
}
} catch (InvocationTargetException e) {
Throwable th = e.getCause();
if (th instanceof AbstractMethodError) {
th.printStackTrace(System.out);
System.out.println("PASS, saw expected exception (AbstractMethodError, wrapped in InvocationTargetException).");
th.printStackTrace(System.out);
if (expected != null) {
if (expected.isInstance(th)) {
System.out.println("PASS, saw expected exception (" + expected.getName() + ").");
} else {
System.out.println("FAIL, Expected " + expected.getName()
+ " wrapped in InvocationTargetException, saw " + th);
lt.add(th);
}
} else {
System.out.println("Expected AbstractMethodError wrapped in InvocationTargetException, saw " + th);
throw th;
System.out.println("FAIL, expected no exception, saw " + th);
lt.add(th);
}
}
System.out.println();
}
/* Many-arg versions of above */
private static void tryAndCheckThrownMany(List<Throwable> lt, byte[] dBytes, String what, Class<?> expected)
throws Throwable {
System.out.println("Methodhandle invokeExact I.m(11params) for instance of " + what);
ByteClassLoader bcl1 = new ByteClassLoader("p.D", readJarFiles, false);
try {
Class<?> d1 = bcl1.loadBytes("p.D", dBytes);
Class<?> t1 = bcl1.loadBytes("p.T", bytesForT());
invokeTestMany(t1, d1, expected, lt);
} finally {
bcl1.close(); // Not necessary for others -- all class files are written in this call.
}
{
System.out.println("Bytecode invokeInterface I.m(11params) for instance of " + what);
ByteClassLoader bcl2 = new ByteClassLoader("pD_m_pri_imp_pI", readJarFiles, false);
Class<?> d2 = bcl2.loadBytes("p.D", dBytes);
Class<?> t2 = bcl2.loadClass("p.Tdirect");
badGoodBadGoodMany(t2, d2, expected, lt);
}
{
System.out.println("Reflection invokeInterface I.m(11params) for instance of " + what);
ByteClassLoader bcl2 = new ByteClassLoader("pD_m_pri_imp_pI", readJarFiles, false);
Class<?> d2 = bcl2.loadBytes("p.D", dBytes);
Class<?> t2 = bcl2.loadClass("p.Treflect");
invokeTestMany(t2, d2, expected, lt);
}
}
private static void invokeTestMany(Class<?> t, Class<?> d, Class<?> expected, List<Throwable> lt)
throws Throwable {
try {
Method m = t.getMethod("test", p.I.class,
Byte.TYPE, Character.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE,
Object.class, Object.class, Object.class,
Object.class, Object.class, Object.class);
Object o = d.newInstance();
Byte b = 1;
Character c = 2;
Short s = 3;
Integer i = 4;
Long j = 5L;
Object o1 = b;
Object o2 = c;
Object o3 = s;
Object o4 = i;
Object o5 = j;
Object o6 = "6";
Object result = m.invoke(null, o, b, c, s, i, j,
o1, o2, o3, o4, o5, o6);
if (expected != null) {
System.out.println("FAIL, Expected " + expected.getName()
+ " wrapped in InvocationTargetException, but nothing was thrown");
lt.add(new Error("Exception " + expected.getName()
+ " was not thrown"));
} else {
System.out.println("PASS, saw expected return.");
}
} catch (InvocationTargetException e) {
Throwable th = e.getCause();
th.printStackTrace(System.out);
if (expected != null) {
if (expected.isInstance(th)) {
System.out.println("PASS, saw expected exception ("
+ expected.getName() + ").");
} else {
System.out.println("FAIL, Expected " + expected.getName()
+ " wrapped in InvocationTargetException, saw " + th);
lt.add(th);
}
} else {
System.out.println("FAIL, expected no exception, saw " + th);
lt.add(th);
}
}
System.out.println();
}
/**
* This tests a peculiar idiom for tickling the bug on older VMs that lack
* methodhandles. The bug (if not fixed) acts in the following way:
*
* When a broken receiver is passed to the first execution of an invokeinterface
* bytecode, the illegal access is detected before the effects of resolution are
* cached for later use, and so repeated calls with a broken receiver will always
* throw the correct error.
*
* If, however, a good receiver is passed to the invokeinterface, the effects of
* resolution will be successfully cached. A subsequent execution with a broken
* receiver will reuse the cached information, skip the detailed resolution work,
* and instead encounter a null pointer. By convention, that is the encoding for a
* missing abstract method, and an AbstractMethodError is thrown -- not the expected
* IllegalAccessError.
*
* @param t2 Test invocation class
* @param d2 Test receiver class
* @param expected expected exception type
* @param lt list of unexpected throwables seen
*/
private static void badGoodBadGood(Class<?> t2, Class<?> d2, Class<?> expected, List<Throwable> lt)
throws Throwable {
System.out.println(" Error input 1st time");
invokeTest(t2, d2, expected, lt);
System.out.println(" Good input (instance of Dok)");
invokeTest(t2, Dok.class, null, lt);
System.out.println(" Error input 2nd time");
invokeTest(t2, d2, expected, lt);
System.out.println(" Good input (instance of Dok)");
invokeTest(t2, Dok.class, null, lt);
}
private static void badGoodBadGoodMany(Class<?> t2, Class<?> d2, Class<?> expected, List<Throwable> lt)
throws Throwable {
System.out.println(" Error input 1st time");
invokeTestMany(t2, d2, expected, lt);
System.out.println(" Good input (instance of Dok)");
invokeTestMany(t2, Dok.class, null, lt);
System.out.println(" Error input 2nd time");
invokeTestMany(t2, d2, expected, lt);
System.out.println(" Good input (instance of Dok)");
invokeTestMany(t2, Dok.class, null, lt);
}
}

View File

@ -22,12 +22,14 @@
*
*/
package p;
/**
* Test class -- implements I, which provides default for m, but this class
* declares it abstract which (should) hide the interface default, and throw
* an abstract method error if it is called (calling it requires bytecode hacking
* or inconsistent compilation).
* an abstract method error if called.
*
*/
public abstract class C implements I {
public abstract class C implements p.I {
public abstract int m();
}

View File

@ -0,0 +1,31 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package p;
/**
* Test class -- implements I, extends E, both define m, so all should be well.
*/
public class Dok extends p.E {
}

View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package p;
/**
* Test class -- implements I, which provides default for m, but this class
* redeclares it so that all its non-overriding descendants should call its
* method instead (with no error, assuming no descendant monkey business, which
* of course is NOT usually the case in this test).
*
*/
public abstract class E implements p.I {
public int m() {
return 2;
}
}

View File

@ -0,0 +1,41 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package p;
/**
* Test class -- implements I, which provides default for m, but this class
* redeclares it so that all its non-overriding descendants should call its
* method instead (with no error, assuming no descendant monkey business, which
* of course is NOT usually the case in this test).
*
* Note that m is final -- one form of monkey business is attempting to redefine
* m.
*
*/
public abstract class F implements p.I {
final public int m() {
return 2;
}
}

View File

@ -22,6 +22,16 @@
*
*/
package p;
/**
* Test interface I, provides default implementations for m() and m(11args).
*/
public interface I {
default public int m() { return 1; }
default public int m(byte b, char c, short s, int i, long l,
Object o1, Object o2, Object o3, Object o4, Object o5, Object o6) {
return 2;
}
}

View File

@ -0,0 +1,47 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package p;
/**
* Invokes I.m directly using invokeInterface bytecodes.
*/
public class Tdirect {
public static int test(p.I i) {
int accum = 0;
for (int j = 0; j < 100000; j++) {
accum += i.m();
}
return accum;
}
public static int test(p.I ii, byte b, char c, short s, int i, long l,
Object o1, Object o2, Object o3, Object o4, Object o5, Object o6) {
int accum = 0;
for (int j = 0; j < 100000; j++) {
accum += ii.m(b,c,s,i,l,o1,o2,o3,o4,o5,o6);
}
return accum;
}
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package p;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Invokes I.m using reflection.
*/
public class Treflect {
public static int test(p.I ii) throws Throwable {
int accum = 0;
Method m = p.I.class.getMethod("m");
try {
for (int j = 0; j < 100000; j++) {
Object o = m.invoke(ii);
accum += ((Integer) o).intValue();
}
} catch (InvocationTargetException ite) {
throw ite.getCause();
}
return accum;
}
public static int test(p.I ii, byte b, char c, short s, int i, long l,
Object o1, Object o2, Object o3, Object o4, Object o5, Object o6)
throws Throwable {
Method m = p.I.class.getMethod("m", Byte.TYPE, Character.TYPE,
Short.TYPE, Integer.TYPE, Long.TYPE,
Object.class, Object.class, Object.class,
Object.class, Object.class, Object.class);
int accum = 0;
try {
for (int j = 0; j < 100000; j++) {
Object o = m.invoke(ii, b, c, s, i, l, o1, o2, o3, o4, o5, o6);
accum += ((Integer) o).intValue();
}
} catch (InvocationTargetException ite) {
throw ite.getCause();
}
return accum;
}
}

View File

@ -21,7 +21,8 @@
# questions.
#
# @ignore 8028733
# @test @(#)Test6626217.sh
# @bug 6626217
# @summary Loader-constraint table allows arrays instead of only the base-classes

View File

@ -1,6 +1,7 @@
#!/bin/sh
##
## @ignore 8028740
## @test Test6929067.sh
## @bug 6929067
## @bug 8021296

View File

@ -22,6 +22,7 @@
*/
/*
* @ignore 8026154
* @test
* @bug 8005933
* @summary Test that -Xshare:auto uses CDS when explicitly specified with -server.

View File

@ -21,6 +21,7 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
# @ignore 8029139
# @test testme.sh
# @bug 8009062
# @summary Poor performance of JNI AttachCurrentThread after fix for 7017193

View File

@ -22,6 +22,7 @@
*/
/*
* @ignore 8028095
* @test
* @key regression
* @bug 8020675

View File

@ -22,6 +22,7 @@
*/
/*
* @ignore 8023735
* @test
* @bug 7051189 8023393
* @summary Need to suppress info message if -Xcheck:jni is used with libjsig.so

View File

@ -24,6 +24,7 @@
#
##
## @ignore 8028806
## @test Test8017498.sh
## @bug 8017498
## @bug 8020791

View File

@ -22,6 +22,7 @@
*/
/*
* @ignore 8028398
* @test
* @summary Test that touching noaccess area in class ReservedHeapSpace results in SIGSEGV/ACCESS_VIOLATION
* @library /testlibrary /testlibrary/whitebox

View File

@ -239,3 +239,4 @@ f26a0c8071bde1e3b923713c75156e4a58955623 jdk8-b114
f82b730c798b6bf38946baaba8a7d80fd5efaa70 jdk8-b115
0dc0067f3b8efb299a4c23f76ee26ea64df9e1d7 jdk8-b116
fc4ac66aa657e09de5f8257c3174f240ed0cbaf7 jdk8-b117
28ca338366ff2774ac9002f9f6eaff4101a3ea3b jdk8-b118

View File

@ -118,7 +118,7 @@ define SetupDemo
COPY := $(PATTERNS_TO_COPY) $(10), \
JAR := $(JDK_OUTPUTDIR)/demo/$2/$1/$$($1_JARFILE), \
JARMAIN := $4, \
MANIFEST := $(JDK_TOPDIR)/make/tools/manifest.mf, \
MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
EXTRA_MANIFEST_ATTR := $(11), \
SRCZIP := $(JDK_OUTPUTDIR)/demo/$2/$1/src.zip, \
EXCLUDE_FILES := $9, \
@ -284,7 +284,7 @@ define SetupJVMTIDemo
COPY := $(PATTERNS_TO_COPY), \
JAR := $(JDK_OUTPUTDIR)/demo/jvmti/$1/$1.jar, \
EXTRA_MANIFEST_ATTR := Main-Class: \n, \
MANIFEST := $(JDK_TOPDIR)/make/tools/manifest.mf))
MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf))
BUILD_DEMOS += $(JDK_OUTPUTDIR)/demo/jvmti/$1/$1.jar
endif
@ -337,7 +337,7 @@ $(JDK_OUTPUTDIR)/demo/jpda/examples.jar: $(JPDA_SOURCES)
$(RM) $(@D)/_the.sources
$(call ListPathsSafely,JPDA_FILES,\n, >> $(@D)/_the.sources)
$(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \
-e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $(JDK_TOPDIR)/make/tools/manifest.mf > $(@D)/_the.manifest
-e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf > $(@D)/_the.manifest
$(ECHO) "Main-Class: " >> $(@D)/_the.manifest
(cd $(JDK_TOPDIR)/src/share/classes && $(JAR) cfm $@ $(@D)/_the.manifest @$(@D)/_the.sources)
(cd $(JDK_TOPDIR)/src/share/classes/com/sun/tools/example && $(JAR) uf $@ README)
@ -401,7 +401,7 @@ ifeq ($(OPENJDK_TARGET_OS), solaris)
BIN := $(JDK_OUTPUTDIR)/democlasses/jni/Poller, \
HEADERS := $(JDK_OUTPUTDIR)/democlasses/jni/Poller, \
JAR := $(JDK_OUTPUTDIR)/demo/jni/Poller/Poller.jar, \
MANIFEST := $(JDK_TOPDIR)/make/tools/manifest.mf, \
MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
SRCZIP := $(JDK_OUTPUTDIR)/demo/jni/Poller/src.zip, \
COPY := README.txt Poller.c, \
JARMAIN := Client))

View File

@ -297,7 +297,7 @@ SECURITY_PKGS := \
# The exception handling of swing beaninfo
# These resources violates the convention of having code and resources together under
# $(JDK_TOPDIR)/src/.../classes directories
$(JDK_OUTPUTDIR)/classes/javax/swing/beaninfo/images/%.gif: $(JDK_TOPDIR)/make/tools/swing-beans/beaninfo/images/%.gif
$(JDK_OUTPUTDIR)/classes/javax/swing/beaninfo/images/%.gif: $(JDK_TOPDIR)/make/data/swingbeaninfo/images/%.gif
$(call install-file)
# The JDK_USER_DEFINED_FILTER is a poor man's incremental build: by specifying

View File

@ -126,8 +126,8 @@ define SetupLauncher
$1_CFLAGS := $(filter-out -MD, $(CFLAGS_JDKEXE))
endif
ifneq ($(wildcard $(JDK_TOPDIR)/makefiles/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)), )
$1_MAPFILE := $(JDK_TOPDIR)/makefiles/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)
ifneq ($(wildcard $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)), )
$1_MAPFILE := $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)
else
$1_MAPFILE :=
endif
@ -385,7 +385,7 @@ $(eval $(call SetupLauncher,tnameserv, \
"com.sun.corba.se.impl.naming.cosnaming.TransientNameServer"$(COMMA) }'))
$(eval $(call SetupLauncher,pack200, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.java.util.jar.pack.Driver"$(COMMA) "--pack" }'))
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.java.util.jar.pack.Driver"$(COMMA) }'))
$(eval $(call SetupLauncher,rmid, \
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.rmi.server.Activation"$(COMMA) }'))
@ -457,7 +457,7 @@ $(eval $(call SetupNativeCompilation,BUILD_UNPACKEXE, \
CFLAGS_linux := -fPIC, \
CFLAGS_solaris := -KPIC, \
CFLAGS_macosx := -fPIC, \
MAPFILE := $(JDK_TOPDIR)/makefiles/mapfiles/libunpack/mapfile-vers-unpack200, \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libunpack/mapfile-vers-unpack200, \
LDFLAGS := $(UNPACKEXE_ZIPOBJS), \
LDFLAGS_windows := $(CXXFLAGS_JDKEXE), \
LDFLAGS_posix := $(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \
@ -586,7 +586,7 @@ endif
# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6512052
ifeq ($(OPENJDK_TARGET_OS), windows)
$(eval $(call SetupLauncher,java-rmi, , \
$(call SET_SHARED_LIBRARY_MAPFILE,$(JDK_TOPDIR)/makefiles/java/main/java/mapfile-$(OPENJDK_TARGET_CPU))))
$(call SET_SHARED_LIBRARY_MAPFILE,$(JDK_TOPDIR)/make/java/main/java/mapfile-$(OPENJDK_TARGET_CPU))))
else
$(JAVA_RMI_CGI): $(JDK_TOPDIR)/src/solaris/bin/java-rmi.cgi.sh
$(call install-file)
@ -661,7 +661,7 @@ endif
##########################################################################################
$(BUILD_LAUNCHERS): $(JDK_TOPDIR)/makefiles/CompileLaunchers.gmk
$(BUILD_LAUNCHERS): $(JDK_TOPDIR)/make/CompileLaunchers.gmk
all: $(BUILD_LAUNCHERS)

View File

@ -140,7 +140,7 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
endif
# END: Swing plaf resources
SWING_BEANINFO_RESOURCES_SRC_DIR = $(JDK_TOPDIR)/make/tools/swing-beans/beaninfo/images
SWING_BEANINFO_RESOURCES_SRC_DIR = $(JDK_TOPDIR)/make/data/swingbeaninfo/images
SWING_BEANINFO_RESOURCES_SRC = $(wildcard $(SWING_BEANINFO_RESOURCES_SRC_DIR)/*.gif)
OUT_BEANINFO_RESOURCES = $(patsubst $(SWING_BEANINFO_RESOURCES_SRC_DIR)%, \
$(JDK_OUTPUTDIR)/classes/javax/swing/beaninfo/images/%, \

View File

@ -40,13 +40,13 @@ include Profiles.gmk
#
# This makefile...so that altering will trigger rebuilding include/exclude-lists => jars
#
MAKEFILE = $(JDK_TOPDIR)/makefiles/CreateJars.gmk
MAKEFILE = $(JDK_TOPDIR)/make/CreateJars.gmk
#
# And similarly for the Profiles
PROFILE_MAKEFILES = $(JDK_TOPDIR)/makefiles/Profiles.gmk $(JDK_TOPDIR)/makefiles/profile-rtjar-includes.txt
PROFILE_MAKEFILES = $(JDK_TOPDIR)/make/Profiles.gmk $(JDK_TOPDIR)/make/profile-rtjar-includes.txt
MAINMANIFEST := $(JDK_TOPDIR)/make/tools/manifest.mf
BEANMANIFEST := $(JDK_TOPDIR)/make/javax/swing/beaninfo/manifest
MAINMANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf
BEANMANIFEST := $(JDK_TOPDIR)/make/data/swingbeaninfo/manifest.mf
$(eval $(call MakeDir, $(IMAGES_OUTPUTDIR)/lib))
@ -246,7 +246,7 @@ $(IMAGES_OUTPUTDIR)/lib$(PROFILE)/_the.jars.exclude: $(MAKEFILE) $(PROFILE_MAKEF
$(call ListPathsSafely,RT_JAR_EXCLUDES,\n, >> $@.tmp)
$(MV) $@.tmp $@
$(IMAGES_OUTPUTDIR)/lib/classlist: $(JDK_TOPDIR)/make/tools/sharing/classlist.$(OPENJDK_TARGET_OS) \
$(IMAGES_OUTPUTDIR)/lib/classlist: $(JDK_TOPDIR)/make/data/classlist/classlist.$(OPENJDK_TARGET_OS) \
$(MAKEFILE)
$(MKDIR) -p $(@D)
$(RM) $@ $@.tmp
@ -518,8 +518,8 @@ $(eval $(call SetupArchive,BUILD_TOOLS_JAR, , \
##########################################################################################
include javadoc/CORE_PKGS.gmk
include javadoc/NON_CORE_PKGS.gmk
include CORE_PKGS.gmk
include NON_CORE_PKGS.gmk
# The compiler should not issue a "Proprietary" warning when compiling
# classes in the com.sun.java.swing.plaf packages, since we've always

View File

@ -38,7 +38,7 @@ include Setup.gmk
#
# Include these extra attributes for now, should probably take out.
#
MAINMANIFEST := $(JDK_TOPDIR)/make/tools/manifest.mf
MAINMANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf
JCE_MANIFEST := $(JDK_OUTPUTDIR)/lib/_the.security.manifest.mf
$(JCE_MANIFEST): $(MAINMANIFEST)
@ -189,7 +189,7 @@ ifneq ($(BUILD_CRYPTO), no)
# NOTE: We currently do not place restrictions on our limited export
# policy. This was not a typo.
#
US_EXPORT_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/javax/crypto/policy/unlimited
US_EXPORT_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited
US_EXPORT_POLICY_JAR_TMP := $(JDK_OUTPUTDIR)/US_export_policy_jar.tmp
$(US_EXPORT_POLICY_JAR_TMP)/%: $(US_EXPORT_POLICY_JAR_SRC_DIR)/%
@ -231,11 +231,11 @@ ifneq ($(BUILD_CRYPTO), no)
LOCAL_POLICY_JAR_TMP := $(JDK_OUTPUTDIR)/local_policy_jar.tmp
ifeq ($(UNLIMITED_CRYPTO), true)
LOCAL_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/javax/crypto/policy/unlimited
LOCAL_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited
LOCAL_POLICY_JAR_DEPS := $(LOCAL_POLICY_JAR_TMP)/default_local.policy
LOCAL_POLICY_JAR_ATTR := Crypto-Strength: unlimited
else
LOCAL_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/javax/crypto/policy/limited
LOCAL_POLICY_JAR_SRC_DIR := $(JDK_TOPDIR)/make/data/cryptopolicy/limited
LOCAL_POLICY_JAR_DEPS := $(LOCAL_POLICY_JAR_TMP)/exempt_local.policy \
$(LOCAL_POLICY_JAR_TMP)/default_local.policy
LOCAL_POLICY_JAR_ATTR := Crypto-Strength: limited

View File

@ -54,7 +54,7 @@ GENDATA += $(GENDATA_HTML32DTD)
GENDATA_UNINAME := $(JDK_OUTPUTDIR)/classes/java/lang/uniName.dat
$(GENDATA_UNINAME): $(JDK_TOPDIR)/make/tools/UnicodeData/UnicodeData.txt $(BUILD_TOOLS)
$(GENDATA_UNINAME): $(JDK_TOPDIR)/make/data/unicodedata/UnicodeData.txt $(BUILD_TOOLS)
$(MKDIR) -p $(@D)
$(TOOL_CHARACTERNAME) $< $@

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -23,369 +23,27 @@
# questions.
#
#
# Makefile for building and packaging all of the JDK and the JRE. See
# also included files.
#
BUILDDIR=.
include $(BUILDDIR)/common/Defs.gmk
#
# Make sure we are clear what the default target is
#
default_target: all
#
# Check target
#
check: variable_check
#
# Help target
#
help: intro_help target_help variable_help notes_help examples_help
# Intro help message
intro_help:
@$(ECHO) "\
Makefile for the main JDK workspace. \n\
Default behavior is to use the BOOTDIR javac to bootstrap the build and \n\
import in pre-built components like the VM from the JDK_IMPORT_PATH. \n\
"
# Target help
target_help:
@$(ECHO) "\
--- Common Targets --- \n\
all -- build the core JDK (default target) \n\
help -- Print out help information \n\
check -- Check make variable values for correctness \n\
sanity -- Perform detailed sanity checks on system and settings \n\
openjdk -- synonym for 'OPENJDK=true all' \n\
fastdebug -- build the core JDK in 'fastdebug' mode (-g -O) \n\
debug -- build the core JDK in 'debug' mode (-g) \n\
clean -- remove all built and imported files \n\
clobber -- same as clean \n\
docs -- run javadoc to generate the JDK documentation \n\
images -- build the jdk and jre image directories \n\
import -- copy in the pre-built components (e.g. VM) \n\
import_product -- copy in the product components \n\
import_fastdebug -- copy in the fastdebug components \n\
import_debug -- copy in the debug components \n\
create_links -- create softlinks in Solaris 32bit build to 64bit dirs \n\
"
# Variable help (only common ones used by this workspace)
variable_help: variable_help_intro variable_list variable_help_end
variable_help_intro:
@$(ECHO) "--- Common Variables ---"
variable_help_end:
@$(ECHO) " "
# One line descriptions for the variables
OUTPUTDIR.desc = Output directory
PARALLEL_COMPILE_JOBS.desc = Solaris/Linux parallel compile run count
SLASH_JAVA.desc = Root of all build tools, e.g. /java or J:
BOOTDIR.desc = JDK used to boot the build
LANGTOOLS_DIST.desc = langtools dist area used to build
CORBA_DIST.desc = corba dist area
JAXP_DIST.desc = jaxp dist area
JAXWS_DIST.desc = jaxws dist area
JDK_IMPORT_PATH.desc = JDK used to import components of the build
COMPILER_PATH.desc = Compiler install directory
CACERTS_FILE.desc = Location of certificates file
DEVTOOLS_PATH.desc = Directory containing zip and unzip
CUPS_HEADERS_PATH.desc = Include directory location for CUPS header files
# Make variables to print out (description and value)
VARIABLE_PRINTVAL_LIST += \
OUTPUTDIR \
PARALLEL_COMPILE_JOBS \
SLASH_JAVA \
BOOTDIR \
LANGTOOLS_DIST \
JAXWS_DIST \
CORBA_DIST \
JAXP_DIST \
JDK_IMPORT_PATH \
COMPILER_PATH \
CACERTS_FILE \
DEVTOOLS_PATH
# Make variables that should refer to directories that exist
VARIABLE_CHECKDIR_LIST += \
SLASH_JAVA \
BOOTDIR \
JDK_IMPORT_PATH \
COMPILER_PATH \
DEVTOOLS_PATH
# Make variables that should refer to files that exist
VARIABLE_CHECKFIL_LIST += \
CACERTS_FILE
# For pattern rules below, so all are treated the same
DO_PRINTVAL_LIST=$(VARIABLE_PRINTVAL_LIST:%=%.printval)
DO_CHECKDIR_LIST=$(VARIABLE_CHECKDIR_LIST:%=%.checkdir)
DO_CHECKFIL_LIST=$(VARIABLE_CHECKFIL_LIST:%=%.checkfil)
# Complete variable check
variable_check: $(DO_CHECKDIR_LIST) $(DO_CHECKFIL_LIST)
variable_list: $(DO_PRINTVAL_LIST) variable_check
# Pattern rule for printing out a variable
%.printval:
@$(ECHO) " ALT_$* - $($*.desc)"
@$(ECHO) " \t $*=$($*)"
# Pattern rule for checking to see if a variable with a directory exists
%.checkdir:
@if [ ! -d $($*) ] ; then \
$(ECHO) "WARNING: $* does not exist, try $(MAKE) sanity"; \
fi
# Pattern rule for checking to see if a variable with a file exists
%.checkfil:
@if [ ! -f $($*) ] ; then \
$(ECHO) "WARNING: $* does not exist, try $(MAKE) sanity"; \
fi
# Misc notes on help
notes_help:
@$(ECHO) "\
--- Notes --- \n\
- All builds use same output directory unless overridden with \n\
\t ALT_OUTPUTDIR=<dir>, changing from product to fastdebug you may want \n\
\t to use the clean target first. \n\
- LANGTOOLS_DIST must refer to a langtools dist area, used to build. \n\
- CORBA_DIST must refer to a corba dist area. \n\
- JAXP_DIST must refer to a jaxp dist area. \n\
- JAXWS_DIST must refer to a jaxws dist area. \n\
- JDK_IMPORT_PATH must refer to a compatible build, not all past promoted \n\
\t builds or previous release JDK builds will work. \n\
- The 'debug' target and 'import_debug' only works when a debug promoted \n\
\t build is available, and they currently are not. \n\
- The fastest builds have been when the workspace and the BOOTDIR are on \n\
\t local disk. \n\
"
examples_help:
@$(ECHO) "\
--- Examples --- \n\
$(MAKE) fastdebug \n\
$(MAKE) ALT_OUTPUTDIR=/tmp/foobar all \n\
$(MAKE) ALT_OUTPUTDIR=/tmp/foobar fastdebug images \n\
$(MAKE) ALT_OUTPUTDIR=/tmp/foobar all docs images \n\
$(MAKE) ALT_BOOTDIR=/opt/java/jdk1.6.0 \n\
$(MAKE) ALT_JDK_IMPORT_PATH=/opt/java/jdk1.7.0 \n\
"
#
# 'all' target intro
#
all::
@$(ECHO) $(PLATFORM) $(ARCH) $(RELEASE) build started: $(shell $(DATE) '+%y-%m-%d %H:%M')
# Just in case anyone uses this old name, same as 'build'
optimized: build
openjdk:
$(MAKE) OPENJDK=true all
#
# Special debug rules (You may also want to set ALT_OUTPUTDIR)
#
debug:
$(MAKE) VARIANT=DBG all
fastdebug:
$(MAKE) VARIANT=DBG FASTDEBUG=true all
#
# Rules to re-import VM and other JDK files
#
import:
$(CD) java/redist; $(MAKE) clean all
import_fastdebug:
$(MAKE) VARIANT=DBG FASTDEBUG=true import
import_product:
$(MAKE) VARIANT=OPT FASTDEBUG=false import
#
# Core.
#
all build:: sanity-all post-sanity-all
SUBDIRS = tools java javax sun com jdk
ifeq ($(PLATFORM), macosx)
SUBDIRS += apple
endif
ifeq ($(PLATFORM), windows)
SUBDIRS += bridge
endif
SUBDIRS_tools = launchers
SUBDIRS_misc = org jpda
# demos
ifndef NO_DEMOS
SUBDIRS_misc += mkdemo
endif
# samples
ifndef NO_SAMPLES
SUBDIRS_misc += mksample
endif
# Alternate classes implementation
ifndef OPENJDK
SUBDIRS_misc += altclasses
endif
include $(BUILDDIR)/common/Subdirs.gmk
all build::
$(SUBDIRS-loop)
clean clobber::
$(RM) -r $(OUTPUTDIR)
#
# Docs
#
OTHERSUBDIRS = docs
docs:: sanity-docs post-sanity-docs
$(OTHERSUBDIRS-loop)
#
# Release engineering targets.
#
include $(BUILDDIR)/common/Release.gmk
-include $(CUSTOM_MAKE_DIR)/Release.gmk
#
# Cscope targets.
#
include $(BUILDDIR)/common/Cscope.gmk
#
# Sanity checks.
#
include $(BUILDDIR)/common/Sanity.gmk
$(OUTPUTDIR) $(TEMPDIR):
$(MKDIR) -p $@
# this should be the last rule in this file:
all::
@if [ -r $(WARNING_FILE) ]; then \
$(CAT) $(WARNING_FILE) ; \
fi
@$(ECHO) $(PLATFORM) $(ARCH) $(RELEASE) build finished: $(shell $(DATE) '+%y-%m-%d %H:%M')
#
# Developer rule that links 32 and 64 bit builds on Solaris by creating
# softlinks in the 32bit outputdir to the 64bit outputdir.
#
ifeq ($(PLATFORM), solaris)
ifeq ($(ARCH_FAMILY), sparc)
ARCH32 = sparc
ARCH64 = sparcv9
else
ARCH32 = i586
ARCH64 = amd64
endif
OUTPUTDIR32 = $(ABS_OUTPUTDIR)/../$(PLATFORM)-$(ARCH32)
OUTPUTDIR64 = $(ABS_OUTPUTDIR)/../$(PLATFORM)-$(ARCH64)
endif
create_links:
ifeq ($(PLATFORM), solaris)
@if [ -d $(OUTPUTDIR32) -a -d $(OUTPUTDIR64) ] ; then \
dirlist=`($(CD) $(OUTPUTDIR64); $(FIND) . -name $(ARCH64))`; \
for sd in $$dirlist ; do \
pdir=`$(DIRNAME) $$sd`; \
if [ -d $(OUTPUTDIR32)/$$pdir ] ; then \
echo "Creating link for $$sd"; \
(cd $(OUTPUTDIR32)/$$pdir; $(RM) $(ARCH64); \
$(LN) -s $(OUTPUTDIR64)/$$sd ); \
fi; \
done; \
else \
$(ECHO) "Build both 32 and 64 bit versions first"; \
fi
# Locate this Makefile
ifeq ($(filter /%, $(lastword $(MAKEFILE_LIST))), )
makefile_path := $(CURDIR)/$(lastword $(MAKEFILE_LIST))
else
$(ECHO) "Rule $@ does not apply on $(PLATFORM)-$(ARCH)"
makefile_path := $(lastword $(MAKEFILE_LIST))
endif
repo_dir := $(patsubst %/make/Makefile, %, $(makefile_path))
# What is the name of this subsystem (langtools, corba, etc)?
subsystem_name := $(notdir $(repo_dir))
# Try to locate top-level makefile
top_level_makefile := $(repo_dir)/../Makefile
ifneq ($(wildcard $(top_level_makefile)), )
$(info Will run $(subsystem_name) target on top-level Makefile)
$(info WARNING: This is a non-recommended way of building!)
$(info ===================================================)
else
$(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?)
$(error Build from top-level Makefile instead)
endif
#
# Test rule
#
.NOTPARALLEL: test_run
test:
$(MAKE) test_run
test_run: test_clean test_start test_summary
test_start:
@$(ECHO) "Tests started at `$(DATE)`"
test_clean:
$(RM) $(OUTPUTDIR)/test_failures.txt $(OUTPUTDIR)/test_log.txt
test_summary: $(OUTPUTDIR)/test_failures.txt
@$(ECHO) "#################################################"
@$(ECHO) "Tests completed at `$(DATE)`"
@( $(EGREP) '^TEST STATS:' $(OUTPUTDIR)/test_log.txt \
|| $(ECHO) "No TEST STATS seen in log" )
@$(ECHO) "For complete details see: $(OUTPUTDIR)/test_log.txt"
@$(ECHO) "#################################################"
@if [ -s $< ] ; then \
$(ECHO) "ERROR: Test failure count: `$(CAT) $< | $(WC) -l`"; \
$(CAT) $<; \
exit 1; \
else \
$(ECHO) "Success! No failures detected"; \
fi
# Get failure list from log
$(OUTPUTDIR)/test_failures.txt: $(OUTPUTDIR)/test_log.txt
@$(RM) $@
@( $(EGREP) '^FAILED:' $< || $(ECHO) "" ) | $(NAWK) 'length>0' > $@
# Get log file of all tests run
JDK_TO_TEST := $(shell \
if [ -d "$(ABS_OUTPUTDIR)/j2sdk-image" ] ; then \
$(ECHO) "$(ABS_OUTPUTDIR)/j2sdk-image"; \
elif [ -d "$(ABS_OUTPUTDIR)/bin" ] ; then \
$(ECHO) "$(ABS_OUTPUTDIR)"; \
elif [ "$(PRODUCT_HOME)" != "" -a -d "$(PRODUCT_HOME)/bin" ] ; then \
$(ECHO) "$(PRODUCT_HOME)"; \
fi \
)
TEST_TARGETS=jdk_all
$(OUTPUTDIR)/test_log.txt:
$(RM) $@
( $(CD) ../test && \
$(MAKE) NO_STOPPING=- PRODUCT_HOME=$(JDK_TO_TEST) $(TEST_TARGETS) \
) | tee $@
#
# JPRT rules
#
include jprt.gmk
#
# Phonies to avoid accidents.
#
.PHONY: all build clean clobber optimized debug fastdebug create_links \
import import_product import_fastdebug import_debug \
test test_run test_start test_clean test_summary
all:
@$(MAKE) -f $(top_level_makefile) $(subsystem_name)

View File

@ -1,31 +0,0 @@
BUILD,RUNTIME 5.8 Sparc 109147-24 x86 109148-24 REQ "Linker patch"
BUILD,RUNTIME 5.8 Sparc 108652-66 x86 108653-55 REQ "Xserver patch"
BUILD,RUNTIME 5.8 Sparc 108940-52 x86 108941-52 REQ "Motif 2.1 patch"
BUILD,RUNTIME 5.8 Sparc 108989-02 x86 108990-02 REQ "Accounting patch"
BUILD,RUNTIME 5.8 Sparc none x86 111307-04 REQ "boot.bin, bootconf.exe, bootenv.rc and nbp patch"
BUILD,RUNTIME 5.8 Sparc 111310-01 x86 111311-01 REQ "libhcpagent.so.l patch"
BUILD,RUNTIME 5.8 Sparc 112396-02 x86 112397-02 REQ "fgrep patch"
BUILD,RUNTIME 5.8 Sparc 108987-13 x86 108988-13 REQ "patchadd, patchrm patch"
BUILD,RUNTIME 5.8 Sparc 111111-03 x86 111112-03 REQ "nawk patch"
BUILD,RUNTIME 5.8 Sparc 108528-20 x86 108529-20 REQ "Kernel update"
BUILD,RUNTIME 5.8 Sparc 108993-18 x86 none REQ "LDAP2 Patch"
BUILD,RUNTIME 5.8 Sparc none x86 110400-01 REQ "RBAC Feature patch"
BUILD,RUNTIME 5.8 Sparc none x86 111024-02 REQ "/kernel/fs/mntfs patch"
BUILD,RUNTIME 5.8 Sparc none x86 108994-18 REQ "LDAP2 patch"
BUILD,RUNTIME 5.8 Sparc 109147-23 x86 109148-23 REQ "linker patch"
BUILD,RUNTIME 5.8 Sparc 111308-03 x86 111309-03 REQ "Performance for apps using memory alloc"
RUNTIME 5.8 Sparc 112003-03 x86 none REQ "Fontset patch for sparcv9"
RUNTIME 5.8 Sparc 108921-16 x86 108922-16 REQ "CDE patch"
RUNTIME 5.8 Sparc 108773-18 x86 108774-18 REQ "X input method patch"
RUNTIME 5.8 Sparc 110386-03 x86 none REQ "RBAC Feature Patch"
RUNTIME 5.8 Sparc 111023-02 x86 none REQ "/kernel/fs/mntfs and /kernel/fs/sparcv9/mntfs patch"
RUNTIME 5.8 Sparc 112472-01 x86 112473-01 OPT "Font2DTest2 patch"
RUNTIME 5.8 Sparc 112438-01 x86 112439-01 REQ "/kernel/drv/random patch"
COMPILER 5.8 Sparc 109505-06 x86 109502-03 REQ "For C 5.0, C++ 5.0"
COMPILER 5.8 Sparc 109513-05 x86 109514-03 REQ "For Forte Development 6 C compiler"
COMPILER 5.8 Sparc 109508-03 x86 109509-03 REQ "For Forte Development 6 update 1 C++ compiler"
COMPILER 5.8 Sparc 109510-03 x86 109511-03 REQ "For Forte 6.1 Debugger"
COMPILER 5.8 Sparc 109516-02 x86 109517-02 REQ "For Forte 6.1 Performance Analyzer"
COMPILER 5.8 Sparc 110480-01 x86 110481-01 REQ "For Forte TeamWare"

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