Merge
This commit is contained in:
commit
6c2dcf473c
@ -194,3 +194,4 @@ cdb401a60cea6ad5ef3f498725ed1decf8dda1ea jdk8-b68
|
|||||||
105a25ffa4a4f0af70188d4371b4a0385009b7ce jdk8-b70
|
105a25ffa4a4f0af70188d4371b4a0385009b7ce jdk8-b70
|
||||||
51ad2a34342055333eb5f36e2fb514b027895708 jdk8-b71
|
51ad2a34342055333eb5f36e2fb514b027895708 jdk8-b71
|
||||||
c1be681d80a1f1c848dc671d664fccb19e046a12 jdk8-b72
|
c1be681d80a1f1c848dc671d664fccb19e046a12 jdk8-b72
|
||||||
|
93b9664f97eeb6f89397a8842318ebacaac9feb9 jdk8-b73
|
||||||
|
5
Makefile
5
Makefile
@ -26,6 +26,11 @@
|
|||||||
# If NEWBUILD is defined, use the new build-infra Makefiles and configure.
|
# If NEWBUILD is defined, use the new build-infra Makefiles and configure.
|
||||||
# See NewMakefile.gmk for more information.
|
# See NewMakefile.gmk for more information.
|
||||||
|
|
||||||
|
# If not specified, select what the default build is
|
||||||
|
ifndef NEWBUILD
|
||||||
|
NEWBUILD=true
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(NEWBUILD),true)
|
ifeq ($(NEWBUILD),true)
|
||||||
|
|
||||||
# The new top level Makefile
|
# The new top level Makefile
|
||||||
|
350
NewMakefile.gmk
350
NewMakefile.gmk
@ -23,273 +23,109 @@
|
|||||||
# questions.
|
# questions.
|
||||||
#
|
#
|
||||||
|
|
||||||
# Utilities used in this Makefile
|
# This must be the first rule
|
||||||
BASENAME=basename
|
default:
|
||||||
CAT=cat
|
|
||||||
CD=cd
|
# Inclusion of this pseudo-target will cause make to execute this file
|
||||||
CMP=cmp
|
# serially, regardless of -j. Recursively called makefiles will not be
|
||||||
CP=cp
|
# affected, however. This is required for correct dependency management.
|
||||||
ECHO=echo
|
.NOTPARALLEL:
|
||||||
MKDIR=mkdir
|
|
||||||
PRINTF=printf
|
# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make.
|
||||||
PWD=pwd
|
# /usr/ccs/bin/make lacks basically every other flow control mechanism.
|
||||||
TAR=tar
|
TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1
|
||||||
ifeq ($(PLATFORM),windows)
|
|
||||||
ZIP=zip
|
# Assume we have GNU make, but check version.
|
||||||
|
ifeq (,$(findstring 3.81,$(MAKE_VERSION)))
|
||||||
|
ifeq (,$(findstring 3.82,$(MAKE_VERSION)))
|
||||||
|
$(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Locate this Makefile
|
||||||
|
ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
|
||||||
|
makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST))
|
||||||
else
|
else
|
||||||
# store symbolic links as the link
|
makefile_path:=$(lastword $(MAKEFILE_LIST))
|
||||||
ZIP=zip -y
|
|
||||||
endif
|
endif
|
||||||
# Insure we have a path that looks like it came from pwd
|
root_dir:=$(dir $(makefile_path))
|
||||||
# (This is mostly for Windows sake and drive letters)
|
|
||||||
define UnixPath # path
|
|
||||||
$(shell (cd "$1" && $(PWD)))
|
|
||||||
endef
|
|
||||||
|
|
||||||
# Current root directory
|
# ... and then we can include our helper functions
|
||||||
CURRENT_DIRECTORY := $(shell $(PWD))
|
include $(root_dir)/common/makefiles/MakeHelpers.gmk
|
||||||
|
|
||||||
# Build directory root
|
$(eval $(call ParseLogLevel))
|
||||||
BUILD_DIR_ROOT = $(CURRENT_DIRECTORY)/build
|
$(eval $(call ParseConfAndSpec))
|
||||||
|
|
||||||
# All configured Makefiles to run
|
# Now determine if we have zero, one or several configurations to build.
|
||||||
ALL_MAKEFILES = $(wildcard $(BUILD_DIR_ROOT)/*-*/Makefile)
|
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 arbitraty 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), $(strip $(shell \
|
||||||
|
$(MAKE) -p -q -f common/makefiles SPEC=$(firstword $(SPEC)) | \
|
||||||
|
grep ^.PHONY: | head -n 1 | cut -d " " -f 2-)))
|
||||||
|
|
||||||
# All bundles to create
|
$(all_phony_targets):
|
||||||
ALL_IMAGE_DIRS = $(wildcard $(BUILD_DIR_ROOT)/*-*/images/*-image)
|
@$(foreach spec,$(SPEC),($(MAKE) -f NewMakefile.gmk SPEC=$(spec) $(VERBOSE) VERBOSE=$(VERBOSE) $@) &&) true
|
||||||
|
|
||||||
# Build all the standard 'all', 'images', and 'clean' targets
|
endif
|
||||||
all images clean: checks
|
|
||||||
@if [ "$(ALL_MAKEFILES)" = "" ] ; then \
|
|
||||||
$(ECHO) "ERROR: No configurations to build"; exit 1; \
|
|
||||||
fi
|
|
||||||
@for bdir in $(dir $(ALL_MAKEFILES)) ; do \
|
|
||||||
$(ECHO) "$(CD) $${bdir} && $(MAKE) $@" ; \
|
|
||||||
$(CD) $${bdir} && $(MAKE) $@ ; \
|
|
||||||
done
|
|
||||||
|
|
||||||
# TBD: Deploy input
|
|
||||||
$(BUILD_DIR_ROOT)/.deploy_input:
|
|
||||||
@if [ "$(ALL_MAKEFILES)" = "" ] ; then \
|
|
||||||
$(ECHO) "ERROR: No configurations to build"; exit 1; \
|
|
||||||
fi
|
|
||||||
@for bdir in $(dir $(ALL_MAKEFILES)) ; do \
|
|
||||||
if [ deploy/make/Makefile ] ; then \
|
|
||||||
echo "Attempting deploy build." ; \
|
|
||||||
( \
|
|
||||||
$(RM) -r $${bdir}/deploy_input ; \
|
|
||||||
$(MKDIR) -p $${bdir}/deploy_input ; \
|
|
||||||
( $(CD) $${bdir}/images && $(TAR) -cf - j2sdk-image j2re-image ) \
|
|
||||||
| ( $(CD) $${bdir}/deploy_input && $(TAR) -xf - ) ; \
|
|
||||||
) ; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
touch $@
|
|
||||||
|
|
||||||
# TBD: Deploy images
|
|
||||||
deploy: $(BUILD_DIR_ROOT)/.deploy_input
|
|
||||||
@if [ "$(ALL_MAKEFILES)" = "" ] ; then \
|
|
||||||
$(ECHO) "ERROR: No configurations to build"; exit 1; \
|
|
||||||
fi
|
|
||||||
@for bdir in $(dir $(ALL_MAKEFILES)) ; do \
|
|
||||||
if [ deploy/make/Makefile ] ; then \
|
|
||||||
echo "Attempting deploy build." ; \
|
|
||||||
( \
|
|
||||||
$(CD) deploy/make && \
|
|
||||||
$(MAKE) \
|
|
||||||
ABS_OUTPUTDIR=$${bdir}/deploy_input \
|
|
||||||
OUTPUTDIR=$${bdir}/deploy_input \
|
|
||||||
) ; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
|
|
||||||
# TBD: Install bundles
|
|
||||||
install:
|
|
||||||
|
|
||||||
# Bundle creation
|
|
||||||
bundles:
|
|
||||||
@if [ "$(ALL_IMAGE_DIRS)" = "" ] ; then \
|
|
||||||
$(ECHO) "ERROR: No images to bundle"; exit 1; \
|
|
||||||
fi
|
|
||||||
@for i in $(ALL_IMAGE_DIRS) ; do \
|
|
||||||
$(MKDIR) -p $${i}/../../bundles && \
|
|
||||||
$(RM) $${i}/../../bundles/`$(BASENAME) $${i}`.zip && \
|
|
||||||
$(ECHO) "$(CD) $${i} && $(ZIP) -q -r ../../bundles/`$(BASENAME) $${i}`.zip ." && \
|
|
||||||
$(CD) $${i} && $(ZIP) -q -r ../../bundles/`$(BASENAME) $${i}`.zip . ; \
|
|
||||||
done
|
|
||||||
|
|
||||||
# Clobber all the built files
|
|
||||||
clobber::
|
|
||||||
$(RM) -r $(BUILD_DIR_ROOT)
|
|
||||||
|
|
||||||
# Make various checks to insure the build will be successful
|
|
||||||
# Possibilities:
|
|
||||||
# * Check that if any closed repo is provided, they all must be.
|
|
||||||
# * Check that all open repos exist, at least until we are ready for some
|
|
||||||
# kind of partial build.
|
|
||||||
checks:
|
|
||||||
@$(ECHO) "No checks yet"
|
|
||||||
|
|
||||||
# Keep track of user targets
|
|
||||||
USER_TARGETS += all deploy install images clean clobber checks
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# To help in adoption of the new configure&&make build process, a bridge
|
|
||||||
# build will use the old settings to run configure and do the build.
|
|
||||||
|
|
||||||
# Build with the configure bridge
|
|
||||||
bridgeBuild: bridge2configure images
|
|
||||||
|
|
||||||
# Bridge from old Makefile ALT settings to configure options
|
|
||||||
bridge2configure: $(BUILD_DIR_ROOT)/.bridge2configureOpts
|
|
||||||
bash ./configure $(strip $(shell $(CAT) $<))
|
|
||||||
|
|
||||||
# Create a file with configure options created from old Makefile mechanisms.
|
|
||||||
$(BUILD_DIR_ROOT)/.bridge2configureOpts: $(BUILD_DIR_ROOT)/.bridge2configureOptsLatest
|
|
||||||
$(RM) $@
|
|
||||||
$(CP) $< $@
|
|
||||||
|
|
||||||
# Use this file to only change when obvious things have changed
|
|
||||||
$(BUILD_DIR_ROOT)/.bridge2configureOptsLatest: FRC
|
|
||||||
$(RM) $@.tmp
|
|
||||||
$(MKDIR) -p $(BUILD_DIR_ROOT)
|
|
||||||
@$(ECHO) " --with-debug-level=$(if $(DEBUG_LEVEL),$(DEBUG_LEVEL),release) " >> $@.tmp
|
|
||||||
ifdef ARCH_DATA_MODEL
|
|
||||||
@$(ECHO) " --with-target-bits=$(ARCH_DATA_MODEL) " >> $@.tmp
|
|
||||||
endif
|
|
||||||
ifdef ALT_PARALLEL_COMPILE_JOBS
|
|
||||||
@$(ECHO) " --with-num-cores=$(ALT_PARALLEL_COMPILE_JOBS) " >> $@.tmp
|
|
||||||
endif
|
|
||||||
ifdef ALT_BOOTDIR
|
|
||||||
@$(ECHO) " --with-boot-jdk=$(call UnixPath,$(ALT_BOOTDIR)) " >> $@.tmp
|
|
||||||
endif
|
|
||||||
ifdef ALT_CUPS_HEADERS_PATH
|
|
||||||
@$(ECHO) " --with-cups-include=$(call UnixPath,$(ALT_CUPS_HEADERS_PATH)) " >> $@.tmp
|
|
||||||
endif
|
|
||||||
ifdef ALT_FREETYPE_HEADERS_PATH
|
|
||||||
@$(ECHO) " --with-freetype=$(call UnixPath,$(ALT_FREETYPE_HEADERS_PATH)/..) " >> $@.tmp
|
|
||||||
endif
|
|
||||||
@if [ -f $@ ] ; then \
|
|
||||||
if ! $(CMP) $@ $@.tmp > /dev/null ; then \
|
|
||||||
$(CP) $@.tmp $@ ; \
|
|
||||||
fi ; \
|
|
||||||
else \
|
|
||||||
$(CP) $@.tmp $@ ; \
|
|
||||||
fi
|
|
||||||
$(RM) $@.tmp
|
|
||||||
|
|
||||||
# Clobber all the built files
|
|
||||||
clobber:: bridge2clobber
|
|
||||||
bridge2clobber::
|
|
||||||
$(RM) $(BUILD_DIR_ROOT)/.bridge2*
|
|
||||||
$(RM) $(BUILD_DIR_ROOT)/.deploy_input
|
|
||||||
|
|
||||||
# Keep track of phony targets
|
|
||||||
PHONY_LIST += bridge2configure bridgeBuild bridge2clobber
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# Sanity checks (history target)
|
|
||||||
#
|
|
||||||
|
|
||||||
sanity: checks
|
|
||||||
|
|
||||||
# Keep track of user targets
|
|
||||||
USER_TARGETS += sanity
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# Javadocs
|
|
||||||
#
|
|
||||||
|
|
||||||
javadocs:
|
|
||||||
cd common/makefiles && $(MAKE) -f MakefileJavadoc.gmk
|
|
||||||
|
|
||||||
# Keep track of user targets
|
|
||||||
USER_TARGETS += javadocs
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# JPRT targets
|
|
||||||
|
|
||||||
ifndef JPRT_ARCHIVE_BUNDLE
|
|
||||||
JPRT_ARCHIVE_BUNDLE=/tmp/jprt_bundles/j2sdk-image.zip
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
jprt_build_product: DEBUG_LEVEL=release
|
# Include this after a potential spec file has been included so that the bundles target
|
||||||
jprt_build_product: BUILD_DIRNAME=*-release
|
# has access to the spec variables.
|
||||||
jprt_build_product: jprt_build_generic
|
include $(root_dir)/common/makefiles/Jprt.gmk
|
||||||
|
|
||||||
jprt_build_fastdebug: DEBUG_LEVEL=fastdebug
|
# Here are "global" targets, i.e. targets that can be executed without specifying a single configuration.
|
||||||
jprt_build_fastdebug: BUILD_DIRNAME=*-fastdebug
|
# If you addd more global targets, please update the variable global_targets in MakeHelpers.
|
||||||
jprt_build_fastdebug: jprt_build_generic
|
|
||||||
|
|
||||||
jprt_build_debug: DEBUG_LEVEL=slowdebug
|
|
||||||
jprt_build_debug: BUILD_DIRNAME=*-debug
|
|
||||||
jprt_build_debug: jprt_build_generic
|
|
||||||
|
|
||||||
jprt_build_generic: $(JPRT_ARCHIVE_BUNDLE)
|
|
||||||
|
|
||||||
$(JPRT_ARCHIVE_BUNDLE): bridgeBuild bundles
|
|
||||||
$(MKDIR) -p $(@D)
|
|
||||||
$(RM) $@
|
|
||||||
$(CP) $(BUILD_DIR_ROOT)/$(BUILD_DIRNAME)/bundles/j2sdk-image.zip $@
|
|
||||||
|
|
||||||
# Keep track of phony targets
|
|
||||||
PHONY_LIST += jprt_build_product jprt_build_fastdebug jprt_build_debug \
|
|
||||||
jprt_build_generic
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# Help target
|
|
||||||
|
|
||||||
HELP_FORMAT=%12s%s\n
|
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@$(PRINTF) "# JDK Makefile\n"
|
$(info )
|
||||||
@$(PRINTF) "#\n"
|
$(info OpenJDK Makefile help)
|
||||||
@$(PRINTF) "# Usage: make [Target]\n"
|
$(info =====================)
|
||||||
@$(PRINTF) "#\n"
|
$(info )
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "Target " "Description"
|
$(info Common make targets)
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "------ " "-----------"
|
$(info . make [default] # Compile all product in langtools, hotspot, jaxp, jaxws,)
|
||||||
@for i in $(USER_TARGETS) ; do \
|
$(info . # corba and jdk)
|
||||||
$(MAKE) help_$${i} ; \
|
$(info . make all # Compile everything, all repos and images)
|
||||||
done
|
$(info . make images # Create complete j2sdk and j2re images)
|
||||||
@$(PRINTF) "#\n"
|
$(info . make overlay-images # Create limited images for sparc 64 bit platforms)
|
||||||
|
$(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, images or overlay-images))
|
||||||
|
$(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 )
|
||||||
|
|
||||||
help_all:
|
.PHONY: help
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Build the entire jdk but not the images"
|
|
||||||
help_images:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Create the jdk images for the builds"
|
|
||||||
help_deploy:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Create the jdk deploy images from the jdk images"
|
|
||||||
help_install:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Create the jdk install bundles from the deploy images"
|
|
||||||
help_clean:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Clean and prepare for a fresh build from scratch"
|
|
||||||
help_clobber:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Clean and also purge any hidden derived data"
|
|
||||||
help_checks:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Perform various checks to make sure we can build"
|
|
||||||
help_sanity:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Same as 'make checks'"
|
|
||||||
help_javadocs:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Build the javadocs"
|
|
||||||
help_help:
|
|
||||||
@$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \
|
|
||||||
"Print out the help messages"
|
|
||||||
|
|
||||||
# Keep track of user targets
|
|
||||||
USER_TARGETS += help
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# Phony targets
|
|
||||||
.PHONY: $(PHONY_LIST) $(USER_TARGETS)
|
|
||||||
|
|
||||||
# Force target
|
|
||||||
FRC:
|
|
||||||
|
@ -24,4 +24,4 @@
|
|||||||
# This Makefile was generated by configure @DATE_WHEN_CONFIGURED@
|
# This Makefile was generated by configure @DATE_WHEN_CONFIGURED@
|
||||||
# GENERATED FILE, DO NOT EDIT
|
# GENERATED FILE, DO NOT EDIT
|
||||||
SPEC:=@OUTPUT_ROOT@/spec.gmk
|
SPEC:=@OUTPUT_ROOT@/spec.gmk
|
||||||
include @SRC_ROOT@/common/makefiles/Makefile
|
include @SRC_ROOT@/NewMakefile.gmk
|
||||||
|
@ -26,9 +26,11 @@ script_dir=`dirname $0`
|
|||||||
|
|
||||||
# Create a timestamp as seconds since epoch
|
# Create a timestamp as seconds since epoch
|
||||||
if test "x`uname -s`" = "xSunOS"; then
|
if test "x`uname -s`" = "xSunOS"; then
|
||||||
# date +%s is not available on Solaris, use this workaround
|
TIMESTAMP=`date +%s`
|
||||||
# from http://solarisjedi.blogspot.co.uk/2006/06/solaris-date-command-and-epoch-time.html
|
if test "x$TIMESTAMP" = "x%s"; then
|
||||||
TIMESTAMP=`/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);print $2}'`
|
# date +%s not available on this Solaris, use workaround from nawk(1):
|
||||||
|
TIMESTAMP=`nawk 'BEGIN{print srand()}'`
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
TIMESTAMP=`date +%s`
|
TIMESTAMP=`date +%s`
|
||||||
fi
|
fi
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -234,7 +234,9 @@ BASIC_REQUIRE_PROG(BASH, bash)
|
|||||||
BASIC_REQUIRE_PROG(CAT, cat)
|
BASIC_REQUIRE_PROG(CAT, cat)
|
||||||
BASIC_REQUIRE_PROG(CHMOD, chmod)
|
BASIC_REQUIRE_PROG(CHMOD, chmod)
|
||||||
BASIC_REQUIRE_PROG(CMP, cmp)
|
BASIC_REQUIRE_PROG(CMP, cmp)
|
||||||
|
BASIC_REQUIRE_PROG(COMM, comm)
|
||||||
BASIC_REQUIRE_PROG(CP, cp)
|
BASIC_REQUIRE_PROG(CP, cp)
|
||||||
|
BASIC_REQUIRE_PROG(CPIO, cpio)
|
||||||
BASIC_REQUIRE_PROG(CUT, cut)
|
BASIC_REQUIRE_PROG(CUT, cut)
|
||||||
BASIC_REQUIRE_PROG(DATE, date)
|
BASIC_REQUIRE_PROG(DATE, date)
|
||||||
BASIC_REQUIRE_PROG(DIFF, [gdiff diff])
|
BASIC_REQUIRE_PROG(DIFF, [gdiff diff])
|
||||||
@ -633,6 +635,18 @@ AC_DEFUN([BASIC_CHECK_DIR_ON_LOCAL_DISK],
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
# Check that source files have basic read permissions set. This might
|
||||||
|
# not be the case in cygwin in certain conditions.
|
||||||
|
AC_DEFUN_ONCE([BASIC_CHECK_SRC_PERMS],
|
||||||
|
[
|
||||||
|
if test x"$OPENJDK_BUILD_OS" = xwindows; then
|
||||||
|
file_to_test="$SRC_ROOT/LICENSE"
|
||||||
|
if test `$STAT -c '%a' "$file_to_test"` -lt 400; then
|
||||||
|
AC_MSG_ERROR([Bad file permissions on src files. This is usually caused by cloning the repositories with a non cygwin hg in a directory not created in cygwin.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
AC_DEFUN_ONCE([BASIC_TEST_USABILITY_ISSUES],
|
AC_DEFUN_ONCE([BASIC_TEST_USABILITY_ISSUES],
|
||||||
[
|
[
|
||||||
|
|
||||||
@ -642,6 +656,8 @@ BASIC_CHECK_DIR_ON_LOCAL_DISK($OUTPUT_ROOT,
|
|||||||
[OUTPUT_DIR_IS_LOCAL="no"])
|
[OUTPUT_DIR_IS_LOCAL="no"])
|
||||||
AC_MSG_RESULT($OUTPUT_DIR_IS_LOCAL)
|
AC_MSG_RESULT($OUTPUT_DIR_IS_LOCAL)
|
||||||
|
|
||||||
|
BASIC_CHECK_SRC_PERMS
|
||||||
|
|
||||||
# Check if the user has any old-style ALT_ variables set.
|
# Check if the user has any old-style ALT_ variables set.
|
||||||
FOUND_ALT_VARIABLES=`env | grep ^ALT_`
|
FOUND_ALT_VARIABLES=`env | grep ^ALT_`
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ AC_DEFUN([BASIC_FIXUP_EXECUTABLE_CYGWIN],
|
|||||||
# bat and cmd files are not always considered executable in cygwin causing which
|
# bat and cmd files are not always considered executable in cygwin causing which
|
||||||
# to not find them
|
# to not find them
|
||||||
if test "x$new_path" = x \
|
if test "x$new_path" = x \
|
||||||
&& test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \
|
&& test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \
|
||||||
&& test "x`$LS \"$path\" 2>/dev/null`" != x; then
|
&& test "x`$LS \"$path\" 2>/dev/null`" != x; then
|
||||||
new_path=`$CYGPATH -u "$path"`
|
new_path=`$CYGPATH -u "$path"`
|
||||||
fi
|
fi
|
||||||
@ -191,7 +191,7 @@ AC_DEFUN([BASIC_FIXUP_EXECUTABLE_CYGWIN],
|
|||||||
# bat and cmd files are not always considered executable in cygwin causing which
|
# bat and cmd files are not always considered executable in cygwin causing which
|
||||||
# to not find them
|
# to not find them
|
||||||
if test "x$new_path" = x \
|
if test "x$new_path" = x \
|
||||||
&& test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \
|
&& test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \
|
||||||
&& test "x`$LS \"$path\" 2>/dev/null`" != x; then
|
&& test "x`$LS \"$path\" 2>/dev/null`" != x; then
|
||||||
new_path=`$CYGPATH -u "$path"`
|
new_path=`$CYGPATH -u "$path"`
|
||||||
fi
|
fi
|
||||||
|
@ -1,4 +1,29 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
# Attempt to guess a canonical system name.
|
# Attempt to guess a canonical system name.
|
||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||||
|
26
common/autoconf/build-aux/config.sub
vendored
26
common/autoconf/build-aux/config.sub
vendored
@ -1,4 +1,30 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
# Configuration validation subroutine script.
|
# Configuration validation subroutine script.
|
||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||||
|
@ -1,4 +1,30 @@
|
|||||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||||
#
|
#
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
#
|
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License version 2 only, as
|
|
||||||
# published by the Free Software Foundation.
|
|
||||||
#
|
|
||||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
# version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
# accompanied this code).
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License version
|
|
||||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
|
||||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
# or visit www.oracle.com if you need additional information or have any
|
|
||||||
# questions.
|
|
||||||
#
|
|
||||||
|
|
||||||
LAUNCHER_NAME=java
|
|
||||||
PRODUCT_NAME="Java(TM)"
|
|
||||||
PRODUCT_SUFFIX="SE Runtime Environment"
|
|
||||||
JDK_RC_PLATFORM_NAME="Platform SE"
|
|
||||||
COMPANY_NAME="Oracle Corporation"
|
|
||||||
|
|
||||||
# Might need better names for these
|
|
||||||
MACOSX_BUNDLE_NAME_BASE="Java SE"
|
|
||||||
MACOSX_BUNDLE_ID_BASE="com.oracle.java"
|
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 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.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -48,6 +48,7 @@ GREP="@GREP@"
|
|||||||
JAVAP="@FIXPATH@ @BOOT_JDK@/bin/javap"
|
JAVAP="@FIXPATH@ @BOOT_JDK@/bin/javap"
|
||||||
LDD="@LDD@"
|
LDD="@LDD@"
|
||||||
MKDIR="@MKDIR@"
|
MKDIR="@MKDIR@"
|
||||||
|
NAWK="@NAWK@"
|
||||||
NM="@NM@"
|
NM="@NM@"
|
||||||
OBJDUMP="@OBJDUMP@"
|
OBJDUMP="@OBJDUMP@"
|
||||||
OTOOL="@OTOOL@"
|
OTOOL="@OTOOL@"
|
||||||
|
@ -83,6 +83,9 @@ PLATFORM_SETUP_OPENJDK_BUILD_AND_TARGET
|
|||||||
BASIC_SETUP_PATHS
|
BASIC_SETUP_PATHS
|
||||||
BASIC_SETUP_LOGGING
|
BASIC_SETUP_LOGGING
|
||||||
|
|
||||||
|
# Check if it's a pure open build or if custom sources are to be used.
|
||||||
|
JDKOPT_SETUP_OPEN_OR_CUSTOM
|
||||||
|
|
||||||
# These are needed to be able to create a configuration name (and thus the output directory)
|
# These are needed to be able to create a configuration name (and thus the output directory)
|
||||||
JDKOPT_SETUP_JDK_VARIANT
|
JDKOPT_SETUP_JDK_VARIANT
|
||||||
JDKOPT_SETUP_JVM_VARIANTS
|
JDKOPT_SETUP_JVM_VARIANTS
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -235,7 +235,7 @@ HOTSPOT_TARGET="$HOTSPOT_TARGET docs export_$HOTSPOT_EXPORT"
|
|||||||
# from configure, but only server is valid anyway. Fix this
|
# from configure, but only server is valid anyway. Fix this
|
||||||
# when hotspot makefiles are rewritten.
|
# when hotspot makefiles are rewritten.
|
||||||
if test "x$MACOSX_UNIVERSAL" = xtrue; then
|
if test "x$MACOSX_UNIVERSAL" = xtrue; then
|
||||||
HOTSPOT_TARGET=universal_product
|
HOTSPOT_TARGET=universal_${HOTSPOT_EXPORT}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#####
|
#####
|
||||||
@ -247,46 +247,50 @@ AC_SUBST(DEBUG_CLASSFILES)
|
|||||||
AC_SUBST(BUILD_VARIANT_RELEASE)
|
AC_SUBST(BUILD_VARIANT_RELEASE)
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS],
|
|
||||||
[
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Should we build only OpenJDK even if closed sources are present?
|
# Should we build only OpenJDK even if closed sources are present?
|
||||||
#
|
#
|
||||||
AC_ARG_ENABLE([openjdk-only], [AS_HELP_STRING([--enable-openjdk-only],
|
AC_DEFUN_ONCE([JDKOPT_SETUP_OPEN_OR_CUSTOM],
|
||||||
[supress building closed source even if present @<:@disabled@:>@])],,[enable_openjdk_only="no"])
|
[
|
||||||
|
AC_ARG_ENABLE([openjdk-only], [AS_HELP_STRING([--enable-openjdk-only],
|
||||||
|
[suppress building custom source even if present @<:@disabled@:>@])],,[enable_openjdk_only="no"])
|
||||||
|
|
||||||
AC_MSG_CHECKING([for presence of closed sources])
|
AC_MSG_CHECKING([for presence of closed sources])
|
||||||
if test -d "$SRC_ROOT/jdk/src/closed"; then
|
if test -d "$SRC_ROOT/jdk/src/closed"; then
|
||||||
CLOSED_SOURCE_PRESENT=yes
|
CLOSED_SOURCE_PRESENT=yes
|
||||||
else
|
|
||||||
CLOSED_SOURCE_PRESENT=no
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([$CLOSED_SOURCE_PRESENT])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if closed source is supressed (openjdk-only)])
|
|
||||||
SUPRESS_CLOSED_SOURCE="$enable_openjdk_only"
|
|
||||||
AC_MSG_RESULT([$SUPRESS_CLOSED_SOURCE])
|
|
||||||
|
|
||||||
if test "x$CLOSED_SOURCE_PRESENT" = xno; then
|
|
||||||
OPENJDK=true
|
|
||||||
if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then
|
|
||||||
AC_MSG_WARN([No closed source present, --enable-openjdk-only makes no sense])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then
|
|
||||||
OPENJDK=true
|
|
||||||
else
|
else
|
||||||
OPENJDK=false
|
CLOSED_SOURCE_PRESENT=no
|
||||||
fi
|
fi
|
||||||
fi
|
AC_MSG_RESULT([$CLOSED_SOURCE_PRESENT])
|
||||||
|
|
||||||
if test "x$OPENJDK" = "xtrue"; then
|
AC_MSG_CHECKING([if closed source is suppressed (openjdk-only)])
|
||||||
|
SUPPRESS_CLOSED_SOURCE="$enable_openjdk_only"
|
||||||
|
AC_MSG_RESULT([$SUPPRESS_CLOSED_SOURCE])
|
||||||
|
|
||||||
|
if test "x$CLOSED_SOURCE_PRESENT" = xno; then
|
||||||
|
OPENJDK=true
|
||||||
|
if test "x$SUPPRESS_CLOSED_SOURCE" = "xyes"; then
|
||||||
|
AC_MSG_WARN([No closed source present, --enable-openjdk-only makes no sense])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test "x$SUPPRESS_CLOSED_SOURCE" = "xyes"; then
|
||||||
|
OPENJDK=true
|
||||||
|
else
|
||||||
|
OPENJDK=false
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$OPENJDK" = "xtrue"; then
|
||||||
SET_OPENJDK="OPENJDK=true"
|
SET_OPENJDK="OPENJDK=true"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_SUBST(SET_OPENJDK)
|
AC_SUBST(SET_OPENJDK)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS],
|
||||||
|
[
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
@ -369,13 +373,51 @@ COMPRESS_JARS=false
|
|||||||
AC_SUBST(COMPRESS_JARS)
|
AC_SUBST(COMPRESS_JARS)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# Setup version numbers
|
||||||
|
#
|
||||||
AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_VERSION_NUMBERS],
|
AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_VERSION_NUMBERS],
|
||||||
[
|
[
|
||||||
# Source the version numbers
|
# Source the version numbers
|
||||||
. $AUTOCONF_DIR/version.numbers
|
. $AUTOCONF_DIR/version-numbers
|
||||||
if test "x$OPENJDK" = "xfalse"; then
|
|
||||||
. $AUTOCONF_DIR/closed.version.numbers
|
# Get the settings from parameters
|
||||||
|
AC_ARG_WITH(milestone, [AS_HELP_STRING([--with-milestone],
|
||||||
|
[Set milestone value for build @<:@internal@:>@])])
|
||||||
|
if test "x$with_milestone" = xyes; then
|
||||||
|
AC_MSG_ERROR([Milestone must have a value])
|
||||||
|
elif test "x$with_milestone" != x; then
|
||||||
|
MILESTONE="$with_milestone"
|
||||||
|
else
|
||||||
|
MILESTONE=internal
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AC_ARG_WITH(build-number, [AS_HELP_STRING([--with-build-number],
|
||||||
|
[Set build number value for build @<:@b00@:>@])])
|
||||||
|
if test "x$with_build_number" = xyes; then
|
||||||
|
AC_MSG_ERROR([Build number must have a value])
|
||||||
|
elif test "x$with_build_number" != x; then
|
||||||
|
JDK_BUILD_NUMBER="$with_build_number"
|
||||||
|
fi
|
||||||
|
if test "x$JDK_BUILD_NUMBER" = x; then
|
||||||
|
JDK_BUILD_NUMBER=b00
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_WITH(user-release-suffix, [AS_HELP_STRING([--with-user-release-suffix],
|
||||||
|
[Add a custom string to the version string if build number isn't set.@<:@username_builddateb00@:>@])])
|
||||||
|
if test "x$with_user_release_suffix" = xyes; then
|
||||||
|
AC_MSG_ERROR([Release suffix must have a value])
|
||||||
|
elif test "x$with_user_release_suffix" != x; then
|
||||||
|
USER_RELEASE_SUFFIX="$with_user_release_suffix"
|
||||||
|
else
|
||||||
|
BUILD_DATE=`date '+%Y_%m_%d_%H_%M'`
|
||||||
|
# Avoid [:alnum:] since it depends on the locale.
|
||||||
|
CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyz0123456789'`
|
||||||
|
USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||||
|
fi
|
||||||
|
AC_SUBST(USER_RELEASE_SUFFIX)
|
||||||
|
|
||||||
# Now set the JDK version, milestone, build number etc.
|
# Now set the JDK version, milestone, build number etc.
|
||||||
AC_SUBST(JDK_MAJOR_VERSION)
|
AC_SUBST(JDK_MAJOR_VERSION)
|
||||||
AC_SUBST(JDK_MINOR_VERSION)
|
AC_SUBST(JDK_MINOR_VERSION)
|
||||||
@ -394,34 +436,13 @@ AC_SUBST(MACOSX_BUNDLE_ID_BASE)
|
|||||||
COPYRIGHT_YEAR=`date +'%Y'`
|
COPYRIGHT_YEAR=`date +'%Y'`
|
||||||
AC_SUBST(COPYRIGHT_YEAR)
|
AC_SUBST(COPYRIGHT_YEAR)
|
||||||
|
|
||||||
RUNTIME_NAME="$PRODUCT_NAME $PRODUCT_SUFFIX"
|
|
||||||
AC_SUBST(RUNTIME_NAME)
|
|
||||||
|
|
||||||
if test "x$JDK_UPDATE_VERSION" != x; then
|
if test "x$JDK_UPDATE_VERSION" != x; then
|
||||||
JDK_VERSION="${JDK_MAJOR_VERSION}.${JDK_MINOR_VERSION}.${JDK_MICRO_VERSION}_${JDK_UPDATE_VERSION}"
|
JDK_VERSION="${JDK_MAJOR_VERSION}.${JDK_MINOR_VERSION}.${JDK_MICRO_VERSION}_${JDK_UPDATE_VERSION}"
|
||||||
else
|
else
|
||||||
JDK_VERSION="${JDK_MAJOR_VERSION}.${JDK_MINOR_VERSION}.${JDK_MICRO_VERSION}"
|
JDK_VERSION="${JDK_MAJOR_VERSION}.${JDK_MINOR_VERSION}.${JDK_MICRO_VERSION}"
|
||||||
fi
|
fi
|
||||||
AC_SUBST(JDK_VERSION)
|
AC_SUBST(JDK_VERSION)
|
||||||
|
|
||||||
if test "x$MILESTONE" != x; then
|
|
||||||
RELEASE="${JDK_VERSION}-${MILESTONE}${BUILD_VARIANT_RELEASE}"
|
|
||||||
else
|
|
||||||
RELEASE="${JDK_VERSION}${BUILD_VARIANT_RELEASE}"
|
|
||||||
fi
|
|
||||||
AC_SUBST(RELEASE)
|
|
||||||
|
|
||||||
if test "x$JDK_BUILD_NUMBER" != x; then
|
|
||||||
FULL_VERSION="${RELEASE}-${JDK_BUILD_NUMBER}"
|
|
||||||
else
|
|
||||||
JDK_BUILD_NUMBER=b00
|
|
||||||
BUILD_DATE=`date '+%Y_%m_%d_%H_%M'`
|
|
||||||
# Avoid [:alnum:] since it depends on the locale.
|
|
||||||
CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyz0123456789'`
|
|
||||||
USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
|
||||||
FULL_VERSION="${RELEASE}-${USER_RELEASE_SUFFIX}-${JDK_BUILD_NUMBER}"
|
|
||||||
fi
|
|
||||||
AC_SUBST(FULL_VERSION)
|
|
||||||
COOKED_BUILD_NUMBER=`$ECHO $JDK_BUILD_NUMBER | $SED -e 's/^b//' -e 's/^0//'`
|
COOKED_BUILD_NUMBER=`$ECHO $JDK_BUILD_NUMBER | $SED -e 's/^b//' -e 's/^0//'`
|
||||||
AC_SUBST(COOKED_BUILD_NUMBER)
|
AC_SUBST(COOKED_BUILD_NUMBER)
|
||||||
])
|
])
|
||||||
@ -434,7 +455,7 @@ AC_SUBST(HOTSPOT_MAKE_ARGS)
|
|||||||
# The name of the Service Agent jar.
|
# The name of the Service Agent jar.
|
||||||
SALIB_NAME="${LIBRARY_PREFIX}saproc${SHARED_LIBRARY_SUFFIX}"
|
SALIB_NAME="${LIBRARY_PREFIX}saproc${SHARED_LIBRARY_SUFFIX}"
|
||||||
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
||||||
SALIB_NAME="${LIBRARY_PREFIX}sawindbg${SHARED_LIBRARY_SUFFIX}"
|
SALIB_NAME="${LIBRARY_PREFIX}sawindbg${SHARED_LIBRARY_SUFFIX}"
|
||||||
fi
|
fi
|
||||||
AC_SUBST(SALIB_NAME)
|
AC_SUBST(SALIB_NAME)
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -163,11 +163,22 @@ MACOSX_BUNDLE_ID_BASE=@MACOSX_BUNDLE_ID_BASE@
|
|||||||
|
|
||||||
# Different version strings generated from the above information.
|
# Different version strings generated from the above information.
|
||||||
JDK_VERSION:=@JDK_VERSION@
|
JDK_VERSION:=@JDK_VERSION@
|
||||||
RUNTIME_NAME:=@RUNTIME_NAME@
|
RUNTIME_NAME=$(PRODUCT_NAME) $(PRODUCT_SUFFIX)
|
||||||
FULL_VERSION:=@FULL_VERSION@
|
|
||||||
JRE_RELEASE_VERSION:=@FULL_VERSION@
|
|
||||||
RELEASE:=@RELEASE@
|
|
||||||
COOKED_BUILD_NUMBER:=@COOKED_BUILD_NUMBER@
|
COOKED_BUILD_NUMBER:=@COOKED_BUILD_NUMBER@
|
||||||
|
# These variables need to be generated here so that MILESTONE and
|
||||||
|
# JDK_BUILD_NUMBER can be overridden on the make command line.
|
||||||
|
ifeq ($(MILESTONE),)
|
||||||
|
RELEASE=$(JDK_VERSION)$(BUILD_VARIANT_RELEASE)
|
||||||
|
else
|
||||||
|
RELEASE=$(JDK_VERSION)-$(MILESTONE)$(BUILD_VARIANT_RELEASE)
|
||||||
|
endif
|
||||||
|
ifeq ($(JDK_BUILD_NUMBER),b00)
|
||||||
|
USER_RELEASE_SUFFIX=@USER_RELEASE_SUFFIX@
|
||||||
|
FULL_VERSION=$(RELEASE)-$(USER_RELEASE_SUFFIX)-$(JDK_BUILD_NUMBER)
|
||||||
|
else
|
||||||
|
FULL_VERSION=$(RELEASE)-$(JDK_BUILD_NUMBER)
|
||||||
|
endif
|
||||||
|
JRE_RELEASE_VERSION:=$(FULL_VERSION)
|
||||||
|
|
||||||
# How to compile the code: release, fastdebug or slowdebug
|
# How to compile the code: release, fastdebug or slowdebug
|
||||||
DEBUG_LEVEL:=@DEBUG_LEVEL@
|
DEBUG_LEVEL:=@DEBUG_LEVEL@
|
||||||
@ -220,6 +231,7 @@ JAXWS_OUTPUTDIR=$(BUILD_OUTPUT)/jaxws
|
|||||||
HOTSPOT_OUTPUTDIR=$(BUILD_OUTPUT)/hotspot
|
HOTSPOT_OUTPUTDIR=$(BUILD_OUTPUT)/hotspot
|
||||||
JDK_OUTPUTDIR=$(BUILD_OUTPUT)/jdk
|
JDK_OUTPUTDIR=$(BUILD_OUTPUT)/jdk
|
||||||
IMAGES_OUTPUTDIR=$(BUILD_OUTPUT)/images
|
IMAGES_OUTPUTDIR=$(BUILD_OUTPUT)/images
|
||||||
|
JCE_OUTPUTDIR=$(BUILD_OUTPUT)/jce-release
|
||||||
|
|
||||||
LANGTOOLS_DIST=$(LANGTOOLS_OUTPUTDIR)/dist
|
LANGTOOLS_DIST=$(LANGTOOLS_OUTPUTDIR)/dist
|
||||||
CORBA_DIST=$(CORBA_OUTPUTDIR)/dist
|
CORBA_DIST=$(CORBA_OUTPUTDIR)/dist
|
||||||
@ -420,6 +432,8 @@ RMIC=@FIXPATH@ $(BOOT_JDK)/bin/rmic
|
|||||||
|
|
||||||
NATIVE2ASCII=@FIXPATH@ $(BOOT_JDK)/bin/native2ascii
|
NATIVE2ASCII=@FIXPATH@ $(BOOT_JDK)/bin/native2ascii
|
||||||
|
|
||||||
|
JARSIGNER=@FIXPATH@ $(BOOT_JDK)/bin/jarsigner
|
||||||
|
|
||||||
# Base flags for RC
|
# Base flags for RC
|
||||||
# Guarding this against resetting value. Legacy make files include spec multiple
|
# Guarding this against resetting value. Legacy make files include spec multiple
|
||||||
# times.
|
# times.
|
||||||
@ -440,10 +454,13 @@ CCACHE:=@CCACHE@
|
|||||||
# CD is going away, but remains to cater for legacy makefiles.
|
# CD is going away, but remains to cater for legacy makefiles.
|
||||||
CD:=cd
|
CD:=cd
|
||||||
CHMOD:=@CHMOD@
|
CHMOD:=@CHMOD@
|
||||||
|
COMM:=@COMM@
|
||||||
CP:=@CP@
|
CP:=@CP@
|
||||||
|
CPIO:=@CPIO@
|
||||||
CUT:=@CUT@
|
CUT:=@CUT@
|
||||||
DATE:=@DATE@
|
DATE:=@DATE@
|
||||||
DIFF:=@DIFF@
|
DIFF:=@DIFF@
|
||||||
|
DIRNAME:=@DIRNAME@
|
||||||
FIND:=@FIND@
|
FIND:=@FIND@
|
||||||
FIND_DELETE:=@FIND_DELETE@
|
FIND_DELETE:=@FIND_DELETE@
|
||||||
ECHO:=@ECHO@
|
ECHO:=@ECHO@
|
||||||
@ -468,6 +485,7 @@ TEE:=@TEE@
|
|||||||
TIME:=@TIME@
|
TIME:=@TIME@
|
||||||
TR:=@TR@
|
TR:=@TR@
|
||||||
TOUCH:=@TOUCH@
|
TOUCH:=@TOUCH@
|
||||||
|
UNIQ:=@UNIQ@
|
||||||
WC:=@WC@
|
WC:=@WC@
|
||||||
XARGS:=@XARGS@
|
XARGS:=@XARGS@
|
||||||
ZIPEXE:=@ZIP@
|
ZIPEXE:=@ZIP@
|
||||||
@ -600,5 +618,21 @@ OS_VERSION_MAJOR:=@OS_VERSION_MAJOR@
|
|||||||
OS_VERSION_MINOR:=@OS_VERSION_MINOR@
|
OS_VERSION_MINOR:=@OS_VERSION_MINOR@
|
||||||
OS_VERSION_MICRO:=@OS_VERSION_MICRO@
|
OS_VERSION_MICRO:=@OS_VERSION_MICRO@
|
||||||
|
|
||||||
|
# Images directory definitions
|
||||||
|
JDK_IMAGE_SUBDIR:=j2sdk-image
|
||||||
|
JRE_IMAGE_SUBDIR:=j2re-image
|
||||||
|
JDK_OVERLAY_IMAGE_SUBDIR:=j2sdk-overlay-image
|
||||||
|
JRE_OVERLAY_IMAGE_SUBDIR:=j2re-overlay-image
|
||||||
|
JDK_IMAGE_DIR:=$(IMAGES_OUTPUTDIR)/$(JDK_IMAGE_SUBDIR)
|
||||||
|
JRE_IMAGE_DIR:=$(IMAGES_OUTPUTDIR)/$(JRE_IMAGE_SUBDIR)
|
||||||
|
JDK_OVERLAY_IMAGE_DIR:=$(IMAGES_OUTPUTDIR)/$(JDK_OVERLAY_IMAGE_SUBDIR)
|
||||||
|
JRE_OVERLAY_IMAGE_DIR:=$(IMAGES_OUTPUTDIR)/$(JRE_OVERLAY_IMAGE_SUBDIR)
|
||||||
|
|
||||||
|
# Macosx bundles directory definitions
|
||||||
|
JDK_BUNDLE_SUBDIR:=j2sdk-bundle/jdk$(JDK_VERSION).jdk/Contents
|
||||||
|
JRE_BUNDLE_SUBDIR:=j2re-bundle/jre$(JDK_VERSION).jre/Contents
|
||||||
|
JDK_BUNDLE_DIR:=$(IMAGES_OUTPUTDIR)/$(JDK_BUNDLE_SUBDIR)
|
||||||
|
JRE_BUNDLE_DIR:=$(IMAGES_OUTPUTDIR)/$(JRE_BUNDLE_SUBDIR)
|
||||||
|
|
||||||
# Include the custom-spec.gmk file if it exists
|
# Include the custom-spec.gmk file if it exists
|
||||||
-include $(dir @SPEC@)/custom-spec.gmk
|
-include $(dir @SPEC@)/custom-spec.gmk
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -27,8 +27,6 @@ JDK_MAJOR_VERSION=1
|
|||||||
JDK_MINOR_VERSION=8
|
JDK_MINOR_VERSION=8
|
||||||
JDK_MICRO_VERSION=0
|
JDK_MICRO_VERSION=0
|
||||||
JDK_UPDATE_VERSION=
|
JDK_UPDATE_VERSION=
|
||||||
JDK_BUILD_NUMBER=
|
|
||||||
MILESTONE=internal
|
|
||||||
LAUNCHER_NAME=openjdk
|
LAUNCHER_NAME=openjdk
|
||||||
PRODUCT_NAME=OpenJDK
|
PRODUCT_NAME=OpenJDK
|
||||||
PRODUCT_SUFFIX="Runtime Environment"
|
PRODUCT_SUFFIX="Runtime Environment"
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 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.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -98,24 +98,30 @@ diff_text() {
|
|||||||
if test "x$SUFFIX" = "xclass"; then
|
if test "x$SUFFIX" = "xclass"; then
|
||||||
# To improve performance when large diffs are found, do a rough filtering of classes
|
# To improve performance when large diffs are found, do a rough filtering of classes
|
||||||
# elibeble for these exceptions
|
# elibeble for these exceptions
|
||||||
if $GREP -R -e '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}' -e thePoint -e aPoint -e setItemsPtr ${THIS_FILE} > /dev/null; then
|
if $GREP -R -e '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}' \
|
||||||
|
-e '[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}' \
|
||||||
|
-e thePoint -e aPoint -e setItemsPtr ${THIS_FILE} > /dev/null; then
|
||||||
$JAVAP -c -constants -l -p ${OTHER_FILE} > ${OTHER_FILE}.javap
|
$JAVAP -c -constants -l -p ${OTHER_FILE} > ${OTHER_FILE}.javap
|
||||||
$JAVAP -c -constants -l -p ${THIS_FILE} > ${THIS_FILE}.javap
|
$JAVAP -c -constants -l -p ${THIS_FILE} > ${THIS_FILE}.javap
|
||||||
TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \
|
TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \
|
||||||
$GREP '^[<>]' | \
|
$GREP '^[<>]' | \
|
||||||
$SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
|
$SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
|
||||||
|
-e '/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/d' \
|
||||||
-e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \
|
-e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \
|
||||||
-e '/[<>].*public com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*itemsPtr();/d' \
|
-e '/[<>].*public com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*itemsPtr();/d' \
|
||||||
-e '/[<>].*public void setItemsPtr(com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*);/d')
|
-e '/[<>].*public void setItemsPtr(com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*);/d')
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if test "x$SUFFIX" = "xproperties"; then
|
if test "x$SUFFIX" = "xproperties"; then
|
||||||
$CAT $OTHER_FILE | $SED -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \
|
# Run through nawk to add possibly missing newline at end of file.
|
||||||
| $SED -f "$SRC_ROOT/common/makefiles/support/unicode2x.sed" \
|
$CAT $OTHER_FILE | $NAWK '{ print }' > $OTHER_FILE.cleaned
|
||||||
| $SED -e '/^#/d' -e '/^$/d' \
|
# Disable this exception since we aren't changing the properties cleaning method yet.
|
||||||
-e :a -e '/\\$/N; s/\\\n//; ta' \
|
# $CAT $OTHER_FILE | $SED -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \
|
||||||
-e 's/^[ \t]*//;s/[ \t]*$//' \
|
# | $SED -f "$SRC_ROOT/common/makefiles/support/unicode2x.sed" \
|
||||||
-e 's/\\=/=/' | LANG=C $SORT > $OTHER_FILE.cleaned
|
# | $SED -e '/^#/d' -e '/^$/d' \
|
||||||
|
# -e :a -e '/\\$/N; s/\\\n//; ta' \
|
||||||
|
# -e 's/^[ \t]*//;s/[ \t]*$//' \
|
||||||
|
# -e 's/\\=/=/' | LANG=C $SORT > $OTHER_FILE.cleaned
|
||||||
TMP=$(LANG=C $DIFF $OTHER_FILE.cleaned $THIS_FILE)
|
TMP=$(LANG=C $DIFF $OTHER_FILE.cleaned $THIS_FILE)
|
||||||
fi
|
fi
|
||||||
if test -n "$TMP"; then
|
if test -n "$TMP"; then
|
||||||
@ -305,14 +311,17 @@ compare_general_files() {
|
|||||||
THIS_FILE=$WORK_DIR/$f.this
|
THIS_FILE=$WORK_DIR/$f.this
|
||||||
$MKDIR -p $(dirname $OTHER_FILE)
|
$MKDIR -p $(dirname $OTHER_FILE)
|
||||||
$MKDIR -p $(dirname $THIS_FILE)
|
$MKDIR -p $(dirname $THIS_FILE)
|
||||||
|
#Note that | doesn't work on mac sed.
|
||||||
$CAT $OTHER_DIR/$f | $SED -e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
|
$CAT $OTHER_DIR/$f | $SED -e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
|
||||||
-e 's/\(<meta name="date" content="\).*\(">\)/\1(removed)\2/' \
|
-e 's/\(<meta name="date" content="\).*\(">\)/\1(removed)\2/' \
|
||||||
-e 's/\(Monday\|Tuesday\|Wednesday\|Thursday\|Friday\|Saturday\|Sunday\), [A-Z][a-z]* [0-9][0-9]*, [12][0-9]* [0-9][0-9:]* \(AM\|PM\) [A-Z][A-Z]*/(removed)/' \
|
-e 's/[A-Z][a-z]*, [A-Z][a-z]* [0-9][0-9]*, [12][0-9]* [0-9][0-9:]* [AMP]\{2,2\} [A-Z][A-Z]*/(removed)/' \
|
||||||
|
-e 's/[A-Z][a-z]* [A-Z][a-z]* [0-9][0-9] [0-9][0-9:]* [A-Z][A-Z]* [12][0-9]*/(removed)/' \
|
||||||
-e 's/^\( from \).*\(\.idl\)$/\1(removed)\2/' \
|
-e 's/^\( from \).*\(\.idl\)$/\1(removed)\2/' \
|
||||||
> $OTHER_FILE
|
> $OTHER_FILE
|
||||||
$CAT $THIS_DIR/$f | $SED -e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
|
$CAT $THIS_DIR/$f | $SED -e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
|
||||||
-e 's/\(<meta name="date" content="\).*\(">\)/\1(removed)\2/' \
|
-e 's/\(<meta name="date" content="\).*\(">\)/\1(removed)\2/' \
|
||||||
-e 's/\(Monday\|Tuesday\|Wednesday\|Thursday\|Friday\|Saturday\|Sunday\), [A-Z][a-z]* [0-9][0-9]*, [12][0-9]* [0-9][0-9:]* \(AM\|PM\) [A-Z][A-Z]*/(removed)/' \
|
-e 's/[A-Z][a-z]*, [A-Z][a-z]* [0-9][0-9]*, [12][0-9]* [0-9][0-9:]* [AMP]\{2,2\} [A-Z][A-Z]*/(removed)/' \
|
||||||
|
-e 's/[A-Z][a-z]* [A-Z][a-z]* [0-9][0-9] [0-9][0-9:]* [A-Z][A-Z]* [12][0-9]*/(removed)/' \
|
||||||
-e 's/^\( from \).*\(\.idl\)$/\1(removed)\2/' \
|
-e 's/^\( from \).*\(\.idl\)$/\1(removed)\2/' \
|
||||||
> $THIS_FILE
|
> $THIS_FILE
|
||||||
else
|
else
|
||||||
@ -370,14 +379,14 @@ compare_zip_file() {
|
|||||||
(cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
|
(cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
|
||||||
|
|
||||||
# Find all archives inside and unzip them as well to compare the contents rather than
|
# Find all archives inside and unzip them as well to compare the contents rather than
|
||||||
# the archives.
|
# the archives. pie.jar.pack.gz i app3.war is corrupt, skip it.
|
||||||
EXCEPTIONS=""
|
EXCEPTIONS="pie.jar.pack.gz"
|
||||||
for pack in $($FIND $THIS_UNZIPDIR -name "*.pack" -o -name "*.pack.gz"); do
|
for pack in $($FIND $THIS_UNZIPDIR \( -name "*.pack" -o -name "*.pack.gz" \) -a ! -name pie.jar.pack.gz); do
|
||||||
($UNPACK200 $pack $pack.jar)
|
($UNPACK200 $pack $pack.jar)
|
||||||
# Filter out the unzipped archives from the diff below.
|
# Filter out the unzipped archives from the diff below.
|
||||||
EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
|
EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
|
||||||
done
|
done
|
||||||
for pack in $($FIND $OTHER_UNZIPDIR -name "*.pack" -o -name "*.pack.gz"); do
|
for pack in $($FIND $OTHER_UNZIPDIR \( -name "*.pack" -o -name "*.pack.gz" \) -a ! -name pie.jar.pack.gz); do
|
||||||
($UNPACK200 $pack $pack.jar)
|
($UNPACK200 $pack $pack.jar)
|
||||||
EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
|
EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
|
||||||
done
|
done
|
||||||
@ -1073,7 +1082,11 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
# Figure out the layout of the this build. Which kinds of images have been produced
|
# Figure out the layout of the this build. Which kinds of images have been produced
|
||||||
if [ -d "$THIS/deploy/j2sdk-image" ]; then
|
if [ -d "$THIS/install/j2sdk-image" ]; then
|
||||||
|
THIS_J2SDK="$THIS/install/j2sdk-image"
|
||||||
|
THIS_J2RE="$THIS/install/j2re-image"
|
||||||
|
echo "Comparing install images"
|
||||||
|
elif [ -d "$THIS/deploy/j2sdk-image" ]; then
|
||||||
THIS_J2SDK="$THIS/deploy/j2sdk-image"
|
THIS_J2SDK="$THIS/deploy/j2sdk-image"
|
||||||
THIS_J2RE="$THIS/deploy/j2re-image"
|
THIS_J2RE="$THIS/deploy/j2re-image"
|
||||||
echo "Comparing deploy images"
|
echo "Comparing deploy images"
|
||||||
@ -1081,9 +1094,16 @@ elif [ -d "$THIS/images/j2sdk-image" ]; then
|
|||||||
THIS_J2SDK="$THIS/images/j2sdk-image"
|
THIS_J2SDK="$THIS/images/j2sdk-image"
|
||||||
THIS_J2RE="$THIS/images/j2re-image"
|
THIS_J2RE="$THIS/images/j2re-image"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "$THIS/images/j2sdk-overlay-image" ]; then
|
if [ -d "$THIS/images/j2sdk-overlay-image" ]; then
|
||||||
THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image"
|
if [ -d "$THIS/install/j2sdk-image" ]; then
|
||||||
THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image"
|
# 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"
|
||||||
|
else
|
||||||
|
THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image"
|
||||||
|
THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "$THIS/images/j2sdk-bundle" ]; then
|
if [ -d "$THIS/images/j2sdk-bundle" ]; then
|
||||||
@ -1100,7 +1120,9 @@ if [ -d "$OTHER/j2sdk-image" ]; then
|
|||||||
OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image"
|
OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image"
|
||||||
OTHER_J2RE_OVERLAY="$OTHER/j2re-image"
|
OTHER_J2RE_OVERLAY="$OTHER/j2re-image"
|
||||||
fi
|
fi
|
||||||
|
elif [ -d "$OTHER/images/j2sdk-image" ]; then
|
||||||
|
OTHER_J2SDK="$OTHER/images/j2sdk-image"
|
||||||
|
OTHER_J2RE="$OTHER/images/j2re-image"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -d "$OTHER/j2sdk-bundle" ]; then
|
if [ -d "$OTHER/j2sdk-bundle" ]; then
|
||||||
@ -1144,6 +1166,26 @@ if [ -z "$OTHER_DOCS" ]; then
|
|||||||
echo "WARNING! Other build doesn't contain docs, skipping doc compare."
|
echo "WARNING! Other build doesn't contain docs, skipping doc compare."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -d "$OTHER/images" ]; then
|
||||||
|
OTHER_SEC_DIR="$OTHER/images"
|
||||||
|
else
|
||||||
|
OTHER_SEC_DIR="$OTHER/tmp"
|
||||||
|
fi
|
||||||
|
OTHER_SEC_BIN="$OTHER_SEC_DIR/sec-bin.zip"
|
||||||
|
THIS_SEC_DIR="$THIS/images"
|
||||||
|
THIS_SEC_BIN="$THIS_SEC_DIR/sec-bin.zip"
|
||||||
|
if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
|
||||||
|
if [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
|
||||||
|
JGSS_WINDOWS_BIN="jgss-windows-x64-bin.zip"
|
||||||
|
else
|
||||||
|
JGSS_WINDOWS_BIN="jgss-windows-i586-bin.zip"
|
||||||
|
fi
|
||||||
|
OTHER_SEC_WINDOWS_BIN="$OTHER_SEC_DIR/sec-windows-bin.zip"
|
||||||
|
OTHER_JGSS_WINDOWS_BIN="$OTHER_SEC_DIR/$JGSS_WINDOWS_BIN"
|
||||||
|
THIS_SEC_WINDOWS_BIN="$THIS_SEC_DIR/sec-windows-bin.zip"
|
||||||
|
THIS_JGSS_WINDOWS_BIN="$THIS_SEC_DIR/$JGSS_WINDOWS_BIN"
|
||||||
|
fi
|
||||||
|
|
||||||
##########################################################################################
|
##########################################################################################
|
||||||
# Do the work
|
# Do the work
|
||||||
|
|
||||||
@ -1260,6 +1302,24 @@ if [ "$CMP_ZIPS" = "true" ]; then
|
|||||||
if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then
|
if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then
|
||||||
compare_all_zip_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk
|
compare_all_zip_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk
|
||||||
fi
|
fi
|
||||||
|
if [ -n "$THIS_SEC_BIN" ] && [ -n "$OTHER_SEC_BIN" ]; then
|
||||||
|
if [ -n "$(echo $THIS_SEC_BIN | $FILTER)" ]; then
|
||||||
|
echo "sec-bin.zip..."
|
||||||
|
compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-bin.zip
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ -n "$THIS_SEC_WINDOWS_BIN" ] && [ -n "$OTHER_SEC_WINDOWS_BIN" ]; then
|
||||||
|
if [ -n "$(echo $THIS_SEC_WINDOWS_BIN | $FILTER)" ]; then
|
||||||
|
echo "sec-windows-bin.zip..."
|
||||||
|
compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-windows-bin.zip
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ -n "$THIS_JGSS_WINDOWS_BIN" ] && [ -n "$OTHER_JGSS_WINDOWS_BIN" ]; then
|
||||||
|
if [ -n "$(echo $THIS_JGSS_WINDOWS_BIN | $FILTER)" ]; then
|
||||||
|
echo "$JGSS_WINDOWS_BIN..."
|
||||||
|
compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin $JGSS_WINDOWS_BIN
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$CMP_JARS" = "true" ]; then
|
if [ "$CMP_JARS" = "true" ]; then
|
||||||
|
@ -813,6 +813,10 @@ fi
|
|||||||
|
|
||||||
if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
|
if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
|
||||||
|
|
||||||
|
ACCEPTED_JARZIP_CONTENTS="
|
||||||
|
/bin/w2k_lsa_auth.dll
|
||||||
|
"
|
||||||
|
|
||||||
# Probably should add all libs here
|
# Probably should add all libs here
|
||||||
ACCEPTED_SMALL_SIZE_DIFF="
|
ACCEPTED_SMALL_SIZE_DIFF="
|
||||||
./demo/jvmti/gctest/lib/gctest.dll
|
./demo/jvmti/gctest/lib/gctest.dll
|
||||||
@ -821,6 +825,7 @@ ACCEPTED_SMALL_SIZE_DIFF="
|
|||||||
./jre/bin/attach.dll
|
./jre/bin/attach.dll
|
||||||
./jre/bin/java_crw_demo.dll
|
./jre/bin/java_crw_demo.dll
|
||||||
./jre/bin/jsoundds.dll
|
./jre/bin/jsoundds.dll
|
||||||
|
./jre/bin/server/jvm.dll
|
||||||
./bin/appletviewer.exe
|
./bin/appletviewer.exe
|
||||||
./bin/extcheck.exe
|
./bin/extcheck.exe
|
||||||
./bin/idlj.exe
|
./bin/idlj.exe
|
||||||
|
@ -87,7 +87,7 @@ $(if $(16),$(error Internal makefile error: Too many arguments to SetupIdlCompil
|
|||||||
$1_SRC := $$(abspath $$($1_SRC))
|
$1_SRC := $$(abspath $$($1_SRC))
|
||||||
$1_BIN := $$(abspath $$($1_BIN))
|
$1_BIN := $$(abspath $$($1_BIN))
|
||||||
# Find all existing java files and existing class files.
|
# Find all existing java files and existing class files.
|
||||||
$$(shell $(MKDIR) -p $$($1_SRC) $$($1_BIN))
|
$$(eval $$(call MakeDir,$$($1_BIN)))
|
||||||
$1_SRCS := $$(shell find $$($1_SRC) -name "*.idl")
|
$1_SRCS := $$(shell find $$($1_SRC) -name "*.idl")
|
||||||
$1_BINS := $$(shell find $$($1_BIN) -name "*.java")
|
$1_BINS := $$(shell find $$($1_BIN) -name "*.java")
|
||||||
# Prepend the source/bin path to the filter expressions.
|
# Prepend the source/bin path to the filter expressions.
|
||||||
|
@ -111,9 +111,9 @@ define SetupArchive
|
|||||||
ifeq ($$(word 20,$$($1_GREP_INCLUDE_PATTERNS)),)
|
ifeq ($$(word 20,$$($1_GREP_INCLUDE_PATTERNS)),)
|
||||||
$1_GREP_INCLUDES:=| $(GREP) $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_INCLUDE_PATTERNS))
|
$1_GREP_INCLUDES:=| $(GREP) $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_INCLUDE_PATTERNS))
|
||||||
else
|
else
|
||||||
$$(shell $(MKDIR) -p $$($1_BIN) && $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_include)
|
$1_GREP_INCLUDE_OUTPUT:=$(RM) $$($1_BIN)/_the.$$($1_JARNAME)_include && \
|
||||||
$$(eval $$(call ListPathsSafelyNow,$1_GREP_INCLUDE_PATTERNS,\n, \
|
$$(strip $$(call ListPathsSafely,$1_GREP_INCLUDE_PATTERNS,\n, \
|
||||||
>> $$($1_BIN)/_the.$$($1_JARNAME)_include))
|
>> $$($1_BIN)/_the.$$($1_JARNAME)_include))
|
||||||
$1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include
|
$1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -124,9 +124,9 @@ define SetupArchive
|
|||||||
ifeq ($$(word 20,$$($1_GREP_EXCLUDE_PATTERNS)),)
|
ifeq ($$(word 20,$$($1_GREP_EXCLUDE_PATTERNS)),)
|
||||||
$1_GREP_EXCLUDES:=| $(GREP) -v $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_EXCLUDE_PATTERNS))
|
$1_GREP_EXCLUDES:=| $(GREP) -v $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_EXCLUDE_PATTERNS))
|
||||||
else
|
else
|
||||||
$$(shell $(MKDIR) -p $$($1_BIN) && $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_exclude)
|
$1_GREP_EXCLUDE_OUTPUT=$(RM) $$($1_BIN)/_the.$$($1_JARNAME)_exclude && \
|
||||||
$$(eval $$(call ListPathsSafelyNow,$1_GREP_EXCLUDE_PATTERNS,\n, \
|
$$(strip $$(call ListPathsSafely,$1_GREP_EXCLUDE_PATTERNS,\n, \
|
||||||
>> $$($1_BIN)/_the.$$($1_JARNAME)_exclude))
|
>> $$($1_BIN)/_the.$$($1_JARNAME)_exclude))
|
||||||
$1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude
|
$1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -137,19 +137,25 @@ define SetupArchive
|
|||||||
else
|
else
|
||||||
$1_JARINDEX = true
|
$1_JARINDEX = true
|
||||||
endif
|
endif
|
||||||
# When this macro is run in the same makefile as the java compilation, dependencies are transfered
|
# When this macro is run in the same makefile as the java compilation, dependencies are
|
||||||
# in make variables. When the macro is run in a different makefile than the java compilation, the
|
# transfered in make variables. When the macro is run in a different makefile than the
|
||||||
# dependencies need to be found in the filesystem.
|
# java compilation, the dependencies need to be found in the filesystem.
|
||||||
ifneq (,$2)
|
ifneq (,$2)
|
||||||
$1_DEPS:=$2
|
$1_DEPS:=$2
|
||||||
else
|
else
|
||||||
|
$1_DEPS:=$$(filter $$(addprefix %,$$($1_FIND_PATTERNS)),\
|
||||||
|
$$(call CacheFind $$($1_SRCS)))
|
||||||
|
ifneq (,$$($1_GREP_INCLUDE_PATTERNS))
|
||||||
|
$1_DEPS:=$$(filter $$(addsuffix %,$$($1_GREP_INCLUDE_PATTERNS)),$$($1_DEPS))
|
||||||
|
endif
|
||||||
|
ifneq (,$$($1_GREP_EXCLUDE_PATTERNS))
|
||||||
|
$1_DEPS:=$$(filter-out $$(addsuffix %,$$($1_GREP_EXCLUDE_PATTERNS)),$$($1_DEPS))
|
||||||
|
endif
|
||||||
# The subst of \ is needed because $ has to be escaped with \ in EXTRA_FILES for the command
|
# The subst of \ is needed because $ has to be escaped with \ in EXTRA_FILES for the command
|
||||||
# lines, but not here for use in make dependencies.
|
# lines, but not here for use in make dependencies.
|
||||||
$1_DEPS:=$$(shell $(FIND) $$($1_SRCS) -type f -a \( $$($1_FIND_PATTERNS) \) \
|
$1_DEPS+=$$(subst \,,$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,$$($1_EXTRA_FILES))))
|
||||||
$$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES)) \
|
|
||||||
$$(subst \,,$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,$$($1_EXTRA_FILES))))
|
|
||||||
ifeq (,$$($1_SKIP_METAINF))
|
ifeq (,$$($1_SKIP_METAINF))
|
||||||
$1_DEPS+=$$(shell $(FIND) $$(addsuffix /META-INF,$$($1_SRCS)) -type f 2> /dev/null)
|
$1_DEPS+=$$(call CacheFind $$(wildcard $$(addsuffix /META-INF,$$($1_SRCS))))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -210,6 +216,8 @@ define SetupArchive
|
|||||||
# Here is the rule that creates/updates the jar file.
|
# Here is the rule that creates/updates the jar file.
|
||||||
$$($1_JAR) : $$($1_DEPS)
|
$$($1_JAR) : $$($1_DEPS)
|
||||||
$(MKDIR) -p $$($1_BIN)
|
$(MKDIR) -p $$($1_BIN)
|
||||||
|
$$($1_GREP_INCLUDE_OUTPUT)
|
||||||
|
$$($1_GREP_EXCLUDE_OUTPUT)
|
||||||
$$(if $$($1_MANIFEST),\
|
$$(if $$($1_MANIFEST),\
|
||||||
$(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \
|
$(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \
|
||||||
-e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $$($1_MANIFEST) > $$($1_MANIFEST_FILE) \
|
-e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $$($1_MANIFEST) > $$($1_MANIFEST_FILE) \
|
||||||
@ -242,14 +250,14 @@ endef
|
|||||||
define SetupZipArchive
|
define SetupZipArchive
|
||||||
# param 1 is for example ZIP_MYSOURCE
|
# param 1 is for example ZIP_MYSOURCE
|
||||||
# param 2,3,4,5,6,7,8,9 are named args.
|
# param 2,3,4,5,6,7,8,9 are named args.
|
||||||
# SRC,ZIP,INCLUDES,EXCLUDES,EXCLUDE_FILES,SUFFIXES,EXTRA_DEPS
|
# SRC,ZIP,INCLUDES,INCLUDE_FILES,EXCLUDES,EXCLUDE_FILES,SUFFIXES,EXTRA_DEPS
|
||||||
$(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
|
$(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
|
||||||
$(call LogSetupMacroEntry,SetupZipArchive($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
|
$(call LogSetupMacroEntry,SetupZipArchive($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
|
||||||
$(if $(16),$(error Internal makefile error: Too many arguments to SetupZipArchive, please update JavaCompilation.gmk))
|
$(if $(16),$(error Internal makefile error: Too many arguments to SetupZipArchive, please update JavaCompilation.gmk))
|
||||||
|
|
||||||
# Find all files in the source tree.
|
# Find all files in the source tree.
|
||||||
$1_SUFFIX_FILTER := $$(patsubst %,-o -name $(DQUOTE)*%$(DQUOTE),$$($1_SUFFIXES))
|
$1_ALL_SRCS := $$(call not-containing,_the.,\
|
||||||
$1_ALL_SRCS := $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i -type f -a ! -name "_the.*" \( -name FALSE_DUMMY $$($1_SUFFIX_FILTER) \) ))
|
$$(filter $$(addprefix %,$$($1_SUFFIXES)),$$(call CacheFind $$($1_SRC))))
|
||||||
|
|
||||||
ifneq ($$($1_INCLUDES),)
|
ifneq ($$($1_INCLUDES),)
|
||||||
$1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
|
$1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
|
||||||
@ -259,6 +267,12 @@ define SetupZipArchive
|
|||||||
else
|
else
|
||||||
$1_ZIP_INCLUDES := $$(addprefix -i$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_INCLUDES)))
|
$1_ZIP_INCLUDES := $$(addprefix -i$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_INCLUDES)))
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
ifneq ($$($1_INCLUDE_FILES),)
|
||||||
|
$1_SRC_INCLUDES += $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
|
||||||
|
$1_ZIP_INCLUDES += $$(addprefix -i$(SPACE),$$($1_INCLUDE_FILES))
|
||||||
|
endif
|
||||||
|
ifneq ($$($1_SRC_INCLUDES),)
|
||||||
$1_ALL_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_SRCS))
|
$1_ALL_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_SRCS))
|
||||||
endif
|
endif
|
||||||
ifneq ($$($1_EXCLUDES),)
|
ifneq ($$($1_EXCLUDES),)
|
||||||
@ -376,7 +390,7 @@ define SetupJavaCompilation
|
|||||||
$$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupJavaCompilation $1 contains missing directory $$d)))
|
$$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupJavaCompilation $1 contains missing directory $$d)))
|
||||||
$$(eval $$(call MakeDir,$$($1_BIN)))
|
$$(eval $$(call MakeDir,$$($1_BIN)))
|
||||||
# Find all files in the source trees.
|
# Find all files in the source trees.
|
||||||
$1_ALL_SRCS := $$(filter-out $(OVR_SRCS),$$(shell $(FIND) $$($1_SRC) -type f))
|
$1_ALL_SRCS += $$(filter-out $(OVR_SRCS),$$(call CacheFind,$$($1_SRC)))
|
||||||
# Extract the java files.
|
# Extract the java files.
|
||||||
ifneq ($$($1_EXCLUDE_FILES),)
|
ifneq ($$($1_EXCLUDE_FILES),)
|
||||||
$1_EXCLUDE_FILES_PATTERN:=$$(addprefix %,$$($1_EXCLUDE_FILES))
|
$1_EXCLUDE_FILES_PATTERN:=$$(addprefix %,$$($1_EXCLUDE_FILES))
|
||||||
@ -408,8 +422,6 @@ define SetupJavaCompilation
|
|||||||
|
|
||||||
# Find all files to be copied from source to bin.
|
# Find all files to be copied from source to bin.
|
||||||
ifneq (,$$($1_COPY))
|
ifneq (,$$($1_COPY))
|
||||||
# Rewrite list of patterns into a find statement.
|
|
||||||
$1_COPY_PATTERN:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_COPY))
|
|
||||||
# Search for all files to be copied.
|
# Search for all files to be copied.
|
||||||
$1_ALL_COPIES := $$(filter $$(addprefix %,$$($1_COPY)),$$($1_ALL_SRCS))
|
$1_ALL_COPIES := $$(filter $$(addprefix %,$$($1_COPY)),$$($1_ALL_SRCS))
|
||||||
# Copy these explicitly
|
# Copy these explicitly
|
||||||
@ -436,8 +448,6 @@ define SetupJavaCompilation
|
|||||||
|
|
||||||
# Find all property files to be copied and cleaned from source to bin.
|
# Find all property files to be copied and cleaned from source to bin.
|
||||||
ifneq (,$$($1_CLEAN))
|
ifneq (,$$($1_CLEAN))
|
||||||
# Rewrite list of patterns into a find statement.
|
|
||||||
$1_CLEAN_PATTERN:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_CLEAN))
|
|
||||||
# Search for all files to be copied.
|
# Search for all files to be copied.
|
||||||
$1_ALL_CLEANS := $$(filter $$(addprefix %,$$($1_CLEAN)),$$($1_ALL_SRCS))
|
$1_ALL_CLEANS := $$(filter $$(addprefix %,$$($1_CLEAN)),$$($1_ALL_SRCS))
|
||||||
# Copy and clean must also respect filters.
|
# Copy and clean must also respect filters.
|
||||||
|
209
common/makefiles/Jprt.gmk
Normal file
209
common/makefiles/Jprt.gmk
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
#
|
||||||
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License version 2 only, as
|
||||||
|
# published by the Free Software Foundation. Oracle designates this
|
||||||
|
# particular file as subject to the "Classpath" exception as provided
|
||||||
|
# by Oracle in the LICENSE file that accompanied this code.
|
||||||
|
#
|
||||||
|
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
# version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
# accompanied this code).
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License version
|
||||||
|
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
#
|
||||||
|
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
# or visit www.oracle.com if you need additional information or have any
|
||||||
|
# questions.
|
||||||
|
#
|
||||||
|
|
||||||
|
# This file is included by the root NewerMakefile and contains targets
|
||||||
|
# and utilities needed by JPRT.
|
||||||
|
|
||||||
|
# Utilities used in this Makefile. Most of this makefile executes without
|
||||||
|
# the context of a spec file from configure.
|
||||||
|
CAT=cat
|
||||||
|
CMP=cmp
|
||||||
|
CP=cp
|
||||||
|
ECHO=echo
|
||||||
|
MKDIR=mkdir
|
||||||
|
PRINTF=printf
|
||||||
|
PWD=pwd
|
||||||
|
# Insure we have a path that looks like it came from pwd
|
||||||
|
# (This is mostly for Windows sake and drive letters)
|
||||||
|
define UnixPath # path
|
||||||
|
$(shell (cd "$1" && $(PWD)))
|
||||||
|
endef
|
||||||
|
|
||||||
|
BUILD_DIR_ROOT:=$(root_dir)/build
|
||||||
|
|
||||||
|
ifdef OPENJDK
|
||||||
|
OPEN_BUILD=true
|
||||||
|
else
|
||||||
|
OPEN_BUILD := $(if $(or $(wildcard $(root_dir)/jdk/src/closed), \
|
||||||
|
$(wildcard $(root_dir)/jdk/make/closed), \
|
||||||
|
$(wildcard $(root_dir)/jdk/test/closed), \
|
||||||
|
$(wildcard $(root_dir)/hotspot/src/closed), \
|
||||||
|
$(wildcard $(root_dir)/hotspot/make/closed), \
|
||||||
|
$(wildcard $(root_dir)/hotspot/test/closed)), \
|
||||||
|
false,true)
|
||||||
|
endif
|
||||||
|
|
||||||
|
HOTSPOT_AVAILABLE := $(if $(wildcard $(root_dir)/hotspot),true,false)
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# To help in adoption of the new configure&&make build process, a bridge
|
||||||
|
# build will use the old settings to run configure and do the build.
|
||||||
|
|
||||||
|
# Build with the configure bridge. After running configure, restart make
|
||||||
|
# to parse the new spec file.
|
||||||
|
BRIDGE_TARGETS := all
|
||||||
|
bridgeBuild: bridge2configure
|
||||||
|
@cd $(root_dir) && $(MAKE) -f NewMakefile.gmk $(BRIDGE_TARGETS)
|
||||||
|
|
||||||
|
# Bridge from old Makefile ALT settings to configure options
|
||||||
|
bridge2configure: $(BUILD_DIR_ROOT)/.bridge2configureOpts
|
||||||
|
bash ./configure $(strip $(shell $(CAT) $<))
|
||||||
|
|
||||||
|
# Create a file with configure options created from old Makefile mechanisms.
|
||||||
|
$(BUILD_DIR_ROOT)/.bridge2configureOpts: $(BUILD_DIR_ROOT)/.bridge2configureOptsLatest
|
||||||
|
$(RM) $@
|
||||||
|
$(CP) $< $@
|
||||||
|
|
||||||
|
# Use this file to only change when obvious things have changed
|
||||||
|
$(BUILD_DIR_ROOT)/.bridge2configureOptsLatest: FRC
|
||||||
|
$(RM) $@.tmp
|
||||||
|
$(MKDIR) -p $(BUILD_DIR_ROOT)
|
||||||
|
@$(ECHO) " --with-debug-level=$(if $(DEBUG_LEVEL),$(DEBUG_LEVEL),release) " >> $@.tmp
|
||||||
|
ifdef ARCH_DATA_MODEL
|
||||||
|
@$(ECHO) " --with-target-bits=$(ARCH_DATA_MODEL) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifeq ($(ARCH_DATA_MODEL),32)
|
||||||
|
@$(ECHO) " --with-jvm-variants=client,server " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_PARALLEL_COMPILE_JOBS
|
||||||
|
@$(ECHO) " --with-num-cores=$(ALT_PARALLEL_COMPILE_JOBS) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_BOOTDIR
|
||||||
|
@$(ECHO) " --with-boot-jdk=$(call UnixPath,$(ALT_BOOTDIR)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_CUPS_HEADERS_PATH
|
||||||
|
@$(ECHO) " --with-cups-include=$(call UnixPath,$(ALT_CUPS_HEADERS_PATH)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_FREETYPE_HEADERS_PATH
|
||||||
|
@$(ECHO) " --with-freetype=$(call UnixPath,$(ALT_FREETYPE_HEADERS_PATH)/..) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifeq ($(HOTSPOT_AVAILABLE),false)
|
||||||
|
ifdef ALT_JDK_IMPORT_PATH
|
||||||
|
@$(ECHO) " --with-import-hotspot=$(call UnixPath,$(ALT_JDK_IMPORT_PATH)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(OPEN_BUILD),true)
|
||||||
|
@$(ECHO) " --enable-openjdk-only " >> $@.tmp
|
||||||
|
else
|
||||||
|
# Todo: move to closed?
|
||||||
|
ifdef ALT_MOZILLA_HEADERS_PATH
|
||||||
|
@$(ECHO) " --with-mozilla-headers=$(call UnixPath,$(ALT_MOZILLA_HEADERS_PATH)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_JUNIT_DIR
|
||||||
|
@$(ECHO) " --with-junit-dir=$(call UnixPath,$(ALT_JUNIT_DIR)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ANT_HOME
|
||||||
|
@$(ECHO) " --with-ant-home=$(call UnixPath,$(ANT_HOME)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_JAVAFX_ZIP_DIR
|
||||||
|
@$(ECHO) " --with-javafx-zip-dir=$(call UnixPath,$(ALT_JAVAFX_ZIP_DIR)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_WIXDIR
|
||||||
|
@$(ECHO) " --with-wix=$(call UnixPath,$(ALT_WIXDIR)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_CCSS_SIGNING_DIR
|
||||||
|
@$(ECHO) " --with-ccss-signing=$(call UnixPath,$(ALT_CCSS_SIGNING_DIR)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_SLASH_JAVA
|
||||||
|
@$(ECHO) " --with-java-devtools=$(call UnixPath,$(ALT_SLASH_JAVA)/devtools) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
ifdef ALT_SPARKLE_FRAMEWORK_DIR
|
||||||
|
@$(ECHO) " --with-sparkle-framework=$(call UnixPath,$(ALT_SPARKLE_FRAMEWORK_DIR)) " >> $@.tmp
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
@if [ -f $@ ] ; then \
|
||||||
|
if ! $(CMP) $@ $@.tmp > /dev/null ; then \
|
||||||
|
$(CP) $@.tmp $@ ; \
|
||||||
|
fi ; \
|
||||||
|
else \
|
||||||
|
$(CP) $@.tmp $@ ; \
|
||||||
|
fi
|
||||||
|
$(RM) $@.tmp
|
||||||
|
|
||||||
|
PHONY_LIST += bridge2configure bridgeBuild
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# JPRT targets
|
||||||
|
|
||||||
|
ifndef JPRT_ARCHIVE_BUNDLE
|
||||||
|
JPRT_ARCHIVE_BUNDLE=/tmp/jprt_bundles/j2sdk-image.zip
|
||||||
|
endif
|
||||||
|
ifndef JPRT_ARCHIVE_INSTALL_BUNDLE
|
||||||
|
JPRT_ARCHIVE_INSTALL_BUNDLE=/tmp/jprt_bundles/product-install.zip
|
||||||
|
endif
|
||||||
|
|
||||||
|
# These targets execute in a SPEC free context, before calling bridgeBuild
|
||||||
|
# to generate the SPEC.
|
||||||
|
jprt_build_product: DEBUG_LEVEL=release
|
||||||
|
jprt_build_product: BUILD_DIRNAME=*-release
|
||||||
|
jprt_build_product: jprt_build_generic
|
||||||
|
|
||||||
|
jprt_build_fastdebug: DEBUG_LEVEL=fastdebug
|
||||||
|
jprt_build_fastdebug: BUILD_DIRNAME=*-fastdebug
|
||||||
|
jprt_build_fastdebug: jprt_build_generic
|
||||||
|
|
||||||
|
jprt_build_debug: DEBUG_LEVEL=slowdebug
|
||||||
|
jprt_build_debug: BUILD_DIRNAME=*-debug
|
||||||
|
jprt_build_debug: jprt_build_generic
|
||||||
|
|
||||||
|
jprt_build_generic: BRIDGE_TARGETS+=jprt_bundle
|
||||||
|
jprt_build_generic: bridgeBuild
|
||||||
|
|
||||||
|
# This target must be called in the context of a SPEC file
|
||||||
|
jprt_bundle: $(JPRT_ARCHIVE_BUNDLE)
|
||||||
|
@$(call CheckIfMakeAtEnd)
|
||||||
|
|
||||||
|
# This target must be called in the context of a SPEC file
|
||||||
|
$(JPRT_ARCHIVE_BUNDLE): bundles
|
||||||
|
$(MKDIR) -p $(@D)
|
||||||
|
$(RM) $@
|
||||||
|
$(CP) $(BUILD_OUTPUT)/bundles/j2sdk-image.zip $@
|
||||||
|
|
||||||
|
# This target must be called in the context of a SPEC file
|
||||||
|
bundles: all
|
||||||
|
@$(call TargetEnter)
|
||||||
|
$(MKDIR) -p $(BUILD_OUTPUT)/bundles
|
||||||
|
ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_BITS),solaris-64)
|
||||||
|
$(CD) $(JDK_OVERLAY_IMAGE_DIR) && $(ZIP) -q -r $(BUILD_OUTPUT)/bundles/j2sdk-image.zip .
|
||||||
|
$(CD) $(JRE_OVERLAY_IMAGE_DIR) && $(ZIP) -q -r $(BUILD_OUTPUT)/bundles/j2re-image.zip .
|
||||||
|
else
|
||||||
|
$(CD) $(JDK_IMAGE_DIR) && $(ZIP) -q -r $(BUILD_OUTPUT)/bundles/j2sdk-image.zip .
|
||||||
|
$(CD) $(JRE_IMAGE_DIR) && $(ZIP) -q -r $(BUILD_OUTPUT)/bundles/j2re-image.zip .
|
||||||
|
if [ -d $(BUILD_OUTPUT)/install/bundles ] ; then \
|
||||||
|
$(CD) $(BUILD_OUTPUT)/install/bundles && $(ZIP) -q -r $(JPRT_ARCHIVE_INSTALL_BUNDLE) . ; \
|
||||||
|
fi
|
||||||
|
endif
|
||||||
|
@$(call TargetExit)
|
||||||
|
|
||||||
|
# Keep track of phony targets
|
||||||
|
PHONY_LIST += jprt_build_product jprt_build_fastdebug jprt_build_debug \
|
||||||
|
jprt_build_generic bundles jprt_bundle
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
# Phony targets
|
||||||
|
.PHONY: $(PHONY_LIST)
|
||||||
|
|
||||||
|
# Force target
|
||||||
|
FRC:
|
@ -65,7 +65,15 @@ MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS)
|
|||||||
|
|
||||||
### Main targets
|
### Main targets
|
||||||
|
|
||||||
all: jdk
|
default: jdk
|
||||||
|
@$(call CheckIfMakeAtEnd)
|
||||||
|
|
||||||
|
all: images docs
|
||||||
|
@$(call CheckIfMakeAtEnd)
|
||||||
|
|
||||||
|
ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_BITS),solaris-64)
|
||||||
|
all: overlay-images
|
||||||
|
endif
|
||||||
|
|
||||||
start-make:
|
start-make:
|
||||||
@$(call AtMakeStart)
|
@$(call AtMakeStart)
|
||||||
@ -126,12 +134,6 @@ overlay-images-only: start-make
|
|||||||
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk overlay-images)
|
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk overlay-images)
|
||||||
@$(call TargetExit)
|
@$(call TargetExit)
|
||||||
|
|
||||||
bundles: images bundles-only
|
|
||||||
bundles-only: start-make
|
|
||||||
@$(call TargetEnter)
|
|
||||||
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk bundles)
|
|
||||||
@$(call TargetExit)
|
|
||||||
|
|
||||||
install: images install-only
|
install: images install-only
|
||||||
install-only: start-make
|
install-only: start-make
|
||||||
@$(call TargetEnter)
|
@$(call TargetEnter)
|
||||||
@ -144,6 +146,12 @@ docs-only: start-make
|
|||||||
@($(CD) $(SRC_ROOT)/common/makefiles/javadoc && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs)
|
@($(CD) $(SRC_ROOT)/common/makefiles/javadoc && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs)
|
||||||
@$(call TargetExit)
|
@$(call TargetExit)
|
||||||
|
|
||||||
|
sign-jars: jdk sign-jars-only
|
||||||
|
sign-jars-only: start-make
|
||||||
|
@$(call TargetEnter)
|
||||||
|
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk sign-jars)
|
||||||
|
@$(call TargetExit)
|
||||||
|
|
||||||
bootcycle-images:
|
bootcycle-images:
|
||||||
@$(ECHO) Boot cycle build step 1: Building the JDK image normally
|
@$(ECHO) Boot cycle build step 1: Building the JDK image normally
|
||||||
@($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(SPEC) images)
|
@($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(SPEC) images)
|
||||||
|
@ -391,4 +391,46 @@ define install-file
|
|||||||
endef
|
endef
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Convenience functions for working around make's limitations with $(filter ).
|
||||||
|
containing = $(foreach v,$2,$(if $(findstring $1,$v),$v))
|
||||||
|
not-containing = $(foreach v,$2,$(if $(findstring $1,$v),,$v))
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# In Cygwin, finds are very costly, both because of expensive forks and because
|
||||||
|
# of bad file system caching. Find is used extensively in $(shell) commands to
|
||||||
|
# find source files. This makes rerunning make with no or few changes rather
|
||||||
|
# expensive. To speed this up, these two macros are used to cache the results
|
||||||
|
# of simple find commands for reuse.
|
||||||
|
#
|
||||||
|
# Runs a find and stores both the directories where it was run and the results.
|
||||||
|
# This macro can be called multiple times to add to the cache. Only finds files
|
||||||
|
# with no filters.
|
||||||
|
#
|
||||||
|
# Needs to be called with $(eval )
|
||||||
|
#
|
||||||
|
# Param 1 - Dir to find in
|
||||||
|
ifeq ($(OPENJDK_BUILD_OS),windows)
|
||||||
|
define FillCacheFind
|
||||||
|
FIND_CACHE_DIR += $1
|
||||||
|
FIND_CACHE := $$(sort $$(FIND_CACHE) $$(shell $(FIND) $1 -type f -o -type l))
|
||||||
|
endef
|
||||||
|
else
|
||||||
|
define FillCacheFind
|
||||||
|
endef
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Mimics find by looking in the cache if all of the directories have been cached.
|
||||||
|
# Otherwise reverts to shell find. This is safe to call on all platforms, even if
|
||||||
|
# cache is deactivated.
|
||||||
|
#
|
||||||
|
# The extra - is needed when FIND_CACHE_DIR is empty but should be harmless.
|
||||||
|
# Param 1 - Dirs to find in
|
||||||
|
define CacheFind
|
||||||
|
$(if $(filter-out $(addsuffix %,- $(FIND_CACHE_DIR)),$1),\
|
||||||
|
$(shell $(FIND) $1 -type f -o -type l),\
|
||||||
|
$(filter $(addsuffix %,$1),$(FIND_CACHE)))
|
||||||
|
endef
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|
||||||
endif # _MAKEBASE_GMK
|
endif # _MAKEBASE_GMK
|
||||||
|
@ -50,7 +50,7 @@ BUILDTIMESDIR=$(OUTPUT_ROOT)/tmp/buildtimes
|
|||||||
|
|
||||||
# Global targets are possible to run either with or without a SPEC. The prototypical
|
# Global targets are possible to run either with or without a SPEC. The prototypical
|
||||||
# global target is "help".
|
# global target is "help".
|
||||||
global_targets=help configure
|
global_targets=help jprt% bridgeBuild
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
# Functions
|
# Functions
|
||||||
@ -112,7 +112,7 @@ endef
|
|||||||
|
|
||||||
# Do not indent this function, this will add whitespace at the start which the caller won't handle
|
# Do not indent this function, this will add whitespace at the start which the caller won't handle
|
||||||
define GetRealTarget
|
define GetRealTarget
|
||||||
$(strip $(if $(MAKECMDGOALS),$(MAKECMDGOALS),all))
|
$(strip $(if $(MAKECMDGOALS),$(MAKECMDGOALS),default))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# Do not indent this function, this will add whitespace at the start which the caller won't handle
|
# Do not indent this function, this will add whitespace at the start which the caller won't handle
|
||||||
@ -126,10 +126,7 @@ define CheckIfMakeAtEnd
|
|||||||
# Check if the current target is the last goal
|
# Check if the current target is the last goal
|
||||||
$(if $(filter $@,$(call LastGoal)),$(call AtMakeEnd))
|
$(if $(filter $@,$(call LastGoal)),$(call AtMakeEnd))
|
||||||
# If the target is 'foo-only', check if our goal was stated as 'foo'
|
# If the target is 'foo-only', check if our goal was stated as 'foo'
|
||||||
$(if $(filter $(patsubst %-only,%,$@),$(call LastGoal)),$(call AtMakeEnd))
|
$(if $(filter $@,$(call LastGoal)-only),$(call AtMakeEnd))
|
||||||
# If no goal is given, 'all' is default, but the last target executed for all is 'jdk-only'. Check for that, too.
|
|
||||||
# At most one of the tests can be true.
|
|
||||||
$(if $(subst all,,$(call LastGoal)),,$(if $(filter $@,jdk-only),$(call AtMakeEnd)))
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# Hook to be called when starting to execute a top-level target
|
# Hook to be called when starting to execute a top-level target
|
||||||
|
@ -23,109 +23,4 @@
|
|||||||
# questions.
|
# questions.
|
||||||
#
|
#
|
||||||
|
|
||||||
# This must be the first rule
|
include ../../NewMakefile.gmk
|
||||||
all:
|
|
||||||
|
|
||||||
# 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 (,$(findstring 3.81,$(MAKE_VERSION)))
|
|
||||||
ifeq (,$(findstring 3.82,$(MAKE_VERSION)))
|
|
||||||
$(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Locate this Makefile
|
|
||||||
ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),)
|
|
||||||
makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST))
|
|
||||||
else
|
|
||||||
makefile_path:=$(lastword $(MAKEFILE_LIST))
|
|
||||||
endif
|
|
||||||
root_dir:=$(patsubst %/common/makefiles/Makefile,%,$(makefile_path))
|
|
||||||
|
|
||||||
# ... and then we can include our helper functions
|
|
||||||
include $(dir $(makefile_path))/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 $(dir $(makefile_path))/Main.gmk
|
|
||||||
else
|
|
||||||
# We are building multiple configurations.
|
|
||||||
# First, find out the valid targets
|
|
||||||
# Run the makefile with an arbitraty 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), $(strip $(shell \
|
|
||||||
$(MAKE) -p -q -f $(makefile_path) SPEC=$(firstword $(SPEC)) | \
|
|
||||||
grep ^.PHONY: | head -n 1 | cut -d " " -f 2-)))
|
|
||||||
|
|
||||||
$(all_phony_targets):
|
|
||||||
@$(foreach spec,$(SPEC),($(MAKE) -f $(makefile_path) SPEC=$(spec) $(VERBOSE) VERBOSE=$(VERBOSE) $@) &&) true
|
|
||||||
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Here are "global" targets, i.e. targets that can be executed without specifying a single configuration.
|
|
||||||
# If you addd more global targets, please update the variable global_targets in MakeHelpers.
|
|
||||||
|
|
||||||
help:
|
|
||||||
$(info )
|
|
||||||
$(info OpenJDK Makefile help)
|
|
||||||
$(info =====================)
|
|
||||||
$(info )
|
|
||||||
$(info Common make targets)
|
|
||||||
$(info . make [all] # Compile all code but do not create images)
|
|
||||||
$(info . make images # Create complete j2sdk and j2re images)
|
|
||||||
$(info . make overlay-images # Create limited images for sparc 64 bit platforms)
|
|
||||||
$(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, images or overlay-images))
|
|
||||||
$(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 )
|
|
||||||
|
|
||||||
configure:
|
|
||||||
@$(SHELL) $(root_dir)/configure $(CONFIGURE_ARGS)
|
|
||||||
@echo ====================================================
|
|
||||||
@echo "Note: This is a non-recommended way of running configure."
|
|
||||||
@echo "Instead, run 'sh configure' in the top-level directory"
|
|
||||||
|
|
||||||
.PHONY: help configure
|
|
||||||
|
@ -236,7 +236,7 @@ define SetupNativeCompilation
|
|||||||
$$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))
|
$$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))
|
||||||
|
|
||||||
# Find all files in the source trees. Sort to remove duplicates.
|
# Find all files in the source trees. Sort to remove duplicates.
|
||||||
$1_ALL_SRCS := $$(sort $$(shell $(FIND) $$($1_SRC) -type f))
|
$1_ALL_SRCS := $$(sort $$(call CacheFind,$$($1_SRC)))
|
||||||
# Extract the C/C++ files.
|
# Extract the C/C++ files.
|
||||||
$1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES)))
|
$1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES)))
|
||||||
$1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
|
$1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
|
||||||
|
@ -32,8 +32,6 @@ include MakeBase.gmk
|
|||||||
# Definitions for $(DOCSDIR), $(MKDIR), $(BINDIR), etc.
|
# Definitions for $(DOCSDIR), $(MKDIR), $(BINDIR), etc.
|
||||||
#
|
#
|
||||||
|
|
||||||
CLASSPATH_SEPARATOR = :
|
|
||||||
|
|
||||||
DOCSDIR=$(OUTPUT_ROOT)/docs
|
DOCSDIR=$(OUTPUT_ROOT)/docs
|
||||||
TEMPDIR=$(OUTPUT_ROOT)/docstemp
|
TEMPDIR=$(OUTPUT_ROOT)/docstemp
|
||||||
|
|
||||||
@ -137,7 +135,7 @@ $(FULL_COMPANY_NAME) in the US and other countries.
|
|||||||
# List of all possible directories for javadoc to look for sources
|
# List of all possible directories for javadoc to look for sources
|
||||||
# NOTE: Quotes are required around sourcepath argument only on Windows.
|
# NOTE: Quotes are required around sourcepath argument only on Windows.
|
||||||
# Otherwise, you get "No packages or classes specified." due
|
# Otherwise, you get "No packages or classes specified." due
|
||||||
# to $(CLASSPATH_SEPARATOR) being interpreted as an end of
|
# to $(PATH_SEP) being interpreted as an end of
|
||||||
# command (newline or shell ; character)
|
# command (newline or shell ; character)
|
||||||
ALL_SOURCE_DIRS = $(JDK_SHARE_CLASSES) \
|
ALL_SOURCE_DIRS = $(JDK_SHARE_CLASSES) \
|
||||||
$(JDK_IMPSRC) \
|
$(JDK_IMPSRC) \
|
||||||
@ -154,7 +152,7 @@ ALL_EXISTING_SOURCE_DIRS := $(wildcard $(ALL_SOURCE_DIRS))
|
|||||||
EMPTY:=
|
EMPTY:=
|
||||||
SPACE:= $(EMPTY) $(EMPTY)
|
SPACE:= $(EMPTY) $(EMPTY)
|
||||||
RELEASEDOCS_SOURCEPATH = \
|
RELEASEDOCS_SOURCEPATH = \
|
||||||
$(subst $(SPACE),$(CLASSPATH_SEPARATOR),$(strip $(ALL_SOURCE_DIRS)))
|
$(subst $(SPACE),$(PATH_SEP),$(strip $(ALL_SOURCE_DIRS)))
|
||||||
|
|
||||||
define prep-target
|
define prep-target
|
||||||
$(MKDIR) -p $(@D)
|
$(MKDIR) -p $(@D)
|
||||||
|
@ -29,6 +29,29 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
|
void report_error()
|
||||||
|
{
|
||||||
|
LPVOID lpMsgBuf;
|
||||||
|
DWORD dw = GetLastError();
|
||||||
|
|
||||||
|
FormatMessage(
|
||||||
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||||
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
NULL,
|
||||||
|
dw,
|
||||||
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
|
(LPTSTR) &lpMsgBuf,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
"Could not start process! Failed with error %d: %s\n",
|
||||||
|
dw, lpMsgBuf);
|
||||||
|
|
||||||
|
LocalFree(lpMsgBuf);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test if pos points to /cygdrive/_/ where _ can
|
* Test if pos points to /cygdrive/_/ where _ can
|
||||||
* be any character.
|
* be any character.
|
||||||
@ -256,7 +279,7 @@ int main(int argc, char **argv)
|
|||||||
DWORD exitCode;
|
DWORD exitCode;
|
||||||
|
|
||||||
if (argc<3 || argv[1][0] != '-' || (argv[1][1] != 'c' && argv[1][1] != 'm')) {
|
if (argc<3 || argv[1][0] != '-' || (argv[1][1] != 'c' && argv[1][1] != 'm')) {
|
||||||
fprintf(stderr, "Usage: fixpath -c|m<path@path@...> /cygdrive/c/WINDOWS/notepad.exe /cygdrive/c/x/test.txt");
|
fprintf(stderr, "Usage: fixpath -c|m<path@path@...> /cygdrive/c/WINDOWS/notepad.exe /cygdrive/c/x/test.txt\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,11 +331,10 @@ int main(int argc, char **argv)
|
|||||||
0,
|
0,
|
||||||
&si,
|
&si,
|
||||||
&pi);
|
&pi);
|
||||||
if(!rc)
|
if(!rc) {
|
||||||
{
|
// Could not start process for some reason. Try to report why:
|
||||||
//Could not start process;
|
report_error();
|
||||||
fprintf(stderr, "Could not start process!\n");
|
exit(rc);
|
||||||
exit(-1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WaitForSingleObject(pi.hProcess,INFINITE);
|
WaitForSingleObject(pi.hProcess,INFINITE);
|
||||||
|
@ -194,3 +194,4 @@ d54dc53e223ed9ce7d5f4d2cd02ad9d5def3c2db jdk8-b59
|
|||||||
603cceb495c8133d47b26a7502d51c7d8a67d76b jdk8-b70
|
603cceb495c8133d47b26a7502d51c7d8a67d76b jdk8-b70
|
||||||
8171d23e914d758836527b80b06debcfdb718f2d jdk8-b71
|
8171d23e914d758836527b80b06debcfdb718f2d jdk8-b71
|
||||||
cb40427f47145b01b7e53c3e02b38ff7625efbda jdk8-b72
|
cb40427f47145b01b7e53c3e02b38ff7625efbda jdk8-b72
|
||||||
|
191afde59e7be0e1a1d76d06f2a32ff17444f0ec jdk8-b73
|
||||||
|
@ -306,3 +306,5 @@ cb8a4e04bc8c104de8a2f67463c7e31232bf8d68 jdk8-b69
|
|||||||
e94068d4ff52849c8aa0786a53a59b63d1312a39 jdk8-b70
|
e94068d4ff52849c8aa0786a53a59b63d1312a39 jdk8-b70
|
||||||
0847210f85480bf3848dc90bc2ab23c0a4791b55 jdk8-b71
|
0847210f85480bf3848dc90bc2ab23c0a4791b55 jdk8-b71
|
||||||
d5cb5830f570d1304ea4b196dde672a291b55f29 jdk8-b72
|
d5cb5830f570d1304ea4b196dde672a291b55f29 jdk8-b72
|
||||||
|
1e129851479e4f5df439109fca2c7be1f1613522 hs25-b15
|
||||||
|
11619f33cd683c2f1d6ef72f1c6ff3dacf5a9f1c jdk8-b73
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# @(#)mapfile-vers-debug 1.18 07/10/25 16:47:35
|
# @(#)mapfile-vers-debug 1.18 07/10/25 16:47:35
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -126,8 +126,9 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetClassModifiers;
|
JVM_GetClassModifiers;
|
||||||
JVM_GetClassName;
|
JVM_GetClassName;
|
||||||
JVM_GetClassNameUTF;
|
JVM_GetClassNameUTF;
|
||||||
JVM_GetClassSignature;
|
JVM_GetClassSignature;
|
||||||
JVM_GetClassSigners;
|
JVM_GetClassSigners;
|
||||||
|
JVM_GetClassTypeAnnotations;
|
||||||
JVM_GetComponentType;
|
JVM_GetComponentType;
|
||||||
JVM_GetDeclaredClasses;
|
JVM_GetDeclaredClasses;
|
||||||
JVM_GetDeclaringClass;
|
JVM_GetDeclaringClass;
|
||||||
@ -154,6 +155,7 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetMethodIxNameUTF;
|
JVM_GetMethodIxNameUTF;
|
||||||
JVM_GetMethodIxSignatureUTF;
|
JVM_GetMethodIxSignatureUTF;
|
||||||
JVM_GetMethodParameterAnnotations;
|
JVM_GetMethodParameterAnnotations;
|
||||||
|
JVM_GetMethodParameters;
|
||||||
JVM_GetPrimitiveArrayElement;
|
JVM_GetPrimitiveArrayElement;
|
||||||
JVM_GetProtectionDomain;
|
JVM_GetProtectionDomain;
|
||||||
JVM_GetSockName;
|
JVM_GetSockName;
|
||||||
@ -283,7 +285,7 @@ SUNWprivate_1.1 {
|
|||||||
# This is for Forte Analyzer profiling support.
|
# This is for Forte Analyzer profiling support.
|
||||||
AsyncGetCallTrace;
|
AsyncGetCallTrace;
|
||||||
|
|
||||||
# INSERT VTABLE SYMBOLS HERE
|
# INSERT VTABLE SYMBOLS HERE
|
||||||
|
|
||||||
local:
|
local:
|
||||||
*;
|
*;
|
||||||
|
@ -128,6 +128,7 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetClassNameUTF;
|
JVM_GetClassNameUTF;
|
||||||
JVM_GetClassSignature;
|
JVM_GetClassSignature;
|
||||||
JVM_GetClassSigners;
|
JVM_GetClassSigners;
|
||||||
|
JVM_GetClassTypeAnnotations;
|
||||||
JVM_GetComponentType;
|
JVM_GetComponentType;
|
||||||
JVM_GetDeclaredClasses;
|
JVM_GetDeclaredClasses;
|
||||||
JVM_GetDeclaringClass;
|
JVM_GetDeclaringClass;
|
||||||
@ -154,6 +155,7 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetMethodIxNameUTF;
|
JVM_GetMethodIxNameUTF;
|
||||||
JVM_GetMethodIxSignatureUTF;
|
JVM_GetMethodIxSignatureUTF;
|
||||||
JVM_GetMethodParameterAnnotations;
|
JVM_GetMethodParameterAnnotations;
|
||||||
|
JVM_GetMethodParameters;
|
||||||
JVM_GetPrimitiveArrayElement;
|
JVM_GetPrimitiveArrayElement;
|
||||||
JVM_GetProtectionDomain;
|
JVM_GetProtectionDomain;
|
||||||
JVM_GetSockName;
|
JVM_GetSockName;
|
||||||
|
@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2012
|
|||||||
|
|
||||||
HS_MAJOR_VER=25
|
HS_MAJOR_VER=25
|
||||||
HS_MINOR_VER=0
|
HS_MINOR_VER=0
|
||||||
HS_BUILD_NUMBER=14
|
HS_BUILD_NUMBER=15
|
||||||
|
|
||||||
JDK_MAJOR_VER=1
|
JDK_MAJOR_VER=1
|
||||||
JDK_MINOR_VER=8
|
JDK_MINOR_VER=8
|
||||||
|
@ -124,6 +124,7 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetClassNameUTF;
|
JVM_GetClassNameUTF;
|
||||||
JVM_GetClassSignature;
|
JVM_GetClassSignature;
|
||||||
JVM_GetClassSigners;
|
JVM_GetClassSigners;
|
||||||
|
JVM_GetClassTypeAnnotations;
|
||||||
JVM_GetComponentType;
|
JVM_GetComponentType;
|
||||||
JVM_GetDeclaredClasses;
|
JVM_GetDeclaredClasses;
|
||||||
JVM_GetDeclaringClass;
|
JVM_GetDeclaringClass;
|
||||||
@ -150,6 +151,7 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetMethodIxNameUTF;
|
JVM_GetMethodIxNameUTF;
|
||||||
JVM_GetMethodIxSignatureUTF;
|
JVM_GetMethodIxSignatureUTF;
|
||||||
JVM_GetMethodParameterAnnotations;
|
JVM_GetMethodParameterAnnotations;
|
||||||
|
JVM_GetMethodParameters;
|
||||||
JVM_GetPrimitiveArrayElement;
|
JVM_GetPrimitiveArrayElement;
|
||||||
JVM_GetProtectionDomain;
|
JVM_GetProtectionDomain;
|
||||||
JVM_GetSockName;
|
JVM_GetSockName;
|
||||||
|
@ -124,6 +124,7 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetClassNameUTF;
|
JVM_GetClassNameUTF;
|
||||||
JVM_GetClassSignature;
|
JVM_GetClassSignature;
|
||||||
JVM_GetClassSigners;
|
JVM_GetClassSigners;
|
||||||
|
JVM_GetClassTypeAnnotations;
|
||||||
JVM_GetComponentType;
|
JVM_GetComponentType;
|
||||||
JVM_GetDeclaredClasses;
|
JVM_GetDeclaredClasses;
|
||||||
JVM_GetDeclaringClass;
|
JVM_GetDeclaringClass;
|
||||||
@ -150,6 +151,7 @@ SUNWprivate_1.1 {
|
|||||||
JVM_GetMethodIxNameUTF;
|
JVM_GetMethodIxNameUTF;
|
||||||
JVM_GetMethodIxSignatureUTF;
|
JVM_GetMethodIxSignatureUTF;
|
||||||
JVM_GetMethodParameterAnnotations;
|
JVM_GetMethodParameterAnnotations;
|
||||||
|
JVM_GetMethodParameters;
|
||||||
JVM_GetPrimitiveArrayElement;
|
JVM_GetPrimitiveArrayElement;
|
||||||
JVM_GetProtectionDomain;
|
JVM_GetProtectionDomain;
|
||||||
JVM_GetSockName;
|
JVM_GetSockName;
|
||||||
|
@ -26,235 +26,237 @@
|
|||||||
|
|
||||||
SUNWprivate_1.1 {
|
SUNWprivate_1.1 {
|
||||||
global:
|
global:
|
||||||
# JNI
|
# JNI
|
||||||
JNI_CreateJavaVM;
|
JNI_CreateJavaVM;
|
||||||
JNI_GetCreatedJavaVMs;
|
JNI_GetCreatedJavaVMs;
|
||||||
JNI_GetDefaultJavaVMInitArgs;
|
JNI_GetDefaultJavaVMInitArgs;
|
||||||
|
|
||||||
# JVM
|
# JVM
|
||||||
JVM_Accept;
|
JVM_Accept;
|
||||||
JVM_ActiveProcessorCount;
|
JVM_ActiveProcessorCount;
|
||||||
JVM_AllocateNewArray;
|
JVM_AllocateNewArray;
|
||||||
JVM_AllocateNewObject;
|
JVM_AllocateNewObject;
|
||||||
JVM_ArrayCopy;
|
JVM_ArrayCopy;
|
||||||
JVM_AssertionStatusDirectives;
|
JVM_AssertionStatusDirectives;
|
||||||
JVM_Available;
|
JVM_Available;
|
||||||
JVM_Bind;
|
JVM_Bind;
|
||||||
JVM_ClassDepth;
|
JVM_ClassDepth;
|
||||||
JVM_ClassLoaderDepth;
|
JVM_ClassLoaderDepth;
|
||||||
JVM_Clone;
|
JVM_Clone;
|
||||||
JVM_Close;
|
JVM_Close;
|
||||||
JVM_CX8Field;
|
JVM_CX8Field;
|
||||||
JVM_CompileClass;
|
JVM_CompileClass;
|
||||||
JVM_CompileClasses;
|
JVM_CompileClasses;
|
||||||
JVM_CompilerCommand;
|
JVM_CompilerCommand;
|
||||||
JVM_Connect;
|
JVM_Connect;
|
||||||
JVM_ConstantPoolGetClassAt;
|
JVM_ConstantPoolGetClassAt;
|
||||||
JVM_ConstantPoolGetClassAtIfLoaded;
|
JVM_ConstantPoolGetClassAtIfLoaded;
|
||||||
JVM_ConstantPoolGetDoubleAt;
|
JVM_ConstantPoolGetDoubleAt;
|
||||||
JVM_ConstantPoolGetFieldAt;
|
JVM_ConstantPoolGetFieldAt;
|
||||||
JVM_ConstantPoolGetFieldAtIfLoaded;
|
JVM_ConstantPoolGetFieldAtIfLoaded;
|
||||||
JVM_ConstantPoolGetFloatAt;
|
JVM_ConstantPoolGetFloatAt;
|
||||||
JVM_ConstantPoolGetIntAt;
|
JVM_ConstantPoolGetIntAt;
|
||||||
JVM_ConstantPoolGetLongAt;
|
JVM_ConstantPoolGetLongAt;
|
||||||
JVM_ConstantPoolGetMethodAt;
|
JVM_ConstantPoolGetMethodAt;
|
||||||
JVM_ConstantPoolGetMethodAtIfLoaded;
|
JVM_ConstantPoolGetMethodAtIfLoaded;
|
||||||
JVM_ConstantPoolGetMemberRefInfoAt;
|
JVM_ConstantPoolGetMemberRefInfoAt;
|
||||||
JVM_ConstantPoolGetSize;
|
JVM_ConstantPoolGetSize;
|
||||||
JVM_ConstantPoolGetStringAt;
|
JVM_ConstantPoolGetStringAt;
|
||||||
JVM_ConstantPoolGetUTF8At;
|
JVM_ConstantPoolGetUTF8At;
|
||||||
JVM_CountStackFrames;
|
JVM_CountStackFrames;
|
||||||
JVM_CurrentClassLoader;
|
JVM_CurrentClassLoader;
|
||||||
JVM_CurrentLoadedClass;
|
JVM_CurrentLoadedClass;
|
||||||
JVM_CurrentThread;
|
JVM_CurrentThread;
|
||||||
JVM_CurrentTimeMillis;
|
JVM_CurrentTimeMillis;
|
||||||
JVM_DefineClass;
|
JVM_DefineClass;
|
||||||
JVM_DefineClassWithSource;
|
JVM_DefineClassWithSource;
|
||||||
JVM_DefineClassWithSourceCond;
|
JVM_DefineClassWithSourceCond;
|
||||||
JVM_DesiredAssertionStatus;
|
JVM_DesiredAssertionStatus;
|
||||||
JVM_DisableCompiler;
|
JVM_DisableCompiler;
|
||||||
JVM_DoPrivileged;
|
JVM_DoPrivileged;
|
||||||
JVM_DTraceGetVersion;
|
JVM_DTraceGetVersion;
|
||||||
JVM_DTraceActivate;
|
JVM_DTraceActivate;
|
||||||
JVM_DTraceIsProbeEnabled;
|
JVM_DTraceIsProbeEnabled;
|
||||||
JVM_DTraceIsSupported;
|
JVM_DTraceIsSupported;
|
||||||
JVM_DTraceDispose;
|
JVM_DTraceDispose;
|
||||||
JVM_DumpAllStacks;
|
JVM_DumpAllStacks;
|
||||||
JVM_DumpThreads;
|
JVM_DumpThreads;
|
||||||
JVM_EnableCompiler;
|
JVM_EnableCompiler;
|
||||||
JVM_Exit;
|
JVM_Exit;
|
||||||
JVM_FillInStackTrace;
|
JVM_FillInStackTrace;
|
||||||
JVM_FindClassFromClass;
|
JVM_FindClassFromClass;
|
||||||
JVM_FindClassFromClassLoader;
|
JVM_FindClassFromClassLoader;
|
||||||
JVM_FindClassFromBootLoader;
|
JVM_FindClassFromBootLoader;
|
||||||
JVM_FindLibraryEntry;
|
JVM_FindLibraryEntry;
|
||||||
JVM_FindLoadedClass;
|
JVM_FindLoadedClass;
|
||||||
JVM_FindPrimitiveClass;
|
JVM_FindPrimitiveClass;
|
||||||
JVM_FindSignal;
|
JVM_FindSignal;
|
||||||
JVM_FreeMemory;
|
JVM_FreeMemory;
|
||||||
JVM_GC;
|
JVM_GC;
|
||||||
JVM_GetAllThreads;
|
JVM_GetAllThreads;
|
||||||
JVM_GetArrayElement;
|
JVM_GetArrayElement;
|
||||||
JVM_GetArrayLength;
|
JVM_GetArrayLength;
|
||||||
JVM_GetCPClassNameUTF;
|
JVM_GetCPClassNameUTF;
|
||||||
JVM_GetCPFieldClassNameUTF;
|
JVM_GetCPFieldClassNameUTF;
|
||||||
JVM_GetCPFieldModifiers;
|
JVM_GetCPFieldModifiers;
|
||||||
JVM_GetCPFieldNameUTF;
|
JVM_GetCPFieldNameUTF;
|
||||||
JVM_GetCPFieldSignatureUTF;
|
JVM_GetCPFieldSignatureUTF;
|
||||||
JVM_GetCPMethodClassNameUTF;
|
JVM_GetCPMethodClassNameUTF;
|
||||||
JVM_GetCPMethodModifiers;
|
JVM_GetCPMethodModifiers;
|
||||||
JVM_GetCPMethodNameUTF;
|
JVM_GetCPMethodNameUTF;
|
||||||
JVM_GetCPMethodSignatureUTF;
|
JVM_GetCPMethodSignatureUTF;
|
||||||
JVM_GetCallerClass;
|
JVM_GetCallerClass;
|
||||||
JVM_GetClassAccessFlags;
|
JVM_GetClassAccessFlags;
|
||||||
JVM_GetClassAnnotations;
|
JVM_GetClassAnnotations;
|
||||||
JVM_GetClassCPEntriesCount;
|
JVM_GetClassCPEntriesCount;
|
||||||
JVM_GetClassCPTypes;
|
JVM_GetClassCPTypes;
|
||||||
JVM_GetClassConstantPool;
|
JVM_GetClassConstantPool;
|
||||||
JVM_GetClassContext;
|
JVM_GetClassContext;
|
||||||
JVM_GetClassDeclaredConstructors;
|
JVM_GetClassDeclaredConstructors;
|
||||||
JVM_GetClassDeclaredFields;
|
JVM_GetClassDeclaredFields;
|
||||||
JVM_GetClassDeclaredMethods;
|
JVM_GetClassDeclaredMethods;
|
||||||
JVM_GetClassFieldsCount;
|
JVM_GetClassFieldsCount;
|
||||||
JVM_GetClassInterfaces;
|
JVM_GetClassInterfaces;
|
||||||
JVM_GetClassLoader;
|
JVM_GetClassLoader;
|
||||||
JVM_GetClassMethodsCount;
|
JVM_GetClassMethodsCount;
|
||||||
JVM_GetClassModifiers;
|
JVM_GetClassModifiers;
|
||||||
JVM_GetClassName;
|
JVM_GetClassName;
|
||||||
JVM_GetClassNameUTF;
|
JVM_GetClassNameUTF;
|
||||||
JVM_GetClassSignature;
|
JVM_GetClassSignature;
|
||||||
JVM_GetClassSigners;
|
JVM_GetClassSigners;
|
||||||
JVM_GetComponentType;
|
JVM_GetComponentType;
|
||||||
JVM_GetDeclaredClasses;
|
JVM_GetClassTypeAnnotations;
|
||||||
JVM_GetDeclaringClass;
|
JVM_GetDeclaredClasses;
|
||||||
JVM_GetEnclosingMethodInfo;
|
JVM_GetDeclaringClass;
|
||||||
JVM_GetFieldAnnotations;
|
JVM_GetEnclosingMethodInfo;
|
||||||
JVM_GetFieldIxModifiers;
|
JVM_GetFieldAnnotations;
|
||||||
JVM_GetHostName;
|
JVM_GetFieldIxModifiers;
|
||||||
JVM_GetInheritedAccessControlContext;
|
JVM_GetHostName;
|
||||||
JVM_GetInterfaceVersion;
|
JVM_GetInheritedAccessControlContext;
|
||||||
JVM_GetLastErrorString;
|
JVM_GetInterfaceVersion;
|
||||||
JVM_GetManagement;
|
JVM_GetLastErrorString;
|
||||||
JVM_GetMethodAnnotations;
|
JVM_GetManagement;
|
||||||
JVM_GetMethodDefaultAnnotationValue;
|
JVM_GetMethodAnnotations;
|
||||||
JVM_GetMethodIxArgsSize;
|
JVM_GetMethodDefaultAnnotationValue;
|
||||||
JVM_GetMethodIxByteCode;
|
JVM_GetMethodIxArgsSize;
|
||||||
JVM_GetMethodIxByteCodeLength;
|
JVM_GetMethodIxByteCode;
|
||||||
JVM_GetMethodIxExceptionIndexes;
|
JVM_GetMethodIxByteCodeLength;
|
||||||
JVM_GetMethodIxExceptionTableEntry;
|
JVM_GetMethodIxExceptionIndexes;
|
||||||
JVM_GetMethodIxExceptionTableLength;
|
JVM_GetMethodIxExceptionTableEntry;
|
||||||
JVM_GetMethodIxExceptionsCount;
|
JVM_GetMethodIxExceptionTableLength;
|
||||||
JVM_GetMethodIxLocalsCount;
|
JVM_GetMethodIxExceptionsCount;
|
||||||
JVM_GetMethodIxMaxStack;
|
JVM_GetMethodIxLocalsCount;
|
||||||
JVM_GetMethodIxModifiers;
|
JVM_GetMethodIxMaxStack;
|
||||||
JVM_GetMethodIxNameUTF;
|
JVM_GetMethodIxModifiers;
|
||||||
JVM_GetMethodIxSignatureUTF;
|
JVM_GetMethodIxNameUTF;
|
||||||
JVM_GetMethodParameterAnnotations;
|
JVM_GetMethodIxSignatureUTF;
|
||||||
JVM_GetPrimitiveArrayElement;
|
JVM_GetMethodParameterAnnotations;
|
||||||
JVM_GetProtectionDomain;
|
JVM_GetMethodParameters;
|
||||||
JVM_GetSockName;
|
JVM_GetPrimitiveArrayElement;
|
||||||
JVM_GetSockOpt;
|
JVM_GetProtectionDomain;
|
||||||
JVM_GetStackAccessControlContext;
|
JVM_GetSockName;
|
||||||
JVM_GetStackTraceDepth;
|
JVM_GetSockOpt;
|
||||||
JVM_GetStackTraceElement;
|
JVM_GetStackAccessControlContext;
|
||||||
JVM_GetSystemPackage;
|
JVM_GetStackTraceDepth;
|
||||||
JVM_GetSystemPackages;
|
JVM_GetStackTraceElement;
|
||||||
JVM_GetThreadStateNames;
|
JVM_GetSystemPackage;
|
||||||
JVM_GetThreadStateValues;
|
JVM_GetSystemPackages;
|
||||||
JVM_GetVersionInfo;
|
JVM_GetThreadStateNames;
|
||||||
JVM_Halt;
|
JVM_GetThreadStateValues;
|
||||||
JVM_HoldsLock;
|
JVM_GetVersionInfo;
|
||||||
JVM_IHashCode;
|
JVM_Halt;
|
||||||
JVM_InitAgentProperties;
|
JVM_HoldsLock;
|
||||||
JVM_InitProperties;
|
JVM_IHashCode;
|
||||||
JVM_InitializeCompiler;
|
JVM_InitAgentProperties;
|
||||||
JVM_InitializeSocketLibrary;
|
JVM_InitProperties;
|
||||||
JVM_InternString;
|
JVM_InitializeCompiler;
|
||||||
JVM_Interrupt;
|
JVM_InitializeSocketLibrary;
|
||||||
JVM_InvokeMethod;
|
JVM_InternString;
|
||||||
JVM_IsArrayClass;
|
JVM_Interrupt;
|
||||||
JVM_IsConstructorIx;
|
JVM_InvokeMethod;
|
||||||
JVM_IsInterface;
|
JVM_IsArrayClass;
|
||||||
JVM_IsInterrupted;
|
JVM_IsConstructorIx;
|
||||||
JVM_IsNaN;
|
JVM_IsInterface;
|
||||||
JVM_IsPrimitiveClass;
|
JVM_IsInterrupted;
|
||||||
JVM_IsSameClassPackage;
|
JVM_IsNaN;
|
||||||
JVM_IsSilentCompiler;
|
JVM_IsPrimitiveClass;
|
||||||
JVM_IsSupportedJNIVersion;
|
JVM_IsSameClassPackage;
|
||||||
JVM_IsThreadAlive;
|
JVM_IsSilentCompiler;
|
||||||
JVM_LatestUserDefinedLoader;
|
JVM_IsSupportedJNIVersion;
|
||||||
JVM_Listen;
|
JVM_IsThreadAlive;
|
||||||
JVM_LoadClass0;
|
JVM_LatestUserDefinedLoader;
|
||||||
JVM_LoadLibrary;
|
JVM_Listen;
|
||||||
JVM_Lseek;
|
JVM_LoadClass0;
|
||||||
JVM_MaxObjectInspectionAge;
|
JVM_LoadLibrary;
|
||||||
JVM_MaxMemory;
|
JVM_Lseek;
|
||||||
JVM_MonitorNotify;
|
JVM_MaxObjectInspectionAge;
|
||||||
JVM_MonitorNotifyAll;
|
JVM_MaxMemory;
|
||||||
JVM_MonitorWait;
|
JVM_MonitorNotify;
|
||||||
JVM_NativePath;
|
JVM_MonitorNotifyAll;
|
||||||
JVM_NanoTime;
|
JVM_MonitorWait;
|
||||||
JVM_NewArray;
|
JVM_NativePath;
|
||||||
JVM_NewInstanceFromConstructor;
|
JVM_NanoTime;
|
||||||
JVM_NewMultiArray;
|
JVM_NewArray;
|
||||||
JVM_OnExit;
|
JVM_NewInstanceFromConstructor;
|
||||||
JVM_Open;
|
JVM_NewMultiArray;
|
||||||
JVM_PrintStackTrace;
|
JVM_OnExit;
|
||||||
JVM_RaiseSignal;
|
JVM_Open;
|
||||||
JVM_RawMonitorCreate;
|
JVM_PrintStackTrace;
|
||||||
JVM_RawMonitorDestroy;
|
JVM_RaiseSignal;
|
||||||
JVM_RawMonitorEnter;
|
JVM_RawMonitorCreate;
|
||||||
JVM_RawMonitorExit;
|
JVM_RawMonitorDestroy;
|
||||||
JVM_Read;
|
JVM_RawMonitorEnter;
|
||||||
JVM_Recv;
|
JVM_RawMonitorExit;
|
||||||
JVM_RecvFrom;
|
JVM_Read;
|
||||||
JVM_RegisterSignal;
|
JVM_Recv;
|
||||||
JVM_ReleaseUTF;
|
JVM_RecvFrom;
|
||||||
JVM_ResolveClass;
|
JVM_RegisterSignal;
|
||||||
JVM_ResumeThread;
|
JVM_ReleaseUTF;
|
||||||
JVM_Send;
|
JVM_ResolveClass;
|
||||||
JVM_SendTo;
|
JVM_ResumeThread;
|
||||||
JVM_SetArrayElement;
|
JVM_Send;
|
||||||
JVM_SetClassSigners;
|
JVM_SendTo;
|
||||||
JVM_SetLength;
|
JVM_SetArrayElement;
|
||||||
|
JVM_SetClassSigners;
|
||||||
|
JVM_SetLength;
|
||||||
JVM_SetNativeThreadName;
|
JVM_SetNativeThreadName;
|
||||||
JVM_SetPrimitiveArrayElement;
|
JVM_SetPrimitiveArrayElement;
|
||||||
JVM_SetProtectionDomain;
|
JVM_SetProtectionDomain;
|
||||||
JVM_SetSockOpt;
|
JVM_SetSockOpt;
|
||||||
JVM_SetThreadPriority;
|
JVM_SetThreadPriority;
|
||||||
JVM_Sleep;
|
JVM_Sleep;
|
||||||
JVM_Socket;
|
JVM_Socket;
|
||||||
JVM_SocketAvailable;
|
JVM_SocketAvailable;
|
||||||
JVM_SocketClose;
|
JVM_SocketClose;
|
||||||
JVM_SocketShutdown;
|
JVM_SocketShutdown;
|
||||||
JVM_StartThread;
|
JVM_StartThread;
|
||||||
JVM_StopThread;
|
JVM_StopThread;
|
||||||
JVM_SuspendThread;
|
JVM_SuspendThread;
|
||||||
JVM_SupportsCX8;
|
JVM_SupportsCX8;
|
||||||
JVM_Sync;
|
JVM_Sync;
|
||||||
JVM_Timeout;
|
JVM_Timeout;
|
||||||
JVM_TotalMemory;
|
JVM_TotalMemory;
|
||||||
JVM_TraceInstructions;
|
JVM_TraceInstructions;
|
||||||
JVM_TraceMethodCalls;
|
JVM_TraceMethodCalls;
|
||||||
JVM_UnloadLibrary;
|
JVM_UnloadLibrary;
|
||||||
JVM_Write;
|
JVM_Write;
|
||||||
JVM_Yield;
|
JVM_Yield;
|
||||||
JVM_handle_solaris_signal;
|
JVM_handle_solaris_signal;
|
||||||
|
|
||||||
# miscellaneous functions
|
# miscellaneous functions
|
||||||
jio_fprintf;
|
jio_fprintf;
|
||||||
jio_printf;
|
jio_printf;
|
||||||
jio_snprintf;
|
jio_snprintf;
|
||||||
jio_vfprintf;
|
jio_vfprintf;
|
||||||
jio_vsnprintf;
|
jio_vsnprintf;
|
||||||
|
|
||||||
# Needed because there is no JVM interface for this.
|
# Needed because there is no JVM interface for this.
|
||||||
sysThreadAvailableStackWithSlack;
|
sysThreadAvailableStackWithSlack;
|
||||||
|
|
||||||
# This is for Forte Analyzer profiling support.
|
# This is for Forte Analyzer profiling support.
|
||||||
AsyncGetCallTrace;
|
AsyncGetCallTrace;
|
||||||
|
|
||||||
# INSERT VTABLE SYMBOLS HERE
|
# INSERT VTABLE SYMBOLS HERE
|
||||||
|
|
||||||
local:
|
local:
|
||||||
*;
|
*;
|
||||||
|
@ -675,8 +675,8 @@ public:
|
|||||||
AbstractAssembler::flush();
|
AbstractAssembler::flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void emit_long(int); // shadows AbstractAssembler::emit_long
|
inline void emit_int32(int); // shadows AbstractAssembler::emit_int32
|
||||||
inline void emit_data(int x) { emit_long(x); }
|
inline void emit_data(int x) { emit_int32(x); }
|
||||||
inline void emit_data(int, RelocationHolder const&);
|
inline void emit_data(int, RelocationHolder const&);
|
||||||
inline void emit_data(int, relocInfo::relocType rtype);
|
inline void emit_data(int, relocInfo::relocType rtype);
|
||||||
// helper for above fcns
|
// helper for above fcns
|
||||||
@ -691,12 +691,12 @@ public:
|
|||||||
inline void add(Register s1, Register s2, Register d );
|
inline void add(Register s1, Register s2, Register d );
|
||||||
inline void add(Register s1, int simm13a, Register d );
|
inline void add(Register s1, int simm13a, Register d );
|
||||||
|
|
||||||
void addcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void addcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void addcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void addcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void addc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 ) | rs1(s1) | rs2(s2) ); }
|
void addc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void addc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void addc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void addccc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void addccc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void addccc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void addccc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
|
|
||||||
// pp 136
|
// pp 136
|
||||||
@ -749,76 +749,76 @@ public:
|
|||||||
// at address s1 is swapped with the data in d. If the values are not equal,
|
// at address s1 is swapped with the data in d. If the values are not equal,
|
||||||
// the the contents of memory at s1 is loaded into d, without the swap.
|
// the the contents of memory at s1 is loaded into d, without the swap.
|
||||||
|
|
||||||
void casa( Register s1, Register s2, Register d, int ia = -1 ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(casa_op3 ) | rs1(s1) | (ia == -1 ? immed(true) : imm_asi(ia)) | rs2(s2)); }
|
void casa( Register s1, Register s2, Register d, int ia = -1 ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(casa_op3 ) | rs1(s1) | (ia == -1 ? immed(true) : imm_asi(ia)) | rs2(s2)); }
|
||||||
void casxa( Register s1, Register s2, Register d, int ia = -1 ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(casxa_op3) | rs1(s1) | (ia == -1 ? immed(true) : imm_asi(ia)) | rs2(s2)); }
|
void casxa( Register s1, Register s2, Register d, int ia = -1 ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(casxa_op3) | rs1(s1) | (ia == -1 ? immed(true) : imm_asi(ia)) | rs2(s2)); }
|
||||||
|
|
||||||
// pp 152
|
// pp 152
|
||||||
|
|
||||||
void udiv( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 ) | rs1(s1) | rs2(s2)); }
|
void udiv( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3 ) | rs1(s1) | rs2(s2)); }
|
||||||
void udiv( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void udiv( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void sdiv( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 ) | rs1(s1) | rs2(s2)); }
|
void sdiv( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3 ) | rs1(s1) | rs2(s2)); }
|
||||||
void sdiv( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void sdiv( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void udivcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
|
void udivcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
|
||||||
void udivcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void udivcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void sdivcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
|
void sdivcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
|
||||||
void sdivcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void sdivcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 155
|
// pp 155
|
||||||
|
|
||||||
void done() { v9_only(); cti(); emit_long( op(arith_op) | fcn(0) | op3(done_op3) ); }
|
void done() { v9_only(); cti(); emit_int32( op(arith_op) | fcn(0) | op3(done_op3) ); }
|
||||||
void retry() { v9_only(); cti(); emit_long( op(arith_op) | fcn(1) | op3(retry_op3) ); }
|
void retry() { v9_only(); cti(); emit_int32( op(arith_op) | fcn(1) | op3(retry_op3) ); }
|
||||||
|
|
||||||
// pp 156
|
// pp 156
|
||||||
|
|
||||||
void fadd( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x40 + w) | fs2(s2, w)); }
|
void fadd( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x40 + w) | fs2(s2, w)); }
|
||||||
void fsub( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x44 + w) | fs2(s2, w)); }
|
void fsub( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x44 + w) | fs2(s2, w)); }
|
||||||
|
|
||||||
// pp 157
|
// pp 157
|
||||||
|
|
||||||
void fcmp( FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { v8_no_cc(cc); emit_long( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x50 + w) | fs2(s2, w)); }
|
void fcmp( FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { v8_no_cc(cc); emit_int32( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x50 + w) | fs2(s2, w)); }
|
||||||
void fcmpe( FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { v8_no_cc(cc); emit_long( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x54 + w) | fs2(s2, w)); }
|
void fcmpe( FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { v8_no_cc(cc); emit_int32( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x54 + w) | fs2(s2, w)); }
|
||||||
|
|
||||||
// pp 159
|
// pp 159
|
||||||
|
|
||||||
void ftox( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(fpop1_op3) | opf(0x80 + w) | fs2(s, w)); }
|
void ftox( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(fpop1_op3) | opf(0x80 + w) | fs2(s, w)); }
|
||||||
void ftoi( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(fpop1_op3) | opf(0xd0 + w) | fs2(s, w)); }
|
void ftoi( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(fpop1_op3) | opf(0xd0 + w) | fs2(s, w)); }
|
||||||
|
|
||||||
// pp 160
|
// pp 160
|
||||||
|
|
||||||
void ftof( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | opf(0xc0 + sw + dw*4) | fs2(s, sw)); }
|
void ftof( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | opf(0xc0 + sw + dw*4) | fs2(s, sw)); }
|
||||||
|
|
||||||
// pp 161
|
// pp 161
|
||||||
|
|
||||||
void fxtof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x80 + w*4) | fs2(s, FloatRegisterImpl::D)); }
|
void fxtof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x80 + w*4) | fs2(s, FloatRegisterImpl::D)); }
|
||||||
void fitof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0xc0 + w*4) | fs2(s, FloatRegisterImpl::S)); }
|
void fitof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0xc0 + w*4) | fs2(s, FloatRegisterImpl::S)); }
|
||||||
|
|
||||||
// pp 162
|
// pp 162
|
||||||
|
|
||||||
void fmov( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x00 + w) | fs2(s, w)); }
|
void fmov( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x00 + w) | fs2(s, w)); }
|
||||||
|
|
||||||
void fneg( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x04 + w) | fs2(s, w)); }
|
void fneg( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x04 + w) | fs2(s, w)); }
|
||||||
|
|
||||||
// page 144 sparc v8 architecture (double prec works on v8 if the source and destination registers are the same). fnegs is the only instruction available
|
// page 144 sparc v8 architecture (double prec works on v8 if the source and destination registers are the same). fnegs is the only instruction available
|
||||||
// on v8 to do negation of single, double and quad precision floats.
|
// on v8 to do negation of single, double and quad precision floats.
|
||||||
|
|
||||||
void fneg( FloatRegisterImpl::Width w, FloatRegister sd ) { if (VM_Version::v9_instructions_work()) emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x04 + w) | fs2(sd, w)); else emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x05) | fs2(sd, w)); }
|
void fneg( FloatRegisterImpl::Width w, FloatRegister sd ) { if (VM_Version::v9_instructions_work()) emit_int32( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x04 + w) | fs2(sd, w)); else emit_int32( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x05) | fs2(sd, w)); }
|
||||||
|
|
||||||
void fabs( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x08 + w) | fs2(s, w)); }
|
void fabs( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v8_s_only(w); emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x08 + w) | fs2(s, w)); }
|
||||||
|
|
||||||
// page 144 sparc v8 architecture (double prec works on v8 if the source and destination registers are the same). fabss is the only instruction available
|
// page 144 sparc v8 architecture (double prec works on v8 if the source and destination registers are the same). fabss is the only instruction available
|
||||||
// on v8 to do abs operation on single/double/quad precision floats.
|
// on v8 to do abs operation on single/double/quad precision floats.
|
||||||
|
|
||||||
void fabs( FloatRegisterImpl::Width w, FloatRegister sd ) { if (VM_Version::v9_instructions_work()) emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x08 + w) | fs2(sd, w)); else emit_long( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x09) | fs2(sd, w)); }
|
void fabs( FloatRegisterImpl::Width w, FloatRegister sd ) { if (VM_Version::v9_instructions_work()) emit_int32( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x08 + w) | fs2(sd, w)); else emit_int32( op(arith_op) | fd(sd, w) | op3(fpop1_op3) | opf(0x09) | fs2(sd, w)); }
|
||||||
|
|
||||||
// pp 163
|
// pp 163
|
||||||
|
|
||||||
void fmul( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x48 + w) | fs2(s2, w)); }
|
void fmul( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x48 + w) | fs2(s2, w)); }
|
||||||
void fmul( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | fs1(s1, sw) | opf(0x60 + sw + dw*4) | fs2(s2, sw)); }
|
void fmul( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | fs1(s1, sw) | opf(0x60 + sw + dw*4) | fs2(s2, sw)); }
|
||||||
void fdiv( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x4c + w) | fs2(s2, w)); }
|
void fdiv( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x4c + w) | fs2(s2, w)); }
|
||||||
|
|
||||||
// pp 164
|
// pp 164
|
||||||
|
|
||||||
void fsqrt( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_long( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x28 + w) | fs2(s, w)); }
|
void fsqrt( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x28 + w) | fs2(s, w)); }
|
||||||
|
|
||||||
// pp 165
|
// pp 165
|
||||||
|
|
||||||
@ -827,22 +827,22 @@ public:
|
|||||||
|
|
||||||
// pp 167
|
// pp 167
|
||||||
|
|
||||||
void flushw() { v9_only(); emit_long( op(arith_op) | op3(flushw_op3) ); }
|
void flushw() { v9_only(); emit_int32( op(arith_op) | op3(flushw_op3) ); }
|
||||||
|
|
||||||
// pp 168
|
// pp 168
|
||||||
|
|
||||||
void illtrap( int const22a) { if (const22a != 0) v9_only(); emit_long( op(branch_op) | u_field(const22a, 21, 0) ); }
|
void illtrap( int const22a) { if (const22a != 0) v9_only(); emit_int32( op(branch_op) | u_field(const22a, 21, 0) ); }
|
||||||
// v8 unimp == illtrap(0)
|
// v8 unimp == illtrap(0)
|
||||||
|
|
||||||
// pp 169
|
// pp 169
|
||||||
|
|
||||||
void impdep1( int id1, int const19a ) { v9_only(); emit_long( op(arith_op) | fcn(id1) | op3(impdep1_op3) | u_field(const19a, 18, 0)); }
|
void impdep1( int id1, int const19a ) { v9_only(); emit_int32( op(arith_op) | fcn(id1) | op3(impdep1_op3) | u_field(const19a, 18, 0)); }
|
||||||
void impdep2( int id1, int const19a ) { v9_only(); emit_long( op(arith_op) | fcn(id1) | op3(impdep2_op3) | u_field(const19a, 18, 0)); }
|
void impdep2( int id1, int const19a ) { v9_only(); emit_int32( op(arith_op) | fcn(id1) | op3(impdep2_op3) | u_field(const19a, 18, 0)); }
|
||||||
|
|
||||||
// pp 149 (v8)
|
// pp 149 (v8)
|
||||||
|
|
||||||
void cpop1( int opc, int cr1, int cr2, int crd ) { v8_only(); emit_long( op(arith_op) | fcn(crd) | op3(impdep1_op3) | u_field(cr1, 18, 14) | opf(opc) | u_field(cr2, 4, 0)); }
|
void cpop1( int opc, int cr1, int cr2, int crd ) { v8_only(); emit_int32( op(arith_op) | fcn(crd) | op3(impdep1_op3) | u_field(cr1, 18, 14) | opf(opc) | u_field(cr2, 4, 0)); }
|
||||||
void cpop2( int opc, int cr1, int cr2, int crd ) { v8_only(); emit_long( op(arith_op) | fcn(crd) | op3(impdep2_op3) | u_field(cr1, 18, 14) | opf(opc) | u_field(cr2, 4, 0)); }
|
void cpop2( int opc, int cr1, int cr2, int crd ) { v8_only(); emit_int32( op(arith_op) | fcn(crd) | op3(impdep2_op3) | u_field(cr1, 18, 14) | opf(opc) | u_field(cr2, 4, 0)); }
|
||||||
|
|
||||||
// pp 170
|
// pp 170
|
||||||
|
|
||||||
@ -872,8 +872,8 @@ public:
|
|||||||
|
|
||||||
// 173
|
// 173
|
||||||
|
|
||||||
void ldfa( FloatRegisterImpl::Width w, Register s1, Register s2, int ia, FloatRegister d ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void ldfa( FloatRegisterImpl::Width w, Register s1, Register s2, int ia, FloatRegister d ) { v9_only(); emit_int32( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void ldfa( FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void ldfa( FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d ) { v9_only(); emit_int32( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 175, lduw is ld on v8
|
// pp 175, lduw is ld on v8
|
||||||
|
|
||||||
@ -896,22 +896,22 @@ public:
|
|||||||
|
|
||||||
// pp 177
|
// pp 177
|
||||||
|
|
||||||
void ldsba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void ldsba( Register s1, Register s2, int ia, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void ldsba( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void ldsba( Register s1, int simm13a, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void ldsha( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void ldsha( Register s1, Register s2, int ia, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void ldsha( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void ldsha( Register s1, int simm13a, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void ldswa( Register s1, Register s2, int ia, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void ldswa( Register s1, Register s2, int ia, Register d ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void ldswa( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void ldswa( Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void lduba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void lduba( Register s1, Register s2, int ia, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void lduba( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void lduba( Register s1, int simm13a, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void lduha( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void lduha( Register s1, Register s2, int ia, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void lduha( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void lduha( Register s1, int simm13a, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void lduwa( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void lduwa( Register s1, Register s2, int ia, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void lduwa( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void lduwa( Register s1, int simm13a, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void ldxa( Register s1, Register s2, int ia, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldx_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void ldxa( Register s1, Register s2, int ia, Register d ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(ldx_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void ldxa( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldx_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void ldxa( Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(ldx_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void ldda( Register s1, Register s2, int ia, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(ldd_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void ldda( Register s1, Register s2, int ia, Register d ) { v9_dep(); emit_int32( op(ldst_op) | rd(d) | op3(ldd_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void ldda( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(ldd_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void ldda( Register s1, int simm13a, Register d ) { v9_dep(); emit_int32( op(ldst_op) | rd(d) | op3(ldd_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 179
|
// pp 179
|
||||||
|
|
||||||
@ -920,111 +920,111 @@ public:
|
|||||||
|
|
||||||
// pp 180
|
// pp 180
|
||||||
|
|
||||||
void ldstuba( Register s1, Register s2, int ia, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void ldstuba( Register s1, Register s2, int ia, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void ldstuba( Register s1, int simm13a, Register d ) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void ldstuba( Register s1, int simm13a, Register d ) { emit_int32( op(ldst_op) | rd(d) | op3(ldstub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 181
|
// pp 181
|
||||||
|
|
||||||
void and3( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 ) | rs1(s1) | rs2(s2) ); }
|
void and3( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void and3( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void and3( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void andcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void andcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void andcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(and_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void andcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void andn( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 ) | rs1(s1) | rs2(s2) ); }
|
void andn( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void andn( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void andn( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void andncc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void andncc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void andncc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void andncc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void or3( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 ) | rs1(s1) | rs2(s2) ); }
|
void or3( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void or3( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void or3( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void orcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void orcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void orcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(or_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void orcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void orn( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | rs2(s2) ); }
|
void orn( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void orn( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void orn( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void orncc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void orncc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void orncc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(orn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void orncc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void xor3( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 ) | rs1(s1) | rs2(s2) ); }
|
void xor3( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void xor3( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void xor3( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void xorcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void xorcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void xorcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void xorcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void xnor( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 ) | rs1(s1) | rs2(s2) ); }
|
void xnor( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void xnor( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void xnor( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void xnorcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void xnorcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void xnorcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void xnorcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 183
|
// pp 183
|
||||||
|
|
||||||
void membar( Membar_mask_bits const7a ) { v9_only(); emit_long( op(arith_op) | op3(membar_op3) | rs1(O7) | immed(true) | u_field( int(const7a), 6, 0)); }
|
void membar( Membar_mask_bits const7a ) { v9_only(); emit_int32( op(arith_op) | op3(membar_op3) | rs1(O7) | immed(true) | u_field( int(const7a), 6, 0)); }
|
||||||
|
|
||||||
// pp 185
|
// pp 185
|
||||||
|
|
||||||
void fmov( FloatRegisterImpl::Width w, Condition c, bool floatCC, CC cca, FloatRegister s2, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, w) | op3(fpop2_op3) | cond_mov(c) | opf_cc(cca, floatCC) | opf_low6(w) | fs2(s2, w)); }
|
void fmov( FloatRegisterImpl::Width w, Condition c, bool floatCC, CC cca, FloatRegister s2, FloatRegister d ) { v9_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fpop2_op3) | cond_mov(c) | opf_cc(cca, floatCC) | opf_low6(w) | fs2(s2, w)); }
|
||||||
|
|
||||||
// pp 189
|
// pp 189
|
||||||
|
|
||||||
void fmov( FloatRegisterImpl::Width w, RCondition c, Register s1, FloatRegister s2, FloatRegister d ) { v9_only(); emit_long( op(arith_op) | fd(d, w) | op3(fpop2_op3) | rs1(s1) | rcond(c) | opf_low5(4 + w) | fs2(s2, w)); }
|
void fmov( FloatRegisterImpl::Width w, RCondition c, Register s1, FloatRegister s2, FloatRegister d ) { v9_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fpop2_op3) | rs1(s1) | rcond(c) | opf_low5(4 + w) | fs2(s2, w)); }
|
||||||
|
|
||||||
// pp 191
|
// pp 191
|
||||||
|
|
||||||
void movcc( Condition c, bool floatCC, CC cca, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | rs2(s2) ); }
|
void movcc( Condition c, bool floatCC, CC cca, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | rs2(s2) ); }
|
||||||
void movcc( Condition c, bool floatCC, CC cca, int simm11a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | immed(true) | simm(simm11a, 11) ); }
|
void movcc( Condition c, bool floatCC, CC cca, int simm11a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | immed(true) | simm(simm11a, 11) ); }
|
||||||
|
|
||||||
// pp 195
|
// pp 195
|
||||||
|
|
||||||
void movr( RCondition c, Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | rs2(s2) ); }
|
void movr( RCondition c, Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | rs2(s2) ); }
|
||||||
void movr( RCondition c, Register s1, int simm10a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | immed(true) | simm(simm10a, 10) ); }
|
void movr( RCondition c, Register s1, int simm10a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | immed(true) | simm(simm10a, 10) ); }
|
||||||
|
|
||||||
// pp 196
|
// pp 196
|
||||||
|
|
||||||
void mulx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | rs2(s2) ); }
|
void mulx( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void mulx( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void mulx( Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void sdivx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | rs2(s2) ); }
|
void sdivx( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void sdivx( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void sdivx( Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void udivx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | rs2(s2) ); }
|
void udivx( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void udivx( Register s1, int simm13a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void udivx( Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 197
|
// pp 197
|
||||||
|
|
||||||
void umul( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 ) | rs1(s1) | rs2(s2) ); }
|
void umul( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void umul( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void umul( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void smul( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 ) | rs1(s1) | rs2(s2) ); }
|
void smul( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void smul( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void smul( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void umulcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void umulcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void umulcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void umulcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void smulcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void smulcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void smulcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void smulcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 199
|
// pp 199
|
||||||
|
|
||||||
void mulscc( Register s1, Register s2, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(mulscc_op3) | rs1(s1) | rs2(s2) ); }
|
void mulscc( Register s1, Register s2, Register d ) { v9_dep(); emit_int32( op(arith_op) | rd(d) | op3(mulscc_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void mulscc( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(mulscc_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void mulscc( Register s1, int simm13a, Register d ) { v9_dep(); emit_int32( op(arith_op) | rd(d) | op3(mulscc_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 201
|
// pp 201
|
||||||
|
|
||||||
void nop() { emit_long( op(branch_op) | op2(sethi_op2) ); }
|
void nop() { emit_int32( op(branch_op) | op2(sethi_op2) ); }
|
||||||
|
|
||||||
|
|
||||||
// pp 202
|
// pp 202
|
||||||
|
|
||||||
void popc( Register s, Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(popc_op3) | rs2(s)); }
|
void popc( Register s, Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(popc_op3) | rs2(s)); }
|
||||||
void popc( int simm13a, Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(popc_op3) | immed(true) | simm(simm13a, 13)); }
|
void popc( int simm13a, Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(popc_op3) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
// pp 203
|
// pp 203
|
||||||
|
|
||||||
void prefetch( Register s1, Register s2, PrefetchFcn f) { v9_only(); emit_long( op(ldst_op) | fcn(f) | op3(prefetch_op3) | rs1(s1) | rs2(s2) ); }
|
void prefetch( Register s1, Register s2, PrefetchFcn f) { v9_only(); emit_int32( op(ldst_op) | fcn(f) | op3(prefetch_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void prefetch( Register s1, int simm13a, PrefetchFcn f) { v9_only(); emit_data( op(ldst_op) | fcn(f) | op3(prefetch_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
void prefetch( Register s1, int simm13a, PrefetchFcn f) { v9_only(); emit_data( op(ldst_op) | fcn(f) | op3(prefetch_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
void prefetcha( Register s1, Register s2, int ia, PrefetchFcn f ) { v9_only(); emit_long( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void prefetcha( Register s1, Register s2, int ia, PrefetchFcn f ) { v9_only(); emit_int32( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void prefetcha( Register s1, int simm13a, PrefetchFcn f ) { v9_only(); emit_long( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void prefetcha( Register s1, int simm13a, PrefetchFcn f ) { v9_only(); emit_int32( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 208
|
// pp 208
|
||||||
|
|
||||||
// not implementing read privileged register
|
// not implementing read privileged register
|
||||||
|
|
||||||
inline void rdy( Register d) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(0, 18, 14)); }
|
inline void rdy( Register d) { v9_dep(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(0, 18, 14)); }
|
||||||
inline void rdccr( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(2, 18, 14)); }
|
inline void rdccr( Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(2, 18, 14)); }
|
||||||
inline void rdasi( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(3, 18, 14)); }
|
inline void rdasi( Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(3, 18, 14)); }
|
||||||
inline void rdtick( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(4, 18, 14)); } // Spoon!
|
inline void rdtick( Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(4, 18, 14)); } // Spoon!
|
||||||
inline void rdpc( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(5, 18, 14)); }
|
inline void rdpc( Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(5, 18, 14)); }
|
||||||
inline void rdfprs( Register d) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(6, 18, 14)); }
|
inline void rdfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(6, 18, 14)); }
|
||||||
|
|
||||||
// pp 213
|
// pp 213
|
||||||
|
|
||||||
@ -1033,47 +1033,47 @@ public:
|
|||||||
|
|
||||||
// pp 214
|
// pp 214
|
||||||
|
|
||||||
void save( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | rs2(s2) ); }
|
void save( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void save( Register s1, int simm13a, Register d ) {
|
void save( Register s1, int simm13a, Register d ) {
|
||||||
// make sure frame is at least large enough for the register save area
|
// make sure frame is at least large enough for the register save area
|
||||||
assert(-simm13a >= 16 * wordSize, "frame too small");
|
assert(-simm13a >= 16 * wordSize, "frame too small");
|
||||||
emit_long( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) );
|
emit_int32( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore( Register s1 = G0, Register s2 = G0, Register d = G0 ) { emit_long( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | rs2(s2) ); }
|
void restore( Register s1 = G0, Register s2 = G0, Register d = G0 ) { emit_int32( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void restore( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void restore( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 216
|
// pp 216
|
||||||
|
|
||||||
void saved() { v9_only(); emit_long( op(arith_op) | fcn(0) | op3(saved_op3)); }
|
void saved() { v9_only(); emit_int32( op(arith_op) | fcn(0) | op3(saved_op3)); }
|
||||||
void restored() { v9_only(); emit_long( op(arith_op) | fcn(1) | op3(saved_op3)); }
|
void restored() { v9_only(); emit_int32( op(arith_op) | fcn(1) | op3(saved_op3)); }
|
||||||
|
|
||||||
// pp 217
|
// pp 217
|
||||||
|
|
||||||
inline void sethi( int imm22a, Register d, RelocationHolder const& rspec = RelocationHolder() );
|
inline void sethi( int imm22a, Register d, RelocationHolder const& rspec = RelocationHolder() );
|
||||||
// pp 218
|
// pp 218
|
||||||
|
|
||||||
void sll( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
|
void sll( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
|
||||||
void sll( Register s1, int imm5a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
|
void sll( Register s1, int imm5a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
|
||||||
void srl( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
|
void srl( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
|
||||||
void srl( Register s1, int imm5a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
|
void srl( Register s1, int imm5a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
|
||||||
void sra( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
|
void sra( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
|
||||||
void sra( Register s1, int imm5a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
|
void sra( Register s1, int imm5a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
|
||||||
|
|
||||||
void sllx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
|
void sllx( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
|
||||||
void sllx( Register s1, int imm6a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
|
void sllx( Register s1, int imm6a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
|
||||||
void srlx( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
|
void srlx( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
|
||||||
void srlx( Register s1, int imm6a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
|
void srlx( Register s1, int imm6a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
|
||||||
void srax( Register s1, Register s2, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
|
void srax( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
|
||||||
void srax( Register s1, int imm6a, Register d ) { v9_only(); emit_long( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
|
void srax( Register s1, int imm6a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
|
||||||
|
|
||||||
// pp 220
|
// pp 220
|
||||||
|
|
||||||
void sir( int simm13a ) { emit_long( op(arith_op) | fcn(15) | op3(sir_op3) | immed(true) | simm(simm13a, 13)); }
|
void sir( int simm13a ) { emit_int32( op(arith_op) | fcn(15) | op3(sir_op3) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
// pp 221
|
// pp 221
|
||||||
|
|
||||||
void stbar() { emit_long( op(arith_op) | op3(membar_op3) | u_field(15, 18, 14)); }
|
void stbar() { emit_int32( op(arith_op) | op3(membar_op3) | u_field(15, 18, 14)); }
|
||||||
|
|
||||||
// pp 222
|
// pp 222
|
||||||
|
|
||||||
@ -1087,8 +1087,8 @@ public:
|
|||||||
|
|
||||||
// pp 224
|
// pp 224
|
||||||
|
|
||||||
void stfa( FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2, int ia ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void stfa( FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2, int ia ) { v9_only(); emit_int32( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void stfa( FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a ) { v9_only(); emit_long( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void stfa( FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a ) { v9_only(); emit_int32( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// p 226
|
// p 226
|
||||||
|
|
||||||
@ -1105,16 +1105,16 @@ public:
|
|||||||
|
|
||||||
// pp 177
|
// pp 177
|
||||||
|
|
||||||
void stba( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void stba( Register d, Register s1, Register s2, int ia ) { emit_int32( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void stba( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void stba( Register d, Register s1, int simm13a ) { emit_int32( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void stha( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void stha( Register d, Register s1, Register s2, int ia ) { emit_int32( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void stha( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void stha( Register d, Register s1, int simm13a ) { emit_int32( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void stwa( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void stwa( Register d, Register s1, Register s2, int ia ) { emit_int32( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void stwa( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void stwa( Register d, Register s1, int simm13a ) { emit_int32( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void stxa( Register d, Register s1, Register s2, int ia ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void stxa( Register d, Register s1, Register s2, int ia ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void stxa( Register d, Register s1, int simm13a ) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void stxa( Register d, Register s1, int simm13a ) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void stda( Register d, Register s1, Register s2, int ia ) { emit_long( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void stda( Register d, Register s1, Register s2, int ia ) { emit_int32( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void stda( Register d, Register s1, int simm13a ) { emit_long( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void stda( Register d, Register s1, int simm13a ) { emit_int32( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 97 (v8)
|
// pp 97 (v8)
|
||||||
|
|
||||||
@ -1129,15 +1129,15 @@ public:
|
|||||||
|
|
||||||
// pp 230
|
// pp 230
|
||||||
|
|
||||||
void sub( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | rs2(s2) ); }
|
void sub( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void sub( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void sub( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
void subcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | rs2(s2) ); }
|
void subcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void subcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void subcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void subc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 ) | rs1(s1) | rs2(s2) ); }
|
void subc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void subc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void subc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void subccc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
void subccc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void subccc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void subccc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 231
|
// pp 231
|
||||||
|
|
||||||
@ -1146,55 +1146,55 @@ public:
|
|||||||
|
|
||||||
// pp 232
|
// pp 232
|
||||||
|
|
||||||
void swapa( Register s1, Register s2, int ia, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
void swapa( Register s1, Register s2, int ia, Register d ) { v9_dep(); emit_int32( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
|
||||||
void swapa( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void swapa( Register s1, int simm13a, Register d ) { v9_dep(); emit_int32( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 234, note op in book is wrong, see pp 268
|
// pp 234, note op in book is wrong, see pp 268
|
||||||
|
|
||||||
void taddcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(taddcc_op3 ) | rs1(s1) | rs2(s2) ); }
|
void taddcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(taddcc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void taddcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(taddcc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void taddcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(taddcc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void taddcctv( Register s1, Register s2, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(taddcctv_op3) | rs1(s1) | rs2(s2) ); }
|
void taddcctv( Register s1, Register s2, Register d ) { v9_dep(); emit_int32( op(arith_op) | rd(d) | op3(taddcctv_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void taddcctv( Register s1, int simm13a, Register d ) { v9_dep(); emit_long( op(arith_op) | rd(d) | op3(taddcctv_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void taddcctv( Register s1, int simm13a, Register d ) { v9_dep(); emit_int32( op(arith_op) | rd(d) | op3(taddcctv_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 235
|
// pp 235
|
||||||
|
|
||||||
void tsubcc( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcc_op3 ) | rs1(s1) | rs2(s2) ); }
|
void tsubcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(tsubcc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
void tsubcc( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void tsubcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(tsubcc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
void tsubcctv( Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcctv_op3) | rs1(s1) | rs2(s2) ); }
|
void tsubcctv( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(tsubcctv_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
void tsubcctv( Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(tsubcctv_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
void tsubcctv( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(tsubcctv_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
// pp 237
|
// pp 237
|
||||||
|
|
||||||
void trap( Condition c, CC cc, Register s1, Register s2 ) { v8_no_cc(cc); emit_long( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | rs2(s2)); }
|
void trap( Condition c, CC cc, Register s1, Register s2 ) { v8_no_cc(cc); emit_int32( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | rs2(s2)); }
|
||||||
void trap( Condition c, CC cc, Register s1, int trapa ) { v8_no_cc(cc); emit_long( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | immed(true) | u_field(trapa, 6, 0)); }
|
void trap( Condition c, CC cc, Register s1, int trapa ) { v8_no_cc(cc); emit_int32( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | immed(true) | u_field(trapa, 6, 0)); }
|
||||||
// simple uncond. trap
|
// simple uncond. trap
|
||||||
void trap( int trapa ) { trap( always, icc, G0, trapa ); }
|
void trap( int trapa ) { trap( always, icc, G0, trapa ); }
|
||||||
|
|
||||||
// pp 239 omit write priv register for now
|
// pp 239 omit write priv register for now
|
||||||
|
|
||||||
inline void wry( Register d) { v9_dep(); emit_long( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(0, 29, 25)); }
|
inline void wry( Register d) { v9_dep(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(0, 29, 25)); }
|
||||||
inline void wrccr(Register s) { v9_only(); emit_long( op(arith_op) | rs1(s) | op3(wrreg_op3) | u_field(2, 29, 25)); }
|
inline void wrccr(Register s) { v9_only(); emit_int32( op(arith_op) | rs1(s) | op3(wrreg_op3) | u_field(2, 29, 25)); }
|
||||||
inline void wrccr(Register s, int simm13a) { v9_only(); emit_long( op(arith_op) |
|
inline void wrccr(Register s, int simm13a) { v9_only(); emit_int32( op(arith_op) |
|
||||||
rs1(s) |
|
rs1(s) |
|
||||||
op3(wrreg_op3) |
|
op3(wrreg_op3) |
|
||||||
u_field(2, 29, 25) |
|
u_field(2, 29, 25) |
|
||||||
immed(true) |
|
immed(true) |
|
||||||
simm(simm13a, 13)); }
|
simm(simm13a, 13)); }
|
||||||
inline void wrasi(Register d) { v9_only(); emit_long( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(3, 29, 25)); }
|
inline void wrasi(Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(3, 29, 25)); }
|
||||||
// wrasi(d, imm) stores (d xor imm) to asi
|
// wrasi(d, imm) stores (d xor imm) to asi
|
||||||
inline void wrasi(Register d, int simm13a) { v9_only(); emit_long( op(arith_op) | rs1(d) | op3(wrreg_op3) |
|
inline void wrasi(Register d, int simm13a) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) |
|
||||||
u_field(3, 29, 25) | immed(true) | simm(simm13a, 13)); }
|
u_field(3, 29, 25) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void wrfprs( Register d) { v9_only(); emit_long( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); }
|
inline void wrfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); }
|
||||||
|
|
||||||
|
|
||||||
// VIS3 instructions
|
// VIS3 instructions
|
||||||
|
|
||||||
void movstosw( FloatRegister s, Register d ) { vis3_only(); emit_long( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstosw_opf) | fs2(s, FloatRegisterImpl::S)); }
|
void movstosw( FloatRegister s, Register d ) { vis3_only(); emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstosw_opf) | fs2(s, FloatRegisterImpl::S)); }
|
||||||
void movstouw( FloatRegister s, Register d ) { vis3_only(); emit_long( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstouw_opf) | fs2(s, FloatRegisterImpl::S)); }
|
void movstouw( FloatRegister s, Register d ) { vis3_only(); emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstouw_opf) | fs2(s, FloatRegisterImpl::S)); }
|
||||||
void movdtox( FloatRegister s, Register d ) { vis3_only(); emit_long( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mdtox_opf) | fs2(s, FloatRegisterImpl::D)); }
|
void movdtox( FloatRegister s, Register d ) { vis3_only(); emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mdtox_opf) | fs2(s, FloatRegisterImpl::D)); }
|
||||||
|
|
||||||
void movwtos( Register s, FloatRegister d ) { vis3_only(); emit_long( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(mftoi_op3) | opf(mwtos_opf) | rs2(s)); }
|
void movwtos( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(mftoi_op3) | opf(mwtos_opf) | rs2(s)); }
|
||||||
void movxtod( Register s, FloatRegister d ) { vis3_only(); emit_long( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(mftoi_op3) | opf(mxtod_opf) | rs2(s)); }
|
void movxtod( Register s, FloatRegister d ) { vis3_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(mftoi_op3) | opf(mxtod_opf) | rs2(s)); }
|
||||||
|
|
||||||
// Creation
|
// Creation
|
||||||
Assembler(CodeBuffer* code) : AbstractAssembler(code) {
|
Assembler(CodeBuffer* code) : AbstractAssembler(code) {
|
||||||
|
@ -35,24 +35,24 @@ inline void Assembler::check_delay() {
|
|||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Assembler::emit_long(int x) {
|
inline void Assembler::emit_int32(int x) {
|
||||||
check_delay();
|
check_delay();
|
||||||
AbstractAssembler::emit_long(x);
|
AbstractAssembler::emit_int32(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Assembler::emit_data(int x, relocInfo::relocType rtype) {
|
inline void Assembler::emit_data(int x, relocInfo::relocType rtype) {
|
||||||
relocate(rtype);
|
relocate(rtype);
|
||||||
emit_long(x);
|
emit_int32(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Assembler::emit_data(int x, RelocationHolder const& rspec) {
|
inline void Assembler::emit_data(int x, RelocationHolder const& rspec) {
|
||||||
relocate(rspec);
|
relocate(rspec);
|
||||||
emit_long(x);
|
emit_int32(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void Assembler::add(Register s1, Register s2, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::add(Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::add(Register s1, int simm13a, Register d ) { emit_long( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
inline void Assembler::add(Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
|
||||||
|
|
||||||
inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt ) { v9_only(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(bpr_op2) | wdisp16(intptr_t(d), intptr_t(pc())) | predict(p) | rs1(s1), rt); has_delay_slot(); }
|
inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt ) { v9_only(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(bpr_op2) | wdisp16(intptr_t(d), intptr_t(pc())) | predict(p) | rs1(s1), rt); has_delay_slot(); }
|
||||||
inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, Label& L) { bpr( c, a, p, s1, target(L)); }
|
inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, Label& L) { bpr( c, a, p, s1, target(L)); }
|
||||||
@ -79,93 +79,93 @@ inline void Assembler::cbcond(Condition c, CC cc, Register s1, int simm5, Label&
|
|||||||
inline void Assembler::call( address d, relocInfo::relocType rt ) { cti(); emit_data( op(call_op) | wdisp(intptr_t(d), intptr_t(pc()), 30), rt); has_delay_slot(); assert(rt != relocInfo::virtual_call_type, "must use virtual_call_Relocation::spec"); }
|
inline void Assembler::call( address d, relocInfo::relocType rt ) { cti(); emit_data( op(call_op) | wdisp(intptr_t(d), intptr_t(pc()), 30), rt); has_delay_slot(); assert(rt != relocInfo::virtual_call_type, "must use virtual_call_Relocation::spec"); }
|
||||||
inline void Assembler::call( Label& L, relocInfo::relocType rt ) { call( target(L), rt); }
|
inline void Assembler::call( Label& L, relocInfo::relocType rt ) { call( target(L), rt); }
|
||||||
|
|
||||||
inline void Assembler::flush( Register s1, Register s2) { emit_long( op(arith_op) | op3(flush_op3) | rs1(s1) | rs2(s2)); }
|
inline void Assembler::flush( Register s1, Register s2) { emit_int32( op(arith_op) | op3(flush_op3) | rs1(s1) | rs2(s2)); }
|
||||||
inline void Assembler::flush( Register s1, int simm13a) { emit_data( op(arith_op) | op3(flush_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::flush( Register s1, int simm13a) { emit_data( op(arith_op) | op3(flush_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::jmpl( Register s1, Register s2, Register d ) { cti(); emit_long( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | rs2(s2)); has_delay_slot(); }
|
inline void Assembler::jmpl( Register s1, Register s2, Register d ) { cti(); emit_int32( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | rs2(s2)); has_delay_slot(); }
|
||||||
inline void Assembler::jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec ) { cti(); emit_data( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); has_delay_slot(); }
|
inline void Assembler::jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec ) { cti(); emit_data( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); has_delay_slot(); }
|
||||||
|
|
||||||
inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d) { emit_long( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d) { emit_int32( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d, RelocationHolder const& rspec) { emit_data( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); }
|
inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d, RelocationHolder const& rspec) { emit_data( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); }
|
||||||
|
|
||||||
inline void Assembler::ldfsr( Register s1, Register s2) { v9_dep(); emit_long( op(ldst_op) | op3(ldfsr_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldfsr( Register s1, Register s2) { v9_dep(); emit_int32( op(ldst_op) | op3(ldfsr_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldfsr( Register s1, int simm13a) { v9_dep(); emit_data( op(ldst_op) | op3(ldfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldfsr( Register s1, int simm13a) { v9_dep(); emit_data( op(ldst_op) | op3(ldfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::ldxfsr( Register s1, Register s2) { v9_only(); emit_long( op(ldst_op) | rd(G1) | op3(ldfsr_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldxfsr( Register s1, Register s2) { v9_only(); emit_int32( op(ldst_op) | rd(G1) | op3(ldfsr_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldxfsr( Register s1, int simm13a) { v9_only(); emit_data( op(ldst_op) | rd(G1) | op3(ldfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldxfsr( Register s1, int simm13a) { v9_only(); emit_data( op(ldst_op) | rd(G1) | op3(ldfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::ldc( Register s1, Register s2, int crd) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(ldc_op3 ) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldc( Register s1, Register s2, int crd) { v8_only(); emit_int32( op(ldst_op) | fcn(crd) | op3(ldc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldc( Register s1, int simm13a, int crd) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(ldc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldc( Register s1, int simm13a, int crd) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(ldc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::lddc( Register s1, Register s2, int crd) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(lddc_op3 ) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::lddc( Register s1, Register s2, int crd) { v8_only(); emit_int32( op(ldst_op) | fcn(crd) | op3(lddc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::lddc( Register s1, int simm13a, int crd) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(lddc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::lddc( Register s1, int simm13a, int crd) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(lddc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::ldcsr( Register s1, Register s2, int crd) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(ldcsr_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldcsr( Register s1, Register s2, int crd) { v8_only(); emit_int32( op(ldst_op) | fcn(crd) | op3(ldcsr_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldcsr( Register s1, int simm13a, int crd) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(ldcsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldcsr( Register s1, int simm13a, int crd) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(ldcsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::ldsb( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(ldsb_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldsb( Register s1, Register s2, Register d) { emit_int32( op(ldst_op) | rd(d) | op3(ldsb_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldsb( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldsb_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldsb( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldsb_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::ldsh( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(ldsh_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldsh( Register s1, Register s2, Register d) { emit_int32( op(ldst_op) | rd(d) | op3(ldsh_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldsh( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldsh_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldsh( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldsh_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::ldsw( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(ldsw_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldsw( Register s1, Register s2, Register d) { emit_int32( op(ldst_op) | rd(d) | op3(ldsw_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldsw( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldsw_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldsw( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldsw_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::ldub( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(ldub_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldub( Register s1, Register s2, Register d) { emit_int32( op(ldst_op) | rd(d) | op3(ldub_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldub( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldub_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldub( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldub_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::lduh( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(lduh_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::lduh( Register s1, Register s2, Register d) { emit_int32( op(ldst_op) | rd(d) | op3(lduh_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::lduh( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(lduh_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::lduh( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(lduh_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::lduw( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(lduw_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::lduw( Register s1, Register s2, Register d) { emit_int32( op(ldst_op) | rd(d) | op3(lduw_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::lduw( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(lduw_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::lduw( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(lduw_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::ldx( Register s1, Register s2, Register d) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(ldx_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldx( Register s1, Register s2, Register d) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(ldx_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldx( Register s1, int simm13a, Register d) { v9_only(); emit_data( op(ldst_op) | rd(d) | op3(ldx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldx( Register s1, int simm13a, Register d) { v9_only(); emit_data( op(ldst_op) | rd(d) | op3(ldx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::ldd( Register s1, Register s2, Register d) { v9_dep(); assert(d->is_even(), "not even"); emit_long( op(ldst_op) | rd(d) | op3(ldd_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldd( Register s1, Register s2, Register d) { v9_dep(); assert(d->is_even(), "not even"); emit_int32( op(ldst_op) | rd(d) | op3(ldd_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldd( Register s1, int simm13a, Register d) { v9_dep(); assert(d->is_even(), "not even"); emit_data( op(ldst_op) | rd(d) | op3(ldd_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldd( Register s1, int simm13a, Register d) { v9_dep(); assert(d->is_even(), "not even"); emit_data( op(ldst_op) | rd(d) | op3(ldd_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::ldstub( Register s1, Register s2, Register d) { emit_long( op(ldst_op) | rd(d) | op3(ldstub_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::ldstub( Register s1, Register s2, Register d) { emit_int32( op(ldst_op) | rd(d) | op3(ldstub_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::ldstub( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldstub_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::ldstub( Register s1, int simm13a, Register d) { emit_data( op(ldst_op) | rd(d) | op3(ldstub_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::rett( Register s1, Register s2 ) { cti(); emit_long( op(arith_op) | op3(rett_op3) | rs1(s1) | rs2(s2)); has_delay_slot(); }
|
inline void Assembler::rett( Register s1, Register s2 ) { cti(); emit_int32( op(arith_op) | op3(rett_op3) | rs1(s1) | rs2(s2)); has_delay_slot(); }
|
||||||
inline void Assembler::rett( Register s1, int simm13a, relocInfo::relocType rt) { cti(); emit_data( op(arith_op) | op3(rett_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rt); has_delay_slot(); }
|
inline void Assembler::rett( Register s1, int simm13a, relocInfo::relocType rt) { cti(); emit_data( op(arith_op) | op3(rett_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rt); has_delay_slot(); }
|
||||||
|
|
||||||
inline void Assembler::sethi( int imm22a, Register d, RelocationHolder const& rspec ) { emit_data( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(imm22a), rspec); }
|
inline void Assembler::sethi( int imm22a, Register d, RelocationHolder const& rspec ) { emit_data( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(imm22a), rspec); }
|
||||||
|
|
||||||
// pp 222
|
// pp 222
|
||||||
|
|
||||||
inline void Assembler::stf( FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2) { emit_long( op(ldst_op) | fd(d, w) | alt_op3(stf_op3, w) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stf( FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2) { emit_int32( op(ldst_op) | fd(d, w) | alt_op3(stf_op3, w) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stf( FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a) { emit_data( op(ldst_op) | fd(d, w) | alt_op3(stf_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stf( FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a) { emit_data( op(ldst_op) | fd(d, w) | alt_op3(stf_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
inline void Assembler::stfsr( Register s1, Register s2) { v9_dep(); emit_long( op(ldst_op) | op3(stfsr_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stfsr( Register s1, Register s2) { v9_dep(); emit_int32( op(ldst_op) | op3(stfsr_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stfsr( Register s1, int simm13a) { v9_dep(); emit_data( op(ldst_op) | op3(stfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stfsr( Register s1, int simm13a) { v9_dep(); emit_data( op(ldst_op) | op3(stfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::stxfsr( Register s1, Register s2) { v9_only(); emit_long( op(ldst_op) | rd(G1) | op3(stfsr_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stxfsr( Register s1, Register s2) { v9_only(); emit_int32( op(ldst_op) | rd(G1) | op3(stfsr_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stxfsr( Register s1, int simm13a) { v9_only(); emit_data( op(ldst_op) | rd(G1) | op3(stfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stxfsr( Register s1, int simm13a) { v9_only(); emit_data( op(ldst_op) | rd(G1) | op3(stfsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
// p 226
|
// p 226
|
||||||
|
|
||||||
inline void Assembler::stb( Register d, Register s1, Register s2) { emit_long( op(ldst_op) | rd(d) | op3(stb_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stb( Register d, Register s1, Register s2) { emit_int32( op(ldst_op) | rd(d) | op3(stb_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stb( Register d, Register s1, int simm13a) { emit_data( op(ldst_op) | rd(d) | op3(stb_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stb( Register d, Register s1, int simm13a) { emit_data( op(ldst_op) | rd(d) | op3(stb_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::sth( Register d, Register s1, Register s2) { emit_long( op(ldst_op) | rd(d) | op3(sth_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::sth( Register d, Register s1, Register s2) { emit_int32( op(ldst_op) | rd(d) | op3(sth_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::sth( Register d, Register s1, int simm13a) { emit_data( op(ldst_op) | rd(d) | op3(sth_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::sth( Register d, Register s1, int simm13a) { emit_data( op(ldst_op) | rd(d) | op3(sth_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::stw( Register d, Register s1, Register s2) { emit_long( op(ldst_op) | rd(d) | op3(stw_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stw( Register d, Register s1, Register s2) { emit_int32( op(ldst_op) | rd(d) | op3(stw_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stw( Register d, Register s1, int simm13a) { emit_data( op(ldst_op) | rd(d) | op3(stw_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stw( Register d, Register s1, int simm13a) { emit_data( op(ldst_op) | rd(d) | op3(stw_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
|
|
||||||
inline void Assembler::stx( Register d, Register s1, Register s2) { v9_only(); emit_long( op(ldst_op) | rd(d) | op3(stx_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stx( Register d, Register s1, Register s2) { v9_only(); emit_int32( op(ldst_op) | rd(d) | op3(stx_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stx( Register d, Register s1, int simm13a) { v9_only(); emit_data( op(ldst_op) | rd(d) | op3(stx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stx( Register d, Register s1, int simm13a) { v9_only(); emit_data( op(ldst_op) | rd(d) | op3(stx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::std( Register d, Register s1, Register s2) { v9_dep(); assert(d->is_even(), "not even"); emit_long( op(ldst_op) | rd(d) | op3(std_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::std( Register d, Register s1, Register s2) { v9_dep(); assert(d->is_even(), "not even"); emit_int32( op(ldst_op) | rd(d) | op3(std_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::std( Register d, Register s1, int simm13a) { v9_dep(); assert(d->is_even(), "not even"); emit_data( op(ldst_op) | rd(d) | op3(std_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::std( Register d, Register s1, int simm13a) { v9_dep(); assert(d->is_even(), "not even"); emit_data( op(ldst_op) | rd(d) | op3(std_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
// v8 p 99
|
// v8 p 99
|
||||||
|
|
||||||
inline void Assembler::stc( int crd, Register s1, Register s2) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(stc_op3 ) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stc( int crd, Register s1, Register s2) { v8_only(); emit_int32( op(ldst_op) | fcn(crd) | op3(stc_op3 ) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stc( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stc( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stc_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::stdc( int crd, Register s1, Register s2) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(stdc_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stdc( int crd, Register s1, Register s2) { v8_only(); emit_int32( op(ldst_op) | fcn(crd) | op3(stdc_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stdc( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stdc_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stdc( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stdc_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::stcsr( int crd, Register s1, Register s2) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(stcsr_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stcsr( int crd, Register s1, Register s2) { v8_only(); emit_int32( op(ldst_op) | fcn(crd) | op3(stcsr_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stcsr( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stcsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stcsr( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stcsr_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
inline void Assembler::stdcq( int crd, Register s1, Register s2) { v8_only(); emit_long( op(ldst_op) | fcn(crd) | op3(stdcq_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::stdcq( int crd, Register s1, Register s2) { v8_only(); emit_int32( op(ldst_op) | fcn(crd) | op3(stdcq_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::stdcq( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stdcq_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::stdcq( int crd, Register s1, int simm13a) { v8_only(); emit_data( op(ldst_op) | fcn(crd) | op3(stdcq_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
// pp 231
|
// pp 231
|
||||||
|
|
||||||
inline void Assembler::swap( Register s1, Register s2, Register d) { v9_dep(); emit_long( op(ldst_op) | rd(d) | op3(swap_op3) | rs1(s1) | rs2(s2) ); }
|
inline void Assembler::swap( Register s1, Register s2, Register d) { v9_dep(); emit_int32( op(ldst_op) | rd(d) | op3(swap_op3) | rs1(s1) | rs2(s2) ); }
|
||||||
inline void Assembler::swap( Register s1, int simm13a, Register d) { v9_dep(); emit_data( op(ldst_op) | rd(d) | op3(swap_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
inline void Assembler::swap( Register s1, int simm13a, Register d) { v9_dep(); emit_data( op(ldst_op) | rd(d) | op3(swap_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
|
||||||
|
|
||||||
#endif // CPU_SPARC_VM_ASSEMBLER_SPARC_INLINE_HPP
|
#endif // CPU_SPARC_VM_ASSEMBLER_SPARC_INLINE_HPP
|
||||||
|
@ -137,7 +137,7 @@ address CppInterpreterGenerator::generate_result_handler_for(BasicType type) {
|
|||||||
}
|
}
|
||||||
__ ret(); // return from interpreter activation
|
__ ret(); // return from interpreter activation
|
||||||
__ delayed()->restore(I5_savedSP, G0, SP); // remove interpreter frame
|
__ delayed()->restore(I5_savedSP, G0, SP); // remove interpreter frame
|
||||||
NOT_PRODUCT(__ emit_long(0);) // marker for disassembly
|
NOT_PRODUCT(__ emit_int32(0);) // marker for disassembly
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,7 +232,7 @@ address CppInterpreterGenerator::generate_tosca_to_stack_converter(BasicType typ
|
|||||||
}
|
}
|
||||||
__ retl(); // return from interpreter activation
|
__ retl(); // return from interpreter activation
|
||||||
__ delayed()->nop(); // schedule this better
|
__ delayed()->nop(); // schedule this better
|
||||||
NOT_PRODUCT(__ emit_long(0);) // marker for disassembly
|
NOT_PRODUCT(__ emit_int32(0);) // marker for disassembly
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1473,7 +1473,7 @@ static address interpreter_frame_manager = NULL;
|
|||||||
__ brx(Assembler::equal, false, Assembler::pt, skip); \
|
__ brx(Assembler::equal, false, Assembler::pt, skip); \
|
||||||
__ delayed()->nop(); \
|
__ delayed()->nop(); \
|
||||||
__ breakpoint_trap(); \
|
__ breakpoint_trap(); \
|
||||||
__ emit_long(marker); \
|
__ emit_int32(marker); \
|
||||||
__ bind(skip); \
|
__ bind(skip); \
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -1224,7 +1224,7 @@ void MacroAssembler::set_narrow_oop(jobject obj, Register d) {
|
|||||||
// Relocation with special format (see relocInfo_sparc.hpp).
|
// Relocation with special format (see relocInfo_sparc.hpp).
|
||||||
relocate(rspec, 1);
|
relocate(rspec, 1);
|
||||||
// Assembler::sethi(0x3fffff, d);
|
// Assembler::sethi(0x3fffff, d);
|
||||||
emit_long( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(0x3fffff) );
|
emit_int32( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(0x3fffff) );
|
||||||
// Don't add relocation for 'add'. Do patching during 'sethi' processing.
|
// Don't add relocation for 'add'. Do patching during 'sethi' processing.
|
||||||
add(d, 0x3ff, d);
|
add(d, 0x3ff, d);
|
||||||
|
|
||||||
@ -1240,7 +1240,7 @@ void MacroAssembler::set_narrow_klass(Klass* k, Register d) {
|
|||||||
// Relocation with special format (see relocInfo_sparc.hpp).
|
// Relocation with special format (see relocInfo_sparc.hpp).
|
||||||
relocate(rspec, 1);
|
relocate(rspec, 1);
|
||||||
// Assembler::sethi(encoded_k, d);
|
// Assembler::sethi(encoded_k, d);
|
||||||
emit_long( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(encoded_k) );
|
emit_int32( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(encoded_k) );
|
||||||
// Don't add relocation for 'add'. Do patching during 'sethi' processing.
|
// Don't add relocation for 'add'. Do patching during 'sethi' processing.
|
||||||
add(d, low10(encoded_k), d);
|
add(d, low10(encoded_k), d);
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type
|
|||||||
}
|
}
|
||||||
__ ret(); // return from interpreter activation
|
__ ret(); // return from interpreter activation
|
||||||
__ delayed()->restore(I5_savedSP, G0, SP); // remove interpreter frame
|
__ delayed()->restore(I5_savedSP, G0, SP); // remove interpreter frame
|
||||||
NOT_PRODUCT(__ emit_long(0);) // marker for disassembly
|
NOT_PRODUCT(__ emit_int32(0);) // marker for disassembly
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ int AbstractAssembler::code_fill_byte() {
|
|||||||
// make this go away someday
|
// make this go away someday
|
||||||
void Assembler::emit_data(jint data, relocInfo::relocType rtype, int format) {
|
void Assembler::emit_data(jint data, relocInfo::relocType rtype, int format) {
|
||||||
if (rtype == relocInfo::none)
|
if (rtype == relocInfo::none)
|
||||||
emit_long(data);
|
emit_int32(data);
|
||||||
else emit_data(data, Relocation::spec_simple(rtype), format);
|
else emit_data(data, Relocation::spec_simple(rtype), format);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ void Assembler::emit_data(jint data, RelocationHolder const& rspec, int format)
|
|||||||
else
|
else
|
||||||
code_section()->relocate(inst_mark(), rspec, format);
|
code_section()->relocate(inst_mark(), rspec, format);
|
||||||
}
|
}
|
||||||
emit_long(data);
|
emit_int32(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int encode(Register r) {
|
static int encode(Register r) {
|
||||||
@ -243,7 +243,7 @@ void Assembler::emit_arith(int op1, int op2, Register dst, int32_t imm32) {
|
|||||||
} else {
|
} else {
|
||||||
emit_int8(op1);
|
emit_int8(op1);
|
||||||
emit_int8(op2 | encode(dst));
|
emit_int8(op2 | encode(dst));
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +254,7 @@ void Assembler::emit_arith_imm32(int op1, int op2, Register dst, int32_t imm32)
|
|||||||
assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
|
assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
|
||||||
emit_int8(op1);
|
emit_int8(op1);
|
||||||
emit_int8(op2 | encode(dst));
|
emit_int8(op2 | encode(dst));
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// immediate-to-memory forms
|
// immediate-to-memory forms
|
||||||
@ -268,7 +268,7 @@ void Assembler::emit_arith_operand(int op1, Register rm, Address adr, int32_t im
|
|||||||
} else {
|
} else {
|
||||||
emit_int8(op1);
|
emit_int8(op1);
|
||||||
emit_operand(rm, adr, 4);
|
emit_operand(rm, adr, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -976,7 +976,7 @@ void Assembler::addr_nop_7() {
|
|||||||
emit_int8(0x1F);
|
emit_int8(0x1F);
|
||||||
emit_int8((unsigned char)0x80);
|
emit_int8((unsigned char)0x80);
|
||||||
// emit_rm(cbuf, 0x2, EAX_enc, EAX_enc);
|
// emit_rm(cbuf, 0x2, EAX_enc, EAX_enc);
|
||||||
emit_long(0); // 32-bits offset (4 bytes)
|
emit_int32(0); // 32-bits offset (4 bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::addr_nop_8() {
|
void Assembler::addr_nop_8() {
|
||||||
@ -987,7 +987,7 @@ void Assembler::addr_nop_8() {
|
|||||||
emit_int8((unsigned char)0x84);
|
emit_int8((unsigned char)0x84);
|
||||||
// emit_rm(cbuf, 0x2, EAX_enc, 0x4);
|
// emit_rm(cbuf, 0x2, EAX_enc, 0x4);
|
||||||
emit_int8(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
|
emit_int8(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
|
||||||
emit_long(0); // 32-bits offset (4 bytes)
|
emit_int32(0); // 32-bits offset (4 bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::addsd(XMMRegister dst, XMMRegister src) {
|
void Assembler::addsd(XMMRegister dst, XMMRegister src) {
|
||||||
@ -1076,7 +1076,7 @@ void Assembler::andl(Address dst, int32_t imm32) {
|
|||||||
prefix(dst);
|
prefix(dst);
|
||||||
emit_int8((unsigned char)0x81);
|
emit_int8((unsigned char)0x81);
|
||||||
emit_operand(rsp, dst, 4);
|
emit_operand(rsp, dst, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::andl(Register dst, int32_t imm32) {
|
void Assembler::andl(Register dst, int32_t imm32) {
|
||||||
@ -1204,7 +1204,7 @@ void Assembler::cmpl(Address dst, int32_t imm32) {
|
|||||||
prefix(dst);
|
prefix(dst);
|
||||||
emit_int8((unsigned char)0x81);
|
emit_int8((unsigned char)0x81);
|
||||||
emit_operand(rdi, dst, 4);
|
emit_operand(rdi, dst, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::cmpl(Register dst, int32_t imm32) {
|
void Assembler::cmpl(Register dst, int32_t imm32) {
|
||||||
@ -1408,7 +1408,7 @@ void Assembler::imull(Register dst, Register src, int value) {
|
|||||||
} else {
|
} else {
|
||||||
emit_int8(0x69);
|
emit_int8(0x69);
|
||||||
emit_int8((unsigned char)(0xC0 | encode));
|
emit_int8((unsigned char)(0xC0 | encode));
|
||||||
emit_long(value);
|
emit_int32(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1440,7 +1440,7 @@ void Assembler::jcc(Condition cc, Label& L, bool maybe_short) {
|
|||||||
"must be 32bit offset (call4)");
|
"must be 32bit offset (call4)");
|
||||||
emit_int8(0x0F);
|
emit_int8(0x0F);
|
||||||
emit_int8((unsigned char)(0x80 | cc));
|
emit_int8((unsigned char)(0x80 | cc));
|
||||||
emit_long(offs - long_size);
|
emit_int32(offs - long_size);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Note: could eliminate cond. jumps to this jump if condition
|
// Note: could eliminate cond. jumps to this jump if condition
|
||||||
@ -1450,7 +1450,7 @@ void Assembler::jcc(Condition cc, Label& L, bool maybe_short) {
|
|||||||
L.add_patch_at(code(), locator());
|
L.add_patch_at(code(), locator());
|
||||||
emit_int8(0x0F);
|
emit_int8(0x0F);
|
||||||
emit_int8((unsigned char)(0x80 | cc));
|
emit_int8((unsigned char)(0x80 | cc));
|
||||||
emit_long(0);
|
emit_int32(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1498,7 +1498,7 @@ void Assembler::jmp(Label& L, bool maybe_short) {
|
|||||||
emit_int8((offs - short_size) & 0xFF);
|
emit_int8((offs - short_size) & 0xFF);
|
||||||
} else {
|
} else {
|
||||||
emit_int8((unsigned char)0xE9);
|
emit_int8((unsigned char)0xE9);
|
||||||
emit_long(offs - long_size);
|
emit_int32(offs - long_size);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// By default, forward jumps are always 32-bit displacements, since
|
// By default, forward jumps are always 32-bit displacements, since
|
||||||
@ -1508,7 +1508,7 @@ void Assembler::jmp(Label& L, bool maybe_short) {
|
|||||||
InstructionMark im(this);
|
InstructionMark im(this);
|
||||||
L.add_patch_at(code(), locator());
|
L.add_patch_at(code(), locator());
|
||||||
emit_int8((unsigned char)0xE9);
|
emit_int8((unsigned char)0xE9);
|
||||||
emit_long(0);
|
emit_int32(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1732,7 +1732,7 @@ void Assembler::vmovdqu(Address dst, XMMRegister src) {
|
|||||||
void Assembler::movl(Register dst, int32_t imm32) {
|
void Assembler::movl(Register dst, int32_t imm32) {
|
||||||
int encode = prefix_and_encode(dst->encoding());
|
int encode = prefix_and_encode(dst->encoding());
|
||||||
emit_int8((unsigned char)(0xB8 | encode));
|
emit_int8((unsigned char)(0xB8 | encode));
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::movl(Register dst, Register src) {
|
void Assembler::movl(Register dst, Register src) {
|
||||||
@ -1753,7 +1753,7 @@ void Assembler::movl(Address dst, int32_t imm32) {
|
|||||||
prefix(dst);
|
prefix(dst);
|
||||||
emit_int8((unsigned char)0xC7);
|
emit_int8((unsigned char)0xC7);
|
||||||
emit_operand(rax, dst, 4);
|
emit_operand(rax, dst, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::movl(Address dst, Register src) {
|
void Assembler::movl(Address dst, Register src) {
|
||||||
@ -2468,6 +2468,26 @@ void Assembler::ptest(XMMRegister dst, XMMRegister src) {
|
|||||||
emit_int8((unsigned char)(0xC0 | encode));
|
emit_int8((unsigned char)(0xC0 | encode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Assembler::vptest(XMMRegister dst, Address src) {
|
||||||
|
assert(VM_Version::supports_avx(), "");
|
||||||
|
InstructionMark im(this);
|
||||||
|
bool vector256 = true;
|
||||||
|
assert(dst != xnoreg, "sanity");
|
||||||
|
int dst_enc = dst->encoding();
|
||||||
|
// swap src<->dst for encoding
|
||||||
|
vex_prefix(src, dst_enc, dst_enc, VEX_SIMD_66, VEX_OPCODE_0F_38, false, vector256);
|
||||||
|
emit_int8(0x17);
|
||||||
|
emit_operand(dst, src);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Assembler::vptest(XMMRegister dst, XMMRegister src) {
|
||||||
|
assert(VM_Version::supports_avx(), "");
|
||||||
|
bool vector256 = true;
|
||||||
|
int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_38);
|
||||||
|
emit_int8(0x17);
|
||||||
|
emit_int8((unsigned char)(0xC0 | encode));
|
||||||
|
}
|
||||||
|
|
||||||
void Assembler::punpcklbw(XMMRegister dst, Address src) {
|
void Assembler::punpcklbw(XMMRegister dst, Address src) {
|
||||||
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
|
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
|
||||||
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
|
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
|
||||||
@ -2499,7 +2519,7 @@ void Assembler::push(int32_t imm32) {
|
|||||||
// in 64bits we push 64bits onto the stack but only
|
// in 64bits we push 64bits onto the stack but only
|
||||||
// take a 32bit immediate
|
// take a 32bit immediate
|
||||||
emit_int8(0x68);
|
emit_int8(0x68);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::push(Register src) {
|
void Assembler::push(Register src) {
|
||||||
@ -2544,12 +2564,18 @@ void Assembler::rep_mov() {
|
|||||||
emit_int8((unsigned char)0xA5);
|
emit_int8((unsigned char)0xA5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sets rcx bytes with rax, value at [edi]
|
||||||
|
void Assembler::rep_stosb() {
|
||||||
|
emit_int8((unsigned char)0xF3); // REP
|
||||||
|
LP64_ONLY(prefix(REX_W));
|
||||||
|
emit_int8((unsigned char)0xAA); // STOSB
|
||||||
|
}
|
||||||
|
|
||||||
// sets rcx pointer sized words with rax, value at [edi]
|
// sets rcx pointer sized words with rax, value at [edi]
|
||||||
// generic
|
// generic
|
||||||
void Assembler::rep_set() { // rep_set
|
void Assembler::rep_stos() {
|
||||||
emit_int8((unsigned char)0xF3);
|
emit_int8((unsigned char)0xF3); // REP
|
||||||
// STOSQ
|
LP64_ONLY(prefix(REX_W)); // LP64:STOSQ, LP32:STOSD
|
||||||
LP64_ONLY(prefix(REX_W));
|
|
||||||
emit_int8((unsigned char)0xAB);
|
emit_int8((unsigned char)0xAB);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2785,7 +2811,7 @@ void Assembler::testl(Register dst, int32_t imm32) {
|
|||||||
emit_int8((unsigned char)0xF7);
|
emit_int8((unsigned char)0xF7);
|
||||||
emit_int8((unsigned char)(0xC0 | encode));
|
emit_int8((unsigned char)(0xC0 | encode));
|
||||||
}
|
}
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::testl(Register dst, Register src) {
|
void Assembler::testl(Register dst, Register src) {
|
||||||
@ -3650,6 +3676,15 @@ void Assembler::vextracti128h(Address dst, XMMRegister src) {
|
|||||||
emit_int8(0x01);
|
emit_int8(0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// duplicate 4-bytes integer data from src into 8 locations in dest
|
||||||
|
void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src) {
|
||||||
|
assert(VM_Version::supports_avx2(), "");
|
||||||
|
bool vector256 = true;
|
||||||
|
int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, vector256, VEX_OPCODE_0F_38);
|
||||||
|
emit_int8(0x58);
|
||||||
|
emit_int8((unsigned char)(0xC0 | encode));
|
||||||
|
}
|
||||||
|
|
||||||
void Assembler::vzeroupper() {
|
void Assembler::vzeroupper() {
|
||||||
assert(VM_Version::supports_avx(), "");
|
assert(VM_Version::supports_avx(), "");
|
||||||
(void)vex_prefix_and_encode(xmm0, xmm0, xmm0, VEX_SIMD_NONE);
|
(void)vex_prefix_and_encode(xmm0, xmm0, xmm0, VEX_SIMD_NONE);
|
||||||
@ -4720,7 +4755,7 @@ void Assembler::andq(Address dst, int32_t imm32) {
|
|||||||
prefixq(dst);
|
prefixq(dst);
|
||||||
emit_int8((unsigned char)0x81);
|
emit_int8((unsigned char)0x81);
|
||||||
emit_operand(rsp, dst, 4);
|
emit_operand(rsp, dst, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::andq(Register dst, int32_t imm32) {
|
void Assembler::andq(Register dst, int32_t imm32) {
|
||||||
@ -4793,7 +4828,7 @@ void Assembler::cmpq(Address dst, int32_t imm32) {
|
|||||||
prefixq(dst);
|
prefixq(dst);
|
||||||
emit_int8((unsigned char)0x81);
|
emit_int8((unsigned char)0x81);
|
||||||
emit_operand(rdi, dst, 4);
|
emit_operand(rdi, dst, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::cmpq(Register dst, int32_t imm32) {
|
void Assembler::cmpq(Register dst, int32_t imm32) {
|
||||||
@ -4932,7 +4967,7 @@ void Assembler::imulq(Register dst, Register src, int value) {
|
|||||||
} else {
|
} else {
|
||||||
emit_int8(0x69);
|
emit_int8(0x69);
|
||||||
emit_int8((unsigned char)(0xC0 | encode));
|
emit_int8((unsigned char)(0xC0 | encode));
|
||||||
emit_long(value);
|
emit_int32(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5085,7 +5120,7 @@ void Assembler::movslq(Register dst, int32_t imm32) {
|
|||||||
InstructionMark im(this);
|
InstructionMark im(this);
|
||||||
int encode = prefixq_and_encode(dst->encoding());
|
int encode = prefixq_and_encode(dst->encoding());
|
||||||
emit_int8((unsigned char)(0xC7 | encode));
|
emit_int8((unsigned char)(0xC7 | encode));
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::movslq(Address dst, int32_t imm32) {
|
void Assembler::movslq(Address dst, int32_t imm32) {
|
||||||
@ -5094,7 +5129,7 @@ void Assembler::movslq(Address dst, int32_t imm32) {
|
|||||||
prefixq(dst);
|
prefixq(dst);
|
||||||
emit_int8((unsigned char)0xC7);
|
emit_int8((unsigned char)0xC7);
|
||||||
emit_operand(rax, dst, 4);
|
emit_operand(rax, dst, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::movslq(Register dst, Address src) {
|
void Assembler::movslq(Register dst, Address src) {
|
||||||
@ -5172,7 +5207,7 @@ void Assembler::orq(Address dst, int32_t imm32) {
|
|||||||
prefixq(dst);
|
prefixq(dst);
|
||||||
emit_int8((unsigned char)0x81);
|
emit_int8((unsigned char)0x81);
|
||||||
emit_operand(rcx, dst, 4);
|
emit_operand(rcx, dst, 4);
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::orq(Register dst, int32_t imm32) {
|
void Assembler::orq(Register dst, int32_t imm32) {
|
||||||
@ -5407,7 +5442,7 @@ void Assembler::testq(Register dst, int32_t imm32) {
|
|||||||
emit_int8((unsigned char)0xF7);
|
emit_int8((unsigned char)0xF7);
|
||||||
emit_int8((unsigned char)(0xC0 | encode));
|
emit_int8((unsigned char)(0xC0 | encode));
|
||||||
}
|
}
|
||||||
emit_long(imm32);
|
emit_int32(imm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::testq(Register dst, Register src) {
|
void Assembler::testq(Register dst, Register src) {
|
||||||
|
@ -832,7 +832,8 @@ private:
|
|||||||
|
|
||||||
// These do register sized moves/scans
|
// These do register sized moves/scans
|
||||||
void rep_mov();
|
void rep_mov();
|
||||||
void rep_set();
|
void rep_stos();
|
||||||
|
void rep_stosb();
|
||||||
void repne_scan();
|
void repne_scan();
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
void repne_scanl();
|
void repne_scanl();
|
||||||
@ -1443,9 +1444,12 @@ private:
|
|||||||
// Shift Right by bytes Logical DoubleQuadword Immediate
|
// Shift Right by bytes Logical DoubleQuadword Immediate
|
||||||
void psrldq(XMMRegister dst, int shift);
|
void psrldq(XMMRegister dst, int shift);
|
||||||
|
|
||||||
// Logical Compare Double Quadword
|
// Logical Compare 128bit
|
||||||
void ptest(XMMRegister dst, XMMRegister src);
|
void ptest(XMMRegister dst, XMMRegister src);
|
||||||
void ptest(XMMRegister dst, Address src);
|
void ptest(XMMRegister dst, Address src);
|
||||||
|
// Logical Compare 256bit
|
||||||
|
void vptest(XMMRegister dst, XMMRegister src);
|
||||||
|
void vptest(XMMRegister dst, Address src);
|
||||||
|
|
||||||
// Interleave Low Bytes
|
// Interleave Low Bytes
|
||||||
void punpcklbw(XMMRegister dst, XMMRegister src);
|
void punpcklbw(XMMRegister dst, XMMRegister src);
|
||||||
@ -1753,6 +1757,9 @@ private:
|
|||||||
void vextractf128h(Address dst, XMMRegister src);
|
void vextractf128h(Address dst, XMMRegister src);
|
||||||
void vextracti128h(Address dst, XMMRegister src);
|
void vextracti128h(Address dst, XMMRegister src);
|
||||||
|
|
||||||
|
// duplicate 4-bytes integer data from src into 8 locations in dest
|
||||||
|
void vpbroadcastd(XMMRegister dst, XMMRegister src);
|
||||||
|
|
||||||
// AVX instruction which is used to clear upper 128 bits of YMM registers and
|
// AVX instruction which is used to clear upper 128 bits of YMM registers and
|
||||||
// to avoid transaction penalty between AVX and SSE states. There is no
|
// to avoid transaction penalty between AVX and SSE states. There is no
|
||||||
// penalty if legacy SSE instructions are encoded using VEX prefix because
|
// penalty if legacy SSE instructions are encoded using VEX prefix because
|
||||||
|
@ -120,6 +120,9 @@ define_pd_global(intx, CMSYoungGenPerWorker, 64*M); // default max size of CMS
|
|||||||
product(bool, UseUnalignedLoadStores, false, \
|
product(bool, UseUnalignedLoadStores, false, \
|
||||||
"Use SSE2 MOVDQU instruction for Arraycopy") \
|
"Use SSE2 MOVDQU instruction for Arraycopy") \
|
||||||
\
|
\
|
||||||
|
product(bool, UseFastStosb, false, \
|
||||||
|
"Use fast-string operation for zeroing: rep stosb") \
|
||||||
|
\
|
||||||
/* assembler */ \
|
/* assembler */ \
|
||||||
product(bool, Use486InstrsOnly, false, \
|
product(bool, Use486InstrsOnly, false, \
|
||||||
"Use 80486 Compliant instruction subset") \
|
"Use 80486 Compliant instruction subset") \
|
||||||
|
@ -2540,7 +2540,7 @@ void MacroAssembler::jump_cc(Condition cc, AddressLiteral dst) {
|
|||||||
// 0000 1111 1000 tttn #32-bit disp
|
// 0000 1111 1000 tttn #32-bit disp
|
||||||
emit_int8(0x0F);
|
emit_int8(0x0F);
|
||||||
emit_int8((unsigned char)(0x80 | cc));
|
emit_int8((unsigned char)(0x80 | cc));
|
||||||
emit_long(offs - long_size);
|
emit_int32(offs - long_size);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
@ -5224,6 +5224,22 @@ void MacroAssembler::verified_entry(int framesize, bool stack_bang, bool fp_mode
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroAssembler::clear_mem(Register base, Register cnt, Register tmp) {
|
||||||
|
// cnt - number of qwords (8-byte words).
|
||||||
|
// base - start address, qword aligned.
|
||||||
|
assert(base==rdi, "base register must be edi for rep stos");
|
||||||
|
assert(tmp==rax, "tmp register must be eax for rep stos");
|
||||||
|
assert(cnt==rcx, "cnt register must be ecx for rep stos");
|
||||||
|
|
||||||
|
xorptr(tmp, tmp);
|
||||||
|
if (UseFastStosb) {
|
||||||
|
shlptr(cnt,3); // convert to number of bytes
|
||||||
|
rep_stosb();
|
||||||
|
} else {
|
||||||
|
NOT_LP64(shlptr(cnt,1);) // convert to number of dwords for 32-bit VM
|
||||||
|
rep_stos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// IndexOf for constant substrings with size >= 8 chars
|
// IndexOf for constant substrings with size >= 8 chars
|
||||||
// which don't need to be loaded through stack.
|
// which don't need to be loaded through stack.
|
||||||
@ -5659,42 +5675,114 @@ void MacroAssembler::string_compare(Register str1, Register str2,
|
|||||||
testl(cnt2, cnt2);
|
testl(cnt2, cnt2);
|
||||||
jcc(Assembler::zero, LENGTH_DIFF_LABEL);
|
jcc(Assembler::zero, LENGTH_DIFF_LABEL);
|
||||||
|
|
||||||
// Load first characters
|
// Compare first characters
|
||||||
load_unsigned_short(result, Address(str1, 0));
|
load_unsigned_short(result, Address(str1, 0));
|
||||||
load_unsigned_short(cnt1, Address(str2, 0));
|
load_unsigned_short(cnt1, Address(str2, 0));
|
||||||
|
|
||||||
// Compare first characters
|
|
||||||
subl(result, cnt1);
|
subl(result, cnt1);
|
||||||
jcc(Assembler::notZero, POP_LABEL);
|
jcc(Assembler::notZero, POP_LABEL);
|
||||||
decrementl(cnt2);
|
cmpl(cnt2, 1);
|
||||||
jcc(Assembler::zero, LENGTH_DIFF_LABEL);
|
jcc(Assembler::equal, LENGTH_DIFF_LABEL);
|
||||||
|
|
||||||
{
|
// Check if the strings start at the same location.
|
||||||
// Check after comparing first character to see if strings are equivalent
|
cmpptr(str1, str2);
|
||||||
Label LSkip2;
|
jcc(Assembler::equal, LENGTH_DIFF_LABEL);
|
||||||
// Check if the strings start at same location
|
|
||||||
cmpptr(str1, str2);
|
|
||||||
jccb(Assembler::notEqual, LSkip2);
|
|
||||||
|
|
||||||
// Check if the length difference is zero (from stack)
|
|
||||||
cmpl(Address(rsp, 0), 0x0);
|
|
||||||
jcc(Assembler::equal, LENGTH_DIFF_LABEL);
|
|
||||||
|
|
||||||
// Strings might not be equivalent
|
|
||||||
bind(LSkip2);
|
|
||||||
}
|
|
||||||
|
|
||||||
Address::ScaleFactor scale = Address::times_2;
|
Address::ScaleFactor scale = Address::times_2;
|
||||||
int stride = 8;
|
int stride = 8;
|
||||||
|
|
||||||
// Advance to next element
|
if (UseAVX >= 2) {
|
||||||
addptr(str1, 16/stride);
|
Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_WIDE_TAIL, COMPARE_SMALL_STR;
|
||||||
addptr(str2, 16/stride);
|
Label COMPARE_WIDE_VECTORS_LOOP, COMPARE_16_CHARS, COMPARE_INDEX_CHAR;
|
||||||
|
Label COMPARE_TAIL_LONG;
|
||||||
|
int pcmpmask = 0x19;
|
||||||
|
|
||||||
if (UseSSE42Intrinsics) {
|
// Setup to compare 16-chars (32-bytes) vectors,
|
||||||
|
// start from first character again because it has aligned address.
|
||||||
|
int stride2 = 16;
|
||||||
|
int adr_stride = stride << scale;
|
||||||
|
int adr_stride2 = stride2 << scale;
|
||||||
|
|
||||||
|
assert(result == rax && cnt2 == rdx && cnt1 == rcx, "pcmpestri");
|
||||||
|
// rax and rdx are used by pcmpestri as elements counters
|
||||||
|
movl(result, cnt2);
|
||||||
|
andl(cnt2, ~(stride2-1)); // cnt2 holds the vector count
|
||||||
|
jcc(Assembler::zero, COMPARE_TAIL_LONG);
|
||||||
|
|
||||||
|
// fast path : compare first 2 8-char vectors.
|
||||||
|
bind(COMPARE_16_CHARS);
|
||||||
|
movdqu(vec1, Address(str1, 0));
|
||||||
|
pcmpestri(vec1, Address(str2, 0), pcmpmask);
|
||||||
|
jccb(Assembler::below, COMPARE_INDEX_CHAR);
|
||||||
|
|
||||||
|
movdqu(vec1, Address(str1, adr_stride));
|
||||||
|
pcmpestri(vec1, Address(str2, adr_stride), pcmpmask);
|
||||||
|
jccb(Assembler::aboveEqual, COMPARE_WIDE_VECTORS);
|
||||||
|
addl(cnt1, stride);
|
||||||
|
|
||||||
|
// Compare the characters at index in cnt1
|
||||||
|
bind(COMPARE_INDEX_CHAR); //cnt1 has the offset of the mismatching character
|
||||||
|
load_unsigned_short(result, Address(str1, cnt1, scale));
|
||||||
|
load_unsigned_short(cnt2, Address(str2, cnt1, scale));
|
||||||
|
subl(result, cnt2);
|
||||||
|
jmp(POP_LABEL);
|
||||||
|
|
||||||
|
// Setup the registers to start vector comparison loop
|
||||||
|
bind(COMPARE_WIDE_VECTORS);
|
||||||
|
lea(str1, Address(str1, result, scale));
|
||||||
|
lea(str2, Address(str2, result, scale));
|
||||||
|
subl(result, stride2);
|
||||||
|
subl(cnt2, stride2);
|
||||||
|
jccb(Assembler::zero, COMPARE_WIDE_TAIL);
|
||||||
|
negptr(result);
|
||||||
|
|
||||||
|
// In a loop, compare 16-chars (32-bytes) at once using (vpxor+vptest)
|
||||||
|
bind(COMPARE_WIDE_VECTORS_LOOP);
|
||||||
|
vmovdqu(vec1, Address(str1, result, scale));
|
||||||
|
vpxor(vec1, Address(str2, result, scale));
|
||||||
|
vptest(vec1, vec1);
|
||||||
|
jccb(Assembler::notZero, VECTOR_NOT_EQUAL);
|
||||||
|
addptr(result, stride2);
|
||||||
|
subl(cnt2, stride2);
|
||||||
|
jccb(Assembler::notZero, COMPARE_WIDE_VECTORS_LOOP);
|
||||||
|
|
||||||
|
// compare wide vectors tail
|
||||||
|
bind(COMPARE_WIDE_TAIL);
|
||||||
|
testptr(result, result);
|
||||||
|
jccb(Assembler::zero, LENGTH_DIFF_LABEL);
|
||||||
|
|
||||||
|
movl(result, stride2);
|
||||||
|
movl(cnt2, result);
|
||||||
|
negptr(result);
|
||||||
|
jmpb(COMPARE_WIDE_VECTORS_LOOP);
|
||||||
|
|
||||||
|
// Identifies the mismatching (higher or lower)16-bytes in the 32-byte vectors.
|
||||||
|
bind(VECTOR_NOT_EQUAL);
|
||||||
|
lea(str1, Address(str1, result, scale));
|
||||||
|
lea(str2, Address(str2, result, scale));
|
||||||
|
jmp(COMPARE_16_CHARS);
|
||||||
|
|
||||||
|
// Compare tail chars, length between 1 to 15 chars
|
||||||
|
bind(COMPARE_TAIL_LONG);
|
||||||
|
movl(cnt2, result);
|
||||||
|
cmpl(cnt2, stride);
|
||||||
|
jccb(Assembler::less, COMPARE_SMALL_STR);
|
||||||
|
|
||||||
|
movdqu(vec1, Address(str1, 0));
|
||||||
|
pcmpestri(vec1, Address(str2, 0), pcmpmask);
|
||||||
|
jcc(Assembler::below, COMPARE_INDEX_CHAR);
|
||||||
|
subptr(cnt2, stride);
|
||||||
|
jccb(Assembler::zero, LENGTH_DIFF_LABEL);
|
||||||
|
lea(str1, Address(str1, result, scale));
|
||||||
|
lea(str2, Address(str2, result, scale));
|
||||||
|
negptr(cnt2);
|
||||||
|
jmpb(WHILE_HEAD_LABEL);
|
||||||
|
|
||||||
|
bind(COMPARE_SMALL_STR);
|
||||||
|
} else if (UseSSE42Intrinsics) {
|
||||||
Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
|
Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_TAIL;
|
||||||
int pcmpmask = 0x19;
|
int pcmpmask = 0x19;
|
||||||
// Setup to compare 16-byte vectors
|
// Setup to compare 8-char (16-byte) vectors,
|
||||||
|
// start from first character again because it has aligned address.
|
||||||
movl(result, cnt2);
|
movl(result, cnt2);
|
||||||
andl(cnt2, ~(stride - 1)); // cnt2 holds the vector count
|
andl(cnt2, ~(stride - 1)); // cnt2 holds the vector count
|
||||||
jccb(Assembler::zero, COMPARE_TAIL);
|
jccb(Assembler::zero, COMPARE_TAIL);
|
||||||
@ -5726,7 +5814,7 @@ void MacroAssembler::string_compare(Register str1, Register str2,
|
|||||||
jccb(Assembler::notZero, COMPARE_WIDE_VECTORS);
|
jccb(Assembler::notZero, COMPARE_WIDE_VECTORS);
|
||||||
|
|
||||||
// compare wide vectors tail
|
// compare wide vectors tail
|
||||||
testl(result, result);
|
testptr(result, result);
|
||||||
jccb(Assembler::zero, LENGTH_DIFF_LABEL);
|
jccb(Assembler::zero, LENGTH_DIFF_LABEL);
|
||||||
|
|
||||||
movl(cnt2, stride);
|
movl(cnt2, stride);
|
||||||
@ -5738,21 +5826,20 @@ void MacroAssembler::string_compare(Register str1, Register str2,
|
|||||||
|
|
||||||
// Mismatched characters in the vectors
|
// Mismatched characters in the vectors
|
||||||
bind(VECTOR_NOT_EQUAL);
|
bind(VECTOR_NOT_EQUAL);
|
||||||
addptr(result, cnt1);
|
addptr(cnt1, result);
|
||||||
movptr(cnt2, result);
|
load_unsigned_short(result, Address(str1, cnt1, scale));
|
||||||
load_unsigned_short(result, Address(str1, cnt2, scale));
|
load_unsigned_short(cnt2, Address(str2, cnt1, scale));
|
||||||
load_unsigned_short(cnt1, Address(str2, cnt2, scale));
|
subl(result, cnt2);
|
||||||
subl(result, cnt1);
|
|
||||||
jmpb(POP_LABEL);
|
jmpb(POP_LABEL);
|
||||||
|
|
||||||
bind(COMPARE_TAIL); // limit is zero
|
bind(COMPARE_TAIL); // limit is zero
|
||||||
movl(cnt2, result);
|
movl(cnt2, result);
|
||||||
// Fallthru to tail compare
|
// Fallthru to tail compare
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shift str2 and str1 to the end of the arrays, negate min
|
// Shift str2 and str1 to the end of the arrays, negate min
|
||||||
lea(str1, Address(str1, cnt2, scale, 0));
|
lea(str1, Address(str1, cnt2, scale));
|
||||||
lea(str2, Address(str2, cnt2, scale, 0));
|
lea(str2, Address(str2, cnt2, scale));
|
||||||
|
decrementl(cnt2); // first character was compared already
|
||||||
negptr(cnt2);
|
negptr(cnt2);
|
||||||
|
|
||||||
// Compare the rest of the elements
|
// Compare the rest of the elements
|
||||||
@ -5817,7 +5904,44 @@ void MacroAssembler::char_arrays_equals(bool is_array_equ, Register ary1, Regist
|
|||||||
shll(limit, 1); // byte count != 0
|
shll(limit, 1); // byte count != 0
|
||||||
movl(result, limit); // copy
|
movl(result, limit); // copy
|
||||||
|
|
||||||
if (UseSSE42Intrinsics) {
|
if (UseAVX >= 2) {
|
||||||
|
// With AVX2, use 32-byte vector compare
|
||||||
|
Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
|
||||||
|
|
||||||
|
// Compare 32-byte vectors
|
||||||
|
andl(result, 0x0000001e); // tail count (in bytes)
|
||||||
|
andl(limit, 0xffffffe0); // vector count (in bytes)
|
||||||
|
jccb(Assembler::zero, COMPARE_TAIL);
|
||||||
|
|
||||||
|
lea(ary1, Address(ary1, limit, Address::times_1));
|
||||||
|
lea(ary2, Address(ary2, limit, Address::times_1));
|
||||||
|
negptr(limit);
|
||||||
|
|
||||||
|
bind(COMPARE_WIDE_VECTORS);
|
||||||
|
vmovdqu(vec1, Address(ary1, limit, Address::times_1));
|
||||||
|
vmovdqu(vec2, Address(ary2, limit, Address::times_1));
|
||||||
|
vpxor(vec1, vec2);
|
||||||
|
|
||||||
|
vptest(vec1, vec1);
|
||||||
|
jccb(Assembler::notZero, FALSE_LABEL);
|
||||||
|
addptr(limit, 32);
|
||||||
|
jcc(Assembler::notZero, COMPARE_WIDE_VECTORS);
|
||||||
|
|
||||||
|
testl(result, result);
|
||||||
|
jccb(Assembler::zero, TRUE_LABEL);
|
||||||
|
|
||||||
|
vmovdqu(vec1, Address(ary1, result, Address::times_1, -32));
|
||||||
|
vmovdqu(vec2, Address(ary2, result, Address::times_1, -32));
|
||||||
|
vpxor(vec1, vec2);
|
||||||
|
|
||||||
|
vptest(vec1, vec1);
|
||||||
|
jccb(Assembler::notZero, FALSE_LABEL);
|
||||||
|
jmpb(TRUE_LABEL);
|
||||||
|
|
||||||
|
bind(COMPARE_TAIL); // limit is zero
|
||||||
|
movl(limit, result);
|
||||||
|
// Fallthru to tail compare
|
||||||
|
} else if (UseSSE42Intrinsics) {
|
||||||
// With SSE4.2, use double quad vector compare
|
// With SSE4.2, use double quad vector compare
|
||||||
Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
|
Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
|
||||||
|
|
||||||
@ -5995,29 +6119,53 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
|
|||||||
{
|
{
|
||||||
assert( UseSSE >= 2, "supported cpu only" );
|
assert( UseSSE >= 2, "supported cpu only" );
|
||||||
Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
|
Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
|
||||||
// Fill 32-byte chunks
|
|
||||||
movdl(xtmp, value);
|
movdl(xtmp, value);
|
||||||
pshufd(xtmp, xtmp, 0);
|
if (UseAVX >= 2 && UseUnalignedLoadStores) {
|
||||||
|
// Fill 64-byte chunks
|
||||||
|
Label L_fill_64_bytes_loop, L_check_fill_32_bytes;
|
||||||
|
vpbroadcastd(xtmp, xtmp);
|
||||||
|
|
||||||
subl(count, 8 << shift);
|
subl(count, 16 << shift);
|
||||||
jcc(Assembler::less, L_check_fill_8_bytes);
|
jcc(Assembler::less, L_check_fill_32_bytes);
|
||||||
align(16);
|
align(16);
|
||||||
|
|
||||||
BIND(L_fill_32_bytes_loop);
|
BIND(L_fill_64_bytes_loop);
|
||||||
|
vmovdqu(Address(to, 0), xtmp);
|
||||||
|
vmovdqu(Address(to, 32), xtmp);
|
||||||
|
addptr(to, 64);
|
||||||
|
subl(count, 16 << shift);
|
||||||
|
jcc(Assembler::greaterEqual, L_fill_64_bytes_loop);
|
||||||
|
|
||||||
if (UseUnalignedLoadStores) {
|
BIND(L_check_fill_32_bytes);
|
||||||
movdqu(Address(to, 0), xtmp);
|
addl(count, 8 << shift);
|
||||||
movdqu(Address(to, 16), xtmp);
|
jccb(Assembler::less, L_check_fill_8_bytes);
|
||||||
|
vmovdqu(Address(to, 0), xtmp);
|
||||||
|
addptr(to, 32);
|
||||||
|
subl(count, 8 << shift);
|
||||||
} else {
|
} else {
|
||||||
movq(Address(to, 0), xtmp);
|
// Fill 32-byte chunks
|
||||||
movq(Address(to, 8), xtmp);
|
pshufd(xtmp, xtmp, 0);
|
||||||
movq(Address(to, 16), xtmp);
|
|
||||||
movq(Address(to, 24), xtmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
addptr(to, 32);
|
subl(count, 8 << shift);
|
||||||
subl(count, 8 << shift);
|
jcc(Assembler::less, L_check_fill_8_bytes);
|
||||||
jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
|
align(16);
|
||||||
|
|
||||||
|
BIND(L_fill_32_bytes_loop);
|
||||||
|
|
||||||
|
if (UseUnalignedLoadStores) {
|
||||||
|
movdqu(Address(to, 0), xtmp);
|
||||||
|
movdqu(Address(to, 16), xtmp);
|
||||||
|
} else {
|
||||||
|
movq(Address(to, 0), xtmp);
|
||||||
|
movq(Address(to, 8), xtmp);
|
||||||
|
movq(Address(to, 16), xtmp);
|
||||||
|
movq(Address(to, 24), xtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
addptr(to, 32);
|
||||||
|
subl(count, 8 << shift);
|
||||||
|
jcc(Assembler::greaterEqual, L_fill_32_bytes_loop);
|
||||||
|
}
|
||||||
BIND(L_check_fill_8_bytes);
|
BIND(L_check_fill_8_bytes);
|
||||||
addl(count, 8 << shift);
|
addl(count, 8 << shift);
|
||||||
jccb(Assembler::zero, L_exit);
|
jccb(Assembler::zero, L_exit);
|
||||||
|
@ -1011,6 +1011,10 @@ public:
|
|||||||
Assembler::vxorpd(dst, nds, src, vector256);
|
Assembler::vxorpd(dst, nds, src, vector256);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Simple version for AVX2 256bit vectors
|
||||||
|
void vpxor(XMMRegister dst, XMMRegister src) { Assembler::vpxor(dst, dst, src, true); }
|
||||||
|
void vpxor(XMMRegister dst, Address src) { Assembler::vpxor(dst, dst, src, true); }
|
||||||
|
|
||||||
// Move packed integer values from low 128 bit to hign 128 bit in 256 bit vector.
|
// Move packed integer values from low 128 bit to hign 128 bit in 256 bit vector.
|
||||||
void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
|
void vinserti128h(XMMRegister dst, XMMRegister nds, XMMRegister src) {
|
||||||
if (UseAVX > 1) // vinserti128h is available only in AVX2
|
if (UseAVX > 1) // vinserti128h is available only in AVX2
|
||||||
@ -1096,6 +1100,9 @@ public:
|
|||||||
// C2 compiled method's prolog code.
|
// C2 compiled method's prolog code.
|
||||||
void verified_entry(int framesize, bool stack_bang, bool fp_mode_24b);
|
void verified_entry(int framesize, bool stack_bang, bool fp_mode_24b);
|
||||||
|
|
||||||
|
// clear memory of size 'cnt' qwords, starting at 'base'.
|
||||||
|
void clear_mem(Register base, Register cnt, Register rtmp);
|
||||||
|
|
||||||
// IndexOf strings.
|
// IndexOf strings.
|
||||||
// Small strings are loaded through stack if they cross page boundary.
|
// Small strings are loaded through stack if they cross page boundary.
|
||||||
void string_indexof(Register str1, Register str2,
|
void string_indexof(Register str1, Register str2,
|
||||||
|
@ -796,16 +796,22 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ align(OptoLoopAlignment);
|
__ align(OptoLoopAlignment);
|
||||||
__ BIND(L_copy_64_bytes_loop);
|
__ BIND(L_copy_64_bytes_loop);
|
||||||
|
|
||||||
if(UseUnalignedLoadStores) {
|
if (UseUnalignedLoadStores) {
|
||||||
__ movdqu(xmm0, Address(from, 0));
|
if (UseAVX >= 2) {
|
||||||
__ movdqu(Address(from, to_from, Address::times_1, 0), xmm0);
|
__ vmovdqu(xmm0, Address(from, 0));
|
||||||
__ movdqu(xmm1, Address(from, 16));
|
__ vmovdqu(Address(from, to_from, Address::times_1, 0), xmm0);
|
||||||
__ movdqu(Address(from, to_from, Address::times_1, 16), xmm1);
|
__ vmovdqu(xmm1, Address(from, 32));
|
||||||
__ movdqu(xmm2, Address(from, 32));
|
__ vmovdqu(Address(from, to_from, Address::times_1, 32), xmm1);
|
||||||
__ movdqu(Address(from, to_from, Address::times_1, 32), xmm2);
|
} else {
|
||||||
__ movdqu(xmm3, Address(from, 48));
|
__ movdqu(xmm0, Address(from, 0));
|
||||||
__ movdqu(Address(from, to_from, Address::times_1, 48), xmm3);
|
__ movdqu(Address(from, to_from, Address::times_1, 0), xmm0);
|
||||||
|
__ movdqu(xmm1, Address(from, 16));
|
||||||
|
__ movdqu(Address(from, to_from, Address::times_1, 16), xmm1);
|
||||||
|
__ movdqu(xmm2, Address(from, 32));
|
||||||
|
__ movdqu(Address(from, to_from, Address::times_1, 32), xmm2);
|
||||||
|
__ movdqu(xmm3, Address(from, 48));
|
||||||
|
__ movdqu(Address(from, to_from, Address::times_1, 48), xmm3);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
__ movq(xmm0, Address(from, 0));
|
__ movq(xmm0, Address(from, 0));
|
||||||
__ movq(Address(from, to_from, Address::times_1, 0), xmm0);
|
__ movq(Address(from, to_from, Address::times_1, 0), xmm0);
|
||||||
|
@ -1286,23 +1286,54 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// end_to - destination array end address
|
// end_to - destination array end address
|
||||||
// qword_count - 64-bits element count, negative
|
// qword_count - 64-bits element count, negative
|
||||||
// to - scratch
|
// to - scratch
|
||||||
// L_copy_32_bytes - entry label
|
// L_copy_bytes - entry label
|
||||||
// L_copy_8_bytes - exit label
|
// L_copy_8_bytes - exit label
|
||||||
//
|
//
|
||||||
void copy_32_bytes_forward(Register end_from, Register end_to,
|
void copy_bytes_forward(Register end_from, Register end_to,
|
||||||
Register qword_count, Register to,
|
Register qword_count, Register to,
|
||||||
Label& L_copy_32_bytes, Label& L_copy_8_bytes) {
|
Label& L_copy_bytes, Label& L_copy_8_bytes) {
|
||||||
DEBUG_ONLY(__ stop("enter at entry label, not here"));
|
DEBUG_ONLY(__ stop("enter at entry label, not here"));
|
||||||
Label L_loop;
|
Label L_loop;
|
||||||
__ align(OptoLoopAlignment);
|
__ align(OptoLoopAlignment);
|
||||||
__ BIND(L_loop);
|
if (UseUnalignedLoadStores) {
|
||||||
if(UseUnalignedLoadStores) {
|
Label L_end;
|
||||||
__ movdqu(xmm0, Address(end_from, qword_count, Address::times_8, -24));
|
// Copy 64-bytes per iteration
|
||||||
__ movdqu(Address(end_to, qword_count, Address::times_8, -24), xmm0);
|
__ BIND(L_loop);
|
||||||
__ movdqu(xmm1, Address(end_from, qword_count, Address::times_8, - 8));
|
if (UseAVX >= 2) {
|
||||||
__ movdqu(Address(end_to, qword_count, Address::times_8, - 8), xmm1);
|
__ vmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
|
||||||
|
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
|
||||||
|
__ vmovdqu(xmm1, Address(end_from, qword_count, Address::times_8, -24));
|
||||||
|
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -24), xmm1);
|
||||||
|
} else {
|
||||||
|
__ movdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
|
||||||
|
__ movdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
|
||||||
|
__ movdqu(xmm1, Address(end_from, qword_count, Address::times_8, -40));
|
||||||
|
__ movdqu(Address(end_to, qword_count, Address::times_8, -40), xmm1);
|
||||||
|
__ movdqu(xmm2, Address(end_from, qword_count, Address::times_8, -24));
|
||||||
|
__ movdqu(Address(end_to, qword_count, Address::times_8, -24), xmm2);
|
||||||
|
__ movdqu(xmm3, Address(end_from, qword_count, Address::times_8, - 8));
|
||||||
|
__ movdqu(Address(end_to, qword_count, Address::times_8, - 8), xmm3);
|
||||||
|
}
|
||||||
|
__ BIND(L_copy_bytes);
|
||||||
|
__ addptr(qword_count, 8);
|
||||||
|
__ jcc(Assembler::lessEqual, L_loop);
|
||||||
|
__ subptr(qword_count, 4); // sub(8) and add(4)
|
||||||
|
__ jccb(Assembler::greater, L_end);
|
||||||
|
// Copy trailing 32 bytes
|
||||||
|
if (UseAVX >= 2) {
|
||||||
|
__ vmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -24));
|
||||||
|
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -24), xmm0);
|
||||||
|
} else {
|
||||||
|
__ movdqu(xmm0, Address(end_from, qword_count, Address::times_8, -24));
|
||||||
|
__ movdqu(Address(end_to, qword_count, Address::times_8, -24), xmm0);
|
||||||
|
__ movdqu(xmm1, Address(end_from, qword_count, Address::times_8, - 8));
|
||||||
|
__ movdqu(Address(end_to, qword_count, Address::times_8, - 8), xmm1);
|
||||||
|
}
|
||||||
|
__ addptr(qword_count, 4);
|
||||||
|
__ BIND(L_end);
|
||||||
} else {
|
} else {
|
||||||
|
// Copy 32-bytes per iteration
|
||||||
|
__ BIND(L_loop);
|
||||||
__ movq(to, Address(end_from, qword_count, Address::times_8, -24));
|
__ movq(to, Address(end_from, qword_count, Address::times_8, -24));
|
||||||
__ movq(Address(end_to, qword_count, Address::times_8, -24), to);
|
__ movq(Address(end_to, qword_count, Address::times_8, -24), to);
|
||||||
__ movq(to, Address(end_from, qword_count, Address::times_8, -16));
|
__ movq(to, Address(end_from, qword_count, Address::times_8, -16));
|
||||||
@ -1311,15 +1342,15 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ movq(Address(end_to, qword_count, Address::times_8, - 8), to);
|
__ movq(Address(end_to, qword_count, Address::times_8, - 8), to);
|
||||||
__ movq(to, Address(end_from, qword_count, Address::times_8, - 0));
|
__ movq(to, Address(end_from, qword_count, Address::times_8, - 0));
|
||||||
__ movq(Address(end_to, qword_count, Address::times_8, - 0), to);
|
__ movq(Address(end_to, qword_count, Address::times_8, - 0), to);
|
||||||
|
|
||||||
|
__ BIND(L_copy_bytes);
|
||||||
|
__ addptr(qword_count, 4);
|
||||||
|
__ jcc(Assembler::lessEqual, L_loop);
|
||||||
}
|
}
|
||||||
__ BIND(L_copy_32_bytes);
|
|
||||||
__ addptr(qword_count, 4);
|
|
||||||
__ jcc(Assembler::lessEqual, L_loop);
|
|
||||||
__ subptr(qword_count, 4);
|
__ subptr(qword_count, 4);
|
||||||
__ jcc(Assembler::less, L_copy_8_bytes); // Copy trailing qwords
|
__ jcc(Assembler::less, L_copy_8_bytes); // Copy trailing qwords
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Copy big chunks backward
|
// Copy big chunks backward
|
||||||
//
|
//
|
||||||
// Inputs:
|
// Inputs:
|
||||||
@ -1327,23 +1358,55 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// dest - destination array address
|
// dest - destination array address
|
||||||
// qword_count - 64-bits element count
|
// qword_count - 64-bits element count
|
||||||
// to - scratch
|
// to - scratch
|
||||||
// L_copy_32_bytes - entry label
|
// L_copy_bytes - entry label
|
||||||
// L_copy_8_bytes - exit label
|
// L_copy_8_bytes - exit label
|
||||||
//
|
//
|
||||||
void copy_32_bytes_backward(Register from, Register dest,
|
void copy_bytes_backward(Register from, Register dest,
|
||||||
Register qword_count, Register to,
|
Register qword_count, Register to,
|
||||||
Label& L_copy_32_bytes, Label& L_copy_8_bytes) {
|
Label& L_copy_bytes, Label& L_copy_8_bytes) {
|
||||||
DEBUG_ONLY(__ stop("enter at entry label, not here"));
|
DEBUG_ONLY(__ stop("enter at entry label, not here"));
|
||||||
Label L_loop;
|
Label L_loop;
|
||||||
__ align(OptoLoopAlignment);
|
__ align(OptoLoopAlignment);
|
||||||
__ BIND(L_loop);
|
if (UseUnalignedLoadStores) {
|
||||||
if(UseUnalignedLoadStores) {
|
Label L_end;
|
||||||
__ movdqu(xmm0, Address(from, qword_count, Address::times_8, 16));
|
// Copy 64-bytes per iteration
|
||||||
__ movdqu(Address(dest, qword_count, Address::times_8, 16), xmm0);
|
__ BIND(L_loop);
|
||||||
__ movdqu(xmm1, Address(from, qword_count, Address::times_8, 0));
|
if (UseAVX >= 2) {
|
||||||
__ movdqu(Address(dest, qword_count, Address::times_8, 0), xmm1);
|
__ vmovdqu(xmm0, Address(from, qword_count, Address::times_8, 32));
|
||||||
|
__ vmovdqu(Address(dest, qword_count, Address::times_8, 32), xmm0);
|
||||||
|
__ vmovdqu(xmm1, Address(from, qword_count, Address::times_8, 0));
|
||||||
|
__ vmovdqu(Address(dest, qword_count, Address::times_8, 0), xmm1);
|
||||||
|
} else {
|
||||||
|
__ movdqu(xmm0, Address(from, qword_count, Address::times_8, 48));
|
||||||
|
__ movdqu(Address(dest, qword_count, Address::times_8, 48), xmm0);
|
||||||
|
__ movdqu(xmm1, Address(from, qword_count, Address::times_8, 32));
|
||||||
|
__ movdqu(Address(dest, qword_count, Address::times_8, 32), xmm1);
|
||||||
|
__ movdqu(xmm2, Address(from, qword_count, Address::times_8, 16));
|
||||||
|
__ movdqu(Address(dest, qword_count, Address::times_8, 16), xmm2);
|
||||||
|
__ movdqu(xmm3, Address(from, qword_count, Address::times_8, 0));
|
||||||
|
__ movdqu(Address(dest, qword_count, Address::times_8, 0), xmm3);
|
||||||
|
}
|
||||||
|
__ BIND(L_copy_bytes);
|
||||||
|
__ subptr(qword_count, 8);
|
||||||
|
__ jcc(Assembler::greaterEqual, L_loop);
|
||||||
|
|
||||||
|
__ addptr(qword_count, 4); // add(8) and sub(4)
|
||||||
|
__ jccb(Assembler::less, L_end);
|
||||||
|
// Copy trailing 32 bytes
|
||||||
|
if (UseAVX >= 2) {
|
||||||
|
__ vmovdqu(xmm0, Address(from, qword_count, Address::times_8, 0));
|
||||||
|
__ vmovdqu(Address(dest, qword_count, Address::times_8, 0), xmm0);
|
||||||
|
} else {
|
||||||
|
__ movdqu(xmm0, Address(from, qword_count, Address::times_8, 16));
|
||||||
|
__ movdqu(Address(dest, qword_count, Address::times_8, 16), xmm0);
|
||||||
|
__ movdqu(xmm1, Address(from, qword_count, Address::times_8, 0));
|
||||||
|
__ movdqu(Address(dest, qword_count, Address::times_8, 0), xmm1);
|
||||||
|
}
|
||||||
|
__ subptr(qword_count, 4);
|
||||||
|
__ BIND(L_end);
|
||||||
} else {
|
} else {
|
||||||
|
// Copy 32-bytes per iteration
|
||||||
|
__ BIND(L_loop);
|
||||||
__ movq(to, Address(from, qword_count, Address::times_8, 24));
|
__ movq(to, Address(from, qword_count, Address::times_8, 24));
|
||||||
__ movq(Address(dest, qword_count, Address::times_8, 24), to);
|
__ movq(Address(dest, qword_count, Address::times_8, 24), to);
|
||||||
__ movq(to, Address(from, qword_count, Address::times_8, 16));
|
__ movq(to, Address(from, qword_count, Address::times_8, 16));
|
||||||
@ -1352,10 +1415,11 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ movq(Address(dest, qword_count, Address::times_8, 8), to);
|
__ movq(Address(dest, qword_count, Address::times_8, 8), to);
|
||||||
__ movq(to, Address(from, qword_count, Address::times_8, 0));
|
__ movq(to, Address(from, qword_count, Address::times_8, 0));
|
||||||
__ movq(Address(dest, qword_count, Address::times_8, 0), to);
|
__ movq(Address(dest, qword_count, Address::times_8, 0), to);
|
||||||
|
|
||||||
|
__ BIND(L_copy_bytes);
|
||||||
|
__ subptr(qword_count, 4);
|
||||||
|
__ jcc(Assembler::greaterEqual, L_loop);
|
||||||
}
|
}
|
||||||
__ BIND(L_copy_32_bytes);
|
|
||||||
__ subptr(qword_count, 4);
|
|
||||||
__ jcc(Assembler::greaterEqual, L_loop);
|
|
||||||
__ addptr(qword_count, 4);
|
__ addptr(qword_count, 4);
|
||||||
__ jcc(Assembler::greater, L_copy_8_bytes); // Copy trailing qwords
|
__ jcc(Assembler::greater, L_copy_8_bytes); // Copy trailing qwords
|
||||||
}
|
}
|
||||||
@ -1385,7 +1449,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_copy_4_bytes, L_copy_2_bytes;
|
Label L_copy_bytes, L_copy_8_bytes, L_copy_4_bytes, L_copy_2_bytes;
|
||||||
Label L_copy_byte, L_exit;
|
Label L_copy_byte, L_exit;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
@ -1417,7 +1481,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
||||||
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
||||||
__ negptr(qword_count); // make the count negative
|
__ negptr(qword_count); // make the count negative
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -1460,8 +1524,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
// Copy in 32-bytes chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_forward(end_from, end_to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_forward(end_from, end_to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
__ jmp(L_copy_4_bytes);
|
__ jmp(L_copy_4_bytes);
|
||||||
|
|
||||||
return start;
|
return start;
|
||||||
@ -1488,7 +1552,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_copy_4_bytes, L_copy_2_bytes;
|
Label L_copy_bytes, L_copy_8_bytes, L_copy_4_bytes, L_copy_2_bytes;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
const Register count = rdx; // elements count
|
const Register count = rdx; // elements count
|
||||||
@ -1531,10 +1595,10 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// Check for and copy trailing dword
|
// Check for and copy trailing dword
|
||||||
__ BIND(L_copy_4_bytes);
|
__ BIND(L_copy_4_bytes);
|
||||||
__ testl(byte_count, 4);
|
__ testl(byte_count, 4);
|
||||||
__ jcc(Assembler::zero, L_copy_32_bytes);
|
__ jcc(Assembler::zero, L_copy_bytes);
|
||||||
__ movl(rax, Address(from, qword_count, Address::times_8));
|
__ movl(rax, Address(from, qword_count, Address::times_8));
|
||||||
__ movl(Address(to, qword_count, Address::times_8), rax);
|
__ movl(Address(to, qword_count, Address::times_8), rax);
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -1549,8 +1613,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
// Copy in 32-bytes chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_backward(from, to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_backward(from, to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
|
|
||||||
restore_arg_regs();
|
restore_arg_regs();
|
||||||
inc_counter_np(SharedRuntime::_jbyte_array_copy_ctr); // Update counter after rscratch1 is free
|
inc_counter_np(SharedRuntime::_jbyte_array_copy_ctr); // Update counter after rscratch1 is free
|
||||||
@ -1585,7 +1649,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_copy_4_bytes,L_copy_2_bytes,L_exit;
|
Label L_copy_bytes, L_copy_8_bytes, L_copy_4_bytes,L_copy_2_bytes,L_exit;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
const Register count = rdx; // elements count
|
const Register count = rdx; // elements count
|
||||||
@ -1616,7 +1680,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
||||||
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
||||||
__ negptr(qword_count);
|
__ negptr(qword_count);
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -1652,8 +1716,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
// Copy in 32-bytes chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_forward(end_from, end_to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_forward(end_from, end_to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
__ jmp(L_copy_4_bytes);
|
__ jmp(L_copy_4_bytes);
|
||||||
|
|
||||||
return start;
|
return start;
|
||||||
@ -1700,7 +1764,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_copy_4_bytes;
|
Label L_copy_bytes, L_copy_8_bytes, L_copy_4_bytes;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
const Register count = rdx; // elements count
|
const Register count = rdx; // elements count
|
||||||
@ -1735,10 +1799,10 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// Check for and copy trailing dword
|
// Check for and copy trailing dword
|
||||||
__ BIND(L_copy_4_bytes);
|
__ BIND(L_copy_4_bytes);
|
||||||
__ testl(word_count, 2);
|
__ testl(word_count, 2);
|
||||||
__ jcc(Assembler::zero, L_copy_32_bytes);
|
__ jcc(Assembler::zero, L_copy_bytes);
|
||||||
__ movl(rax, Address(from, qword_count, Address::times_8));
|
__ movl(rax, Address(from, qword_count, Address::times_8));
|
||||||
__ movl(Address(to, qword_count, Address::times_8), rax);
|
__ movl(Address(to, qword_count, Address::times_8), rax);
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -1753,8 +1817,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
// Copy in 32-bytes chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_backward(from, to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_backward(from, to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
|
|
||||||
restore_arg_regs();
|
restore_arg_regs();
|
||||||
inc_counter_np(SharedRuntime::_jshort_array_copy_ctr); // Update counter after rscratch1 is free
|
inc_counter_np(SharedRuntime::_jshort_array_copy_ctr); // Update counter after rscratch1 is free
|
||||||
@ -1790,7 +1854,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_copy_4_bytes, L_exit;
|
Label L_copy_bytes, L_copy_8_bytes, L_copy_4_bytes, L_exit;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
const Register count = rdx; // elements count
|
const Register count = rdx; // elements count
|
||||||
@ -1826,7 +1890,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
||||||
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
||||||
__ negptr(qword_count);
|
__ negptr(qword_count);
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -1853,8 +1917,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
// Copy 32-bytes chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_forward(end_from, end_to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_forward(end_from, end_to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
__ jmp(L_copy_4_bytes);
|
__ jmp(L_copy_4_bytes);
|
||||||
|
|
||||||
return start;
|
return start;
|
||||||
@ -1882,7 +1946,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_copy_2_bytes, L_exit;
|
Label L_copy_bytes, L_copy_8_bytes, L_copy_2_bytes, L_exit;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
const Register count = rdx; // elements count
|
const Register count = rdx; // elements count
|
||||||
@ -1916,10 +1980,10 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
|
|
||||||
// Check for and copy trailing dword
|
// Check for and copy trailing dword
|
||||||
__ testl(dword_count, 1);
|
__ testl(dword_count, 1);
|
||||||
__ jcc(Assembler::zero, L_copy_32_bytes);
|
__ jcc(Assembler::zero, L_copy_bytes);
|
||||||
__ movl(rax, Address(from, dword_count, Address::times_4, -4));
|
__ movl(rax, Address(from, dword_count, Address::times_4, -4));
|
||||||
__ movl(Address(to, dword_count, Address::times_4, -4), rax);
|
__ movl(Address(to, dword_count, Address::times_4, -4), rax);
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -1937,8 +2001,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
// Copy in 32-bytes chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_backward(from, to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_backward(from, to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
|
|
||||||
__ bind(L_exit);
|
__ bind(L_exit);
|
||||||
if (is_oop) {
|
if (is_oop) {
|
||||||
@ -1976,7 +2040,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_exit;
|
Label L_copy_bytes, L_copy_8_bytes, L_exit;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
const Register qword_count = rdx; // elements count
|
const Register qword_count = rdx; // elements count
|
||||||
@ -2008,7 +2072,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
__ lea(end_from, Address(from, qword_count, Address::times_8, -8));
|
||||||
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
__ lea(end_to, Address(to, qword_count, Address::times_8, -8));
|
||||||
__ negptr(qword_count);
|
__ negptr(qword_count);
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -2027,8 +2091,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ ret(0);
|
__ ret(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy 64-byte chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_forward(end_from, end_to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_forward(end_from, end_to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
|
|
||||||
if (is_oop) {
|
if (is_oop) {
|
||||||
__ BIND(L_exit);
|
__ BIND(L_exit);
|
||||||
@ -2065,7 +2129,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubCodeMark mark(this, "StubRoutines", name);
|
StubCodeMark mark(this, "StubRoutines", name);
|
||||||
address start = __ pc();
|
address start = __ pc();
|
||||||
|
|
||||||
Label L_copy_32_bytes, L_copy_8_bytes, L_exit;
|
Label L_copy_bytes, L_copy_8_bytes, L_exit;
|
||||||
const Register from = rdi; // source array address
|
const Register from = rdi; // source array address
|
||||||
const Register to = rsi; // destination array address
|
const Register to = rsi; // destination array address
|
||||||
const Register qword_count = rdx; // elements count
|
const Register qword_count = rdx; // elements count
|
||||||
@ -2091,7 +2155,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
gen_write_ref_array_pre_barrier(to, saved_count, dest_uninitialized);
|
gen_write_ref_array_pre_barrier(to, saved_count, dest_uninitialized);
|
||||||
}
|
}
|
||||||
|
|
||||||
__ jmp(L_copy_32_bytes);
|
__ jmp(L_copy_bytes);
|
||||||
|
|
||||||
// Copy trailing qwords
|
// Copy trailing qwords
|
||||||
__ BIND(L_copy_8_bytes);
|
__ BIND(L_copy_8_bytes);
|
||||||
@ -2110,8 +2174,8 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ ret(0);
|
__ ret(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy in 32-bytes chunks
|
// Copy in multi-bytes chunks
|
||||||
copy_32_bytes_backward(from, to, qword_count, rax, L_copy_32_bytes, L_copy_8_bytes);
|
copy_bytes_backward(from, to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||||
|
|
||||||
if (is_oop) {
|
if (is_oop) {
|
||||||
__ BIND(L_exit);
|
__ BIND(L_exit);
|
||||||
|
@ -429,7 +429,7 @@ void VM_Version::get_processor_features() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
char buf[256];
|
char buf[256];
|
||||||
jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||||
cores_per_cpu(), threads_per_core(),
|
cores_per_cpu(), threads_per_core(),
|
||||||
cpu_family(), _model, _stepping,
|
cpu_family(), _model, _stepping,
|
||||||
(supports_cmov() ? ", cmov" : ""),
|
(supports_cmov() ? ", cmov" : ""),
|
||||||
@ -446,6 +446,7 @@ void VM_Version::get_processor_features() {
|
|||||||
(supports_avx() ? ", avx" : ""),
|
(supports_avx() ? ", avx" : ""),
|
||||||
(supports_avx2() ? ", avx2" : ""),
|
(supports_avx2() ? ", avx2" : ""),
|
||||||
(supports_aes() ? ", aes" : ""),
|
(supports_aes() ? ", aes" : ""),
|
||||||
|
(supports_erms() ? ", erms" : ""),
|
||||||
(supports_mmx_ext() ? ", mmxext" : ""),
|
(supports_mmx_ext() ? ", mmxext" : ""),
|
||||||
(supports_3dnow_prefetch() ? ", 3dnowpref" : ""),
|
(supports_3dnow_prefetch() ? ", 3dnowpref" : ""),
|
||||||
(supports_lzcnt() ? ", lzcnt": ""),
|
(supports_lzcnt() ? ", lzcnt": ""),
|
||||||
@ -671,6 +672,16 @@ void VM_Version::get_processor_features() {
|
|||||||
FLAG_SET_DEFAULT(UsePopCountInstruction, false);
|
FLAG_SET_DEFAULT(UsePopCountInstruction, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use fast-string operations if available.
|
||||||
|
if (supports_erms()) {
|
||||||
|
if (FLAG_IS_DEFAULT(UseFastStosb)) {
|
||||||
|
UseFastStosb = true;
|
||||||
|
}
|
||||||
|
} else if (UseFastStosb) {
|
||||||
|
warning("fast-string operations are not available on this CPU");
|
||||||
|
FLAG_SET_DEFAULT(UseFastStosb, false);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef COMPILER2
|
#ifdef COMPILER2
|
||||||
if (FLAG_IS_DEFAULT(AlignVector)) {
|
if (FLAG_IS_DEFAULT(AlignVector)) {
|
||||||
// Modern processors allow misaligned memory operations for vectors.
|
// Modern processors allow misaligned memory operations for vectors.
|
||||||
|
@ -204,7 +204,8 @@ public:
|
|||||||
avx2 : 1,
|
avx2 : 1,
|
||||||
: 2,
|
: 2,
|
||||||
bmi2 : 1,
|
bmi2 : 1,
|
||||||
: 23;
|
erms : 1,
|
||||||
|
: 22;
|
||||||
} bits;
|
} bits;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -247,7 +248,8 @@ protected:
|
|||||||
CPU_TSCINV = (1 << 16),
|
CPU_TSCINV = (1 << 16),
|
||||||
CPU_AVX = (1 << 17),
|
CPU_AVX = (1 << 17),
|
||||||
CPU_AVX2 = (1 << 18),
|
CPU_AVX2 = (1 << 18),
|
||||||
CPU_AES = (1 << 19)
|
CPU_AES = (1 << 19),
|
||||||
|
CPU_ERMS = (1 << 20) // enhanced 'rep movsb/stosb' instructions
|
||||||
} cpuFeatureFlags;
|
} cpuFeatureFlags;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -425,6 +427,8 @@ protected:
|
|||||||
result |= CPU_TSCINV;
|
result |= CPU_TSCINV;
|
||||||
if (_cpuid_info.std_cpuid1_ecx.bits.aes != 0)
|
if (_cpuid_info.std_cpuid1_ecx.bits.aes != 0)
|
||||||
result |= CPU_AES;
|
result |= CPU_AES;
|
||||||
|
if (_cpuid_info.sef_cpuid7_ebx.bits.erms != 0)
|
||||||
|
result |= CPU_ERMS;
|
||||||
|
|
||||||
// AMD features.
|
// AMD features.
|
||||||
if (is_amd()) {
|
if (is_amd()) {
|
||||||
@ -489,7 +493,7 @@ public:
|
|||||||
return (_cpuid_info.std_max_function >= 0xB) &&
|
return (_cpuid_info.std_max_function >= 0xB) &&
|
||||||
// eax[4:0] | ebx[0:15] == 0 indicates invalid topology level.
|
// eax[4:0] | ebx[0:15] == 0 indicates invalid topology level.
|
||||||
// Some cpus have max cpuid >= 0xB but do not support processor topology.
|
// Some cpus have max cpuid >= 0xB but do not support processor topology.
|
||||||
((_cpuid_info.tpl_cpuidB0_eax & 0x1f | _cpuid_info.tpl_cpuidB0_ebx.bits.logical_cpus) != 0);
|
(((_cpuid_info.tpl_cpuidB0_eax & 0x1f) | _cpuid_info.tpl_cpuidB0_ebx.bits.logical_cpus) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint cores_per_cpu() {
|
static uint cores_per_cpu() {
|
||||||
@ -550,6 +554,7 @@ public:
|
|||||||
static bool supports_avx2() { return (_cpuFeatures & CPU_AVX2) != 0; }
|
static bool supports_avx2() { return (_cpuFeatures & CPU_AVX2) != 0; }
|
||||||
static bool supports_tsc() { return (_cpuFeatures & CPU_TSC) != 0; }
|
static bool supports_tsc() { return (_cpuFeatures & CPU_TSC) != 0; }
|
||||||
static bool supports_aes() { return (_cpuFeatures & CPU_AES) != 0; }
|
static bool supports_aes() { return (_cpuFeatures & CPU_AES) != 0; }
|
||||||
|
static bool supports_erms() { return (_cpuFeatures & CPU_ERMS) != 0; }
|
||||||
|
|
||||||
// Intel features
|
// Intel features
|
||||||
static bool is_intel_family_core() { return is_intel() &&
|
static bool is_intel_family_core() { return is_intel() &&
|
||||||
|
@ -11572,15 +11572,28 @@ instruct MoveL2D_reg_reg_sse(regD dst, eRegL src, regD tmp) %{
|
|||||||
// =======================================================================
|
// =======================================================================
|
||||||
// fast clearing of an array
|
// fast clearing of an array
|
||||||
instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{
|
instruct rep_stos(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{
|
||||||
|
predicate(!UseFastStosb);
|
||||||
match(Set dummy (ClearArray cnt base));
|
match(Set dummy (ClearArray cnt base));
|
||||||
effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
|
effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
|
||||||
format %{ "SHL ECX,1\t# Convert doublewords to words\n\t"
|
format %{ "XOR EAX,EAX\t# ClearArray:\n\t"
|
||||||
"XOR EAX,EAX\n\t"
|
"SHL ECX,1\t# Convert doublewords to words\n\t"
|
||||||
"REP STOS\t# store EAX into [EDI++] while ECX--" %}
|
"REP STOS\t# store EAX into [EDI++] while ECX--" %}
|
||||||
opcode(0,0x4);
|
ins_encode %{
|
||||||
ins_encode( Opcode(0xD1), RegOpc(ECX),
|
__ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
|
||||||
OpcRegReg(0x33,EAX,EAX),
|
%}
|
||||||
Opcode(0xF3), Opcode(0xAB) );
|
ins_pipe( pipe_slow );
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct rep_fast_stosb(eCXRegI cnt, eDIRegP base, eAXRegI zero, Universe dummy, eFlagsReg cr) %{
|
||||||
|
predicate(UseFastStosb);
|
||||||
|
match(Set dummy (ClearArray cnt base));
|
||||||
|
effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
|
||||||
|
format %{ "XOR EAX,EAX\t# ClearArray:\n\t"
|
||||||
|
"SHL ECX,3\t# Convert doublewords to bytes\n\t"
|
||||||
|
"REP STOSB\t# store EAX into [EDI++] while ECX--" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
|
||||||
|
%}
|
||||||
ins_pipe( pipe_slow );
|
ins_pipe( pipe_slow );
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
@ -10374,16 +10374,33 @@ instruct MoveL2D_reg_reg(regD dst, rRegL src) %{
|
|||||||
instruct rep_stos(rcx_RegL cnt, rdi_RegP base, rax_RegI zero, Universe dummy,
|
instruct rep_stos(rcx_RegL cnt, rdi_RegP base, rax_RegI zero, Universe dummy,
|
||||||
rFlagsReg cr)
|
rFlagsReg cr)
|
||||||
%{
|
%{
|
||||||
|
predicate(!UseFastStosb);
|
||||||
match(Set dummy (ClearArray cnt base));
|
match(Set dummy (ClearArray cnt base));
|
||||||
effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
|
effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
|
||||||
|
|
||||||
format %{ "xorl rax, rax\t# ClearArray:\n\t"
|
format %{ "xorq rax, rax\t# ClearArray:\n\t"
|
||||||
"rep stosq\t# Store rax to *rdi++ while rcx--" %}
|
"rep stosq\t# Store rax to *rdi++ while rcx--" %}
|
||||||
ins_encode(opc_reg_reg(0x33, RAX, RAX), // xorl %eax, %eax
|
ins_encode %{
|
||||||
Opcode(0xF3), Opcode(0x48), Opcode(0xAB)); // rep REX_W stos
|
__ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
|
||||||
|
%}
|
||||||
ins_pipe(pipe_slow);
|
ins_pipe(pipe_slow);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
instruct rep_fast_stosb(rcx_RegL cnt, rdi_RegP base, rax_RegI zero, Universe dummy,
|
||||||
|
rFlagsReg cr)
|
||||||
|
%{
|
||||||
|
predicate(UseFastStosb);
|
||||||
|
match(Set dummy (ClearArray cnt base));
|
||||||
|
effect(USE_KILL cnt, USE_KILL base, KILL zero, KILL cr);
|
||||||
|
format %{ "xorq rax, rax\t# ClearArray:\n\t"
|
||||||
|
"shlq rcx,3\t# Convert doublewords to bytes\n\t"
|
||||||
|
"rep stosb\t# Store rax to *rdi++ while rcx--" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ clear_mem($base$$Register, $cnt$$Register, $zero$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe( pipe_slow );
|
||||||
|
%}
|
||||||
|
|
||||||
instruct string_compare(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
|
instruct string_compare(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
|
||||||
rax_RegI result, regD tmp1, rFlagsReg cr)
|
rax_RegI result, regD tmp1, rFlagsReg cr)
|
||||||
%{
|
%{
|
||||||
|
@ -298,12 +298,12 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
// The next steps are taken in the product version:
|
// The next steps are taken in the product version:
|
||||||
//
|
//
|
||||||
// Obtain the JAVA_HOME value from the location of libjvm[_g].so.
|
// Obtain the JAVA_HOME value from the location of libjvm.so.
|
||||||
// This library should be located at:
|
// This library should be located at:
|
||||||
// <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm[_g].so.
|
// <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
|
||||||
//
|
//
|
||||||
// If "/jre/lib/" appears at the right place in the path, then we
|
// If "/jre/lib/" appears at the right place in the path, then we
|
||||||
// assume libjvm[_g].so is installed in a JDK and we use this path.
|
// assume libjvm.so is installed in a JDK and we use this path.
|
||||||
//
|
//
|
||||||
// Otherwise exit with message: "Could not create the Java virtual machine."
|
// Otherwise exit with message: "Could not create the Java virtual machine."
|
||||||
//
|
//
|
||||||
@ -313,9 +313,9 @@ void os::init_system_properties_values() {
|
|||||||
// instead of exit check for $JAVA_HOME environment variable.
|
// instead of exit check for $JAVA_HOME environment variable.
|
||||||
//
|
//
|
||||||
// If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
|
// If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
|
||||||
// then we append a fake suffix "hotspot/libjvm[_g].so" to this path so
|
// then we append a fake suffix "hotspot/libjvm.so" to this path so
|
||||||
// it looks like libjvm[_g].so is installed there
|
// it looks like libjvm.so is installed there
|
||||||
// <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm[_g].so.
|
// <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
|
||||||
//
|
//
|
||||||
// Otherwise exit.
|
// Otherwise exit.
|
||||||
//
|
//
|
||||||
@ -1228,7 +1228,7 @@ const char* os::get_current_directory(char *buf, int buflen) {
|
|||||||
return getcwd(buf, buflen);
|
return getcwd(buf, buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if addr is inside libjvm[_g].so
|
// check if addr is inside libjvm.so
|
||||||
bool os::address_is_in_vm(address addr) {
|
bool os::address_is_in_vm(address addr) {
|
||||||
static address libjvm_base_addr;
|
static address libjvm_base_addr;
|
||||||
Dl_info dlinfo;
|
Dl_info dlinfo;
|
||||||
@ -1689,7 +1689,7 @@ void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
|
|||||||
|
|
||||||
static char saved_jvm_path[MAXPATHLEN] = {0};
|
static char saved_jvm_path[MAXPATHLEN] = {0};
|
||||||
|
|
||||||
// Find the full path to the current module, libjvm or libjvm_g
|
// Find the full path to the current module, libjvm
|
||||||
void os::jvm_path(char *buf, jint buflen) {
|
void os::jvm_path(char *buf, jint buflen) {
|
||||||
// Error checking.
|
// Error checking.
|
||||||
if (buflen < MAXPATHLEN) {
|
if (buflen < MAXPATHLEN) {
|
||||||
@ -1732,10 +1732,9 @@ void os::jvm_path(char *buf, jint buflen) {
|
|||||||
char* jrelib_p;
|
char* jrelib_p;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
// Check the current module name "libjvm" or "libjvm_g".
|
// Check the current module name "libjvm"
|
||||||
p = strrchr(buf, '/');
|
p = strrchr(buf, '/');
|
||||||
assert(strstr(p, "/libjvm") == p, "invalid library name");
|
assert(strstr(p, "/libjvm") == p, "invalid library name");
|
||||||
p = strstr(p, "_g") ? "_g" : "";
|
|
||||||
|
|
||||||
rp = realpath(java_home_var, buf);
|
rp = realpath(java_home_var, buf);
|
||||||
if (rp == NULL)
|
if (rp == NULL)
|
||||||
@ -1764,11 +1763,9 @@ void os::jvm_path(char *buf, jint buflen) {
|
|||||||
// to complete the path to JVM being overridden. Otherwise fallback
|
// to complete the path to JVM being overridden. Otherwise fallback
|
||||||
// to the path to the current library.
|
// to the path to the current library.
|
||||||
if (0 == access(buf, F_OK)) {
|
if (0 == access(buf, F_OK)) {
|
||||||
// Use current module name "libjvm[_g]" instead of
|
// Use current module name "libjvm"
|
||||||
// "libjvm"debug_only("_g")"" since for fastdebug version
|
|
||||||
// we should have "libjvm" but debug_only("_g") adds "_g"!
|
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
snprintf(buf + len, buflen-len, "/libjvm%s%s", p, JNI_LIB_SUFFIX);
|
snprintf(buf + len, buflen-len, "/libjvm%s", JNI_LIB_SUFFIX);
|
||||||
} else {
|
} else {
|
||||||
// Fall back to path of current library
|
// Fall back to path of current library
|
||||||
rp = realpath(dli_fname, buf);
|
rp = realpath(dli_fname, buf);
|
||||||
|
@ -321,12 +321,12 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
// The next steps are taken in the product version:
|
// The next steps are taken in the product version:
|
||||||
//
|
//
|
||||||
// Obtain the JAVA_HOME value from the location of libjvm[_g].so.
|
// Obtain the JAVA_HOME value from the location of libjvm.so.
|
||||||
// This library should be located at:
|
// This library should be located at:
|
||||||
// <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm[_g].so.
|
// <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
|
||||||
//
|
//
|
||||||
// If "/jre/lib/" appears at the right place in the path, then we
|
// If "/jre/lib/" appears at the right place in the path, then we
|
||||||
// assume libjvm[_g].so is installed in a JDK and we use this path.
|
// assume libjvm.so is installed in a JDK and we use this path.
|
||||||
//
|
//
|
||||||
// Otherwise exit with message: "Could not create the Java virtual machine."
|
// Otherwise exit with message: "Could not create the Java virtual machine."
|
||||||
//
|
//
|
||||||
@ -336,9 +336,9 @@ void os::init_system_properties_values() {
|
|||||||
// instead of exit check for $JAVA_HOME environment variable.
|
// instead of exit check for $JAVA_HOME environment variable.
|
||||||
//
|
//
|
||||||
// If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
|
// If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
|
||||||
// then we append a fake suffix "hotspot/libjvm[_g].so" to this path so
|
// then we append a fake suffix "hotspot/libjvm.so" to this path so
|
||||||
// it looks like libjvm[_g].so is installed there
|
// it looks like libjvm.so is installed there
|
||||||
// <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm[_g].so.
|
// <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
|
||||||
//
|
//
|
||||||
// Otherwise exit.
|
// Otherwise exit.
|
||||||
//
|
//
|
||||||
@ -1679,7 +1679,7 @@ const char* os::get_current_directory(char *buf, int buflen) {
|
|||||||
return getcwd(buf, buflen);
|
return getcwd(buf, buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if addr is inside libjvm[_g].so
|
// check if addr is inside libjvm.so
|
||||||
bool os::address_is_in_vm(address addr) {
|
bool os::address_is_in_vm(address addr) {
|
||||||
static address libjvm_base_addr;
|
static address libjvm_base_addr;
|
||||||
Dl_info dlinfo;
|
Dl_info dlinfo;
|
||||||
@ -2180,7 +2180,7 @@ void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
|
|||||||
|
|
||||||
static char saved_jvm_path[MAXPATHLEN] = {0};
|
static char saved_jvm_path[MAXPATHLEN] = {0};
|
||||||
|
|
||||||
// Find the full path to the current module, libjvm.so or libjvm_g.so
|
// Find the full path to the current module, libjvm.so
|
||||||
void os::jvm_path(char *buf, jint buflen) {
|
void os::jvm_path(char *buf, jint buflen) {
|
||||||
// Error checking.
|
// Error checking.
|
||||||
if (buflen < MAXPATHLEN) {
|
if (buflen < MAXPATHLEN) {
|
||||||
@ -2223,10 +2223,9 @@ void os::jvm_path(char *buf, jint buflen) {
|
|||||||
char* jrelib_p;
|
char* jrelib_p;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
// Check the current module name "libjvm.so" or "libjvm_g.so".
|
// Check the current module name "libjvm.so".
|
||||||
p = strrchr(buf, '/');
|
p = strrchr(buf, '/');
|
||||||
assert(strstr(p, "/libjvm") == p, "invalid library name");
|
assert(strstr(p, "/libjvm") == p, "invalid library name");
|
||||||
p = strstr(p, "_g") ? "_g" : "";
|
|
||||||
|
|
||||||
rp = realpath(java_home_var, buf);
|
rp = realpath(java_home_var, buf);
|
||||||
if (rp == NULL)
|
if (rp == NULL)
|
||||||
@ -2242,11 +2241,9 @@ void os::jvm_path(char *buf, jint buflen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (0 == access(buf, F_OK)) {
|
if (0 == access(buf, F_OK)) {
|
||||||
// Use current module name "libjvm[_g].so" instead of
|
// Use current module name "libjvm.so"
|
||||||
// "libjvm"debug_only("_g")".so" since for fastdebug version
|
|
||||||
// we should have "libjvm.so" but debug_only("_g") adds "_g"!
|
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
snprintf(buf + len, buflen-len, "/hotspot/libjvm%s.so", p);
|
snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");
|
||||||
} else {
|
} else {
|
||||||
// Go back to path of .so
|
// Go back to path of .so
|
||||||
rp = realpath(dli_fname, buf);
|
rp = realpath(dli_fname, buf);
|
||||||
|
@ -734,12 +734,12 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
// The next steps are taken in the product version:
|
// The next steps are taken in the product version:
|
||||||
//
|
//
|
||||||
// Obtain the JAVA_HOME value from the location of libjvm[_g].so.
|
// Obtain the JAVA_HOME value from the location of libjvm.so.
|
||||||
// This library should be located at:
|
// This library should be located at:
|
||||||
// <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm[_g].so.
|
// <JAVA_HOME>/jre/lib/<arch>/{client|server}/libjvm.so.
|
||||||
//
|
//
|
||||||
// If "/jre/lib/" appears at the right place in the path, then we
|
// If "/jre/lib/" appears at the right place in the path, then we
|
||||||
// assume libjvm[_g].so is installed in a JDK and we use this path.
|
// assume libjvm.so is installed in a JDK and we use this path.
|
||||||
//
|
//
|
||||||
// Otherwise exit with message: "Could not create the Java virtual machine."
|
// Otherwise exit with message: "Could not create the Java virtual machine."
|
||||||
//
|
//
|
||||||
@ -749,9 +749,9 @@ void os::init_system_properties_values() {
|
|||||||
// instead of exit check for $JAVA_HOME environment variable.
|
// instead of exit check for $JAVA_HOME environment variable.
|
||||||
//
|
//
|
||||||
// If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
|
// If it is defined and we are able to locate $JAVA_HOME/jre/lib/<arch>,
|
||||||
// then we append a fake suffix "hotspot/libjvm[_g].so" to this path so
|
// then we append a fake suffix "hotspot/libjvm.so" to this path so
|
||||||
// it looks like libjvm[_g].so is installed there
|
// it looks like libjvm.so is installed there
|
||||||
// <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm[_g].so.
|
// <JAVA_HOME>/jre/lib/<arch>/hotspot/libjvm.so.
|
||||||
//
|
//
|
||||||
// Otherwise exit.
|
// Otherwise exit.
|
||||||
//
|
//
|
||||||
@ -1934,7 +1934,7 @@ const char* os::get_current_directory(char *buf, int buflen) {
|
|||||||
return getcwd(buf, buflen);
|
return getcwd(buf, buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if addr is inside libjvm[_g].so
|
// check if addr is inside libjvm.so
|
||||||
bool os::address_is_in_vm(address addr) {
|
bool os::address_is_in_vm(address addr) {
|
||||||
static address libjvm_base_addr;
|
static address libjvm_base_addr;
|
||||||
Dl_info dlinfo;
|
Dl_info dlinfo;
|
||||||
@ -2474,7 +2474,7 @@ void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
|
|||||||
|
|
||||||
static char saved_jvm_path[MAXPATHLEN] = { 0 };
|
static char saved_jvm_path[MAXPATHLEN] = { 0 };
|
||||||
|
|
||||||
// Find the full path to the current module, libjvm.so or libjvm_g.so
|
// Find the full path to the current module, libjvm.so
|
||||||
void os::jvm_path(char *buf, jint buflen) {
|
void os::jvm_path(char *buf, jint buflen) {
|
||||||
// Error checking.
|
// Error checking.
|
||||||
if (buflen < MAXPATHLEN) {
|
if (buflen < MAXPATHLEN) {
|
||||||
@ -2522,10 +2522,9 @@ void os::jvm_path(char *buf, jint buflen) {
|
|||||||
strcpy(cpu_arch, "amd64");
|
strcpy(cpu_arch, "amd64");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Check the current module name "libjvm.so" or "libjvm_g.so".
|
// Check the current module name "libjvm.so".
|
||||||
p = strrchr(buf, '/');
|
p = strrchr(buf, '/');
|
||||||
assert(strstr(p, "/libjvm") == p, "invalid library name");
|
assert(strstr(p, "/libjvm") == p, "invalid library name");
|
||||||
p = strstr(p, "_g") ? "_g" : "";
|
|
||||||
|
|
||||||
realpath(java_home_var, buf);
|
realpath(java_home_var, buf);
|
||||||
// determine if this is a legacy image or modules image
|
// determine if this is a legacy image or modules image
|
||||||
@ -2538,11 +2537,9 @@ void os::jvm_path(char *buf, jint buflen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (0 == access(buf, F_OK)) {
|
if (0 == access(buf, F_OK)) {
|
||||||
// Use current module name "libjvm[_g].so" instead of
|
// Use current module name "libjvm.so"
|
||||||
// "libjvm"debug_only("_g")".so" since for fastdebug version
|
|
||||||
// we should have "libjvm.so" but debug_only("_g") adds "_g"!
|
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
snprintf(buf + len, buflen-len, "/hotspot/libjvm%s.so", p);
|
snprintf(buf + len, buflen-len, "/hotspot/libjvm.so");
|
||||||
} else {
|
} else {
|
||||||
// Go back to path of .so
|
// Go back to path of .so
|
||||||
realpath((char *)dlinfo.dli_fname, buf);
|
realpath((char *)dlinfo.dli_fname, buf);
|
||||||
|
@ -182,7 +182,7 @@ void os::init_system_properties_values() {
|
|||||||
|
|
||||||
if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) {
|
if (!getenv("_ALT_JAVA_HOME_DIR", home_dir, MAX_PATH)) {
|
||||||
os::jvm_path(home_dir, sizeof(home_dir));
|
os::jvm_path(home_dir, sizeof(home_dir));
|
||||||
// Found the full path to jvm[_g].dll.
|
// Found the full path to jvm.dll.
|
||||||
// Now cut the path to <java_home>/jre if we can.
|
// Now cut the path to <java_home>/jre if we can.
|
||||||
*(strrchr(home_dir, '\\')) = '\0'; /* get rid of \jvm.dll */
|
*(strrchr(home_dir, '\\')) = '\0'; /* get rid of \jvm.dll */
|
||||||
pslash = strrchr(home_dir, '\\');
|
pslash = strrchr(home_dir, '\\');
|
||||||
@ -1715,7 +1715,7 @@ void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) {
|
|||||||
|
|
||||||
static char saved_jvm_path[MAX_PATH] = {0};
|
static char saved_jvm_path[MAX_PATH] = {0};
|
||||||
|
|
||||||
// Find the full path to the current module, jvm.dll or jvm_g.dll
|
// Find the full path to the current module, jvm.dll
|
||||||
void os::jvm_path(char *buf, jint buflen) {
|
void os::jvm_path(char *buf, jint buflen) {
|
||||||
// Error checking.
|
// Error checking.
|
||||||
if (buflen < MAX_PATH) {
|
if (buflen < MAX_PATH) {
|
||||||
|
@ -36,7 +36,7 @@ public class ProjectCreator {
|
|||||||
+ "into .dsp file, substituting for path given in "
|
+ "into .dsp file, substituting for path given in "
|
||||||
+ "-sourceBase. Example: HotSpotWorkSpace>");
|
+ "-sourceBase. Example: HotSpotWorkSpace>");
|
||||||
System.err.println(" -dllLoc <path to directory in which to put "
|
System.err.println(" -dllLoc <path to directory in which to put "
|
||||||
+ "jvm.dll and jvm_g.dll; no trailing slash>");
|
+ "jvm.dll; no trailing slash>");
|
||||||
System.err.println(" If any of the above are specified, "
|
System.err.println(" If any of the above are specified, "
|
||||||
+ "they must all be.");
|
+ "they must all be.");
|
||||||
System.err.println(" Additional, optional arguments, which can be "
|
System.err.println(" Additional, optional arguments, which can be "
|
||||||
|
@ -216,8 +216,6 @@ class AbstractAssembler : public ResourceObj {
|
|||||||
bool isByte(int x) const { return 0 <= x && x < 0x100; }
|
bool isByte(int x) const { return 0 <= x && x < 0x100; }
|
||||||
bool isShiftCount(int x) const { return 0 <= x && x < 32; }
|
bool isShiftCount(int x) const { return 0 <= x && x < 32; }
|
||||||
|
|
||||||
void emit_long(jint x) { emit_int32(x); } // deprecated
|
|
||||||
|
|
||||||
// Instruction boundaries (required when emitting relocatable values).
|
// Instruction boundaries (required when emitting relocatable values).
|
||||||
class InstructionMark: public StackObj {
|
class InstructionMark: public StackObj {
|
||||||
private:
|
private:
|
||||||
|
@ -2259,7 +2259,7 @@ class LIR_OpVisitState: public StackObj {
|
|||||||
typedef enum { inputMode, firstMode = inputMode, tempMode, outputMode, numModes, invalidMode = -1 } OprMode;
|
typedef enum { inputMode, firstMode = inputMode, tempMode, outputMode, numModes, invalidMode = -1 } OprMode;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
maxNumberOfOperands = 16,
|
maxNumberOfOperands = 20,
|
||||||
maxNumberOfInfos = 4
|
maxNumberOfInfos = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -906,6 +906,7 @@ void ClassFileParser::parse_field_attributes(ClassLoaderData* loader_data,
|
|||||||
bool* is_synthetic_addr,
|
bool* is_synthetic_addr,
|
||||||
u2* generic_signature_index_addr,
|
u2* generic_signature_index_addr,
|
||||||
AnnotationArray** field_annotations,
|
AnnotationArray** field_annotations,
|
||||||
|
AnnotationArray** field_type_annotations,
|
||||||
ClassFileParser::FieldAnnotationCollector* parsed_annotations,
|
ClassFileParser::FieldAnnotationCollector* parsed_annotations,
|
||||||
TRAPS) {
|
TRAPS) {
|
||||||
ClassFileStream* cfs = stream();
|
ClassFileStream* cfs = stream();
|
||||||
@ -917,6 +918,10 @@ void ClassFileParser::parse_field_attributes(ClassLoaderData* loader_data,
|
|||||||
int runtime_visible_annotations_length = 0;
|
int runtime_visible_annotations_length = 0;
|
||||||
u1* runtime_invisible_annotations = NULL;
|
u1* runtime_invisible_annotations = NULL;
|
||||||
int runtime_invisible_annotations_length = 0;
|
int runtime_invisible_annotations_length = 0;
|
||||||
|
u1* runtime_visible_type_annotations = NULL;
|
||||||
|
int runtime_visible_type_annotations_length = 0;
|
||||||
|
u1* runtime_invisible_type_annotations = NULL;
|
||||||
|
int runtime_invisible_type_annotations_length = 0;
|
||||||
while (attributes_count--) {
|
while (attributes_count--) {
|
||||||
cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length
|
cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length
|
||||||
u2 attribute_name_index = cfs->get_u2_fast();
|
u2 attribute_name_index = cfs->get_u2_fast();
|
||||||
@ -971,6 +976,16 @@ void ClassFileParser::parse_field_attributes(ClassLoaderData* loader_data,
|
|||||||
runtime_invisible_annotations = cfs->get_u1_buffer();
|
runtime_invisible_annotations = cfs->get_u1_buffer();
|
||||||
assert(runtime_invisible_annotations != NULL, "null invisible annotations");
|
assert(runtime_invisible_annotations != NULL, "null invisible annotations");
|
||||||
cfs->skip_u1(runtime_invisible_annotations_length, CHECK);
|
cfs->skip_u1(runtime_invisible_annotations_length, CHECK);
|
||||||
|
} else if (attribute_name == vmSymbols::tag_runtime_visible_type_annotations()) {
|
||||||
|
runtime_visible_type_annotations_length = attribute_length;
|
||||||
|
runtime_visible_type_annotations = cfs->get_u1_buffer();
|
||||||
|
assert(runtime_visible_type_annotations != NULL, "null visible type annotations");
|
||||||
|
cfs->skip_u1(runtime_visible_type_annotations_length, CHECK);
|
||||||
|
} else if (PreserveAllAnnotations && attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) {
|
||||||
|
runtime_invisible_type_annotations_length = attribute_length;
|
||||||
|
runtime_invisible_type_annotations = cfs->get_u1_buffer();
|
||||||
|
assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
|
||||||
|
cfs->skip_u1(runtime_invisible_type_annotations_length, CHECK);
|
||||||
} else {
|
} else {
|
||||||
cfs->skip_u1(attribute_length, CHECK); // Skip unknown attributes
|
cfs->skip_u1(attribute_length, CHECK); // Skip unknown attributes
|
||||||
}
|
}
|
||||||
@ -988,6 +1003,12 @@ void ClassFileParser::parse_field_attributes(ClassLoaderData* loader_data,
|
|||||||
runtime_invisible_annotations,
|
runtime_invisible_annotations,
|
||||||
runtime_invisible_annotations_length,
|
runtime_invisible_annotations_length,
|
||||||
CHECK);
|
CHECK);
|
||||||
|
*field_type_annotations = assemble_annotations(loader_data,
|
||||||
|
runtime_visible_type_annotations,
|
||||||
|
runtime_visible_type_annotations_length,
|
||||||
|
runtime_invisible_type_annotations,
|
||||||
|
runtime_invisible_type_annotations_length,
|
||||||
|
CHECK);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1084,6 +1105,7 @@ Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data,
|
|||||||
bool is_interface,
|
bool is_interface,
|
||||||
FieldAllocationCount *fac,
|
FieldAllocationCount *fac,
|
||||||
Array<AnnotationArray*>** fields_annotations,
|
Array<AnnotationArray*>** fields_annotations,
|
||||||
|
Array<AnnotationArray*>** fields_type_annotations,
|
||||||
u2* java_fields_count_ptr, TRAPS) {
|
u2* java_fields_count_ptr, TRAPS) {
|
||||||
ClassFileStream* cfs = stream();
|
ClassFileStream* cfs = stream();
|
||||||
cfs->guarantee_more(2, CHECK_NULL); // length
|
cfs->guarantee_more(2, CHECK_NULL); // length
|
||||||
@ -1119,6 +1141,7 @@ Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data,
|
|||||||
THREAD, u2, total_fields * (FieldInfo::field_slots + 1));
|
THREAD, u2, total_fields * (FieldInfo::field_slots + 1));
|
||||||
|
|
||||||
AnnotationArray* field_annotations = NULL;
|
AnnotationArray* field_annotations = NULL;
|
||||||
|
AnnotationArray* field_type_annotations = NULL;
|
||||||
// The generic signature slots start after all other fields' data.
|
// The generic signature slots start after all other fields' data.
|
||||||
int generic_signature_slot = total_fields * FieldInfo::field_slots;
|
int generic_signature_slot = total_fields * FieldInfo::field_slots;
|
||||||
int num_generic_signature = 0;
|
int num_generic_signature = 0;
|
||||||
@ -1160,7 +1183,7 @@ Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data,
|
|||||||
cp, attributes_count, is_static, signature_index,
|
cp, attributes_count, is_static, signature_index,
|
||||||
&constantvalue_index, &is_synthetic,
|
&constantvalue_index, &is_synthetic,
|
||||||
&generic_signature_index, &field_annotations,
|
&generic_signature_index, &field_annotations,
|
||||||
&parsed_annotations,
|
&field_type_annotations, &parsed_annotations,
|
||||||
CHECK_NULL);
|
CHECK_NULL);
|
||||||
if (field_annotations != NULL) {
|
if (field_annotations != NULL) {
|
||||||
if (*fields_annotations == NULL) {
|
if (*fields_annotations == NULL) {
|
||||||
@ -1170,6 +1193,14 @@ Array<u2>* ClassFileParser::parse_fields(ClassLoaderData* loader_data,
|
|||||||
}
|
}
|
||||||
(*fields_annotations)->at_put(n, field_annotations);
|
(*fields_annotations)->at_put(n, field_annotations);
|
||||||
}
|
}
|
||||||
|
if (field_type_annotations != NULL) {
|
||||||
|
if (*fields_type_annotations == NULL) {
|
||||||
|
*fields_type_annotations = MetadataFactory::new_array<AnnotationArray*>(
|
||||||
|
loader_data, length, NULL,
|
||||||
|
CHECK_NULL);
|
||||||
|
}
|
||||||
|
(*fields_type_annotations)->at_put(n, field_type_annotations);
|
||||||
|
}
|
||||||
if (is_synthetic) {
|
if (is_synthetic) {
|
||||||
access_flags.set_is_synthetic();
|
access_flags.set_is_synthetic();
|
||||||
}
|
}
|
||||||
@ -1831,6 +1862,7 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
AnnotationArray** method_annotations,
|
AnnotationArray** method_annotations,
|
||||||
AnnotationArray** method_parameter_annotations,
|
AnnotationArray** method_parameter_annotations,
|
||||||
AnnotationArray** method_default_annotations,
|
AnnotationArray** method_default_annotations,
|
||||||
|
AnnotationArray** method_type_annotations,
|
||||||
TRAPS) {
|
TRAPS) {
|
||||||
ClassFileStream* cfs = stream();
|
ClassFileStream* cfs = stream();
|
||||||
methodHandle nullHandle;
|
methodHandle nullHandle;
|
||||||
@ -1903,6 +1935,8 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
u2** localvariable_table_start;
|
u2** localvariable_table_start;
|
||||||
u2* localvariable_type_table_length;
|
u2* localvariable_type_table_length;
|
||||||
u2** localvariable_type_table_start;
|
u2** localvariable_type_table_start;
|
||||||
|
u2 method_parameters_length = 0;
|
||||||
|
u1* method_parameters_data = NULL;
|
||||||
bool parsed_code_attribute = false;
|
bool parsed_code_attribute = false;
|
||||||
bool parsed_checked_exceptions_attribute = false;
|
bool parsed_checked_exceptions_attribute = false;
|
||||||
bool parsed_stackmap_attribute = false;
|
bool parsed_stackmap_attribute = false;
|
||||||
@ -1918,6 +1952,10 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
int runtime_visible_parameter_annotations_length = 0;
|
int runtime_visible_parameter_annotations_length = 0;
|
||||||
u1* runtime_invisible_parameter_annotations = NULL;
|
u1* runtime_invisible_parameter_annotations = NULL;
|
||||||
int runtime_invisible_parameter_annotations_length = 0;
|
int runtime_invisible_parameter_annotations_length = 0;
|
||||||
|
u1* runtime_visible_type_annotations = NULL;
|
||||||
|
int runtime_visible_type_annotations_length = 0;
|
||||||
|
u1* runtime_invisible_type_annotations = NULL;
|
||||||
|
int runtime_invisible_type_annotations_length = 0;
|
||||||
u1* annotation_default = NULL;
|
u1* annotation_default = NULL;
|
||||||
int annotation_default_length = 0;
|
int annotation_default_length = 0;
|
||||||
|
|
||||||
@ -2108,6 +2146,14 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
parse_checked_exceptions(&checked_exceptions_length,
|
parse_checked_exceptions(&checked_exceptions_length,
|
||||||
method_attribute_length,
|
method_attribute_length,
|
||||||
cp, CHECK_(nullHandle));
|
cp, CHECK_(nullHandle));
|
||||||
|
} else if (method_attribute_name == vmSymbols::tag_method_parameters()) {
|
||||||
|
method_parameters_length = cfs->get_u1_fast();
|
||||||
|
method_parameters_data = cfs->get_u1_buffer();
|
||||||
|
cfs->skip_u2_fast(method_parameters_length);
|
||||||
|
cfs->skip_u4_fast(method_parameters_length);
|
||||||
|
// ignore this attribute if it cannot be reflected
|
||||||
|
if (!SystemDictionary::Parameter_klass_loaded())
|
||||||
|
method_parameters_length = 0;
|
||||||
} else if (method_attribute_name == vmSymbols::tag_synthetic()) {
|
} else if (method_attribute_name == vmSymbols::tag_synthetic()) {
|
||||||
if (method_attribute_length != 0) {
|
if (method_attribute_length != 0) {
|
||||||
classfile_parse_error(
|
classfile_parse_error(
|
||||||
@ -2159,6 +2205,17 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
annotation_default = cfs->get_u1_buffer();
|
annotation_default = cfs->get_u1_buffer();
|
||||||
assert(annotation_default != NULL, "null annotation default");
|
assert(annotation_default != NULL, "null annotation default");
|
||||||
cfs->skip_u1(annotation_default_length, CHECK_(nullHandle));
|
cfs->skip_u1(annotation_default_length, CHECK_(nullHandle));
|
||||||
|
} else if (method_attribute_name == vmSymbols::tag_runtime_visible_type_annotations()) {
|
||||||
|
runtime_visible_type_annotations_length = method_attribute_length;
|
||||||
|
runtime_visible_type_annotations = cfs->get_u1_buffer();
|
||||||
|
assert(runtime_visible_type_annotations != NULL, "null visible type annotations");
|
||||||
|
// No need for the VM to parse Type annotations
|
||||||
|
cfs->skip_u1(runtime_visible_type_annotations_length, CHECK_(nullHandle));
|
||||||
|
} else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) {
|
||||||
|
runtime_invisible_type_annotations_length = method_attribute_length;
|
||||||
|
runtime_invisible_type_annotations = cfs->get_u1_buffer();
|
||||||
|
assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
|
||||||
|
cfs->skip_u1(runtime_invisible_type_annotations_length, CHECK_(nullHandle));
|
||||||
} else {
|
} else {
|
||||||
// Skip unknown attributes
|
// Skip unknown attributes
|
||||||
cfs->skip_u1(method_attribute_length, CHECK_(nullHandle));
|
cfs->skip_u1(method_attribute_length, CHECK_(nullHandle));
|
||||||
@ -2184,7 +2241,8 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
Method* m = Method::allocate(
|
Method* m = Method::allocate(
|
||||||
loader_data, code_length, access_flags, linenumber_table_length,
|
loader_data, code_length, access_flags, linenumber_table_length,
|
||||||
total_lvt_length, exception_table_length, checked_exceptions_length,
|
total_lvt_length, exception_table_length, checked_exceptions_length,
|
||||||
generic_signature_index, ConstMethod::NORMAL, CHECK_(nullHandle));
|
method_parameters_length, generic_signature_index,
|
||||||
|
ConstMethod::NORMAL, CHECK_(nullHandle));
|
||||||
|
|
||||||
ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
|
ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
|
||||||
|
|
||||||
@ -2232,6 +2290,18 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
exception_table_start, size);
|
exception_table_start, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy method parameters
|
||||||
|
if (method_parameters_length > 0) {
|
||||||
|
MethodParametersElement* elem = m->constMethod()->method_parameters_start();
|
||||||
|
for(int i = 0; i < method_parameters_length; i++) {
|
||||||
|
elem[i].name_cp_index =
|
||||||
|
Bytes::get_Java_u2(method_parameters_data);
|
||||||
|
method_parameters_data += 2;
|
||||||
|
elem[i].flags = Bytes::get_Java_u4(method_parameters_data);
|
||||||
|
method_parameters_data += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Copy checked exceptions
|
// Copy checked exceptions
|
||||||
if (checked_exceptions_length > 0) {
|
if (checked_exceptions_length > 0) {
|
||||||
int size = checked_exceptions_length * sizeof(CheckedExceptionElement) / sizeof(u2);
|
int size = checked_exceptions_length * sizeof(CheckedExceptionElement) / sizeof(u2);
|
||||||
@ -2333,6 +2403,12 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
NULL,
|
NULL,
|
||||||
0,
|
0,
|
||||||
CHECK_(nullHandle));
|
CHECK_(nullHandle));
|
||||||
|
*method_type_annotations = assemble_annotations(loader_data,
|
||||||
|
runtime_visible_type_annotations,
|
||||||
|
runtime_visible_type_annotations_length,
|
||||||
|
runtime_invisible_type_annotations,
|
||||||
|
runtime_invisible_type_annotations_length,
|
||||||
|
CHECK_(nullHandle));
|
||||||
|
|
||||||
if (name == vmSymbols::finalize_method_name() &&
|
if (name == vmSymbols::finalize_method_name() &&
|
||||||
signature == vmSymbols::void_method_signature()) {
|
signature == vmSymbols::void_method_signature()) {
|
||||||
@ -2364,12 +2440,14 @@ Array<Method*>* ClassFileParser::parse_methods(ClassLoaderData* loader_data,
|
|||||||
Array<AnnotationArray*>** methods_annotations,
|
Array<AnnotationArray*>** methods_annotations,
|
||||||
Array<AnnotationArray*>** methods_parameter_annotations,
|
Array<AnnotationArray*>** methods_parameter_annotations,
|
||||||
Array<AnnotationArray*>** methods_default_annotations,
|
Array<AnnotationArray*>** methods_default_annotations,
|
||||||
|
Array<AnnotationArray*>** methods_type_annotations,
|
||||||
bool* has_default_methods,
|
bool* has_default_methods,
|
||||||
TRAPS) {
|
TRAPS) {
|
||||||
ClassFileStream* cfs = stream();
|
ClassFileStream* cfs = stream();
|
||||||
AnnotationArray* method_annotations = NULL;
|
AnnotationArray* method_annotations = NULL;
|
||||||
AnnotationArray* method_parameter_annotations = NULL;
|
AnnotationArray* method_parameter_annotations = NULL;
|
||||||
AnnotationArray* method_default_annotations = NULL;
|
AnnotationArray* method_default_annotations = NULL;
|
||||||
|
AnnotationArray* method_type_annotations = NULL;
|
||||||
cfs->guarantee_more(2, CHECK_NULL); // length
|
cfs->guarantee_more(2, CHECK_NULL); // length
|
||||||
u2 length = cfs->get_u2_fast();
|
u2 length = cfs->get_u2_fast();
|
||||||
if (length == 0) {
|
if (length == 0) {
|
||||||
@ -2386,6 +2464,7 @@ Array<Method*>* ClassFileParser::parse_methods(ClassLoaderData* loader_data,
|
|||||||
&method_annotations,
|
&method_annotations,
|
||||||
&method_parameter_annotations,
|
&method_parameter_annotations,
|
||||||
&method_default_annotations,
|
&method_default_annotations,
|
||||||
|
&method_type_annotations,
|
||||||
CHECK_NULL);
|
CHECK_NULL);
|
||||||
|
|
||||||
if (method->is_final()) {
|
if (method->is_final()) {
|
||||||
@ -2411,7 +2490,13 @@ Array<Method*>* ClassFileParser::parse_methods(ClassLoaderData* loader_data,
|
|||||||
MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
|
MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
|
||||||
}
|
}
|
||||||
(*methods_default_annotations)->at_put(index, method_default_annotations);
|
(*methods_default_annotations)->at_put(index, method_default_annotations);
|
||||||
|
if (*methods_type_annotations == NULL) {
|
||||||
|
*methods_type_annotations =
|
||||||
|
MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
|
||||||
|
}
|
||||||
|
(*methods_type_annotations)->at_put(index, method_type_annotations);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_need_verify && length > 1) {
|
if (_need_verify && length > 1) {
|
||||||
// Check duplicated methods
|
// Check duplicated methods
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
@ -2445,6 +2530,7 @@ Array<int>* ClassFileParser::sort_methods(ClassLoaderData* loader_data,
|
|||||||
Array<AnnotationArray*>* methods_annotations,
|
Array<AnnotationArray*>* methods_annotations,
|
||||||
Array<AnnotationArray*>* methods_parameter_annotations,
|
Array<AnnotationArray*>* methods_parameter_annotations,
|
||||||
Array<AnnotationArray*>* methods_default_annotations,
|
Array<AnnotationArray*>* methods_default_annotations,
|
||||||
|
Array<AnnotationArray*>* methods_type_annotations,
|
||||||
TRAPS) {
|
TRAPS) {
|
||||||
int length = methods->length();
|
int length = methods->length();
|
||||||
// If JVMTI original method ordering or sharing is enabled we have to
|
// If JVMTI original method ordering or sharing is enabled we have to
|
||||||
@ -2463,7 +2549,8 @@ Array<int>* ClassFileParser::sort_methods(ClassLoaderData* loader_data,
|
|||||||
// Note that the ordering is not alphabetical, see Symbol::fast_compare
|
// Note that the ordering is not alphabetical, see Symbol::fast_compare
|
||||||
Method::sort_methods(methods, methods_annotations,
|
Method::sort_methods(methods, methods_annotations,
|
||||||
methods_parameter_annotations,
|
methods_parameter_annotations,
|
||||||
methods_default_annotations);
|
methods_default_annotations,
|
||||||
|
methods_type_annotations);
|
||||||
|
|
||||||
// If JVMTI original method ordering or sharing is enabled construct int
|
// If JVMTI original method ordering or sharing is enabled construct int
|
||||||
// array remembering the original ordering
|
// array remembering the original ordering
|
||||||
@ -2728,6 +2815,10 @@ void ClassFileParser::parse_classfile_attributes(ClassLoaderData* loader_data,
|
|||||||
int runtime_visible_annotations_length = 0;
|
int runtime_visible_annotations_length = 0;
|
||||||
u1* runtime_invisible_annotations = NULL;
|
u1* runtime_invisible_annotations = NULL;
|
||||||
int runtime_invisible_annotations_length = 0;
|
int runtime_invisible_annotations_length = 0;
|
||||||
|
u1* runtime_visible_type_annotations = NULL;
|
||||||
|
int runtime_visible_type_annotations_length = 0;
|
||||||
|
u1* runtime_invisible_type_annotations = NULL;
|
||||||
|
int runtime_invisible_type_annotations_length = 0;
|
||||||
u1* inner_classes_attribute_start = NULL;
|
u1* inner_classes_attribute_start = NULL;
|
||||||
u4 inner_classes_attribute_length = 0;
|
u4 inner_classes_attribute_length = 0;
|
||||||
u2 enclosing_method_class_index = 0;
|
u2 enclosing_method_class_index = 0;
|
||||||
@ -2834,6 +2925,17 @@ void ClassFileParser::parse_classfile_attributes(ClassLoaderData* loader_data,
|
|||||||
classfile_parse_error("Multiple BootstrapMethods attributes in class file %s", CHECK);
|
classfile_parse_error("Multiple BootstrapMethods attributes in class file %s", CHECK);
|
||||||
parsed_bootstrap_methods_attribute = true;
|
parsed_bootstrap_methods_attribute = true;
|
||||||
parse_classfile_bootstrap_methods_attribute(loader_data, cp, attribute_length, CHECK);
|
parse_classfile_bootstrap_methods_attribute(loader_data, cp, attribute_length, CHECK);
|
||||||
|
} else if (tag == vmSymbols::tag_runtime_visible_type_annotations()) {
|
||||||
|
runtime_visible_type_annotations_length = attribute_length;
|
||||||
|
runtime_visible_type_annotations = cfs->get_u1_buffer();
|
||||||
|
assert(runtime_visible_type_annotations != NULL, "null visible type annotations");
|
||||||
|
// No need for the VM to parse Type annotations
|
||||||
|
cfs->skip_u1(runtime_visible_type_annotations_length, CHECK);
|
||||||
|
} else if (PreserveAllAnnotations && tag == vmSymbols::tag_runtime_invisible_type_annotations()) {
|
||||||
|
runtime_invisible_type_annotations_length = attribute_length;
|
||||||
|
runtime_invisible_type_annotations = cfs->get_u1_buffer();
|
||||||
|
assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
|
||||||
|
cfs->skip_u1(runtime_invisible_type_annotations_length, CHECK);
|
||||||
} else {
|
} else {
|
||||||
// Unknown attribute
|
// Unknown attribute
|
||||||
cfs->skip_u1(attribute_length, CHECK);
|
cfs->skip_u1(attribute_length, CHECK);
|
||||||
@ -2850,6 +2952,13 @@ void ClassFileParser::parse_classfile_attributes(ClassLoaderData* loader_data,
|
|||||||
runtime_invisible_annotations_length,
|
runtime_invisible_annotations_length,
|
||||||
CHECK);
|
CHECK);
|
||||||
set_class_annotations(annotations);
|
set_class_annotations(annotations);
|
||||||
|
AnnotationArray* type_annotations = assemble_annotations(loader_data,
|
||||||
|
runtime_visible_type_annotations,
|
||||||
|
runtime_visible_type_annotations_length,
|
||||||
|
runtime_invisible_type_annotations,
|
||||||
|
runtime_invisible_type_annotations_length,
|
||||||
|
CHECK);
|
||||||
|
set_class_type_annotations(type_annotations);
|
||||||
|
|
||||||
if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) {
|
if (parsed_innerclasses_attribute || parsed_enclosingmethod_attribute) {
|
||||||
u2 num_of_classes = parse_classfile_inner_classes_attribute(
|
u2 num_of_classes = parse_classfile_inner_classes_attribute(
|
||||||
@ -2956,6 +3065,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
TempNewSymbol& parsed_name,
|
TempNewSymbol& parsed_name,
|
||||||
bool verify,
|
bool verify,
|
||||||
TRAPS) {
|
TRAPS) {
|
||||||
|
|
||||||
// When a retransformable agent is attached, JVMTI caches the
|
// When a retransformable agent is attached, JVMTI caches the
|
||||||
// class bytes that existed before the first retransformation.
|
// class bytes that existed before the first retransformation.
|
||||||
// If RedefineClasses() was used before the retransformable
|
// If RedefineClasses() was used before the retransformable
|
||||||
@ -3190,7 +3300,9 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
// Fields (offsets are filled in later)
|
// Fields (offsets are filled in later)
|
||||||
FieldAllocationCount fac;
|
FieldAllocationCount fac;
|
||||||
Array<AnnotationArray*>* fields_annotations = NULL;
|
Array<AnnotationArray*>* fields_annotations = NULL;
|
||||||
|
Array<AnnotationArray*>* fields_type_annotations = NULL;
|
||||||
Array<u2>* fields = parse_fields(loader_data, class_name, cp, access_flags.is_interface(), &fac, &fields_annotations,
|
Array<u2>* fields = parse_fields(loader_data, class_name, cp, access_flags.is_interface(), &fac, &fields_annotations,
|
||||||
|
&fields_type_annotations,
|
||||||
&java_fields_count,
|
&java_fields_count,
|
||||||
CHECK_(nullHandle));
|
CHECK_(nullHandle));
|
||||||
// Methods
|
// Methods
|
||||||
@ -3202,6 +3314,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
Array<AnnotationArray*>* methods_annotations = NULL;
|
Array<AnnotationArray*>* methods_annotations = NULL;
|
||||||
Array<AnnotationArray*>* methods_parameter_annotations = NULL;
|
Array<AnnotationArray*>* methods_parameter_annotations = NULL;
|
||||||
Array<AnnotationArray*>* methods_default_annotations = NULL;
|
Array<AnnotationArray*>* methods_default_annotations = NULL;
|
||||||
|
Array<AnnotationArray*>* methods_type_annotations = NULL;
|
||||||
Array<Method*>* methods = parse_methods(loader_data,
|
Array<Method*>* methods = parse_methods(loader_data,
|
||||||
cp, access_flags.is_interface(),
|
cp, access_flags.is_interface(),
|
||||||
&promoted_flags,
|
&promoted_flags,
|
||||||
@ -3209,6 +3322,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
&methods_annotations,
|
&methods_annotations,
|
||||||
&methods_parameter_annotations,
|
&methods_parameter_annotations,
|
||||||
&methods_default_annotations,
|
&methods_default_annotations,
|
||||||
|
&methods_type_annotations,
|
||||||
&has_default_methods,
|
&has_default_methods,
|
||||||
CHECK_(nullHandle));
|
CHECK_(nullHandle));
|
||||||
|
|
||||||
@ -3270,6 +3384,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
methods_annotations,
|
methods_annotations,
|
||||||
methods_parameter_annotations,
|
methods_parameter_annotations,
|
||||||
methods_default_annotations,
|
methods_default_annotations,
|
||||||
|
methods_type_annotations,
|
||||||
CHECK_(nullHandle));
|
CHECK_(nullHandle));
|
||||||
|
|
||||||
// promote flags from parse_methods() to the klass' flags
|
// promote flags from parse_methods() to the klass' flags
|
||||||
@ -3687,11 +3802,13 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
if (is_anonymous()) // I am well known to myself
|
if (is_anonymous()) // I am well known to myself
|
||||||
cp->klass_at_put(this_class_index, this_klass()); // eagerly resolve
|
cp->klass_at_put(this_class_index, this_klass()); // eagerly resolve
|
||||||
|
|
||||||
|
// Allocate an annotation type if needed.
|
||||||
if (fields_annotations != NULL ||
|
if (fields_annotations != NULL ||
|
||||||
methods_annotations != NULL ||
|
methods_annotations != NULL ||
|
||||||
methods_parameter_annotations != NULL ||
|
methods_parameter_annotations != NULL ||
|
||||||
methods_default_annotations != NULL) {
|
methods_default_annotations != NULL ||
|
||||||
// Allocate an annotation type if needed.
|
fields_type_annotations != NULL ||
|
||||||
|
methods_type_annotations != NULL) {
|
||||||
Annotations* anno = Annotations::allocate(loader_data,
|
Annotations* anno = Annotations::allocate(loader_data,
|
||||||
fields_annotations, methods_annotations,
|
fields_annotations, methods_annotations,
|
||||||
methods_parameter_annotations,
|
methods_parameter_annotations,
|
||||||
@ -3701,6 +3818,16 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
this_klass->set_annotations(NULL);
|
this_klass->set_annotations(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fields_type_annotations != NULL ||
|
||||||
|
methods_type_annotations != NULL) {
|
||||||
|
assert(this_klass->annotations() != NULL, "annotations should have been allocated");
|
||||||
|
Annotations* anno = Annotations::allocate(loader_data,
|
||||||
|
fields_type_annotations,
|
||||||
|
methods_type_annotations,
|
||||||
|
NULL,
|
||||||
|
NULL, CHECK_(nullHandle));
|
||||||
|
this_klass->annotations()->set_type_annotations(anno);
|
||||||
|
}
|
||||||
|
|
||||||
this_klass->set_minor_version(minor_version);
|
this_klass->set_minor_version(minor_version);
|
||||||
this_klass->set_major_version(major_version);
|
this_klass->set_major_version(major_version);
|
||||||
@ -3725,6 +3852,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
// Fill in field values obtained by parse_classfile_attributes
|
// Fill in field values obtained by parse_classfile_attributes
|
||||||
if (parsed_annotations.has_any_annotations())
|
if (parsed_annotations.has_any_annotations())
|
||||||
parsed_annotations.apply_to(this_klass);
|
parsed_annotations.apply_to(this_klass);
|
||||||
|
|
||||||
// Create annotations
|
// Create annotations
|
||||||
if (_annotations != NULL && this_klass->annotations() == NULL) {
|
if (_annotations != NULL && this_klass->annotations() == NULL) {
|
||||||
Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL);
|
Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL);
|
||||||
@ -3732,6 +3860,19 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
}
|
}
|
||||||
apply_parsed_class_attributes(this_klass);
|
apply_parsed_class_attributes(this_klass);
|
||||||
|
|
||||||
|
// Create type annotations
|
||||||
|
if (_type_annotations != NULL) {
|
||||||
|
if (this_klass->annotations() == NULL) {
|
||||||
|
Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL);
|
||||||
|
this_klass->set_annotations(anno);
|
||||||
|
}
|
||||||
|
if (this_klass->annotations()->type_annotations() == NULL) {
|
||||||
|
Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL);
|
||||||
|
this_klass->annotations()->set_type_annotations(anno);
|
||||||
|
}
|
||||||
|
this_klass->annotations()->type_annotations()->set_class_annotations(_type_annotations);
|
||||||
|
}
|
||||||
|
|
||||||
// Miranda methods
|
// Miranda methods
|
||||||
if ((num_miranda_methods > 0) ||
|
if ((num_miranda_methods > 0) ||
|
||||||
// if this class introduced new miranda methods or
|
// if this class introduced new miranda methods or
|
||||||
|
@ -64,6 +64,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
int _sde_length;
|
int _sde_length;
|
||||||
Array<u2>* _inner_classes;
|
Array<u2>* _inner_classes;
|
||||||
AnnotationArray* _annotations;
|
AnnotationArray* _annotations;
|
||||||
|
AnnotationArray* _type_annotations;
|
||||||
|
|
||||||
void set_class_synthetic_flag(bool x) { _synthetic_flag = x; }
|
void set_class_synthetic_flag(bool x) { _synthetic_flag = x; }
|
||||||
void set_class_sourcefile(Symbol* x) { _sourcefile = x; }
|
void set_class_sourcefile(Symbol* x) { _sourcefile = x; }
|
||||||
@ -71,12 +72,14 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
|
void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
|
||||||
void set_class_inner_classes(Array<u2>* x) { _inner_classes = x; }
|
void set_class_inner_classes(Array<u2>* x) { _inner_classes = x; }
|
||||||
void set_class_annotations(AnnotationArray* x) { _annotations = x; }
|
void set_class_annotations(AnnotationArray* x) { _annotations = x; }
|
||||||
|
void set_class_type_annotations(AnnotationArray* x) { _type_annotations = x; }
|
||||||
void init_parsed_class_attributes() {
|
void init_parsed_class_attributes() {
|
||||||
_synthetic_flag = false;
|
_synthetic_flag = false;
|
||||||
_sourcefile = NULL;
|
_sourcefile = NULL;
|
||||||
_generic_signature = NULL;
|
_generic_signature = NULL;
|
||||||
_sde_buffer = NULL;
|
_sde_buffer = NULL;
|
||||||
_sde_length = 0;
|
_sde_length = 0;
|
||||||
|
_annotations = _type_annotations = NULL;
|
||||||
// initialize the other flags too:
|
// initialize the other flags too:
|
||||||
_has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false;
|
_has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false;
|
||||||
_max_bootstrap_specifier_index = -1;
|
_max_bootstrap_specifier_index = -1;
|
||||||
@ -163,6 +166,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
bool* is_synthetic_addr,
|
bool* is_synthetic_addr,
|
||||||
u2* generic_signature_index_addr,
|
u2* generic_signature_index_addr,
|
||||||
AnnotationArray** field_annotations,
|
AnnotationArray** field_annotations,
|
||||||
|
AnnotationArray** field_type_annotations,
|
||||||
FieldAnnotationCollector* parsed_annotations,
|
FieldAnnotationCollector* parsed_annotations,
|
||||||
TRAPS);
|
TRAPS);
|
||||||
Array<u2>* parse_fields(ClassLoaderData* loader_data,
|
Array<u2>* parse_fields(ClassLoaderData* loader_data,
|
||||||
@ -170,6 +174,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
constantPoolHandle cp, bool is_interface,
|
constantPoolHandle cp, bool is_interface,
|
||||||
FieldAllocationCount *fac,
|
FieldAllocationCount *fac,
|
||||||
Array<AnnotationArray*>** fields_annotations,
|
Array<AnnotationArray*>** fields_annotations,
|
||||||
|
Array<AnnotationArray*>** fields_type_annotations,
|
||||||
u2* java_fields_count_ptr, TRAPS);
|
u2* java_fields_count_ptr, TRAPS);
|
||||||
|
|
||||||
// Method parsing
|
// Method parsing
|
||||||
@ -180,6 +185,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
AnnotationArray** method_annotations,
|
AnnotationArray** method_annotations,
|
||||||
AnnotationArray** method_parameter_annotations,
|
AnnotationArray** method_parameter_annotations,
|
||||||
AnnotationArray** method_default_annotations,
|
AnnotationArray** method_default_annotations,
|
||||||
|
AnnotationArray** method_type_annotations,
|
||||||
TRAPS);
|
TRAPS);
|
||||||
Array<Method*>* parse_methods(ClassLoaderData* loader_data,
|
Array<Method*>* parse_methods(ClassLoaderData* loader_data,
|
||||||
constantPoolHandle cp,
|
constantPoolHandle cp,
|
||||||
@ -189,6 +195,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
Array<AnnotationArray*>** methods_annotations,
|
Array<AnnotationArray*>** methods_annotations,
|
||||||
Array<AnnotationArray*>** methods_parameter_annotations,
|
Array<AnnotationArray*>** methods_parameter_annotations,
|
||||||
Array<AnnotationArray*>** methods_default_annotations,
|
Array<AnnotationArray*>** methods_default_annotations,
|
||||||
|
Array<AnnotationArray*>** methods_type_annotations,
|
||||||
bool* has_default_method,
|
bool* has_default_method,
|
||||||
TRAPS);
|
TRAPS);
|
||||||
Array<int>* sort_methods(ClassLoaderData* loader_data,
|
Array<int>* sort_methods(ClassLoaderData* loader_data,
|
||||||
@ -196,6 +203,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
Array<AnnotationArray*>* methods_annotations,
|
Array<AnnotationArray*>* methods_annotations,
|
||||||
Array<AnnotationArray*>* methods_parameter_annotations,
|
Array<AnnotationArray*>* methods_parameter_annotations,
|
||||||
Array<AnnotationArray*>* methods_default_annotations,
|
Array<AnnotationArray*>* methods_default_annotations,
|
||||||
|
Array<AnnotationArray*>* methods_type_annotations,
|
||||||
TRAPS);
|
TRAPS);
|
||||||
u2* parse_exception_table(ClassLoaderData* loader_data,
|
u2* parse_exception_table(ClassLoaderData* loader_data,
|
||||||
u4 code_length, u4 exception_table_length,
|
u4 code_length, u4 exception_table_length,
|
||||||
|
@ -93,3 +93,10 @@ void ClassFileStream::skip_u2(int length, TRAPS) {
|
|||||||
}
|
}
|
||||||
_current += length * 2;
|
_current += length * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassFileStream::skip_u4(int length, TRAPS) {
|
||||||
|
if (_need_verify) {
|
||||||
|
guarantee_more(length * 4, CHECK);
|
||||||
|
}
|
||||||
|
_current += length * 4;
|
||||||
|
}
|
||||||
|
@ -133,6 +133,11 @@ class ClassFileStream: public ResourceObj {
|
|||||||
_current += 2 * length;
|
_current += 2 * length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void skip_u4(int length, TRAPS);
|
||||||
|
void skip_u4_fast(int length) {
|
||||||
|
_current += 4 * length;
|
||||||
|
}
|
||||||
|
|
||||||
// Tells whether eos is reached
|
// Tells whether eos is reached
|
||||||
bool at_eos() const { return _current == _buffer_end; }
|
bool at_eos() const { return _current == _buffer_end; }
|
||||||
};
|
};
|
||||||
|
@ -330,10 +330,19 @@ Metaspace* ClassLoaderData::metaspace_non_null() {
|
|||||||
}
|
}
|
||||||
if (this == the_null_class_loader_data()) {
|
if (this == the_null_class_loader_data()) {
|
||||||
assert (class_loader() == NULL, "Must be");
|
assert (class_loader() == NULL, "Must be");
|
||||||
size_t word_size = Metaspace::first_chunk_word_size();
|
set_metaspace(new Metaspace(_metaspace_lock, Metaspace::BootMetaspaceType));
|
||||||
set_metaspace(new Metaspace(_metaspace_lock, word_size));
|
} else if (is_anonymous()) {
|
||||||
|
if (TraceClassLoaderData && Verbose && class_loader() != NULL) {
|
||||||
|
tty->print_cr("is_anonymous: %s", class_loader()->klass()->internal_name());
|
||||||
|
}
|
||||||
|
set_metaspace(new Metaspace(_metaspace_lock, Metaspace::AnonymousMetaspaceType));
|
||||||
|
} else if (class_loader()->is_a(SystemDictionary::reflect_DelegatingClassLoader_klass())) {
|
||||||
|
if (TraceClassLoaderData && Verbose && class_loader() != NULL) {
|
||||||
|
tty->print_cr("is_reflection: %s", class_loader()->klass()->internal_name());
|
||||||
|
}
|
||||||
|
set_metaspace(new Metaspace(_metaspace_lock, Metaspace::ReflectionMetaspaceType));
|
||||||
} else {
|
} else {
|
||||||
set_metaspace(new Metaspace(_metaspace_lock)); // default size for now.
|
set_metaspace(new Metaspace(_metaspace_lock, Metaspace::StandardMetaspaceType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return _metaspace;
|
return _metaspace;
|
||||||
@ -672,8 +681,8 @@ void ClassLoaderData::initialize_shared_metaspaces() {
|
|||||||
"only supported for null loader data for now");
|
"only supported for null loader data for now");
|
||||||
assert (!_shared_metaspaces_initialized, "only initialize once");
|
assert (!_shared_metaspaces_initialized, "only initialize once");
|
||||||
MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
|
MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
|
||||||
_ro_metaspace = new Metaspace(_metaspace_lock, SharedReadOnlySize/wordSize);
|
_ro_metaspace = new Metaspace(_metaspace_lock, Metaspace::ROMetaspaceType);
|
||||||
_rw_metaspace = new Metaspace(_metaspace_lock, SharedReadWriteSize/wordSize);
|
_rw_metaspace = new Metaspace(_metaspace_lock, Metaspace::ReadWriteMetaspaceType);
|
||||||
_shared_metaspaces_initialized = true;
|
_shared_metaspaces_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1148,7 +1148,8 @@ static Method* new_method(
|
|||||||
int code_length = bytecodes->length();
|
int code_length = bytecodes->length();
|
||||||
|
|
||||||
Method* m = Method::allocate(cp->pool_holder()->class_loader_data(),
|
Method* m = Method::allocate(cp->pool_holder()->class_loader_data(),
|
||||||
code_length, flags, 0, 0, 0, 0, 0, mt, CHECK_NULL);
|
code_length, flags, 0, 0, 0, 0, 0, 0,
|
||||||
|
mt, CHECK_NULL);
|
||||||
|
|
||||||
m->set_constants(NULL); // This will get filled in later
|
m->set_constants(NULL); // This will get filled in later
|
||||||
m->set_name_index(cp->utf8(name));
|
m->set_name_index(cp->utf8(name));
|
||||||
|
@ -1813,10 +1813,12 @@ void java_lang_reflect_Method::compute_offsets() {
|
|||||||
annotations_offset = -1;
|
annotations_offset = -1;
|
||||||
parameter_annotations_offset = -1;
|
parameter_annotations_offset = -1;
|
||||||
annotation_default_offset = -1;
|
annotation_default_offset = -1;
|
||||||
|
type_annotations_offset = -1;
|
||||||
compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
|
compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
|
||||||
compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
|
compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
|
||||||
compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
|
compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
|
||||||
compute_optional_offset(annotation_default_offset, k, vmSymbols::annotation_default_name(), vmSymbols::byte_array_signature());
|
compute_optional_offset(annotation_default_offset, k, vmSymbols::annotation_default_name(), vmSymbols::byte_array_signature());
|
||||||
|
compute_optional_offset(type_annotations_offset, k, vmSymbols::type_annotations_name(), vmSymbols::byte_array_signature());
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle java_lang_reflect_Method::create(TRAPS) {
|
Handle java_lang_reflect_Method::create(TRAPS) {
|
||||||
@ -1962,6 +1964,22 @@ void java_lang_reflect_Method::set_annotation_default(oop method, oop value) {
|
|||||||
method->obj_field_put(annotation_default_offset, value);
|
method->obj_field_put(annotation_default_offset, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool java_lang_reflect_Method::has_type_annotations_field() {
|
||||||
|
return (type_annotations_offset >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
oop java_lang_reflect_Method::type_annotations(oop method) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
assert(has_type_annotations_field(), "type_annotations field must be present");
|
||||||
|
return method->obj_field(type_annotations_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Method::set_type_annotations(oop method, oop value) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
assert(has_type_annotations_field(), "type_annotations field must be present");
|
||||||
|
method->obj_field_put(type_annotations_offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
void java_lang_reflect_Constructor::compute_offsets() {
|
void java_lang_reflect_Constructor::compute_offsets() {
|
||||||
Klass* k = SystemDictionary::reflect_Constructor_klass();
|
Klass* k = SystemDictionary::reflect_Constructor_klass();
|
||||||
compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
|
compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
|
||||||
@ -1973,9 +1991,11 @@ void java_lang_reflect_Constructor::compute_offsets() {
|
|||||||
signature_offset = -1;
|
signature_offset = -1;
|
||||||
annotations_offset = -1;
|
annotations_offset = -1;
|
||||||
parameter_annotations_offset = -1;
|
parameter_annotations_offset = -1;
|
||||||
|
type_annotations_offset = -1;
|
||||||
compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
|
compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
|
||||||
compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
|
compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
|
||||||
compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
|
compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
|
||||||
|
compute_optional_offset(type_annotations_offset, k, vmSymbols::type_annotations_name(), vmSymbols::byte_array_signature());
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle java_lang_reflect_Constructor::create(TRAPS) {
|
Handle java_lang_reflect_Constructor::create(TRAPS) {
|
||||||
@ -2086,6 +2106,22 @@ void java_lang_reflect_Constructor::set_parameter_annotations(oop method, oop va
|
|||||||
method->obj_field_put(parameter_annotations_offset, value);
|
method->obj_field_put(parameter_annotations_offset, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool java_lang_reflect_Constructor::has_type_annotations_field() {
|
||||||
|
return (type_annotations_offset >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
oop java_lang_reflect_Constructor::type_annotations(oop constructor) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
assert(has_type_annotations_field(), "type_annotations field must be present");
|
||||||
|
return constructor->obj_field(type_annotations_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Constructor::set_type_annotations(oop constructor, oop value) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
assert(has_type_annotations_field(), "type_annotations field must be present");
|
||||||
|
constructor->obj_field_put(type_annotations_offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
void java_lang_reflect_Field::compute_offsets() {
|
void java_lang_reflect_Field::compute_offsets() {
|
||||||
Klass* k = SystemDictionary::reflect_Field_klass();
|
Klass* k = SystemDictionary::reflect_Field_klass();
|
||||||
compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
|
compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
|
||||||
@ -2096,8 +2132,10 @@ void java_lang_reflect_Field::compute_offsets() {
|
|||||||
// The generic signature and annotations fields are only present in 1.5
|
// The generic signature and annotations fields are only present in 1.5
|
||||||
signature_offset = -1;
|
signature_offset = -1;
|
||||||
annotations_offset = -1;
|
annotations_offset = -1;
|
||||||
|
type_annotations_offset = -1;
|
||||||
compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
|
compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
|
||||||
compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
|
compute_optional_offset(annotations_offset, k, vmSymbols::annotations_name(), vmSymbols::byte_array_signature());
|
||||||
|
compute_optional_offset(type_annotations_offset, k, vmSymbols::type_annotations_name(), vmSymbols::byte_array_signature());
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle java_lang_reflect_Field::create(TRAPS) {
|
Handle java_lang_reflect_Field::create(TRAPS) {
|
||||||
@ -2192,6 +2230,21 @@ void java_lang_reflect_Field::set_annotations(oop field, oop value) {
|
|||||||
field->obj_field_put(annotations_offset, value);
|
field->obj_field_put(annotations_offset, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool java_lang_reflect_Field::has_type_annotations_field() {
|
||||||
|
return (type_annotations_offset >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
oop java_lang_reflect_Field::type_annotations(oop field) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
assert(has_type_annotations_field(), "type_annotations field must be present");
|
||||||
|
return field->obj_field(type_annotations_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Field::set_type_annotations(oop field, oop value) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
assert(has_type_annotations_field(), "type_annotations field must be present");
|
||||||
|
field->obj_field_put(type_annotations_offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
void sun_reflect_ConstantPool::compute_offsets() {
|
void sun_reflect_ConstantPool::compute_offsets() {
|
||||||
Klass* k = SystemDictionary::reflect_ConstantPool_klass();
|
Klass* k = SystemDictionary::reflect_ConstantPool_klass();
|
||||||
@ -2202,6 +2255,66 @@ void sun_reflect_ConstantPool::compute_offsets() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Parameter::compute_offsets() {
|
||||||
|
Klass* k = SystemDictionary::reflect_Parameter_klass();
|
||||||
|
if(NULL != k) {
|
||||||
|
compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
|
||||||
|
compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature());
|
||||||
|
compute_offset(index_offset, k, vmSymbols::index_name(), vmSymbols::int_signature());
|
||||||
|
compute_offset(executable_offset, k, vmSymbols::executable_name(), vmSymbols::executable_signature());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle java_lang_reflect_Parameter::create(TRAPS) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
Symbol* name = vmSymbols::java_lang_reflect_Parameter();
|
||||||
|
Klass* k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
|
||||||
|
instanceKlassHandle klass (THREAD, k);
|
||||||
|
// Ensure it is initialized
|
||||||
|
klass->initialize(CHECK_NH);
|
||||||
|
return klass->allocate_instance_handle(CHECK_NH);
|
||||||
|
}
|
||||||
|
|
||||||
|
oop java_lang_reflect_Parameter::name(oop param) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
return param->obj_field(name_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Parameter::set_name(oop param, oop value) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
param->obj_field_put(name_offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int java_lang_reflect_Parameter::modifiers(oop param) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
return param->int_field(modifiers_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Parameter::set_modifiers(oop param, int value) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
param->int_field_put(modifiers_offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int java_lang_reflect_Parameter::index(oop param) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
return param->int_field(index_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Parameter::set_index(oop param, int value) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
param->int_field_put(index_offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
oop java_lang_reflect_Parameter::executable(oop param) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
return param->obj_field(executable_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_reflect_Parameter::set_executable(oop param, oop value) {
|
||||||
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
|
param->obj_field_put(executable_offset, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Handle sun_reflect_ConstantPool::create(TRAPS) {
|
Handle sun_reflect_ConstantPool::create(TRAPS) {
|
||||||
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
|
||||||
@ -2857,6 +2970,7 @@ int java_lang_reflect_Method::signature_offset;
|
|||||||
int java_lang_reflect_Method::annotations_offset;
|
int java_lang_reflect_Method::annotations_offset;
|
||||||
int java_lang_reflect_Method::parameter_annotations_offset;
|
int java_lang_reflect_Method::parameter_annotations_offset;
|
||||||
int java_lang_reflect_Method::annotation_default_offset;
|
int java_lang_reflect_Method::annotation_default_offset;
|
||||||
|
int java_lang_reflect_Method::type_annotations_offset;
|
||||||
int java_lang_reflect_Constructor::clazz_offset;
|
int java_lang_reflect_Constructor::clazz_offset;
|
||||||
int java_lang_reflect_Constructor::parameterTypes_offset;
|
int java_lang_reflect_Constructor::parameterTypes_offset;
|
||||||
int java_lang_reflect_Constructor::exceptionTypes_offset;
|
int java_lang_reflect_Constructor::exceptionTypes_offset;
|
||||||
@ -2865,6 +2979,7 @@ int java_lang_reflect_Constructor::modifiers_offset;
|
|||||||
int java_lang_reflect_Constructor::signature_offset;
|
int java_lang_reflect_Constructor::signature_offset;
|
||||||
int java_lang_reflect_Constructor::annotations_offset;
|
int java_lang_reflect_Constructor::annotations_offset;
|
||||||
int java_lang_reflect_Constructor::parameter_annotations_offset;
|
int java_lang_reflect_Constructor::parameter_annotations_offset;
|
||||||
|
int java_lang_reflect_Constructor::type_annotations_offset;
|
||||||
int java_lang_reflect_Field::clazz_offset;
|
int java_lang_reflect_Field::clazz_offset;
|
||||||
int java_lang_reflect_Field::name_offset;
|
int java_lang_reflect_Field::name_offset;
|
||||||
int java_lang_reflect_Field::type_offset;
|
int java_lang_reflect_Field::type_offset;
|
||||||
@ -2872,6 +2987,11 @@ int java_lang_reflect_Field::slot_offset;
|
|||||||
int java_lang_reflect_Field::modifiers_offset;
|
int java_lang_reflect_Field::modifiers_offset;
|
||||||
int java_lang_reflect_Field::signature_offset;
|
int java_lang_reflect_Field::signature_offset;
|
||||||
int java_lang_reflect_Field::annotations_offset;
|
int java_lang_reflect_Field::annotations_offset;
|
||||||
|
int java_lang_reflect_Field::type_annotations_offset;
|
||||||
|
int java_lang_reflect_Parameter::name_offset;
|
||||||
|
int java_lang_reflect_Parameter::modifiers_offset;
|
||||||
|
int java_lang_reflect_Parameter::index_offset;
|
||||||
|
int java_lang_reflect_Parameter::executable_offset;
|
||||||
int java_lang_boxing_object::value_offset;
|
int java_lang_boxing_object::value_offset;
|
||||||
int java_lang_boxing_object::long_value_offset;
|
int java_lang_boxing_object::long_value_offset;
|
||||||
int java_lang_ref_Reference::referent_offset;
|
int java_lang_ref_Reference::referent_offset;
|
||||||
@ -3056,6 +3176,8 @@ void JavaClasses::compute_offsets() {
|
|||||||
sun_reflect_ConstantPool::compute_offsets();
|
sun_reflect_ConstantPool::compute_offsets();
|
||||||
sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
|
sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
|
||||||
}
|
}
|
||||||
|
if (JDK_Version::is_jdk18x_version())
|
||||||
|
java_lang_reflect_Parameter::compute_offsets();
|
||||||
|
|
||||||
// generated interpreter code wants to know about the offsets we just computed:
|
// generated interpreter code wants to know about the offsets we just computed:
|
||||||
AbstractAssembler::update_delayed_values();
|
AbstractAssembler::update_delayed_values();
|
||||||
|
@ -554,6 +554,7 @@ class java_lang_reflect_Method : public java_lang_reflect_AccessibleObject {
|
|||||||
static int annotations_offset;
|
static int annotations_offset;
|
||||||
static int parameter_annotations_offset;
|
static int parameter_annotations_offset;
|
||||||
static int annotation_default_offset;
|
static int annotation_default_offset;
|
||||||
|
static int type_annotations_offset;
|
||||||
|
|
||||||
static void compute_offsets();
|
static void compute_offsets();
|
||||||
|
|
||||||
@ -599,6 +600,10 @@ class java_lang_reflect_Method : public java_lang_reflect_AccessibleObject {
|
|||||||
static oop annotation_default(oop method);
|
static oop annotation_default(oop method);
|
||||||
static void set_annotation_default(oop method, oop value);
|
static void set_annotation_default(oop method, oop value);
|
||||||
|
|
||||||
|
static bool has_type_annotations_field();
|
||||||
|
static oop type_annotations(oop method);
|
||||||
|
static void set_type_annotations(oop method, oop value);
|
||||||
|
|
||||||
// Debugging
|
// Debugging
|
||||||
friend class JavaClasses;
|
friend class JavaClasses;
|
||||||
};
|
};
|
||||||
@ -618,6 +623,7 @@ class java_lang_reflect_Constructor : public java_lang_reflect_AccessibleObject
|
|||||||
static int signature_offset;
|
static int signature_offset;
|
||||||
static int annotations_offset;
|
static int annotations_offset;
|
||||||
static int parameter_annotations_offset;
|
static int parameter_annotations_offset;
|
||||||
|
static int type_annotations_offset;
|
||||||
|
|
||||||
static void compute_offsets();
|
static void compute_offsets();
|
||||||
|
|
||||||
@ -653,6 +659,10 @@ class java_lang_reflect_Constructor : public java_lang_reflect_AccessibleObject
|
|||||||
static oop parameter_annotations(oop method);
|
static oop parameter_annotations(oop method);
|
||||||
static void set_parameter_annotations(oop method, oop value);
|
static void set_parameter_annotations(oop method, oop value);
|
||||||
|
|
||||||
|
static bool has_type_annotations_field();
|
||||||
|
static oop type_annotations(oop constructor);
|
||||||
|
static void set_type_annotations(oop constructor, oop value);
|
||||||
|
|
||||||
// Debugging
|
// Debugging
|
||||||
friend class JavaClasses;
|
friend class JavaClasses;
|
||||||
};
|
};
|
||||||
@ -671,6 +681,7 @@ class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
|
|||||||
static int modifiers_offset;
|
static int modifiers_offset;
|
||||||
static int signature_offset;
|
static int signature_offset;
|
||||||
static int annotations_offset;
|
static int annotations_offset;
|
||||||
|
static int type_annotations_offset;
|
||||||
|
|
||||||
static void compute_offsets();
|
static void compute_offsets();
|
||||||
|
|
||||||
@ -710,10 +721,45 @@ class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
|
|||||||
static oop annotation_default(oop method);
|
static oop annotation_default(oop method);
|
||||||
static void set_annotation_default(oop method, oop value);
|
static void set_annotation_default(oop method, oop value);
|
||||||
|
|
||||||
|
static bool has_type_annotations_field();
|
||||||
|
static oop type_annotations(oop field);
|
||||||
|
static void set_type_annotations(oop field, oop value);
|
||||||
|
|
||||||
// Debugging
|
// Debugging
|
||||||
friend class JavaClasses;
|
friend class JavaClasses;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class java_lang_reflect_Parameter {
|
||||||
|
private:
|
||||||
|
// Note that to reduce dependencies on the JDK we compute these
|
||||||
|
// offsets at run-time.
|
||||||
|
static int name_offset;
|
||||||
|
static int modifiers_offset;
|
||||||
|
static int index_offset;
|
||||||
|
static int executable_offset;
|
||||||
|
|
||||||
|
static void compute_offsets();
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Allocation
|
||||||
|
static Handle create(TRAPS);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
static oop name(oop field);
|
||||||
|
static void set_name(oop field, oop value);
|
||||||
|
|
||||||
|
static int index(oop reflect);
|
||||||
|
static void set_index(oop reflect, int value);
|
||||||
|
|
||||||
|
static int modifiers(oop reflect);
|
||||||
|
static void set_modifiers(oop reflect, int value);
|
||||||
|
|
||||||
|
static oop executable(oop constructor);
|
||||||
|
static void set_executable(oop constructor, oop value);
|
||||||
|
|
||||||
|
friend class JavaClasses;
|
||||||
|
};
|
||||||
|
|
||||||
// Interface to sun.reflect.ConstantPool objects
|
// Interface to sun.reflect.ConstantPool objects
|
||||||
class sun_reflect_ConstantPool {
|
class sun_reflect_ConstantPool {
|
||||||
private:
|
private:
|
||||||
|
@ -131,6 +131,7 @@ class SymbolPropertyTable;
|
|||||||
do_klass(Properties_klass, java_util_Properties, Pre ) \
|
do_klass(Properties_klass, java_util_Properties, Pre ) \
|
||||||
do_klass(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre ) \
|
do_klass(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre ) \
|
||||||
do_klass(reflect_Field_klass, java_lang_reflect_Field, Pre ) \
|
do_klass(reflect_Field_klass, java_lang_reflect_Field, Pre ) \
|
||||||
|
do_klass(reflect_Parameter_klass, java_lang_reflect_Parameter, Opt ) \
|
||||||
do_klass(reflect_Method_klass, java_lang_reflect_Method, Pre ) \
|
do_klass(reflect_Method_klass, java_lang_reflect_Method, Pre ) \
|
||||||
do_klass(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre ) \
|
do_klass(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre ) \
|
||||||
\
|
\
|
||||||
@ -459,6 +460,7 @@ public:
|
|||||||
// Tells whether ClassLoader.checkPackageAccess is present
|
// Tells whether ClassLoader.checkPackageAccess is present
|
||||||
static bool has_checkPackageAccess() { return _has_checkPackageAccess; }
|
static bool has_checkPackageAccess() { return _has_checkPackageAccess; }
|
||||||
|
|
||||||
|
static bool Parameter_klass_loaded() { return WK_KLASS(reflect_Parameter_klass) != NULL; }
|
||||||
static bool Class_klass_loaded() { return WK_KLASS(Class_klass) != NULL; }
|
static bool Class_klass_loaded() { return WK_KLASS(Class_klass) != NULL; }
|
||||||
static bool Cloneable_klass_loaded() { return WK_KLASS(Cloneable_klass) != NULL; }
|
static bool Cloneable_klass_loaded() { return WK_KLASS(Cloneable_klass) != NULL; }
|
||||||
static bool Object_klass_loaded() { return WK_KLASS(Object_klass) != NULL; }
|
static bool Object_klass_loaded() { return WK_KLASS(Object_klass) != NULL; }
|
||||||
|
@ -86,6 +86,7 @@
|
|||||||
template(java_lang_reflect_Method, "java/lang/reflect/Method") \
|
template(java_lang_reflect_Method, "java/lang/reflect/Method") \
|
||||||
template(java_lang_reflect_Constructor, "java/lang/reflect/Constructor") \
|
template(java_lang_reflect_Constructor, "java/lang/reflect/Constructor") \
|
||||||
template(java_lang_reflect_Field, "java/lang/reflect/Field") \
|
template(java_lang_reflect_Field, "java/lang/reflect/Field") \
|
||||||
|
template(java_lang_reflect_Parameter, "java/lang/reflect/Parameter") \
|
||||||
template(java_lang_reflect_Array, "java/lang/reflect/Array") \
|
template(java_lang_reflect_Array, "java/lang/reflect/Array") \
|
||||||
template(java_lang_StringBuffer, "java/lang/StringBuffer") \
|
template(java_lang_StringBuffer, "java/lang/StringBuffer") \
|
||||||
template(java_lang_StringBuilder, "java/lang/StringBuilder") \
|
template(java_lang_StringBuilder, "java/lang/StringBuilder") \
|
||||||
@ -126,6 +127,7 @@
|
|||||||
template(tag_line_number_table, "LineNumberTable") \
|
template(tag_line_number_table, "LineNumberTable") \
|
||||||
template(tag_local_variable_table, "LocalVariableTable") \
|
template(tag_local_variable_table, "LocalVariableTable") \
|
||||||
template(tag_local_variable_type_table, "LocalVariableTypeTable") \
|
template(tag_local_variable_type_table, "LocalVariableTypeTable") \
|
||||||
|
template(tag_method_parameters, "MethodParameters") \
|
||||||
template(tag_stack_map_table, "StackMapTable") \
|
template(tag_stack_map_table, "StackMapTable") \
|
||||||
template(tag_synthetic, "Synthetic") \
|
template(tag_synthetic, "Synthetic") \
|
||||||
template(tag_deprecated, "Deprecated") \
|
template(tag_deprecated, "Deprecated") \
|
||||||
@ -136,6 +138,8 @@
|
|||||||
template(tag_runtime_visible_parameter_annotations, "RuntimeVisibleParameterAnnotations") \
|
template(tag_runtime_visible_parameter_annotations, "RuntimeVisibleParameterAnnotations") \
|
||||||
template(tag_runtime_invisible_parameter_annotations,"RuntimeInvisibleParameterAnnotations") \
|
template(tag_runtime_invisible_parameter_annotations,"RuntimeInvisibleParameterAnnotations") \
|
||||||
template(tag_annotation_default, "AnnotationDefault") \
|
template(tag_annotation_default, "AnnotationDefault") \
|
||||||
|
template(tag_runtime_visible_type_annotations, "RuntimeVisibleTypeAnnotations") \
|
||||||
|
template(tag_runtime_invisible_type_annotations, "RuntimeInvisibleTypeAnnotations") \
|
||||||
template(tag_enclosing_method, "EnclosingMethod") \
|
template(tag_enclosing_method, "EnclosingMethod") \
|
||||||
template(tag_bootstrap_methods, "BootstrapMethods") \
|
template(tag_bootstrap_methods, "BootstrapMethods") \
|
||||||
\
|
\
|
||||||
@ -233,12 +237,17 @@
|
|||||||
/* Support for annotations (JDK 1.5 and above) */ \
|
/* Support for annotations (JDK 1.5 and above) */ \
|
||||||
\
|
\
|
||||||
template(annotations_name, "annotations") \
|
template(annotations_name, "annotations") \
|
||||||
|
template(index_name, "index") \
|
||||||
|
template(executable_name, "executable") \
|
||||||
template(parameter_annotations_name, "parameterAnnotations") \
|
template(parameter_annotations_name, "parameterAnnotations") \
|
||||||
template(annotation_default_name, "annotationDefault") \
|
template(annotation_default_name, "annotationDefault") \
|
||||||
template(sun_reflect_ConstantPool, "sun/reflect/ConstantPool") \
|
template(sun_reflect_ConstantPool, "sun/reflect/ConstantPool") \
|
||||||
template(ConstantPool_name, "constantPoolOop") \
|
template(ConstantPool_name, "constantPoolOop") \
|
||||||
template(sun_reflect_UnsafeStaticFieldAccessorImpl, "sun/reflect/UnsafeStaticFieldAccessorImpl")\
|
template(sun_reflect_UnsafeStaticFieldAccessorImpl, "sun/reflect/UnsafeStaticFieldAccessorImpl")\
|
||||||
template(base_name, "base") \
|
template(base_name, "base") \
|
||||||
|
/* Type Annotations (JDK 8 and above) */ \
|
||||||
|
template(type_annotations_name, "typeAnnotations") \
|
||||||
|
\
|
||||||
\
|
\
|
||||||
/* Support for JSR 292 & invokedynamic (JDK 1.7 and above) */ \
|
/* Support for JSR 292 & invokedynamic (JDK 1.7 and above) */ \
|
||||||
template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
|
template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
|
||||||
@ -470,6 +479,7 @@
|
|||||||
template(class_signature, "Ljava/lang/Class;") \
|
template(class_signature, "Ljava/lang/Class;") \
|
||||||
template(string_signature, "Ljava/lang/String;") \
|
template(string_signature, "Ljava/lang/String;") \
|
||||||
template(reference_signature, "Ljava/lang/ref/Reference;") \
|
template(reference_signature, "Ljava/lang/ref/Reference;") \
|
||||||
|
template(executable_signature, "Ljava/lang/reflect/Executable;") \
|
||||||
template(concurrenthashmap_signature, "Ljava/util/concurrent/ConcurrentHashMap;") \
|
template(concurrenthashmap_signature, "Ljava/util/concurrent/ConcurrentHashMap;") \
|
||||||
template(String_StringBuilder_signature, "(Ljava/lang/String;)Ljava/lang/StringBuilder;") \
|
template(String_StringBuilder_signature, "(Ljava/lang/String;)Ljava/lang/StringBuilder;") \
|
||||||
template(int_StringBuilder_signature, "(I)Ljava/lang/StringBuilder;") \
|
template(int_StringBuilder_signature, "(I)Ljava/lang/StringBuilder;") \
|
||||||
|
@ -56,7 +56,7 @@ void ConcurrentMarkSweepPolicy::initialize_generations() {
|
|||||||
if (_generations == NULL)
|
if (_generations == NULL)
|
||||||
vm_exit_during_initialization("Unable to allocate gen spec");
|
vm_exit_during_initialization("Unable to allocate gen spec");
|
||||||
|
|
||||||
if (ParNewGeneration::in_use()) {
|
if (UseParNewGC) {
|
||||||
if (UseAdaptiveSizePolicy) {
|
if (UseAdaptiveSizePolicy) {
|
||||||
_generations[0] = new GenerationSpec(Generation::ASParNew,
|
_generations[0] = new GenerationSpec(Generation::ASParNew,
|
||||||
_initial_gen0_size, _max_gen0_size);
|
_initial_gen0_size, _max_gen0_size);
|
||||||
@ -96,7 +96,7 @@ void ConcurrentMarkSweepPolicy::initialize_size_policy(size_t init_eden_size,
|
|||||||
|
|
||||||
void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
|
void ConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
|
||||||
// initialize the policy counters - 2 collectors, 3 generations
|
// initialize the policy counters - 2 collectors, 3 generations
|
||||||
if (ParNewGeneration::in_use()) {
|
if (UseParNewGC) {
|
||||||
_gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 3);
|
_gc_policy_counters = new GCPolicyCounters("ParNew:CMS", 2, 3);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -119,7 +119,7 @@ void ASConcurrentMarkSweepPolicy::initialize_gc_policy_counters() {
|
|||||||
|
|
||||||
assert(size_policy() != NULL, "A size policy is required");
|
assert(size_policy() != NULL, "A size policy is required");
|
||||||
// initialize the policy counters - 2 collectors, 3 generations
|
// initialize the policy counters - 2 collectors, 3 generations
|
||||||
if (ParNewGeneration::in_use()) {
|
if (UseParNewGC) {
|
||||||
_gc_policy_counters = new CMSGCAdaptivePolicyCounters("ParNew:CMS", 2, 3,
|
_gc_policy_counters = new CMSGCAdaptivePolicyCounters("ParNew:CMS", 2, 3,
|
||||||
size_policy());
|
size_policy());
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,6 @@ HeapWord* CompactibleFreeListSpace::forward(oop q, size_t size,
|
|||||||
assert(q->forwardee() == NULL, "should be forwarded to NULL");
|
assert(q->forwardee() == NULL, "should be forwarded to NULL");
|
||||||
}
|
}
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::register_live_oop(q, adjusted_size));
|
|
||||||
compact_top += adjusted_size;
|
compact_top += adjusted_size;
|
||||||
|
|
||||||
// we need to update the offset table so that the beginnings of objects can be
|
// we need to update the offset table so that the beginnings of objects can be
|
||||||
|
@ -827,10 +827,10 @@ void ConcurrentMarkSweepGeneration::printOccupancy(const char *s) {
|
|||||||
GenCollectedHeap* gch = GenCollectedHeap::heap();
|
GenCollectedHeap* gch = GenCollectedHeap::heap();
|
||||||
if (PrintGCDetails) {
|
if (PrintGCDetails) {
|
||||||
if (Verbose) {
|
if (Verbose) {
|
||||||
gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"("SIZE_FORMAT")]",
|
gclog_or_tty->print("[%d %s-%s: "SIZE_FORMAT"("SIZE_FORMAT")]",
|
||||||
level(), short_name(), s, used(), capacity());
|
level(), short_name(), s, used(), capacity());
|
||||||
} else {
|
} else {
|
||||||
gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"K("SIZE_FORMAT"K)]",
|
gclog_or_tty->print("[%d %s-%s: "SIZE_FORMAT"K("SIZE_FORMAT"K)]",
|
||||||
level(), short_name(), s, used() / K, capacity() / K);
|
level(), short_name(), s, used() / K, capacity() / K);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ CollectionSetChooser::CollectionSetChooser() :
|
|||||||
_curr_index(0), _length(0), _first_par_unreserved_idx(0),
|
_curr_index(0), _length(0), _first_par_unreserved_idx(0),
|
||||||
_region_live_threshold_bytes(0), _remaining_reclaimable_bytes(0) {
|
_region_live_threshold_bytes(0), _remaining_reclaimable_bytes(0) {
|
||||||
_region_live_threshold_bytes =
|
_region_live_threshold_bytes =
|
||||||
HeapRegion::GrainBytes * (size_t) G1OldCSetRegionLiveThresholdPercent / 100;
|
HeapRegion::GrainBytes * (size_t) G1MixedGCLiveThresholdPercent / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -192,6 +192,7 @@ bool CMMarkStack::allocate(size_t capacity) {
|
|||||||
setEmpty();
|
setEmpty();
|
||||||
_capacity = (jint) capacity;
|
_capacity = (jint) capacity;
|
||||||
_saved_index = -1;
|
_saved_index = -1;
|
||||||
|
_should_expand = false;
|
||||||
NOT_PRODUCT(_max_depth = 0);
|
NOT_PRODUCT(_max_depth = 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -747,8 +748,8 @@ void ConcurrentMark::reset() {
|
|||||||
assert(_heap_end != NULL, "heap bounds should look ok");
|
assert(_heap_end != NULL, "heap bounds should look ok");
|
||||||
assert(_heap_start < _heap_end, "heap bounds should look ok");
|
assert(_heap_start < _heap_end, "heap bounds should look ok");
|
||||||
|
|
||||||
// reset all the marking data structures and any necessary flags
|
// Reset all the marking data structures and any necessary flags
|
||||||
clear_marking_state();
|
reset_marking_state();
|
||||||
|
|
||||||
if (verbose_low()) {
|
if (verbose_low()) {
|
||||||
gclog_or_tty->print_cr("[global] resetting");
|
gclog_or_tty->print_cr("[global] resetting");
|
||||||
@ -766,6 +767,23 @@ void ConcurrentMark::reset() {
|
|||||||
set_concurrent_marking_in_progress();
|
set_concurrent_marking_in_progress();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConcurrentMark::reset_marking_state(bool clear_overflow) {
|
||||||
|
_markStack.set_should_expand();
|
||||||
|
_markStack.setEmpty(); // Also clears the _markStack overflow flag
|
||||||
|
if (clear_overflow) {
|
||||||
|
clear_has_overflown();
|
||||||
|
} else {
|
||||||
|
assert(has_overflown(), "pre-condition");
|
||||||
|
}
|
||||||
|
_finger = _heap_start;
|
||||||
|
|
||||||
|
for (uint i = 0; i < _max_worker_id; ++i) {
|
||||||
|
CMTaskQueue* queue = _task_queues->queue(i);
|
||||||
|
queue->set_empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ConcurrentMark::set_phase(uint active_tasks, bool concurrent) {
|
void ConcurrentMark::set_phase(uint active_tasks, bool concurrent) {
|
||||||
assert(active_tasks <= _max_worker_id, "we should not have more");
|
assert(active_tasks <= _max_worker_id, "we should not have more");
|
||||||
|
|
||||||
@ -796,7 +814,7 @@ void ConcurrentMark::set_phase(uint active_tasks, bool concurrent) {
|
|||||||
void ConcurrentMark::set_non_marking_state() {
|
void ConcurrentMark::set_non_marking_state() {
|
||||||
// We set the global marking state to some default values when we're
|
// We set the global marking state to some default values when we're
|
||||||
// not doing marking.
|
// not doing marking.
|
||||||
clear_marking_state();
|
reset_marking_state();
|
||||||
_active_tasks = 0;
|
_active_tasks = 0;
|
||||||
clear_concurrent_marking_in_progress();
|
clear_concurrent_marking_in_progress();
|
||||||
}
|
}
|
||||||
@ -963,7 +981,7 @@ void ConcurrentMark::enter_first_sync_barrier(uint worker_id) {
|
|||||||
// not clear the overflow flag since we rely on it being true when
|
// not clear the overflow flag since we rely on it being true when
|
||||||
// we exit this method to abort the pause and restart concurent
|
// we exit this method to abort the pause and restart concurent
|
||||||
// marking.
|
// marking.
|
||||||
clear_marking_state(concurrent() /* clear_overflow */);
|
reset_marking_state(concurrent() /* clear_overflow */);
|
||||||
force_overflow()->update();
|
force_overflow()->update();
|
||||||
|
|
||||||
if (G1Log::fine()) {
|
if (G1Log::fine()) {
|
||||||
@ -1257,8 +1275,9 @@ void ConcurrentMark::checkpointRootsFinal(bool clear_all_soft_refs) {
|
|||||||
if (has_overflown()) {
|
if (has_overflown()) {
|
||||||
// Oops. We overflowed. Restart concurrent marking.
|
// Oops. We overflowed. Restart concurrent marking.
|
||||||
_restart_for_overflow = true;
|
_restart_for_overflow = true;
|
||||||
// Clear the flag. We do not need it any more.
|
// Clear the marking state because we will be restarting
|
||||||
clear_has_overflown();
|
// marking due to overflowing the global mark stack.
|
||||||
|
reset_marking_state();
|
||||||
if (G1TraceMarkStackOverflow) {
|
if (G1TraceMarkStackOverflow) {
|
||||||
gclog_or_tty->print_cr("\nRemark led to restart for overflow.");
|
gclog_or_tty->print_cr("\nRemark led to restart for overflow.");
|
||||||
}
|
}
|
||||||
@ -1282,6 +1301,8 @@ void ConcurrentMark::checkpointRootsFinal(bool clear_all_soft_refs) {
|
|||||||
/* option */ VerifyOption_G1UseNextMarking);
|
/* option */ VerifyOption_G1UseNextMarking);
|
||||||
}
|
}
|
||||||
assert(!restart_for_overflow(), "sanity");
|
assert(!restart_for_overflow(), "sanity");
|
||||||
|
// Completely reset the marking state since marking completed
|
||||||
|
set_non_marking_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand the marking stack, if we have to and if we can.
|
// Expand the marking stack, if we have to and if we can.
|
||||||
@ -1289,11 +1310,6 @@ void ConcurrentMark::checkpointRootsFinal(bool clear_all_soft_refs) {
|
|||||||
_markStack.expand();
|
_markStack.expand();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the marking state if marking completed
|
|
||||||
if (!restart_for_overflow()) {
|
|
||||||
set_non_marking_state();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if VERIFY_OBJS_PROCESSED
|
#if VERIFY_OBJS_PROCESSED
|
||||||
_scan_obj_cl.objs_processed = 0;
|
_scan_obj_cl.objs_processed = 0;
|
||||||
ThreadLocalObjQueue::objs_enqueued = 0;
|
ThreadLocalObjQueue::objs_enqueued = 0;
|
||||||
@ -2963,22 +2979,6 @@ void ConcurrentMark::verify_no_cset_oops(bool verify_stacks,
|
|||||||
}
|
}
|
||||||
#endif // PRODUCT
|
#endif // PRODUCT
|
||||||
|
|
||||||
void ConcurrentMark::clear_marking_state(bool clear_overflow) {
|
|
||||||
_markStack.set_should_expand();
|
|
||||||
_markStack.setEmpty(); // Also clears the _markStack overflow flag
|
|
||||||
if (clear_overflow) {
|
|
||||||
clear_has_overflown();
|
|
||||||
} else {
|
|
||||||
assert(has_overflown(), "pre-condition");
|
|
||||||
}
|
|
||||||
_finger = _heap_start;
|
|
||||||
|
|
||||||
for (uint i = 0; i < _max_worker_id; ++i) {
|
|
||||||
CMTaskQueue* queue = _task_queues->queue(i);
|
|
||||||
queue->set_empty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Aggregate the counting data that was constructed concurrently
|
// Aggregate the counting data that was constructed concurrently
|
||||||
// with marking.
|
// with marking.
|
||||||
class AggregateCountDataHRClosure: public HeapRegionClosure {
|
class AggregateCountDataHRClosure: public HeapRegionClosure {
|
||||||
@ -3185,7 +3185,7 @@ void ConcurrentMark::abort() {
|
|||||||
// Clear the liveness counting data
|
// Clear the liveness counting data
|
||||||
clear_all_count_data();
|
clear_all_count_data();
|
||||||
// Empty mark stack
|
// Empty mark stack
|
||||||
clear_marking_state();
|
reset_marking_state();
|
||||||
for (uint i = 0; i < _max_worker_id; ++i) {
|
for (uint i = 0; i < _max_worker_id; ++i) {
|
||||||
_tasks[i]->clear_region_fields();
|
_tasks[i]->clear_region_fields();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -478,15 +478,18 @@ protected:
|
|||||||
// It resets the global marking data structures, as well as the
|
// It resets the global marking data structures, as well as the
|
||||||
// task local ones; should be called during initial mark.
|
// task local ones; should be called during initial mark.
|
||||||
void reset();
|
void reset();
|
||||||
// It resets all the marking data structures.
|
|
||||||
void clear_marking_state(bool clear_overflow = true);
|
// Resets all the marking data structures. Called when we have to restart
|
||||||
|
// marking or when marking completes (via set_non_marking_state below).
|
||||||
|
void reset_marking_state(bool clear_overflow = true);
|
||||||
|
|
||||||
|
// We do this after we're done with marking so that the marking data
|
||||||
|
// structures are initialised to a sensible and predictable state.
|
||||||
|
void set_non_marking_state();
|
||||||
|
|
||||||
// It should be called to indicate which phase we're in (concurrent
|
// It should be called to indicate which phase we're in (concurrent
|
||||||
// mark or remark) and how many threads are currently active.
|
// mark or remark) and how many threads are currently active.
|
||||||
void set_phase(uint active_tasks, bool concurrent);
|
void set_phase(uint active_tasks, bool concurrent);
|
||||||
// We do this after we're done with marking so that the marking data
|
|
||||||
// structures are initialised to a sensible and predictable state.
|
|
||||||
void set_non_marking_state();
|
|
||||||
|
|
||||||
// prints all gathered CM-related statistics
|
// prints all gathered CM-related statistics
|
||||||
void print_stats();
|
void print_stats();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -159,13 +159,11 @@ void ConcurrentMarkThread::run() {
|
|||||||
VM_CGC_Operation op(&final_cl, verbose_str, true /* needs_pll */);
|
VM_CGC_Operation op(&final_cl, verbose_str, true /* needs_pll */);
|
||||||
VMThread::execute(&op);
|
VMThread::execute(&op);
|
||||||
}
|
}
|
||||||
if (cm()->restart_for_overflow() &&
|
|
||||||
G1TraceMarkStackOverflow) {
|
|
||||||
gclog_or_tty->print_cr("Restarting conc marking because of MS overflow "
|
|
||||||
"in remark (restart #%d).", iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cm()->restart_for_overflow()) {
|
if (cm()->restart_for_overflow()) {
|
||||||
|
if (G1TraceMarkStackOverflow) {
|
||||||
|
gclog_or_tty->print_cr("Restarting conc marking because of MS overflow "
|
||||||
|
"in remark (restart #%d).", iter);
|
||||||
|
}
|
||||||
if (G1Log::fine()) {
|
if (G1Log::fine()) {
|
||||||
gclog_or_tty->date_stamp(PrintGCDateStamps);
|
gclog_or_tty->date_stamp(PrintGCDateStamps);
|
||||||
gclog_or_tty->stamp(PrintGCTimeStamps);
|
gclog_or_tty->stamp(PrintGCTimeStamps);
|
||||||
|
@ -3668,7 +3668,7 @@ void G1CollectedHeap::log_gc_header() {
|
|||||||
gclog_or_tty->stamp(PrintGCTimeStamps);
|
gclog_or_tty->stamp(PrintGCTimeStamps);
|
||||||
|
|
||||||
GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause())
|
GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause())
|
||||||
.append(g1_policy()->gcs_are_young() ? " (young)" : " (mixed)")
|
.append(g1_policy()->gcs_are_young() ? "(young)" : "(mixed)")
|
||||||
.append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : "");
|
.append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : "");
|
||||||
|
|
||||||
gclog_or_tty->print("[%s", (const char*)gc_cause_str);
|
gclog_or_tty->print("[%s", (const char*)gc_cause_str);
|
||||||
|
@ -309,9 +309,9 @@ void G1CollectorPolicy::initialize_flags() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults), _adaptive_size(true) {
|
G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults), _adaptive_size(true) {
|
||||||
assert(G1DefaultMinNewGenPercent <= G1DefaultMaxNewGenPercent, "Min larger than max");
|
assert(G1NewSizePercent <= G1MaxNewSizePercent, "Min larger than max");
|
||||||
assert(G1DefaultMinNewGenPercent > 0 && G1DefaultMinNewGenPercent < 100, "Min out of bounds");
|
assert(G1NewSizePercent > 0 && G1NewSizePercent < 100, "Min out of bounds");
|
||||||
assert(G1DefaultMaxNewGenPercent > 0 && G1DefaultMaxNewGenPercent < 100, "Max out of bounds");
|
assert(G1MaxNewSizePercent > 0 && G1MaxNewSizePercent < 100, "Max out of bounds");
|
||||||
|
|
||||||
if (FLAG_IS_CMDLINE(NewRatio)) {
|
if (FLAG_IS_CMDLINE(NewRatio)) {
|
||||||
if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
|
if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
|
||||||
@ -344,12 +344,12 @@ G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults), _adaptive_size(
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint G1YoungGenSizer::calculate_default_min_length(uint new_number_of_heap_regions) {
|
uint G1YoungGenSizer::calculate_default_min_length(uint new_number_of_heap_regions) {
|
||||||
uint default_value = (new_number_of_heap_regions * G1DefaultMinNewGenPercent) / 100;
|
uint default_value = (new_number_of_heap_regions * G1NewSizePercent) / 100;
|
||||||
return MAX2(1U, default_value);
|
return MAX2(1U, default_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint G1YoungGenSizer::calculate_default_max_length(uint new_number_of_heap_regions) {
|
uint G1YoungGenSizer::calculate_default_max_length(uint new_number_of_heap_regions) {
|
||||||
uint default_value = (new_number_of_heap_regions * G1DefaultMaxNewGenPercent) / 100;
|
uint default_value = (new_number_of_heap_regions * G1MaxNewSizePercent) / 100;
|
||||||
return MAX2(1U, default_value);
|
return MAX2(1U, default_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,18 +94,18 @@ class TraceGen1TimeData : public CHeapObj<mtGC> {
|
|||||||
// will occur.
|
// will occur.
|
||||||
//
|
//
|
||||||
// If nothing related to the the young gen size is set on the command
|
// If nothing related to the the young gen size is set on the command
|
||||||
// line we should allow the young gen to be between
|
// line we should allow the young gen to be between G1NewSizePercent
|
||||||
// G1DefaultMinNewGenPercent and G1DefaultMaxNewGenPercent of the
|
// and G1MaxNewSizePercent of the heap size. This means that every time
|
||||||
// heap size. This means that every time the heap size changes the
|
// the heap size changes, the limits for the young gen size will be
|
||||||
// limits for the young gen size will be updated.
|
// recalculated.
|
||||||
//
|
//
|
||||||
// If only -XX:NewSize is set we should use the specified value as the
|
// If only -XX:NewSize is set we should use the specified value as the
|
||||||
// minimum size for young gen. Still using G1DefaultMaxNewGenPercent
|
// minimum size for young gen. Still using G1MaxNewSizePercent of the
|
||||||
// of the heap as maximum.
|
// heap as maximum.
|
||||||
//
|
//
|
||||||
// If only -XX:MaxNewSize is set we should use the specified value as the
|
// If only -XX:MaxNewSize is set we should use the specified value as the
|
||||||
// maximum size for young gen. Still using G1DefaultMinNewGenPercent
|
// maximum size for young gen. Still using G1NewSizePercent of the heap
|
||||||
// of the heap as minimum.
|
// as minimum.
|
||||||
//
|
//
|
||||||
// If -XX:NewSize and -XX:MaxNewSize are both specified we use these values.
|
// If -XX:NewSize and -XX:MaxNewSize are both specified we use these values.
|
||||||
// No updates when the heap size changes. There is a special case when
|
// No updates when the heap size changes. There is a special case when
|
||||||
|
@ -282,10 +282,8 @@ class G1AdjustPointersClosure: public HeapRegionClosure {
|
|||||||
if (r->startsHumongous()) {
|
if (r->startsHumongous()) {
|
||||||
// We must adjust the pointers on the single H object.
|
// We must adjust the pointers on the single H object.
|
||||||
oop obj = oop(r->bottom());
|
oop obj = oop(r->bottom());
|
||||||
debug_only(GenMarkSweep::track_interior_pointers(obj));
|
|
||||||
// point all the oops to the new location
|
// point all the oops to the new location
|
||||||
obj->adjust_pointers();
|
obj->adjust_pointers();
|
||||||
debug_only(GenMarkSweep::check_interior_pointers());
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// This really ought to be "as_CompactibleSpace"...
|
// This really ought to be "as_CompactibleSpace"...
|
||||||
|
@ -287,17 +287,18 @@
|
|||||||
"The number of times we'll force an overflow during " \
|
"The number of times we'll force an overflow during " \
|
||||||
"concurrent marking") \
|
"concurrent marking") \
|
||||||
\
|
\
|
||||||
experimental(uintx, G1DefaultMinNewGenPercent, 20, \
|
experimental(uintx, G1NewSizePercent, 20, \
|
||||||
"Percentage (0-100) of the heap size to use as minimum " \
|
"Percentage (0-100) of the heap size to use as default " \
|
||||||
"young gen size.") \
|
"minimum young gen size.") \
|
||||||
\
|
\
|
||||||
experimental(uintx, G1DefaultMaxNewGenPercent, 80, \
|
experimental(uintx, G1MaxNewSizePercent, 80, \
|
||||||
"Percentage (0-100) of the heap size to use as maximum " \
|
"Percentage (0-100) of the heap size to use as default " \
|
||||||
"young gen size.") \
|
" maximum young gen size.") \
|
||||||
\
|
\
|
||||||
experimental(uintx, G1OldCSetRegionLiveThresholdPercent, 90, \
|
experimental(uintx, G1MixedGCLiveThresholdPercent, 90, \
|
||||||
"Threshold for regions to be added to the collection set. " \
|
"Threshold for regions to be considered for inclusion in the " \
|
||||||
"Regions with more live bytes than this will not be collected.") \
|
"collection set of mixed GCs. " \
|
||||||
|
"Regions with live bytes exceeding this will not be collected.") \
|
||||||
\
|
\
|
||||||
product(uintx, G1HeapWastePercent, 5, \
|
product(uintx, G1HeapWastePercent, 5, \
|
||||||
"Amount of space, expressed as a percentage of the heap size, " \
|
"Amount of space, expressed as a percentage of the heap size, " \
|
||||||
|
@ -1623,7 +1623,3 @@ void ParNewGeneration::ref_processor_init()
|
|||||||
const char* ParNewGeneration::name() const {
|
const char* ParNewGeneration::name() const {
|
||||||
return "par new generation";
|
return "par new generation";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParNewGeneration::in_use() {
|
|
||||||
return UseParNewGC && ParallelGCThreads > 0;
|
|
||||||
}
|
|
||||||
|
@ -361,8 +361,6 @@ class ParNewGeneration: public DefNewGeneration {
|
|||||||
delete _task_queues;
|
delete _task_queues;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool in_use();
|
|
||||||
|
|
||||||
virtual void ref_processor_init();
|
virtual void ref_processor_init();
|
||||||
virtual Generation::Name kind() { return Generation::ParNew; }
|
virtual Generation::Name kind() { return Generation::ParNew; }
|
||||||
virtual const char* name() const;
|
virtual const char* name() const;
|
||||||
|
@ -164,7 +164,6 @@ void PSMarkSweepDecorator::precompact() {
|
|||||||
start_array->allocate_block(compact_top);
|
start_array->allocate_block(compact_top);
|
||||||
}
|
}
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::register_live_oop(oop(q), size));
|
|
||||||
compact_top += size;
|
compact_top += size;
|
||||||
assert(compact_top <= dest->space()->end(),
|
assert(compact_top <= dest->space()->end(),
|
||||||
"Exceeding space in destination");
|
"Exceeding space in destination");
|
||||||
@ -225,7 +224,6 @@ void PSMarkSweepDecorator::precompact() {
|
|||||||
start_array->allocate_block(compact_top);
|
start_array->allocate_block(compact_top);
|
||||||
}
|
}
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::register_live_oop(oop(q), sz));
|
|
||||||
compact_top += sz;
|
compact_top += sz;
|
||||||
assert(compact_top <= dest->space()->end(),
|
assert(compact_top <= dest->space()->end(),
|
||||||
"Exceeding space in destination");
|
"Exceeding space in destination");
|
||||||
@ -304,11 +302,8 @@ void PSMarkSweepDecorator::adjust_pointers() {
|
|||||||
HeapWord* end = _first_dead;
|
HeapWord* end = _first_dead;
|
||||||
|
|
||||||
while (q < end) {
|
while (q < end) {
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::track_interior_pointers(oop(q)));
|
|
||||||
// point all the oops to the new location
|
// point all the oops to the new location
|
||||||
size_t size = oop(q)->adjust_pointers();
|
size_t size = oop(q)->adjust_pointers();
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::check_interior_pointers());
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::validate_live_oop(oop(q), size));
|
|
||||||
q += size;
|
q += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,11 +323,8 @@ void PSMarkSweepDecorator::adjust_pointers() {
|
|||||||
Prefetch::write(q, interval);
|
Prefetch::write(q, interval);
|
||||||
if (oop(q)->is_gc_marked()) {
|
if (oop(q)->is_gc_marked()) {
|
||||||
// q is alive
|
// q is alive
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::track_interior_pointers(oop(q)));
|
|
||||||
// point all the oops to the new location
|
// point all the oops to the new location
|
||||||
size_t size = oop(q)->adjust_pointers();
|
size_t size = oop(q)->adjust_pointers();
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::check_interior_pointers());
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::validate_live_oop(oop(q), size));
|
|
||||||
debug_only(prev_q = q);
|
debug_only(prev_q = q);
|
||||||
q += size;
|
q += size;
|
||||||
} else {
|
} else {
|
||||||
@ -366,7 +358,6 @@ void PSMarkSweepDecorator::compact(bool mangle_free_space ) {
|
|||||||
while (q < end) {
|
while (q < end) {
|
||||||
size_t size = oop(q)->size();
|
size_t size = oop(q)->size();
|
||||||
assert(!oop(q)->is_gc_marked(), "should be unmarked (special dense prefix handling)");
|
assert(!oop(q)->is_gc_marked(), "should be unmarked (special dense prefix handling)");
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::live_oop_moved_to(q, size, q));
|
|
||||||
debug_only(prev_q = q);
|
debug_only(prev_q = q);
|
||||||
q += size;
|
q += size;
|
||||||
}
|
}
|
||||||
@ -401,7 +392,6 @@ void PSMarkSweepDecorator::compact(bool mangle_free_space ) {
|
|||||||
Prefetch::write(compaction_top, copy_interval);
|
Prefetch::write(compaction_top, copy_interval);
|
||||||
|
|
||||||
// copy object and reinit its mark
|
// copy object and reinit its mark
|
||||||
VALIDATE_MARK_SWEEP_ONLY(MarkSweep::live_oop_moved_to(q, size, compaction_top));
|
|
||||||
assert(q != compaction_top, "everything in this pass should be moving");
|
assert(q != compaction_top, "everything in this pass should be moving");
|
||||||
Copy::aligned_conjoint_words(q, compaction_top, size);
|
Copy::aligned_conjoint_words(q, compaction_top, size);
|
||||||
oop(compaction_top)->init_mark();
|
oop(compaction_top)->init_mark();
|
||||||
|
@ -99,25 +99,6 @@ double PSParallelCompact::_dwl_adjustment;
|
|||||||
bool PSParallelCompact::_dwl_initialized = false;
|
bool PSParallelCompact::_dwl_initialized = false;
|
||||||
#endif // #ifdef ASSERT
|
#endif // #ifdef ASSERT
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
GrowableArray<void*>* PSParallelCompact::_root_refs_stack = NULL;
|
|
||||||
GrowableArray<oop> * PSParallelCompact::_live_oops = NULL;
|
|
||||||
GrowableArray<oop> * PSParallelCompact::_live_oops_moved_to = NULL;
|
|
||||||
GrowableArray<size_t>* PSParallelCompact::_live_oops_size = NULL;
|
|
||||||
size_t PSParallelCompact::_live_oops_index = 0;
|
|
||||||
GrowableArray<void*>* PSParallelCompact::_other_refs_stack = NULL;
|
|
||||||
GrowableArray<void*>* PSParallelCompact::_adjusted_pointers = NULL;
|
|
||||||
bool PSParallelCompact::_pointer_tracking = false;
|
|
||||||
bool PSParallelCompact::_root_tracking = true;
|
|
||||||
|
|
||||||
GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops = NULL;
|
|
||||||
GrowableArray<HeapWord*>* PSParallelCompact::_cur_gc_live_oops_moved_to = NULL;
|
|
||||||
GrowableArray<size_t> * PSParallelCompact::_cur_gc_live_oops_size = NULL;
|
|
||||||
GrowableArray<HeapWord*>* PSParallelCompact::_last_gc_live_oops = NULL;
|
|
||||||
GrowableArray<HeapWord*>* PSParallelCompact::_last_gc_live_oops_moved_to = NULL;
|
|
||||||
GrowableArray<size_t> * PSParallelCompact::_last_gc_live_oops_size = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void SplitInfo::record(size_t src_region_idx, size_t partial_obj_size,
|
void SplitInfo::record(size_t src_region_idx, size_t partial_obj_size,
|
||||||
HeapWord* destination)
|
HeapWord* destination)
|
||||||
{
|
{
|
||||||
@ -2715,151 +2696,6 @@ void PSParallelCompact::verify_complete(SpaceId space_id) {
|
|||||||
}
|
}
|
||||||
#endif // #ifdef ASSERT
|
#endif // #ifdef ASSERT
|
||||||
|
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
|
|
||||||
void PSParallelCompact::track_adjusted_pointer(void* p, bool isroot) {
|
|
||||||
if (!ValidateMarkSweep)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!isroot) {
|
|
||||||
if (_pointer_tracking) {
|
|
||||||
guarantee(_adjusted_pointers->contains(p), "should have seen this pointer");
|
|
||||||
_adjusted_pointers->remove(p);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ptrdiff_t index = _root_refs_stack->find(p);
|
|
||||||
if (index != -1) {
|
|
||||||
int l = _root_refs_stack->length();
|
|
||||||
if (l > 0 && l - 1 != index) {
|
|
||||||
void* last = _root_refs_stack->pop();
|
|
||||||
assert(last != p, "should be different");
|
|
||||||
_root_refs_stack->at_put(index, last);
|
|
||||||
} else {
|
|
||||||
_root_refs_stack->remove(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PSParallelCompact::check_adjust_pointer(void* p) {
|
|
||||||
_adjusted_pointers->push(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class AdjusterTracker: public OopClosure {
|
|
||||||
public:
|
|
||||||
AdjusterTracker() {};
|
|
||||||
void do_oop(oop* o) { PSParallelCompact::check_adjust_pointer(o); }
|
|
||||||
void do_oop(narrowOop* o) { PSParallelCompact::check_adjust_pointer(o); }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void PSParallelCompact::track_interior_pointers(oop obj) {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
_adjusted_pointers->clear();
|
|
||||||
_pointer_tracking = true;
|
|
||||||
|
|
||||||
AdjusterTracker checker;
|
|
||||||
obj->oop_iterate_no_header(&checker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PSParallelCompact::check_interior_pointers() {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
_pointer_tracking = false;
|
|
||||||
guarantee(_adjusted_pointers->length() == 0, "should have processed the same pointers");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PSParallelCompact::reset_live_oop_tracking() {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
guarantee((size_t)_live_oops->length() == _live_oops_index, "should be at end of live oops");
|
|
||||||
_live_oops_index = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PSParallelCompact::register_live_oop(oop p, size_t size) {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
_live_oops->push(p);
|
|
||||||
_live_oops_size->push(size);
|
|
||||||
_live_oops_index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PSParallelCompact::validate_live_oop(oop p, size_t size) {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
oop obj = _live_oops->at((int)_live_oops_index);
|
|
||||||
guarantee(obj == p, "should be the same object");
|
|
||||||
guarantee(_live_oops_size->at((int)_live_oops_index) == size, "should be the same size");
|
|
||||||
_live_oops_index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PSParallelCompact::live_oop_moved_to(HeapWord* q, size_t size,
|
|
||||||
HeapWord* compaction_top) {
|
|
||||||
assert(oop(q)->forwardee() == NULL || oop(q)->forwardee() == oop(compaction_top),
|
|
||||||
"should be moved to forwarded location");
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
PSParallelCompact::validate_live_oop(oop(q), size);
|
|
||||||
_live_oops_moved_to->push(oop(compaction_top));
|
|
||||||
}
|
|
||||||
if (RecordMarkSweepCompaction) {
|
|
||||||
_cur_gc_live_oops->push(q);
|
|
||||||
_cur_gc_live_oops_moved_to->push(compaction_top);
|
|
||||||
_cur_gc_live_oops_size->push(size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PSParallelCompact::compaction_complete() {
|
|
||||||
if (RecordMarkSweepCompaction) {
|
|
||||||
GrowableArray<HeapWord*>* _tmp_live_oops = _cur_gc_live_oops;
|
|
||||||
GrowableArray<HeapWord*>* _tmp_live_oops_moved_to = _cur_gc_live_oops_moved_to;
|
|
||||||
GrowableArray<size_t> * _tmp_live_oops_size = _cur_gc_live_oops_size;
|
|
||||||
|
|
||||||
_cur_gc_live_oops = _last_gc_live_oops;
|
|
||||||
_cur_gc_live_oops_moved_to = _last_gc_live_oops_moved_to;
|
|
||||||
_cur_gc_live_oops_size = _last_gc_live_oops_size;
|
|
||||||
_last_gc_live_oops = _tmp_live_oops;
|
|
||||||
_last_gc_live_oops_moved_to = _tmp_live_oops_moved_to;
|
|
||||||
_last_gc_live_oops_size = _tmp_live_oops_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PSParallelCompact::print_new_location_of_heap_address(HeapWord* q) {
|
|
||||||
if (!RecordMarkSweepCompaction) {
|
|
||||||
tty->print_cr("Requires RecordMarkSweepCompaction to be enabled");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_last_gc_live_oops == NULL) {
|
|
||||||
tty->print_cr("No compaction information gathered yet");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < _last_gc_live_oops->length(); i++) {
|
|
||||||
HeapWord* old_oop = _last_gc_live_oops->at(i);
|
|
||||||
size_t sz = _last_gc_live_oops_size->at(i);
|
|
||||||
if (old_oop <= q && q < (old_oop + sz)) {
|
|
||||||
HeapWord* new_oop = _last_gc_live_oops_moved_to->at(i);
|
|
||||||
size_t offset = (q - old_oop);
|
|
||||||
tty->print_cr("Address " PTR_FORMAT, q);
|
|
||||||
tty->print_cr(" Was in oop " PTR_FORMAT ", size %d, at offset %d", old_oop, sz, offset);
|
|
||||||
tty->print_cr(" Now in oop " PTR_FORMAT ", actual address " PTR_FORMAT, new_oop, new_oop + offset);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q);
|
|
||||||
}
|
|
||||||
#endif //VALIDATE_MARK_SWEEP
|
|
||||||
|
|
||||||
// Update interior oops in the ranges of regions [beg_region, end_region).
|
// Update interior oops in the ranges of regions [beg_region, end_region).
|
||||||
void
|
void
|
||||||
PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
|
PSParallelCompact::update_and_deadwood_in_dense_prefix(ParCompactionManager* cm,
|
||||||
|
@ -1006,34 +1006,6 @@ class PSParallelCompact : AllStatic {
|
|||||||
// Reset time since last full gc
|
// Reset time since last full gc
|
||||||
static void reset_millis_since_last_gc();
|
static void reset_millis_since_last_gc();
|
||||||
|
|
||||||
protected:
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
static GrowableArray<void*>* _root_refs_stack;
|
|
||||||
static GrowableArray<oop> * _live_oops;
|
|
||||||
static GrowableArray<oop> * _live_oops_moved_to;
|
|
||||||
static GrowableArray<size_t>* _live_oops_size;
|
|
||||||
static size_t _live_oops_index;
|
|
||||||
static size_t _live_oops_index_at_perm;
|
|
||||||
static GrowableArray<void*>* _other_refs_stack;
|
|
||||||
static GrowableArray<void*>* _adjusted_pointers;
|
|
||||||
static bool _pointer_tracking;
|
|
||||||
static bool _root_tracking;
|
|
||||||
|
|
||||||
// The following arrays are saved since the time of the last GC and
|
|
||||||
// assist in tracking down problems where someone has done an errant
|
|
||||||
// store into the heap, usually to an oop that wasn't properly
|
|
||||||
// handleized across a GC. If we crash or otherwise fail before the
|
|
||||||
// next GC, we can query these arrays to find out the object we had
|
|
||||||
// intended to do the store to (assuming it is still alive) and the
|
|
||||||
// offset within that object. Covered under RecordMarkSweepCompaction.
|
|
||||||
static GrowableArray<HeapWord*> * _cur_gc_live_oops;
|
|
||||||
static GrowableArray<HeapWord*> * _cur_gc_live_oops_moved_to;
|
|
||||||
static GrowableArray<size_t>* _cur_gc_live_oops_size;
|
|
||||||
static GrowableArray<HeapWord*> * _last_gc_live_oops;
|
|
||||||
static GrowableArray<HeapWord*> * _last_gc_live_oops_moved_to;
|
|
||||||
static GrowableArray<size_t>* _last_gc_live_oops_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class MarkAndPushClosure: public OopClosure {
|
class MarkAndPushClosure: public OopClosure {
|
||||||
private:
|
private:
|
||||||
@ -1191,25 +1163,6 @@ class PSParallelCompact : AllStatic {
|
|||||||
// Time since last full gc (in milliseconds).
|
// Time since last full gc (in milliseconds).
|
||||||
static jlong millis_since_last_gc();
|
static jlong millis_since_last_gc();
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
static void track_adjusted_pointer(void* p, bool isroot);
|
|
||||||
static void check_adjust_pointer(void* p);
|
|
||||||
static void track_interior_pointers(oop obj);
|
|
||||||
static void check_interior_pointers();
|
|
||||||
|
|
||||||
static void reset_live_oop_tracking();
|
|
||||||
static void register_live_oop(oop p, size_t size);
|
|
||||||
static void validate_live_oop(oop p, size_t size);
|
|
||||||
static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top);
|
|
||||||
static void compaction_complete();
|
|
||||||
|
|
||||||
// Querying operation of RecordMarkSweepCompaction results.
|
|
||||||
// Finds and prints the current base oop and offset for a word
|
|
||||||
// within an oop that was live during the last GC. Helpful for
|
|
||||||
// tracking down heap stomps.
|
|
||||||
static void print_new_location_of_heap_address(HeapWord* q);
|
|
||||||
#endif // #ifdef VALIDATE_MARK_SWEEP
|
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
// Debugging support.
|
// Debugging support.
|
||||||
static const char* space_names[last_space_id];
|
static const char* space_names[last_space_id];
|
||||||
@ -1250,12 +1203,7 @@ template <class T>
|
|||||||
inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) {
|
inline void PSParallelCompact::follow_root(ParCompactionManager* cm, T* p) {
|
||||||
assert(!Universe::heap()->is_in_reserved(p),
|
assert(!Universe::heap()->is_in_reserved(p),
|
||||||
"roots shouldn't be things within the heap");
|
"roots shouldn't be things within the heap");
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
guarantee(!_root_refs_stack->contains(p), "should only be in here once");
|
|
||||||
_root_refs_stack->push(p);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
T heap_oop = oopDesc::load_heap_oop(p);
|
T heap_oop = oopDesc::load_heap_oop(p);
|
||||||
if (!oopDesc::is_null(heap_oop)) {
|
if (!oopDesc::is_null(heap_oop)) {
|
||||||
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
||||||
@ -1294,20 +1242,10 @@ inline void PSParallelCompact::adjust_pointer(T* p, bool isroot) {
|
|||||||
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
|
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, isroot));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline void PSParallelCompact::KeepAliveClosure::do_oop_work(T* p) {
|
inline void PSParallelCompact::KeepAliveClosure::do_oop_work(T* p) {
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
if (!Universe::heap()->is_in_reserved(p)) {
|
|
||||||
_root_refs_stack->push(p);
|
|
||||||
} else {
|
|
||||||
_other_refs_stack->push(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
mark_and_push(_compaction_manager, p);
|
mark_and_push(_compaction_manager, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,8 +808,9 @@ void PSYoungGen::print_on(outputStream* st) const {
|
|||||||
st->print(" to "); to_space()->print_on(st);
|
st->print(" to "); to_space()->print_on(st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note that a space is not printed before the [NAME:
|
||||||
void PSYoungGen::print_used_change(size_t prev_used) const {
|
void PSYoungGen::print_used_change(size_t prev_used) const {
|
||||||
gclog_or_tty->print(" [%s:", name());
|
gclog_or_tty->print("[%s:", name());
|
||||||
gclog_or_tty->print(" " SIZE_FORMAT "K"
|
gclog_or_tty->print(" " SIZE_FORMAT "K"
|
||||||
"->" SIZE_FORMAT "K"
|
"->" SIZE_FORMAT "K"
|
||||||
"(" SIZE_FORMAT "K)",
|
"(" SIZE_FORMAT "K)",
|
||||||
|
@ -42,26 +42,6 @@ size_t MarkSweep::_preserved_count_max = 0;
|
|||||||
PreservedMark* MarkSweep::_preserved_marks = NULL;
|
PreservedMark* MarkSweep::_preserved_marks = NULL;
|
||||||
ReferenceProcessor* MarkSweep::_ref_processor = NULL;
|
ReferenceProcessor* MarkSweep::_ref_processor = NULL;
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
GrowableArray<void*>* MarkSweep::_root_refs_stack = NULL;
|
|
||||||
GrowableArray<oop> * MarkSweep::_live_oops = NULL;
|
|
||||||
GrowableArray<oop> * MarkSweep::_live_oops_moved_to = NULL;
|
|
||||||
GrowableArray<size_t>* MarkSweep::_live_oops_size = NULL;
|
|
||||||
size_t MarkSweep::_live_oops_index = 0;
|
|
||||||
size_t MarkSweep::_live_oops_index_at_perm = 0;
|
|
||||||
GrowableArray<void*>* MarkSweep::_other_refs_stack = NULL;
|
|
||||||
GrowableArray<void*>* MarkSweep::_adjusted_pointers = NULL;
|
|
||||||
bool MarkSweep::_pointer_tracking = false;
|
|
||||||
bool MarkSweep::_root_tracking = true;
|
|
||||||
|
|
||||||
GrowableArray<HeapWord*>* MarkSweep::_cur_gc_live_oops = NULL;
|
|
||||||
GrowableArray<HeapWord*>* MarkSweep::_cur_gc_live_oops_moved_to = NULL;
|
|
||||||
GrowableArray<size_t> * MarkSweep::_cur_gc_live_oops_size = NULL;
|
|
||||||
GrowableArray<HeapWord*>* MarkSweep::_last_gc_live_oops = NULL;
|
|
||||||
GrowableArray<HeapWord*>* MarkSweep::_last_gc_live_oops_moved_to = NULL;
|
|
||||||
GrowableArray<size_t> * MarkSweep::_last_gc_live_oops_size = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MarkSweep::FollowRootClosure MarkSweep::follow_root_closure;
|
MarkSweep::FollowRootClosure MarkSweep::follow_root_closure;
|
||||||
CodeBlobToOopClosure MarkSweep::follow_code_root_closure(&MarkSweep::follow_root_closure, /*do_marking=*/ true);
|
CodeBlobToOopClosure MarkSweep::follow_code_root_closure(&MarkSweep::follow_root_closure, /*do_marking=*/ true);
|
||||||
|
|
||||||
@ -185,142 +165,6 @@ void MarkSweep::restore_marks() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
|
|
||||||
void MarkSweep::track_adjusted_pointer(void* p, bool isroot) {
|
|
||||||
if (!ValidateMarkSweep)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!isroot) {
|
|
||||||
if (_pointer_tracking) {
|
|
||||||
guarantee(_adjusted_pointers->contains(p), "should have seen this pointer");
|
|
||||||
_adjusted_pointers->remove(p);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ptrdiff_t index = _root_refs_stack->find(p);
|
|
||||||
if (index != -1) {
|
|
||||||
int l = _root_refs_stack->length();
|
|
||||||
if (l > 0 && l - 1 != index) {
|
|
||||||
void* last = _root_refs_stack->pop();
|
|
||||||
assert(last != p, "should be different");
|
|
||||||
_root_refs_stack->at_put(index, last);
|
|
||||||
} else {
|
|
||||||
_root_refs_stack->remove(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::check_adjust_pointer(void* p) {
|
|
||||||
_adjusted_pointers->push(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
class AdjusterTracker: public OopClosure {
|
|
||||||
public:
|
|
||||||
AdjusterTracker() {}
|
|
||||||
void do_oop(oop* o) { MarkSweep::check_adjust_pointer(o); }
|
|
||||||
void do_oop(narrowOop* o) { MarkSweep::check_adjust_pointer(o); }
|
|
||||||
};
|
|
||||||
|
|
||||||
void MarkSweep::track_interior_pointers(oop obj) {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
_adjusted_pointers->clear();
|
|
||||||
_pointer_tracking = true;
|
|
||||||
|
|
||||||
AdjusterTracker checker;
|
|
||||||
obj->oop_iterate_no_header(&checker);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::check_interior_pointers() {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
_pointer_tracking = false;
|
|
||||||
guarantee(_adjusted_pointers->length() == 0, "should have processed the same pointers");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::reset_live_oop_tracking() {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
guarantee((size_t)_live_oops->length() == _live_oops_index, "should be at end of live oops");
|
|
||||||
_live_oops_index = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::register_live_oop(oop p, size_t size) {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
_live_oops->push(p);
|
|
||||||
_live_oops_size->push(size);
|
|
||||||
_live_oops_index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::validate_live_oop(oop p, size_t size) {
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
oop obj = _live_oops->at((int)_live_oops_index);
|
|
||||||
guarantee(obj == p, "should be the same object");
|
|
||||||
guarantee(_live_oops_size->at((int)_live_oops_index) == size, "should be the same size");
|
|
||||||
_live_oops_index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::live_oop_moved_to(HeapWord* q, size_t size,
|
|
||||||
HeapWord* compaction_top) {
|
|
||||||
assert(oop(q)->forwardee() == NULL || oop(q)->forwardee() == oop(compaction_top),
|
|
||||||
"should be moved to forwarded location");
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
MarkSweep::validate_live_oop(oop(q), size);
|
|
||||||
_live_oops_moved_to->push(oop(compaction_top));
|
|
||||||
}
|
|
||||||
if (RecordMarkSweepCompaction) {
|
|
||||||
_cur_gc_live_oops->push(q);
|
|
||||||
_cur_gc_live_oops_moved_to->push(compaction_top);
|
|
||||||
_cur_gc_live_oops_size->push(size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::compaction_complete() {
|
|
||||||
if (RecordMarkSweepCompaction) {
|
|
||||||
GrowableArray<HeapWord*>* _tmp_live_oops = _cur_gc_live_oops;
|
|
||||||
GrowableArray<HeapWord*>* _tmp_live_oops_moved_to = _cur_gc_live_oops_moved_to;
|
|
||||||
GrowableArray<size_t> * _tmp_live_oops_size = _cur_gc_live_oops_size;
|
|
||||||
|
|
||||||
_cur_gc_live_oops = _last_gc_live_oops;
|
|
||||||
_cur_gc_live_oops_moved_to = _last_gc_live_oops_moved_to;
|
|
||||||
_cur_gc_live_oops_size = _last_gc_live_oops_size;
|
|
||||||
_last_gc_live_oops = _tmp_live_oops;
|
|
||||||
_last_gc_live_oops_moved_to = _tmp_live_oops_moved_to;
|
|
||||||
_last_gc_live_oops_size = _tmp_live_oops_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarkSweep::print_new_location_of_heap_address(HeapWord* q) {
|
|
||||||
if (!RecordMarkSweepCompaction) {
|
|
||||||
tty->print_cr("Requires RecordMarkSweepCompaction to be enabled");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_last_gc_live_oops == NULL) {
|
|
||||||
tty->print_cr("No compaction information gathered yet");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < _last_gc_live_oops->length(); i++) {
|
|
||||||
HeapWord* old_oop = _last_gc_live_oops->at(i);
|
|
||||||
size_t sz = _last_gc_live_oops_size->at(i);
|
|
||||||
if (old_oop <= q && q < (old_oop + sz)) {
|
|
||||||
HeapWord* new_oop = _last_gc_live_oops_moved_to->at(i);
|
|
||||||
size_t offset = (q - old_oop);
|
|
||||||
tty->print_cr("Address " PTR_FORMAT, q);
|
|
||||||
tty->print_cr(" Was in oop " PTR_FORMAT ", size " SIZE_FORMAT ", at offset " SIZE_FORMAT, old_oop, sz, offset);
|
|
||||||
tty->print_cr(" Now in oop " PTR_FORMAT ", actual address " PTR_FORMAT, new_oop, new_oop + offset);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tty->print_cr("Address " PTR_FORMAT " not found in live oop information from last GC", q);
|
|
||||||
}
|
|
||||||
#endif //VALIDATE_MARK_SWEEP
|
|
||||||
|
|
||||||
MarkSweep::IsAliveClosure MarkSweep::is_alive;
|
MarkSweep::IsAliveClosure MarkSweep::is_alive;
|
||||||
|
|
||||||
void MarkSweep::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); }
|
void MarkSweep::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); }
|
||||||
|
@ -44,21 +44,6 @@ class DataLayout;
|
|||||||
//
|
//
|
||||||
// Class unloading will only occur when a full gc is invoked.
|
// Class unloading will only occur when a full gc is invoked.
|
||||||
|
|
||||||
// If VALIDATE_MARK_SWEEP is defined, the -XX:+ValidateMarkSweep flag will
|
|
||||||
// be operational, and will provide slow but comprehensive self-checks within
|
|
||||||
// the GC. This is not enabled by default in product or release builds,
|
|
||||||
// since the extra call to track_adjusted_pointer() in _adjust_pointer()
|
|
||||||
// would be too much overhead, and would disturb performance measurement.
|
|
||||||
// However, debug builds are sometimes way too slow to run GC tests!
|
|
||||||
#ifdef ASSERT
|
|
||||||
#define VALIDATE_MARK_SWEEP 1
|
|
||||||
#endif
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
#define VALIDATE_MARK_SWEEP_ONLY(code) code
|
|
||||||
#else
|
|
||||||
#define VALIDATE_MARK_SWEEP_ONLY(code)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// declared at end
|
// declared at end
|
||||||
class PreservedMark;
|
class PreservedMark;
|
||||||
|
|
||||||
@ -147,33 +132,6 @@ class MarkSweep : AllStatic {
|
|||||||
// Reference processing (used in ...follow_contents)
|
// Reference processing (used in ...follow_contents)
|
||||||
static ReferenceProcessor* _ref_processor;
|
static ReferenceProcessor* _ref_processor;
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
static GrowableArray<void*>* _root_refs_stack;
|
|
||||||
static GrowableArray<oop> * _live_oops;
|
|
||||||
static GrowableArray<oop> * _live_oops_moved_to;
|
|
||||||
static GrowableArray<size_t>* _live_oops_size;
|
|
||||||
static size_t _live_oops_index;
|
|
||||||
static size_t _live_oops_index_at_perm;
|
|
||||||
static GrowableArray<void*>* _other_refs_stack;
|
|
||||||
static GrowableArray<void*>* _adjusted_pointers;
|
|
||||||
static bool _pointer_tracking;
|
|
||||||
static bool _root_tracking;
|
|
||||||
|
|
||||||
// The following arrays are saved since the time of the last GC and
|
|
||||||
// assist in tracking down problems where someone has done an errant
|
|
||||||
// store into the heap, usually to an oop that wasn't properly
|
|
||||||
// handleized across a GC. If we crash or otherwise fail before the
|
|
||||||
// next GC, we can query these arrays to find out the object we had
|
|
||||||
// intended to do the store to (assuming it is still alive) and the
|
|
||||||
// offset within that object. Covered under RecordMarkSweepCompaction.
|
|
||||||
static GrowableArray<HeapWord*> * _cur_gc_live_oops;
|
|
||||||
static GrowableArray<HeapWord*> * _cur_gc_live_oops_moved_to;
|
|
||||||
static GrowableArray<size_t>* _cur_gc_live_oops_size;
|
|
||||||
static GrowableArray<HeapWord*> * _last_gc_live_oops;
|
|
||||||
static GrowableArray<HeapWord*> * _last_gc_live_oops_moved_to;
|
|
||||||
static GrowableArray<size_t>* _last_gc_live_oops_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Non public closures
|
// Non public closures
|
||||||
static KeepAliveClosure keep_alive;
|
static KeepAliveClosure keep_alive;
|
||||||
|
|
||||||
@ -227,24 +185,6 @@ class MarkSweep : AllStatic {
|
|||||||
static void adjust_pointer(oop* p) { adjust_pointer(p, false); }
|
static void adjust_pointer(oop* p) { adjust_pointer(p, false); }
|
||||||
static void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); }
|
static void adjust_pointer(narrowOop* p) { adjust_pointer(p, false); }
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
static void track_adjusted_pointer(void* p, bool isroot);
|
|
||||||
static void check_adjust_pointer(void* p);
|
|
||||||
static void track_interior_pointers(oop obj);
|
|
||||||
static void check_interior_pointers();
|
|
||||||
|
|
||||||
static void reset_live_oop_tracking();
|
|
||||||
static void register_live_oop(oop p, size_t size);
|
|
||||||
static void validate_live_oop(oop p, size_t size);
|
|
||||||
static void live_oop_moved_to(HeapWord* q, size_t size, HeapWord* compaction_top);
|
|
||||||
static void compaction_complete();
|
|
||||||
|
|
||||||
// Querying operation of RecordMarkSweepCompaction results.
|
|
||||||
// Finds and prints the current base oop and offset for a word
|
|
||||||
// within an oop that was live during the last GC. Helpful for
|
|
||||||
// tracking down heap stomps.
|
|
||||||
static void print_new_location_of_heap_address(HeapWord* q);
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class PreservedMark VALUE_OBJ_CLASS_SPEC {
|
class PreservedMark VALUE_OBJ_CLASS_SPEC {
|
||||||
|
@ -46,12 +46,6 @@ inline void MarkSweep::mark_object(oop obj) {
|
|||||||
template <class T> inline void MarkSweep::follow_root(T* p) {
|
template <class T> inline void MarkSweep::follow_root(T* p) {
|
||||||
assert(!Universe::heap()->is_in_reserved(p),
|
assert(!Universe::heap()->is_in_reserved(p),
|
||||||
"roots shouldn't be things within the heap");
|
"roots shouldn't be things within the heap");
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
guarantee(!_root_refs_stack->contains(p), "should only be in here once");
|
|
||||||
_root_refs_stack->push(p);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
T heap_oop = oopDesc::load_heap_oop(p);
|
T heap_oop = oopDesc::load_heap_oop(p);
|
||||||
if (!oopDesc::is_null(heap_oop)) {
|
if (!oopDesc::is_null(heap_oop)) {
|
||||||
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
||||||
@ -97,19 +91,9 @@ template <class T> inline void MarkSweep::adjust_pointer(T* p, bool isroot) {
|
|||||||
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
|
oopDesc::encode_store_heap_oop_not_null(p, new_obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, isroot));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T> inline void MarkSweep::KeepAliveClosure::do_oop_work(T* p) {
|
template <class T> inline void MarkSweep::KeepAliveClosure::do_oop_work(T* p) {
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
if (!Universe::heap()->is_in_reserved(p)) {
|
|
||||||
_root_refs_stack->push(p);
|
|
||||||
} else {
|
|
||||||
_other_refs_stack->push(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
mark_and_push(p);
|
mark_and_push(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,9 +99,9 @@ class GCCauseString : StackObj {
|
|||||||
public:
|
public:
|
||||||
GCCauseString(const char* prefix, GCCause::Cause cause) {
|
GCCauseString(const char* prefix, GCCause::Cause cause) {
|
||||||
if (PrintGCCause) {
|
if (PrintGCCause) {
|
||||||
_position = jio_snprintf(_buffer, _length, "%s (%s)", prefix, GCCause::to_string(cause));
|
_position = jio_snprintf(_buffer, _length, "%s (%s) ", prefix, GCCause::to_string(cause));
|
||||||
} else {
|
} else {
|
||||||
_position = jio_snprintf(_buffer, _length, "%s", prefix);
|
_position = jio_snprintf(_buffer, _length, "%s ", prefix);
|
||||||
}
|
}
|
||||||
assert(_position >= 0 && _position <= _length,
|
assert(_position >= 0 && _position <= _length,
|
||||||
err_msg("Need to increase the buffer size in GCCauseString? %d", _position));
|
err_msg("Need to increase the buffer size in GCCauseString? %d", _position));
|
||||||
|
@ -417,7 +417,7 @@ IRT_ENTRY(address, InterpreterRuntime::exception_handler_for_exception(JavaThrea
|
|||||||
|
|
||||||
// exception handler lookup
|
// exception handler lookup
|
||||||
KlassHandle h_klass(THREAD, h_exception->klass());
|
KlassHandle h_klass(THREAD, h_exception->klass());
|
||||||
handler_bci = h_method->fast_exception_handler_bci_for(h_klass, current_bci, THREAD);
|
handler_bci = Method::fast_exception_handler_bci_for(h_method, h_klass, current_bci, THREAD);
|
||||||
if (HAS_PENDING_EXCEPTION) {
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
// We threw an exception while trying to find the exception handler.
|
// We threw an exception while trying to find the exception handler.
|
||||||
// Transfer the new exception to the exception handle which will
|
// Transfer the new exception to the exception handle which will
|
||||||
|
@ -27,13 +27,8 @@
|
|||||||
#include "interpreter/interpreter.hpp"
|
#include "interpreter/interpreter.hpp"
|
||||||
#include "interpreter/rewriter.hpp"
|
#include "interpreter/rewriter.hpp"
|
||||||
#include "memory/gcLocker.hpp"
|
#include "memory/gcLocker.hpp"
|
||||||
#include "memory/metadataFactory.hpp"
|
|
||||||
#include "memory/oopFactory.hpp"
|
|
||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
#include "oops/generateOopMap.hpp"
|
#include "oops/generateOopMap.hpp"
|
||||||
#include "oops/objArrayOop.hpp"
|
|
||||||
#include "oops/oop.inline.hpp"
|
|
||||||
#include "prims/methodComparator.hpp"
|
|
||||||
#include "prims/methodHandles.hpp"
|
#include "prims/methodHandles.hpp"
|
||||||
|
|
||||||
// Computes a CPC map (new_index -> original_index) for constant pool entries
|
// Computes a CPC map (new_index -> original_index) for constant pool entries
|
||||||
@ -402,13 +397,6 @@ void Rewriter::rewrite(instanceKlassHandle klass, TRAPS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Rewriter::rewrite(instanceKlassHandle klass, constantPoolHandle cpool, Array<Method*>* methods, TRAPS) {
|
|
||||||
ResourceMark rm(THREAD);
|
|
||||||
Rewriter rw(klass, cpool, methods, CHECK);
|
|
||||||
// (That's all, folks.)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Method*>* methods, TRAPS)
|
Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Method*>* methods, TRAPS)
|
||||||
: _klass(klass),
|
: _klass(klass),
|
||||||
_pool(cpool),
|
_pool(cpool),
|
||||||
@ -453,46 +441,25 @@ Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Me
|
|||||||
restore_bytecodes();
|
restore_bytecodes();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Relocate jsr/rets in a method. This can't be done with the rewriter
|
// Relocate after everything, but still do this under the is_rewritten flag,
|
||||||
// stage because it can throw other exceptions, leaving the bytecodes
|
// so methods with jsrs in custom class lists in aren't attempted to be
|
||||||
// pointing at constant pool cache entries.
|
// rewritten in the RO section of the shared archive.
|
||||||
// Link and check jvmti dependencies while we're iterating over the methods.
|
// Relocated bytecodes don't have to be restored, only the cp cache entries
|
||||||
// JSR292 code calls with a different set of methods, so two entry points.
|
|
||||||
void Rewriter::relocate_and_link(instanceKlassHandle this_oop, TRAPS) {
|
|
||||||
relocate_and_link(this_oop, this_oop->methods(), THREAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Rewriter::relocate_and_link(instanceKlassHandle this_oop,
|
|
||||||
Array<Method*>* methods, TRAPS) {
|
|
||||||
int len = methods->length();
|
|
||||||
for (int i = len-1; i >= 0; i--) {
|
for (int i = len-1; i >= 0; i--) {
|
||||||
methodHandle m(THREAD, methods->at(i));
|
methodHandle m(THREAD, _methods->at(i));
|
||||||
|
|
||||||
if (m->has_jsrs()) {
|
if (m->has_jsrs()) {
|
||||||
m = rewrite_jsrs(m, CHECK);
|
m = rewrite_jsrs(m, THREAD);
|
||||||
|
// Restore bytecodes to their unrewritten state if there are exceptions
|
||||||
|
// relocating bytecodes. If some are relocated, that is ok because that
|
||||||
|
// doesn't affect constant pool to cpCache rewriting.
|
||||||
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
|
restore_bytecodes();
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Method might have gotten rewritten.
|
// Method might have gotten rewritten.
|
||||||
methods->at_put(i, m());
|
methods->at_put(i, m());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up method entry points for compiler and interpreter .
|
|
||||||
m->link_method(m, CHECK);
|
|
||||||
|
|
||||||
// This is for JVMTI and unrelated to relocator but the last thing we do
|
|
||||||
#ifdef ASSERT
|
|
||||||
if (StressMethodComparator) {
|
|
||||||
static int nmc = 0;
|
|
||||||
for (int j = i; j >= 0 && j >= i-4; j--) {
|
|
||||||
if ((++nmc % 1000) == 0) tty->print_cr("Have run MethodComparator %d times...", nmc);
|
|
||||||
bool z = MethodComparator::methods_EMCP(m(),
|
|
||||||
methods->at(j));
|
|
||||||
if (j == i && !z) {
|
|
||||||
tty->print("MethodComparator FAIL: "); m->print(); m->print_codes();
|
|
||||||
assert(z, "method must compare equal to itself");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif //ASSERT
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,14 +158,6 @@ class Rewriter: public StackObj {
|
|||||||
public:
|
public:
|
||||||
// Driver routine:
|
// Driver routine:
|
||||||
static void rewrite(instanceKlassHandle klass, TRAPS);
|
static void rewrite(instanceKlassHandle klass, TRAPS);
|
||||||
static void rewrite(instanceKlassHandle klass, constantPoolHandle cpool, Array<Method*>* methods, TRAPS);
|
|
||||||
|
|
||||||
// Second pass, not gated by is_rewritten flag
|
|
||||||
static void relocate_and_link(instanceKlassHandle klass, TRAPS);
|
|
||||||
// JSR292 version to call with it's own methods.
|
|
||||||
static void relocate_and_link(instanceKlassHandle klass,
|
|
||||||
Array<Method*>* methods, TRAPS);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SHARE_VM_INTERPRETER_REWRITER_HPP
|
#endif // SHARE_VM_INTERPRETER_REWRITER_HPP
|
||||||
|
@ -67,7 +67,8 @@ void TreeChunk<Chunk_t, FreeList_t>::verify_tree_chunk_list() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class Chunk_t, template <class> class FreeList_t>
|
template <class Chunk_t, template <class> class FreeList_t>
|
||||||
TreeList<Chunk_t, FreeList_t>::TreeList() {}
|
TreeList<Chunk_t, FreeList_t>::TreeList() : _parent(NULL),
|
||||||
|
_left(NULL), _right(NULL) {}
|
||||||
|
|
||||||
template <class Chunk_t, template <class> class FreeList_t>
|
template <class Chunk_t, template <class> class FreeList_t>
|
||||||
TreeList<Chunk_t, FreeList_t>*
|
TreeList<Chunk_t, FreeList_t>*
|
||||||
@ -82,7 +83,7 @@ TreeList<Chunk_t, FreeList_t>::as_TreeList(TreeChunk<Chunk_t,FreeList_t>* tc) {
|
|||||||
tl->link_head(tc);
|
tl->link_head(tc);
|
||||||
tl->link_tail(tc);
|
tl->link_tail(tc);
|
||||||
tl->set_count(1);
|
tl->set_count(1);
|
||||||
|
assert(tl->parent() == NULL, "Should be clear");
|
||||||
return tl;
|
return tl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -777,6 +777,15 @@ MetaWord* CollectorPolicy::satisfy_failed_metadata_allocation(
|
|||||||
full_gc_count,
|
full_gc_count,
|
||||||
GCCause::_metadata_GC_threshold);
|
GCCause::_metadata_GC_threshold);
|
||||||
VMThread::execute(&op);
|
VMThread::execute(&op);
|
||||||
|
|
||||||
|
// If GC was locked out, try again. Check
|
||||||
|
// before checking success because the prologue
|
||||||
|
// could have succeeded and the GC still have
|
||||||
|
// been locked out.
|
||||||
|
if (op.gc_locked()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (op.prologue_succeeded()) {
|
if (op.prologue_succeeded()) {
|
||||||
return op.result();
|
return op.result();
|
||||||
}
|
}
|
||||||
@ -818,7 +827,7 @@ void MarkSweepPolicy::initialize_generations() {
|
|||||||
if (_generations == NULL)
|
if (_generations == NULL)
|
||||||
vm_exit_during_initialization("Unable to allocate gen spec");
|
vm_exit_during_initialization("Unable to allocate gen spec");
|
||||||
|
|
||||||
if (UseParNewGC && ParallelGCThreads > 0) {
|
if (UseParNewGC) {
|
||||||
_generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size);
|
_generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size);
|
||||||
} else {
|
} else {
|
||||||
_generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size);
|
_generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size);
|
||||||
@ -831,10 +840,9 @@ void MarkSweepPolicy::initialize_generations() {
|
|||||||
|
|
||||||
void MarkSweepPolicy::initialize_gc_policy_counters() {
|
void MarkSweepPolicy::initialize_gc_policy_counters() {
|
||||||
// initialize the policy counters - 2 collectors, 3 generations
|
// initialize the policy counters - 2 collectors, 3 generations
|
||||||
if (UseParNewGC && ParallelGCThreads > 0) {
|
if (UseParNewGC) {
|
||||||
_gc_policy_counters = new GCPolicyCounters("ParNew:MSC", 2, 3);
|
_gc_policy_counters = new GCPolicyCounters("ParNew:MSC", 2, 3);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
_gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 3);
|
_gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,6 +119,7 @@ void FileMapInfo::populate_header(size_t alignment) {
|
|||||||
_header._magic = 0xf00baba2;
|
_header._magic = 0xf00baba2;
|
||||||
_header._version = _current_version;
|
_header._version = _current_version;
|
||||||
_header._alignment = alignment;
|
_header._alignment = alignment;
|
||||||
|
_header._obj_alignment = ObjectAlignmentInBytes;
|
||||||
|
|
||||||
// The following fields are for sanity checks for whether this archive
|
// The following fields are for sanity checks for whether this archive
|
||||||
// will function correctly with this JVM and the bootclasspath it's
|
// will function correctly with this JVM and the bootclasspath it's
|
||||||
@ -211,7 +212,11 @@ void FileMapInfo::open_for_write() {
|
|||||||
|
|
||||||
// Remove the existing file in case another process has it open.
|
// Remove the existing file in case another process has it open.
|
||||||
remove(_full_path);
|
remove(_full_path);
|
||||||
|
#ifdef _WINDOWS // if 0444 is used on Windows, then remove() will fail.
|
||||||
|
int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0744);
|
||||||
|
#else
|
||||||
int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444);
|
int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444);
|
||||||
|
#endif
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fail_stop("Unable to create shared archive file %s.", _full_path);
|
fail_stop("Unable to create shared archive file %s.", _full_path);
|
||||||
}
|
}
|
||||||
@ -370,9 +375,8 @@ ReservedSpace FileMapInfo::reserve_shared_memory() {
|
|||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
// the reserved virtual memory is for mapping class data sharing archive
|
// the reserved virtual memory is for mapping class data sharing archive
|
||||||
if (MemTracker::is_on()) {
|
MemTracker::record_virtual_memory_type((address)rs.base(), mtClassShared);
|
||||||
MemTracker::record_virtual_memory_type((address)rs.base(), mtClassShared);
|
|
||||||
}
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,6 +398,11 @@ char* FileMapInfo::map_region(int i) {
|
|||||||
fail_continue(err_msg("Unable to map %s shared space at required address.", shared_region_name[i]));
|
fail_continue(err_msg("Unable to map %s shared space at required address.", shared_region_name[i]));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
// This call is Windows-only because the memory_type gets recorded for the other platforms
|
||||||
|
// in method FileMapInfo::reserve_shared_memory(), which is not called on Windows.
|
||||||
|
MemTracker::record_virtual_memory_type((address)base, mtClassShared);
|
||||||
|
#endif
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -465,6 +474,12 @@ bool FileMapInfo::validate() {
|
|||||||
" version or build of HotSpot.");
|
" version or build of HotSpot.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (_header._obj_alignment != ObjectAlignmentInBytes) {
|
||||||
|
fail_continue("The shared archive file's ObjectAlignmentInBytes of %d"
|
||||||
|
" does not equal the current ObjectAlignmentInBytes of %d.",
|
||||||
|
_header._obj_alignment, ObjectAlignmentInBytes);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Cannot verify interpreter yet, as it can only be created after the GC
|
// Cannot verify interpreter yet, as it can only be created after the GC
|
||||||
// heap has been initialized.
|
// heap has been initialized.
|
||||||
|
@ -63,6 +63,7 @@ private:
|
|||||||
int _magic; // identify file type.
|
int _magic; // identify file type.
|
||||||
int _version; // (from enum, above.)
|
int _version; // (from enum, above.)
|
||||||
size_t _alignment; // how shared archive should be aligned
|
size_t _alignment; // how shared archive should be aligned
|
||||||
|
int _obj_alignment; // value of ObjectAlignmentInBytes
|
||||||
|
|
||||||
struct space_info {
|
struct space_info {
|
||||||
int _file_offset; // sizeof(this) rounded to vm page size
|
int _file_offset; // sizeof(this) rounded to vm page size
|
||||||
|
@ -100,21 +100,8 @@ void GenMarkSweep::invoke_at_safepoint(int level, ReferenceProcessor* rp,
|
|||||||
|
|
||||||
mark_sweep_phase3(level);
|
mark_sweep_phase3(level);
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
guarantee(_root_refs_stack->length() == 0, "should be empty by now");
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
mark_sweep_phase4();
|
mark_sweep_phase4();
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
guarantee(_live_oops->length() == _live_oops_moved_to->length(),
|
|
||||||
"should be the same size");
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
restore_marks();
|
restore_marks();
|
||||||
|
|
||||||
// Set saved marks for allocation profiler (and other things? -- dld)
|
// Set saved marks for allocation profiler (and other things? -- dld)
|
||||||
@ -187,31 +174,6 @@ void GenMarkSweep::allocate_stacks() {
|
|||||||
|
|
||||||
_preserved_marks = (PreservedMark*)scratch;
|
_preserved_marks = (PreservedMark*)scratch;
|
||||||
_preserved_count = 0;
|
_preserved_count = 0;
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
_root_refs_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
|
|
||||||
_other_refs_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
|
|
||||||
_adjusted_pointers = new (ResourceObj::C_HEAP, mtGC) GrowableArray<void*>(100, true);
|
|
||||||
_live_oops = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(100, true);
|
|
||||||
_live_oops_moved_to = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(100, true);
|
|
||||||
_live_oops_size = new (ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
|
|
||||||
}
|
|
||||||
if (RecordMarkSweepCompaction) {
|
|
||||||
if (_cur_gc_live_oops == NULL) {
|
|
||||||
_cur_gc_live_oops = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
|
|
||||||
_cur_gc_live_oops_moved_to = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
|
|
||||||
_cur_gc_live_oops_size = new(ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
|
|
||||||
_last_gc_live_oops = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
|
|
||||||
_last_gc_live_oops_moved_to = new(ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(100, true);
|
|
||||||
_last_gc_live_oops_size = new(ResourceObj::C_HEAP, mtGC) GrowableArray<size_t>(100, true);
|
|
||||||
} else {
|
|
||||||
_cur_gc_live_oops->clear();
|
|
||||||
_cur_gc_live_oops_moved_to->clear();
|
|
||||||
_cur_gc_live_oops_size->clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -225,19 +187,6 @@ void GenMarkSweep::deallocate_stacks() {
|
|||||||
_preserved_oop_stack.clear(true);
|
_preserved_oop_stack.clear(true);
|
||||||
_marking_stack.clear();
|
_marking_stack.clear();
|
||||||
_objarray_stack.clear(true);
|
_objarray_stack.clear(true);
|
||||||
|
|
||||||
#ifdef VALIDATE_MARK_SWEEP
|
|
||||||
if (ValidateMarkSweep) {
|
|
||||||
delete _root_refs_stack;
|
|
||||||
delete _other_refs_stack;
|
|
||||||
delete _adjusted_pointers;
|
|
||||||
delete _live_oops;
|
|
||||||
delete _live_oops_size;
|
|
||||||
delete _live_oops_moved_to;
|
|
||||||
_live_oops_index = 0;
|
|
||||||
_live_oops_index_at_perm = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenMarkSweep::mark_sweep_phase1(int level,
|
void GenMarkSweep::mark_sweep_phase1(int level,
|
||||||
@ -246,8 +195,6 @@ void GenMarkSweep::mark_sweep_phase1(int level,
|
|||||||
TraceTime tm("phase 1", PrintGC && Verbose, true, gclog_or_tty);
|
TraceTime tm("phase 1", PrintGC && Verbose, true, gclog_or_tty);
|
||||||
trace(" 1");
|
trace(" 1");
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
|
|
||||||
|
|
||||||
GenCollectedHeap* gch = GenCollectedHeap::heap();
|
GenCollectedHeap* gch = GenCollectedHeap::heap();
|
||||||
|
|
||||||
// Because follow_root_closure is created statically, cannot
|
// Because follow_root_closure is created statically, cannot
|
||||||
@ -315,8 +262,6 @@ void GenMarkSweep::mark_sweep_phase2() {
|
|||||||
TraceTime tm("phase 2", PrintGC && Verbose, true, gclog_or_tty);
|
TraceTime tm("phase 2", PrintGC && Verbose, true, gclog_or_tty);
|
||||||
trace("2");
|
trace("2");
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
|
|
||||||
|
|
||||||
gch->prepare_for_compaction();
|
gch->prepare_for_compaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,8 +282,6 @@ void GenMarkSweep::mark_sweep_phase3(int level) {
|
|||||||
// Need new claim bits for the pointer adjustment tracing.
|
// Need new claim bits for the pointer adjustment tracing.
|
||||||
ClassLoaderDataGraph::clear_claimed_marks();
|
ClassLoaderDataGraph::clear_claimed_marks();
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
|
|
||||||
|
|
||||||
// Because the two closures below are created statically, cannot
|
// Because the two closures below are created statically, cannot
|
||||||
// use OopsInGenClosure constructor which takes a generation,
|
// use OopsInGenClosure constructor which takes a generation,
|
||||||
// as the Universe has not been created when the static constructors
|
// as the Universe has not been created when the static constructors
|
||||||
@ -393,10 +336,6 @@ void GenMarkSweep::mark_sweep_phase4() {
|
|||||||
TraceTime tm("phase 4", PrintGC && Verbose, true, gclog_or_tty);
|
TraceTime tm("phase 4", PrintGC && Verbose, true, gclog_or_tty);
|
||||||
trace("4");
|
trace("4");
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(reset_live_oop_tracking());
|
|
||||||
|
|
||||||
GenCompactClosure blk;
|
GenCompactClosure blk;
|
||||||
gch->generation_iterate(&blk, true);
|
gch->generation_iterate(&blk, true);
|
||||||
|
|
||||||
VALIDATE_MARK_SWEEP_ONLY(compaction_complete());
|
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user