Merge
diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index 5f49404..f3f827b 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -392,3 +392,4 @@
5f6920274c48eb00d31afee6c034826a754c13d9 jdk-9+147
3ffc3e886c74736e387f3685e86b557cdea706c8 jdk-9+148
b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149
+6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150
diff --git a/common/autoconf/boot-jdk.m4 b/common/autoconf/boot-jdk.m4
index f75f3ad..7eafd28 100644
--- a/common/autoconf/boot-jdk.m4
+++ b/common/autoconf/boot-jdk.m4
@@ -305,9 +305,8 @@
BOOT_JDK_SOURCETARGET="-source 8 -target 8"
AC_SUBST(BOOT_JDK_SOURCETARGET)
- ADD_JVM_ARG_IF_OK([--patch-module foo=bar], dummy, [$JAVA])
AC_MSG_CHECKING([if Boot JDK supports modules])
- if test "x$JVM_ARG_OK" = "xtrue"; then
+ if "$JAVA" --list-modules > /dev/null 2>&1; then
AC_MSG_RESULT([yes])
BOOT_JDK_MODULAR="true"
else
diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index 5cad333..4ec1088 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -5170,7 +5170,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1482168759
+DATE_WHEN_GENERATED=1482828098
###############################################################################
#
@@ -24677,7 +24677,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_MINOR=0
+ VERSION_MINOR=$DEFAULT_VERSION_MINOR
fi
fi
@@ -24724,7 +24724,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_SECURITY=0
+ VERSION_SECURITY=$DEFAULT_VERSION_SECURITY
fi
fi
@@ -24771,7 +24771,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_PATCH=0
+ VERSION_PATCH=$DEFAULT_VERSION_PATCH
fi
fi
@@ -30665,24 +30665,9 @@
BOOT_JDK_SOURCETARGET="-source 8 -target 8"
-
- $ECHO "Check if jvm arg is ok: --patch-module foo=bar" >&5
- $ECHO "Command: $JAVA --patch-module foo=bar -version" >&5
- OUTPUT=`$JAVA --patch-module foo=bar -version 2>&1`
- FOUND_WARN=`$ECHO "$OUTPUT" | $GREP -i warn`
- FOUND_VERSION=`$ECHO $OUTPUT | $GREP " version \""`
- if test "x$FOUND_VERSION" != x && test "x$FOUND_WARN" = x; then
- dummy="$dummy --patch-module foo=bar"
- JVM_ARG_OK=true
- else
- $ECHO "Arg failed:" >&5
- $ECHO "$OUTPUT" >&5
- JVM_ARG_OK=false
- fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Boot JDK supports modules" >&5
$as_echo_n "checking if Boot JDK supports modules... " >&6; }
- if test "x$JVM_ARG_OK" = "xtrue"; then
+ if "$JAVA" --list-modules > /dev/null 2>&1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
BOOT_JDK_MODULAR="true"
diff --git a/common/autoconf/hotspot.m4 b/common/autoconf/hotspot.m4
index b12914b..79eb26c 100644
--- a/common/autoconf/hotspot.m4
+++ b/common/autoconf/hotspot.m4
@@ -481,7 +481,7 @@
AC_MSG_RESULT([no, forced])
BUILD_GTEST="false"
elif test "x$enable_hotspot_gtest" = "x"; then
- if test "x$GTEST_DIR_EXISTS" = "xtrue" && test "x$OPENJDK_TARGET_OS" != "xaix"; then
+ if test "x$GTEST_DIR_EXISTS" = "xtrue"; then
AC_MSG_RESULT([yes])
BUILD_GTEST="true"
else
diff --git a/common/autoconf/jdk-version.m4 b/common/autoconf/jdk-version.m4
index 949f427..5321e56 100644
--- a/common/autoconf/jdk-version.m4
+++ b/common/autoconf/jdk-version.m4
@@ -226,7 +226,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_MINOR=0
+ VERSION_MINOR=$DEFAULT_VERSION_MINOR
fi
fi
@@ -248,7 +248,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_SECURITY=0
+ VERSION_SECURITY=$DEFAULT_VERSION_SECURITY
fi
fi
@@ -270,7 +270,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_PATCH=0
+ VERSION_PATCH=$DEFAULT_VERSION_PATCH
fi
fi
diff --git a/common/autoconf/version-numbers b/common/autoconf/version-numbers
index ac2c9f2..4cb5467 100644
--- a/common/autoconf/version-numbers
+++ b/common/autoconf/version-numbers
@@ -26,6 +26,9 @@
# Default version numbers to use unless overridden by configure
DEFAULT_VERSION_MAJOR=9
+DEFAULT_VERSION_MINOR=0
+DEFAULT_VERSION_SECURITY=0
+DEFAULT_VERSION_PATCH=0
LAUNCHER_NAME=openjdk
PRODUCT_NAME=OpenJDK
diff --git a/common/bin/print-config.js b/common/bin/print-config.js
new file mode 100644
index 0000000..1abb206
--- /dev/null
+++ b/common/bin/print-config.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This little utility can be used to expand the jib-profiles configuration
+ * files into plain json.
+ *
+ * Usage:
+ *
+ * jjs -scripting print-config.js -- [<jib-profiles.js>]
+ *
+ */
+
+var file = $ARG[0];
+if (file == null) {
+ file = new java.io.File(__DIR__, "../conf/jib-profiles.js").getCanonicalPath();
+}
+load(file);
+var input = {};
+input.get = function(dependencyName, attribute) {
+ return "\${" + dependencyName + "." + attribute + "}";
+};
+print(JSON.stringify(getJibProfiles(input), null, 2));
diff --git a/common/conf/jib-profiles.js b/common/conf/jib-profiles.js
index 8c0f3a7..761bf01 100644
--- a/common/conf/jib-profiles.js
+++ b/common/conf/jib-profiles.js
@@ -55,6 +55,7 @@
* be provided:
*
* input.profile
+ * input.build_id
* input.target_os
* input.target_cpu
* input.build_os
@@ -181,11 +182,14 @@
var data = {};
- // Identifies the version of this format to the tool reading it
- data.format_version = "1.0";
+ // Identifies the version of this format to the tool reading it.
+ // 1.1 signifies that the publish, publish-src and get-src features are usable.
+ data.format_version = "1.1";
- // Organization is used when uploading/publishing build results
- data.organization = "com.oracle.jpg.jdk";
+ // Organization, product and version are used when uploading/publishing build results
+ data.organization = "";
+ data.product = "jdk";
+ data.version = getVersion();
// The base directory for the build output. JIB will assume that the
// actual build directory will be <output_basedir>/<configuration>
@@ -195,12 +199,18 @@
// The make argument to use to specify the name of the configuration
data.configuration_make_arg = "CONF_NAME=";
+ // Exclude list to use when Jib creates a source bundle
+ data.src_bundle_excludes = "./build webrev .hg */.hg */*/.hg */*/*/.hg";
+ // Include list to use when creating a minimal jib source bundle which
+ // contains just the jib configuration files.
+ data.conf_bundle_includes = "*/conf/jib-profiles.* common/autoconf/version-numbers"
+
// Define some common values
- var common = getJibProfilesCommon(input);
+ var common = getJibProfilesCommon(input, data);
// Generate the profiles part of the configuration
- data.profiles = getJibProfilesProfiles(input, common);
+ data.profiles = getJibProfilesProfiles(input, common, data);
// Generate the dependencies part of the configuration
- data.dependencies = getJibProfilesDependencies(input, common);
+ data.dependencies = getJibProfilesDependencies(input, common, data);
return data;
};
@@ -211,18 +221,168 @@
* @param input External data to use for generating the configuration
* @returns Common values
*/
-var getJibProfilesCommon = function (input) {
+var getJibProfilesCommon = function (input, data) {
var common = {};
- common.dependencies = ["boot_jdk", "gnumake", "jtreg"],
- common.default_make_targets = ["product-bundles", "test-bundles"],
- common.default_make_targets_debug = common.default_make_targets;
- common.default_make_targets_slowdebug = common.default_make_targets;
- common.configure_args = ["--enable-jtreg-failure-handler"],
- common.configure_args_32bit = ["--with-target-bits=32"],
- common.configure_args_debug = ["--enable-debug"],
- common.configure_args_slowdebug = ["--with-debug-level=slowdebug"],
- common.organization = "jpg.infra.builddeps"
+ common.organization = "jpg.infra.builddeps";
+ common.build_id = getBuildId(input);
+ common.build_number = input.build_number != null ? input.build_number : "0";
+
+ // List of the main profile names used for iteration
+ common.main_profile_names = [
+ "linux-x64", "linux-x86", "macosx-x64", "solaris-x64",
+ "solaris-sparcv9", "windows-x64", "windows-x86"
+ ];
+
+ // These are the base setttings for all the main build profiles.
+ common.main_profile_base = {
+ dependencies: ["boot_jdk", "gnumake", "jtreg"],
+ default_make_targets: ["product-bundles", "test-bundles"],
+ configure_args: [
+ "--with-version-opt=" + common.build_id,
+ "--enable-jtreg-failure-handler",
+ "--with-version-build=" + common.build_number
+ ]
+ };
+ // Extra settings for debug profiles
+ common.debug_suffix = "-debug";
+ common.debug_profile_base = {
+ configure_args: ["--enable-debug"],
+ labels: "debug"
+ };
+ // Extra settings for slowdebug profiles
+ common.slowdebug_suffix = "-slowdebug";
+ common.slowdebug_profile_base = {
+ configure_args: ["--with-debug-level=slowdebug"],
+ labels: "slowdebug"
+ };
+ // Extra settings for openjdk only profiles
+ common.open_suffix = "-open";
+ common.open_profile_base = {
+ configure_args: ["--enable-openjdk-only"],
+ labels: "open"
+ };
+
+ common.configure_args_32bit = ["--with-target-bits=32"];
+
+ /**
+ * Define common artifacts template for all main profiles
+ * @param pf - Name of platform in bundle names
+ * @param demo_ext - Type of extension for demo bundle
+ */
+ common.main_profile_artifacts = function (pf, demo_ext) {
+ return {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ exploded: "images/test"
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ },
+ demo: {
+ local: "bundles/\\(jdk.*demo." + demo_ext + "\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_demo." + demo_ext,
+ "bundles/" + pf + "/\\1"
+ ],
+ }
+ }
+ };
+ };
+
+
+ /**
+ * Define common artifacts template for all debug profiles
+ * @param pf - Name of platform in bundle names
+ */
+ common.debug_profile_artifacts = function (pf) {
+ return {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin-debug.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin-debug.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-debug.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests-debug.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests-debug.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ exploded: "images/test"
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-debug-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-debug-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-debug-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ }
+ }
+ };
+ };
var boot_jdk_revision = "8";
var boot_jdk_subdirpart = "1.8.0";
@@ -251,100 +411,105 @@
* @param common The common values
* @returns {{}} Profiles part of the configuration
*/
-var getJibProfilesProfiles = function (input, common) {
- var profiles = {};
-
+var getJibProfilesProfiles = function (input, common, data) {
// Main SE profiles
- var mainProfiles = {
+ var profiles = {
"linux-x64": {
target_os: "linux",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args, "--with-zlib=system"),
- default_make_targets: concat(common.default_make_targets, "docs-bundles")
+ dependencies: ["devkit"],
+ configure_args: ["--with-zlib=system"],
+ default_make_targets: ["docs-bundles"],
},
"linux-x86": {
target_os: "linux",
target_cpu: "x86",
build_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args, common.configure_args_32bit,
+ dependencies: ["devkit"],
+ configure_args: concat(common.configure_args_32bit,
"--with-jvm-variants=minimal,server", "--with-zlib=system"),
- default_make_targets: common.default_make_targets
},
"macosx-x64": {
target_os: "macosx",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
+ dependencies: ["devkit"],
configure_args: concat(common.configure_args, "--with-zlib=system"),
- default_make_targets: common.default_make_targets
},
"solaris-x64": {
target_os: "solaris",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit", "cups"),
- configure_args: concat(common.configure_args, "--with-zlib=system",
- "--enable-dtrace"),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "cups"],
+ configure_args: ["--with-zlib=system", "--enable-dtrace"],
},
"solaris-sparcv9": {
target_os: "solaris",
target_cpu: "sparcv9",
- dependencies: concat(common.dependencies, "devkit", "cups"),
- configure_args: concat(common.configure_args, "--with-zlib=system",
- "--enable-dtrace"),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "cups"],
+ configure_args: ["--with-zlib=system", "--enable-dtrace"],
},
"windows-x64": {
target_os: "windows",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit", "freetype"),
- configure_args: concat(common.configure_args),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "freetype"],
},
"windows-x86": {
target_os: "windows",
target_cpu: "x86",
build_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit", "freetype"),
- configure_args: concat(common.configure_args, common.configure_args_32bit),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "freetype"],
+ configure_args: concat(common.configure_args_32bit),
}
};
- profiles = concatObjects(profiles, mainProfiles);
+ // Add the base settings to all the main profiles
+ common.main_profile_names.forEach(function (name) {
+ profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
+ });
+
// Generate debug versions of all the main profiles
- profiles = concatObjects(profiles, generateDebugProfiles(common, mainProfiles));
+ common.main_profile_names.forEach(function (name) {
+ var debugName = name + common.debug_suffix;
+ profiles[debugName] = concatObjects(profiles[name],
+ common.debug_profile_base);
+ });
// Generate slowdebug versions of all the main profiles
- profiles = concatObjects(profiles, generateSlowdebugProfiles(common, mainProfiles));
+ common.main_profile_names.forEach(function (name) {
+ var debugName = name + common.slowdebug_suffix;
+ profiles[debugName] = concatObjects(profiles[name],
+ common.slowdebug_profile_base);
+ });
// Generate open only profiles for all the main profiles for JPRT and reference
// implementation builds.
- var openOnlyProfiles = generateOpenOnlyProfiles(common, mainProfiles);
+ common.main_profile_names.forEach(function (name) {
+ var openName = name + common.open_suffix;
+ profiles[openName] = concatObjects(profiles[name],
+ common.open_profile_base);
+ });
// The open only profiles on linux are used for reference builds and should
// produce the compact profile images by default. This adds "profiles" as an
// extra default target.
var openOnlyProfilesExtra = {
- "linux-x64-open": {
- default_make_targets: "profiles"
- },
-
"linux-x86-open": {
default_make_targets: "profiles",
configure_args: "--with-jvm-variants=client,server"
}
};
- var openOnlyProfiles = concatObjects(openOnlyProfiles, openOnlyProfilesExtra);
+ profiles = concatObjects(profiles, openOnlyProfilesExtra);
- profiles = concatObjects(profiles, openOnlyProfiles);
- // Generate debug profiles for the open jprt profiles
- profiles = concatObjects(profiles, generateDebugProfiles(common, openOnlyProfiles));
+ // Generate debug profiles for the open only profiles
+ common.main_profile_names.forEach(function (name) {
+ var openName = name + common.open_suffix;
+ var openDebugName = openName + common.debug_suffix;
+ profiles[openDebugName] = concatObjects(profiles[openName],
+ common.debug_profile_base);
+ });
// Profiles for building the zero jvm variant. These are used for verification
// in JPRT.
@@ -352,31 +517,46 @@
"linux-x64-zero": {
target_os: "linux",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args,
+ dependencies: ["devkit"],
+ configure_args: [
"--with-zlib=system",
"--with-jvm-variants=zero",
- "--enable-libffi-bundling"),
- default_make_targets: common.default_make_targets
+ "--enable-libffi-bundling"
+ ]
},
"linux-x86-zero": {
target_os: "linux",
target_cpu: "x86",
build_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args, common.configure_args_32bit,
+ dependencies: ["devkit"],
+ configure_args: concat(common.configure_args_32bit, [
"--with-zlib=system",
"--with-jvm-variants=zero",
- "--enable-libffi-bundling"),
- default_make_targets: common.default_make_targets
- },
+ "--enable-libffi-bundling"
+ ])
+ }
}
profiles = concatObjects(profiles, zeroProfiles);
- profiles = concatObjects(profiles, generateDebugProfiles(common, zeroProfiles));
- // Profiles used to run tests. Used in JPRT.
+ // Add the base settings to the zero profiles and generate debug profiles
+ Object.keys(zeroProfiles).forEach(function (name) {
+ var debugName = name + common.debug_suffix;
+ profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
+ profiles[debugName] = concatObjects(profiles[name], common.debug_profile_base);
+ });
+
+ // Profiles used to run tests. Used in JPRT and Mach 5.
var testOnlyProfiles = {
+ "run-test-jprt": {
+ target_os: input.build_os,
+ target_cpu: input.build_cpu,
+ dependencies: [ "jtreg", "gnumake", "boot_jdk" ],
+ labels: "test",
+ environment: {
+ "JT_JAVA": common.boot_jdk_home
+ }
+ },
"run-test": {
target_os: input.build_os,
@@ -390,6 +570,230 @@
};
profiles = concatObjects(profiles, testOnlyProfiles);
+ // Profiles used to run tests using Jib for internal dependencies.
+ var testedProfile = input.testedProfile;
+ if (testedProfile == null) {
+ testedProfile = input.build_os + "-" + input.build_cpu;
+ }
+ var testOnlyProfilesPrebuilt = {
+ "run-test-prebuilt": {
+ src: "src.conf",
+ dependencies: [ "jtreg", "gnumake", testedProfile + ".jdk",
+ testedProfile + ".test", "src.full"
+ ],
+ work_dir: input.get("src.full", "install_path") + "/test",
+ environment: {
+ "PRODUCT_HOME": input.get(testedProfile + ".jdk", "home_path"),
+ "TEST_IMAGE_DIR": input.get(testedProfile + ".test", "home_path"),
+ "TEST_OUTPUT_DIR": input.src_top_dir
+ },
+ labels: "test"
+ }
+ };
+ // If actually running the run-test-prebuilt profile, verify that the input
+ // variable is valid and if so, add the appropriate target_* values from
+ // the tested profile.
+ if (input.profile == "run-test-prebuilt") {
+ if (profiles[testedProfile] == null) {
+ error("testedProfile is not defined: " + testedProfile);
+ } else {
+ testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
+ = profiles[testedProfile]["target_os"];
+ testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
+ = profiles[testedProfile]["target_cpu"];
+ }
+ }
+ profiles = concatObjects(profiles, testOnlyProfilesPrebuilt);
+
+ //
+ // Define artifacts for profiles
+ //
+ // Macosx bundles are named osx and Windows demo bundles use zip instead of
+ // tar.gz.
+ var artifactData = {
+ "linux-x64": {
+ platform: "linux-x64",
+ demo_ext: "tar.gz"
+ },
+ "linux-x86": {
+ platform: "linux-x86",
+ demo_ext: "tar.gz"
+ },
+ "macosx-x64": {
+ platform: "osx-x64",
+ demo_ext: "tar.gz"
+ },
+ "solaris-x64": {
+ platform: "solaris-x64",
+ demo_ext: "tar.gz"
+ },
+ "solaris-sparcv9": {
+ platform: "solaris-sparcv9",
+ demo_ext: "tar.gz"
+ },
+ "windows-x64": {
+ platform: "windows-x64",
+ demo_ext: "zip"
+ },
+ "windows-x86": {
+ platform: "windows-x86",
+ demo_ext: "zip"
+ }
+ }
+ // Generate common artifacts for all main profiles
+ common.main_profile_names.forEach(function (name) {
+ profiles[name] = concatObjects(profiles[name],
+ common.main_profile_artifacts(artifactData[name].platform, artifactData[name].demo_ext));
+ });
+
+ // Generate common artifacts for all debug profiles
+ common.main_profile_names.forEach(function (name) {
+ var debugName = name + common.debug_suffix;
+ profiles[debugName] = concatObjects(profiles[debugName],
+ common.debug_profile_artifacts(artifactData[name].platform));
+ });
+
+ // Extra profile specific artifacts
+ profilesArtifacts = {
+ "linux-x64": {
+ artifacts: {
+ doc_api_spec: {
+ local: "bundles/\\(jdk.*doc-api-spec.tar.gz\\)",
+ remote: [
+ "bundles/common/jdk-" + data.version + "_doc-api-spec.tar.gz",
+ "bundles/linux-x64/\\1"
+ ],
+ },
+ }
+ },
+
+ "linux-x64-open": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ demo: {
+ local: "bundles/\\(jdk.*demo.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ doc_api_spec: {
+ local: "bundles/\\(jdk.*doc-api-spec.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ }
+ },
+
+ "linux-x86-open": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*[0-9]_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },/* The build does not create these
+ jre_compact1: {
+ local: "bundles/\\(jre.*-compact1_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre_compact2: {
+ local: "bundles/\\(jre.*-compact2_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre_compact3: {
+ local: "bundles/\\(jre.*-compact3_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },*/
+ }
+ },
+
+ "windows-x86-open": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1"
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1"
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ },
+ demo: {
+ local: "bundles/\\(jdk.*demo.zip\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ }
+ }
+ },
+
+ "linux-x86-open-debug": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin-debug.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin-debug.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-debug-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ }
+ },
+
+ };
+ profiles = concatObjects(profiles, profilesArtifacts);
+
+
+ // Define the reference implementation profiles. These are basically the same
+ // as the open profiles, but upload artifacts to a different location and
+ // are only defined for specific platforms.
+ profiles["linux-x64-ri"] = clone(profiles["linux-x64-open"]);
+ profiles["linux-x86-ri"] = clone(profiles["linux-x86-open"]);
+ profiles["linux-x86-ri-debug"] = clone(profiles["linux-x86-open-debug"]);
+ profiles["windows-x86-ri"] = clone(profiles["windows-x86-open"]);
+
+ // Generate artifacts for ri profiles
+ [ "linux-x64-ri", "linux-x86-ri", "linux-x86-ri-debug", "windows-x86-ri" ]
+ .forEach(function (name) {
+ // Rewrite all remote dirs to "bundles/openjdk/BCL/..."
+ for (artifactName in profiles[name].artifacts) {
+ var artifact = profiles[name].artifacts[artifactName];
+ artifact.remote = replaceAll("\/GPL\/", "/BCL/",
+ (artifact.remote != null ? artifact.remote : artifact.local));
+ }
+ });
+
// Generate the missing platform attributes
profiles = generatePlatformAttributes(profiles);
profiles = generateDefaultMakeTargetsConfigureArg(common, profiles);
@@ -514,78 +918,6 @@
};
/**
- * Generates debug versions of profiles. Clones the given profiles and adds
- * debug metadata.
- *
- * @param common Common values
- * @param profiles Profiles map to generate debug profiles for
- * @returns {{}} New map of profiles containing debug profiles
- */
-var generateDebugProfiles = function (common, profiles) {
- var newProfiles = {};
- for (var profile in profiles) {
- var debugProfile = profile + "-debug";
- newProfiles[debugProfile] = clone(profiles[profile]);
- newProfiles[debugProfile].debug_level = "fastdebug";
- newProfiles[debugProfile].default_make_targets
- = common.default_make_targets_debug;
- newProfiles[debugProfile].labels
- = concat(newProfiles[debugProfile].labels || [], "debug"),
- newProfiles[debugProfile].configure_args
- = concat(newProfiles[debugProfile].configure_args,
- common.configure_args_debug);
- }
- return newProfiles;
-};
-
-/**
- * Generates slowdebug versions of profiles. Clones the given profiles and adds
- * debug metadata.
- *
- * @param common Common values
- * @param profiles Profiles map to generate debug profiles for
- * @returns {{}} New map of profiles containing debug profiles
- */
-var generateSlowdebugProfiles = function (common, profiles) {
- var newProfiles = {};
- for (var profile in profiles) {
- var debugProfile = profile + "-slowdebug";
- newProfiles[debugProfile] = clone(profiles[profile]);
- newProfiles[debugProfile].debug_level = "slowdebug";
- newProfiles[debugProfile].default_make_targets
- = common.default_make_targets_slowdebug;
- newProfiles[debugProfile].labels
- = concat(newProfiles[debugProfile].labels || [], "slowdebug"),
- newProfiles[debugProfile].configure_args
- = concat(newProfiles[debugProfile].configure_args,
- common.configure_args_slowdebug);
- }
- return newProfiles;
-};
-
-/**
- * Generates open only versions of profiles. Clones the given profiles and adds
- * open metadata.
- *
- * @param common Common values
- * @param profiles Profiles map to generate open only profiles for
- * @returns {{}} New map of profiles containing open only profiles
- */
-var generateOpenOnlyProfiles = function (common, profiles) {
- var newProfiles = {};
- for (var profile in profiles) {
- var openProfile = profile + "-open";
- newProfiles[openProfile] = clone(profiles[profile]);
- newProfiles[openProfile].labels
- = concat(newProfiles[openProfile].labels || [], "open"),
- newProfiles[openProfile].configure_args
- = concat(newProfiles[openProfile].configure_args,
- "--enable-openjdk-only");
- }
- return newProfiles;
-};
-
-/**
* The default_make_targets attribute on a profile is not a real Jib attribute.
* This function rewrites that attribute into the corresponding configure arg.
* Calling this function multiple times on the same profiles object is safe.
@@ -602,10 +934,12 @@
// Iterate over all configure args and see if --with-default-make-target
// is already there and change it, otherwise add it.
var found = false;
- for (var arg in ret[profile].configure_args) {
- if (arg.startsWith("--with-default-make-target")) {
+ for (var i in ret[profile].configure_args) {
+ var arg = ret[profile].configure_args[i];
+ if (arg != null && arg.startsWith("--with-default-make-target=")) {
found = true;
- arg.replace(/=.*/, "=" + targetsString);
+ ret[profile].configure_args[i]
+ = "--with-default-make-target=" + targetsString;
}
}
if (!found) {
@@ -618,6 +952,16 @@
return ret;
}
+var getBuildId = function (input) {
+ if (input.build_id != null) {
+ return input.build_id;
+ } else {
+ var topdir = new java.io.File(__DIR__, "../..").getCanonicalFile().getName();
+ var userName = java.lang.System.getProperty("user.name");
+ return userName + "." + topdir;
+ }
+}
+
/**
* Deep clones an object tree.
*
@@ -638,25 +982,25 @@
};
/**
- * Copies all elements in an array into a new array but replacing all
- * occurrences of original with replacement.
+ * Takes a String or Array of Strings and does a replace operation on each
+ * of them.
*
- * @param original Element to look for
- * @param replacement Element to replace with
- * @param a Array to copy
- * @returns {Array} New array with all occurrences of original replaced
- * with replacement
+ * @param pattern Pattern to look for
+ * @param replacement Replacement text to insert
+ * @param a String or Array of Strings to replace
+ * @returns {Array} Either a new array or a new string depending on the input
*/
-var replace = function (original, replacement, a) {
+var replaceAll = function (pattern, replacement, a) {
+ // If a is an array
+ if (Array === a.constructor) {
var newA = [];
for (var i in a) {
- if (original == a[i]) {
- newA.push(replacement);
- } else {
- newA.push(a[i]);
+ newA.push(a[i].replace(pattern, replacement));
}
+ return newA;
+ } else {
+ return a.replace(pattern, replacement);
}
- return newA;
};
/**
@@ -669,20 +1013,26 @@
* @returns {{}} New object tree containing the concatenation of o1 and o2
*/
var concatObjects = function (o1, o2) {
+ if (o1 == null) {
+ return clone(o2);
+ }
+ if (o2 == null) {
+ return clone(o1);
+ }
var ret = {};
for (var a in o1) {
if (o2[a] == null) {
- ret[a] = o1[a];
+ ret[a] = clone(o1[a]);
}
}
for (var a in o2) {
if (o1[a] == null) {
- ret[a] = o2[a];
+ ret[a] = clone(o2[a]);
} else {
if (typeof o1[a] == 'string') {
- ret[a] = [o1[a]].concat(o2[a]);
+ ret[a] = clone([o1[a]].concat(o2[a]));
} else if (Array.isArray(o1[a])) {
- ret[a] = o1[a].concat(o2[a]);
+ ret[a] = clone(o1[a].concat(o2[a]));
} else if (typeof o1[a] == 'object') {
ret[a] = concatObjects(o1[a], o2[a]);
}
@@ -690,3 +1040,45 @@
}
return ret;
};
+
+/**
+ * Constructs the numeric version string from reading the
+ * common/autoconf/version-numbers file and removing all trailing ".0".
+ *
+ * @param major Override major version
+ * @param minor Override minor version
+ * @param security Override security version
+ * @param patch Override patch version
+ * @returns {String} The numeric version string
+ */
+var getVersion = function (major, minor, security, patch) {
+ var version_numbers = getVersionNumbers();
+ var version = (major != null ? major : version_numbers.get("DEFAULT_VERSION_MAJOR"))
+ + "." + (minor != null ? minor : version_numbers.get("DEFAULT_VERSION_MINOR"))
+ + "." + (security != null ? security : version_numbers.get("DEFAULT_VERSION_SECURITY"))
+ + "." + (patch != null ? patch : version_numbers.get("DEFAULT_VERSION_PATCH"));
+ while (version.match(".*\.0$")) {
+ version = version.substring(0, version.length - 2);
+ }
+ return version;
+};
+
+// Properties representation of the common/autoconf/version-numbers file. Lazily
+// initiated by the function below.
+var version_numbers;
+
+/**
+ * Read the common/autoconf/version-numbers file into a Properties object.
+ *
+ * @returns {java.utilProperties}
+ */
+var getVersionNumbers = function () {
+ // Read version information from common/autoconf/version-numbers
+ if (version_numbers == null) {
+ version_numbers = new java.util.Properties();
+ var stream = new java.io.FileInputStream(__DIR__ + "/../../common/autoconf/version-numbers");
+ version_numbers.load(stream);
+ stream.close();
+ }
+ return version_numbers;
+}
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index 7b65fd3..5243903 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -552,3 +552,4 @@
132a72c782071cc11ab25cc7c9ee167c3632fea4 jdk-9+147
5e4e893520ecdbd517c6ed6375f0885664fe62c4 jdk-9+148
30e1996bd55da36183434f24ed964adebf9ca71e jdk-9+149
+98fe046473c90204cbc9b34c512b9fc10dfb8479 jdk-9+150
diff --git a/hotspot/THIRD_PARTY_README b/hotspot/THIRD_PARTY_README
deleted file mode 100644
index a93b35b..0000000
--- a/hotspot/THIRD_PARTY_README
+++ /dev/null
@@ -1,3605 +0,0 @@
-DO NOT TRANSLATE OR LOCALIZE.
------------------------------
-
-%% This notice is provided with respect to ASM Bytecode Manipulation
-Framework v5.0, which may be included with JRE 8, and JDK 8, and
-OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2000-2011 France Télécom
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holders nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
---------------------------------------------------------------------------------
-
-%% This notice is provided with respect to BSDiff v4.3, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright 2003-2005 Colin Percival
-All rights reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to CodeViewer 1.0, which may be
-included with JDK 8.
-
---- begin of LICENSE ---
-
-Copyright 1999 by CoolServlets.com.
-
-Any errors or suggested improvements to this class can be reported as
-instructed on CoolServlets.com. We hope you enjoy this program... your
-comments will encourage further development! This software is distributed
-under the terms of the BSD License. Redistribution and use in source and
-binary forms, with or without modification, are permitted provided that the
-following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-Neither name of CoolServlets.com nor the names of its contributors may be
-used to endorse or promote products derived from this software without
-specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Cryptix AES 3.2.0, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Cryptix General License
-
-Copyright (c) 1995-2005 The Cryptix Foundation Limited.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- 1. Redistributions of source code must retain the copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
-CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to CUP Parser Generator for
-Java 0.10k, which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted, provided
-that the above copyright notice appear in all copies and that both the
-copyright notice and this permission notice and warranty disclaimer appear in
-supporting documentation, and that the names of the authors or their
-employers not be used in advertising or publicity pertaining to distribution of
-the software without specific, written prior permission.
-
-The authors and their employers disclaim all warranties with regard to
-this software, including all implied warranties of merchantability and fitness.
-In no event shall the authors or their employers be liable for any special,
-indirect or consequential damages or any damages whatsoever resulting from
-loss of use, data or profits, whether in an action of contract, negligence or
-other tortious action, arising out of or in connection with the use or
-performance of this software.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Document Object Model (DOM) Level 2
-& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-W3C SOFTWARE NOTICE AND LICENSE
-
-http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
-
-This work (and included software, documentation such as READMEs, or other
-related items) is being provided by the copyright holders under the following
-license. By obtaining, using and/or copying this work, you (the licensee)
-agree that you have read, understood, and will comply with the following terms
-and conditions.
-
-Permission to copy, modify, and distribute this software and its
-documentation, with or without modification, for any purpose and without fee
-or royalty is hereby granted, provided that you include the following on ALL
-copies of the software and documentation or portions thereof, including
-modifications:
-
- 1.The full text of this NOTICE in a location viewable to users of the
- redistributed or derivative work.
-
- 2.Any pre-existing intellectual property disclaimers, notices, or terms and
- conditions. If none exist, the W3C Software Short Notice should be included
- (hypertext is preferred, text is permitted) within the body of any
- redistributed or derivative code.
-
- 3.Notice of any changes or modifications to the files, including the date
- changes were made. (We recommend you provide URIs to the location from
- which the code is derived.)
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
-MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
-PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY
-THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
-DOCUMENTATION. The name and trademarks of copyright holders may NOT be used
-in advertising or publicity pertaining to the software without specific,
-written prior permission. Title to copyright in this software and any
-associated documentation will at all times remain with copyright holders.
-
-____________________________________
-
-This formulation of W3C's notice and license became active on December 31
-2002. This version removes the copyright ownership notice such that this
-license can be used with materials other than those owned by the W3C, reflects
-that ERCIM is now a host of the W3C, includes references to this specific
-dated version of the license, and removes the ambiguous grant of "use".
-Otherwise, this version is the same as the previous version and is written so
-as to preserve the Free Software Foundation's assessment of GPL compatibility
-and OSI's certification under the Open Source Definition. Please see our
-Copyright FAQ for common questions about using materials from our site,
-including specific terms and conditions for packages like libwww, Amaya, and
-Jigsaw. Other questions about this notice can be directed to
-site-policy@w3.org.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Dynalink v0.5, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2009-2013, Attila Szegedi
-
-All rights reserved.Redistribution and use in source and binary forms, with or
-without modification, are permitted provided that the following conditions are
-met:* Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer. * Redistributions in
-binary form must reproduce the above copyright notice, this list of
-conditions and the following disclaimer in the documentation and/or other
-materials provided with the distribution. * Neither the name of Attila
-Szegedi nor the names of its contributors may be used to endorse or promote
-products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Elliptic Curve Cryptography, which
-may be included with JRE 8, JDK 8, and OpenJDK 8.
-
-You are receiving a copy of the Elliptic Curve Cryptography library in source
-form with the JDK 8 and OpenJDK 8 source distributions, and as object code in
-the JRE 8 & JDK 8 runtimes.
-
-In the case of the JRE 8 & JDK 8 runtimes, the terms of the Oracle license do
-NOT apply to the Elliptic Curve Cryptography library; it is licensed under the
-following license, separately from Oracle's JDK & JRE. If you do not wish to
-install the Elliptic Curve Cryptography library, you may delete the library
-named libsunec.so (on Solaris and Linux systems) or sunec.dll (on Windows
-systems) from the JRE bin directory reserved for native libraries.
-
-
---- begin of LICENSE ---
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to ECMAScript Language
-Specification ECMA-262 Edition 5.1 which may be included with
-JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright notice
-Copyright © 2011 Ecma International
-Ecma International
-Rue du Rhone 114
-CH-1204 Geneva
-Tel: +41 22 849 6000
-Fax: +41 22 849 6001
-Web: http://www.ecma-international.org
-
-This document and possible translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it or assist
-in its implementation may be prepared, copied, published, and distributed, in
-whole or in part, without restriction of any kind, provided that the above
-copyright notice and this section are included on all such copies and derivative
-works. However, this document itself may not be modified in any way, including
-by removing the copyright notice or references to Ecma International, except as
-needed for the purpose of developing any document or deliverable produced by
-Ecma International (in which case the rules applied to copyrights must be
-followed) or as required to translate it into languages other than English. The
-limited permissions granted above are perpetual and will not be revoked by Ecma
-International or its successors or assigns. This document and the information
-contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL
-DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY
-WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP
-RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
-PURPOSE." Software License
-
-All Software contained in this document ("Software)" is protected by copyright
-and is being made available under the "BSD License", included below. This
-Software may be subject to third party rights (rights from parties other than
-Ecma International), including patent rights, and no licenses under such third
-party rights are granted under this license even if the third party concerned is
-a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS
-AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR
-INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO
-IMPLEMENT ECMA INTERNATIONAL STANDARDS*. Redistribution and use in source and
-binary forms, with or without modification, are permitted provided that the
-following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation and/or
-other materials provided with the distribution.
-
-3. Neither the name of the authors nor Ecma International may be used to endorse
-or promote products derived from this software without specific prior written
-permission.
-
-THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
-SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
-OF SUCH DAMAGE.
---- end of LICENSE ---
-
-%% This notice is provided with respect to Dynalink library which is included
-with the Nashorn technology.
-
---- begin of LICENSE ---
-Copyright (c) 2009-2013, Attila Szegedi
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-* Neither the name of the copyright holder nor the names of
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---- end of LICENSE ---
-
-%% This notice is provided with respect to Joni library which is included
-with the Nashorn technology.
-
---- begin of LICENSE ---
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to FontConfig 2.5, which may be
-included with JRE 8, JDK 8, and OpenJDK 8 source distributions on
-Linux and Solaris.
-
---- begin of LICENSE ---
-
-Copyright © 2001,2003 Keith Packard
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that the
-above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation, and that
-the name of Keith Packard not be used in advertising or publicity pertaining
-to distribution of the software without specific, written prior permission.
-Keith Packard makes no representations about the suitability of this software
-for any purpose. It is provided "as is" without express or implied warranty.
-
-KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL KEITH
-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
-DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to IAIK PKCS#11 Wrapper,
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-IAIK PKCS#11 Wrapper License
-
-Copyright (c) 2002 Graz University of Technology. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-3. The end-user documentation included with the redistribution, if any, must
- include the following acknowledgment:
-
- "This product includes software developed by IAIK of Graz University of
- Technology."
-
- Alternately, this acknowledgment may appear in the software itself, if and
- wherever such third-party acknowledgments normally appear.
-
-4. The names "Graz University of Technology" and "IAIK of Graz University of
- Technology" must not be used to endorse or promote products derived from this
- software without prior written permission.
-
-5. Products derived from this software may not be called "IAIK PKCS Wrapper",
- nor may "IAIK" appear in their name, without prior written permission of
- Graz University of Technology.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to ICU4C 4.0.1 and ICU4J 4.4, which
-may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 1995-2010 International Business Machines Corporation and others
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, and/or sell copies of the
-Software, and to permit persons to whom the Software is furnished to do so,
-provided that the above copyright notice(s) and this permission notice appear
-in all copies of the Software and that both the above copyright notice(s) and
-this permission notice appear in supporting documentation.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
-NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
-LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY
-DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization of the copyright holder.
-All trademarks and registered trademarks mentioned herein are the property of
-their respective owners.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to IJG JPEG 6b, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-This software is copyright (C) 1991-1998, Thomas G. Lane.
-All Rights Reserved except as specified below.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-software (or portions thereof) for any purpose, without fee, subject to these
-conditions:
-(1) If any part of the source code for this software is distributed, then this
-README file must be included, with this copyright and no-warranty notice
-unaltered; and any additions, deletions, or changes to the original files
-must be clearly indicated in accompanying documentation.
-(2) If only executable code is distributed, then the accompanying
-documentation must state that "this software is based in part on the work of
-the Independent JPEG Group".
-(3) Permission for use of this software is granted only if the user accepts
-full responsibility for any undesirable consequences; the authors accept
-NO LIABILITY for damages of any kind.
-
-These conditions apply to any software derived from or based on the IJG code,
-not just to the unmodified library. If you use our work, you ought to
-acknowledge us.
-
-Permission is NOT granted for the use of any IJG author's name or company name
-in advertising or publicity relating to this software or products derived from
-it. This software may be referred to only as "the Independent JPEG Group's
-software".
-
-We specifically permit and encourage the use of this software as the basis of
-commercial products, provided that all warranty or liability claims are
-assumed by the product vendor.
-
---- end of LICENSE ---
-
---------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Joni v1.1.9, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to JOpt-Simple v3.0, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- Copyright (c) 2004-2009 Paul R. Holser, Jr.
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
---- end of LICENSE ---
-
---------------------------------------------------------------------------------
-
-%% This notice is provided with respect to JSON, which may be included
-with JRE 8 & JDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2002 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Kerberos functionality, which
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- (C) Copyright IBM Corp. 1999 All Rights Reserved.
- Copyright 1997 The Open Group Research Institute. All rights reserved.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Kerberos functionality from
-FundsXpress, INC., which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- Copyright (C) 1998 by the FundsXpress, INC.
-
- All rights reserved.
-
- Export of this software from the United States of America may require
- a specific license from the United States Government. It is the
- responsibility of any person or organization contemplating export to
- obtain such a license before exporting.
-
- WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
- distribute this software and its documentation for any purpose and
- without fee is hereby granted, provided that the above copyright
- notice appear in all copies and that both that copyright notice and
- this permission notice appear in supporting documentation, and that
- the name of FundsXpress. not be used in advertising or publicity pertaining
- to distribution of the software without specific, written prior
- permission. FundsXpress makes no representations about the suitability of
- this software for any purpose. It is provided "as is" without express
- or implied warranty.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Kronos OpenGL headers, which may be
-included with JDK 8 and OpenJDK 8 source distributions.
-
---- begin of LICENSE ---
-
- Copyright (c) 2007 The Khronos Group Inc.
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and/or associated documentation files (the "Materials"), to
- deal in the Materials without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Materials, and to permit persons to whom the Materials are
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Materials.
-
- THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
- MATERIALS.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% Portions Copyright Eastman Kodak Company 1992
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to libpng 1.5.4, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-This copy of the libpng notices is provided for your convenience. In case of
-any discrepancy between this copy and the notices in the file png.h that is
-included in the libpng distribution, the latter shall prevail.
-
-COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
-
-If you modify libpng you may insert additional notices immediately following
-this sentence.
-
-This code is released under the libpng license.
-
-libpng versions 1.2.6, August 15, 2004, through 1.5.4, July 7, 2011, are
-Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
-
- Simon-Pierre Cadieux
- Eric S. Raymond
- Gilles Vollant
-
-and with the following additions to the disclaimer:
-
- There is no warranty against interference with your enjoyment of the
- library or against infringement. There is no warranty that our
- efforts or the library will fulfill any of your particular purposes
- or needs. This library is provided with all faults, and the entire
- risk of satisfactory quality, performance, accuracy, and effort is with
- the user.
-
-libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
-
- Tom Lane
- Glenn Randers-Pehrson
- Willem van Schaik
-
-libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
-
- John Bowler
- Kevin Bracey
- Sam Bushell
- Magnus Holmgren
- Greg Roelofs
- Tom Tanner
-
-libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
-
-For the purposes of this copyright and license, "Contributing Authors"
-is defined as the following set of individuals:
-
- Andreas Dilger
- Dave Martindale
- Guy Eric Schalnat
- Paul Schmidt
- Tim Wegner
-
-The PNG Reference Library is supplied "AS IS". The Contributing Authors
-and Group 42, Inc. disclaim all warranties, expressed or implied,
-including, without limitation, the warranties of merchantability and of
-fitness for any purpose. The Contributing Authors and Group 42, Inc.
-assume no liability for direct, indirect, incidental, special, exemplary,
-or consequential damages, which may result from the use of the PNG
-Reference Library, even if advised of the possibility of such damage.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-source code, or portions hereof, for any purpose, without fee, subject
-to the following restrictions:
-
-1. The origin of this source code must not be misrepresented.
-
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
-
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
-
-The Contributing Authors and Group 42, Inc. specifically permit, without
-fee, and encourage the use of this source code as a component to
-supporting the PNG file format in commercial products. If you use this
-source code in a product, acknowledgment is not required but would be
-appreciated.
-
-
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
-
- printf("%s",png_get_copyright(NULL));
-
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
-
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
-
-Glenn Randers-Pehrson
-glennrp at users.sourceforge.net
-July 7, 2011
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to libungif 4.1.3, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Little CMS 2.4, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Little CMS
-Copyright (c) 1998-2010 Marti Maria Saguer
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the
-U.S. and other countries.
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Mesa 3D Graphics Library v4.1,
-which may be included with JRE 8, JDK 8, and OpenJDK 8 source distributions.
-
---- begin of LICENSE ---
-
- Mesa 3-D graphics library
- Version: 4.1
-
- Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Mozilla Network Security
-Services (NSS), which is supplied with the JDK test suite in the OpenJDK
-source code repository. It is licensed under Mozilla Public License (MPL),
-version 2.0.
-
-The NSS libraries are supplied in executable form, built from unmodified
-NSS source code labeled with the "NSS_3.13.1_RTM" release tag.
-
-The NSS source code is available in the OpenJDK source code repository at:
- jdk/test/sun/security/pkcs11/nss/src
-
-The NSS libraries are available in the OpenJDK source code repository at:
- jdk/test/sun/security/pkcs11/nss/lib
-
---- begin of LICENSE ---
-
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
- means each individual or legal entity that creates, contributes to
- the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
- means the combination of the Contributions of others (if any) used
- by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
- means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
- means Source Code Form to which the initial Contributor has attached
- the notice in Exhibit A, the Executable Form of such Source Code
- Form, and Modifications of such Source Code Form, in each case
- including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
- means
-
- (a) that the initial Contributor has attached the notice described
- in Exhibit B to the Covered Software; or
-
- (b) that the Covered Software was made available under the terms of
- version 1.1 or earlier of the License, but not also under the
- terms of a Secondary License.
-
-1.6. "Executable Form"
- means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
- means a work that combines Covered Software with other material, in
- a separate file or files, that is not Covered Software.
-
-1.8. "License"
- means this document.
-
-1.9. "Licensable"
- means having the right to grant, to the maximum extent possible,
- whether at the time of the initial grant or subsequently, any and
- all of the rights conveyed by this License.
-
-1.10. "Modifications"
- means any of the following:
-
- (a) any file in Source Code Form that results from an addition to,
- deletion from, or modification of the contents of Covered
- Software; or
-
- (b) any new file in Source Code Form that contains any Covered
- Software.
-
-1.11. "Patent Claims" of a Contributor
- means any patent claim(s), including without limitation, method,
- process, and apparatus claims, in any patent Licensable by such
- Contributor that would be infringed, but for the grant of the
- License, by the making, using, selling, offering for sale, having
- made, import, or transfer of either its Contributions or its
- Contributor Version.
-
-1.12. "Secondary License"
- means either the GNU General Public License, Version 2.0, the GNU
- Lesser General Public License, Version 2.1, the GNU Affero General
- Public License, Version 3.0, or any later versions of those
- licenses.
-
-1.13. "Source Code Form"
- means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
- means an individual or a legal entity exercising rights under this
- License. For legal entities, "You" includes any entity that
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
- Licensable by such Contributor to use, reproduce, make available,
- modify, display, perform, distribute, and otherwise exploit its
- Contributions, either on an unmodified basis, with Modifications, or
- as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
- for sale, have made, import, and otherwise transfer either its
- Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
- or
-
-(b) for infringements caused by: (i) Your and any other third party's
- modifications of Covered Software, or (ii) the combination of its
- Contributions with other software (except as part of its Contributor
- Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
- its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
- Form, as described in Section 3.1, and You must inform recipients of
- the Executable Form how they can obtain a copy of such Source Code
- Form by reasonable means in a timely manner, at a charge no more
- than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
- License, or sublicense it under different terms, provided that the
- license for the Executable Form does not attempt to limit or alter
- the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-* *
-* 6. Disclaimer of Warranty *
-* ------------------------- *
-* *
-* Covered Software is provided under this License on an "as is" *
-* basis, without warranty of any kind, either expressed, implied, or *
-* statutory, including, without limitation, warranties that the *
-* Covered Software is free of defects, merchantable, fit for a *
-* particular purpose or non-infringing. The entire risk as to the *
-* quality and performance of the Covered Software is with You. *
-* Should any Covered Software prove defective in any respect, You *
-* (not any Contributor) assume the cost of any necessary servicing, *
-* repair, or correction. This disclaimer of warranty constitutes an *
-* essential part of this License. No use of any Covered Software is *
-* authorized under this License except under this disclaimer. *
-* *
-************************************************************************
-
-************************************************************************
-* *
-* 7. Limitation of Liability *
-* -------------------------- *
-* *
-* Under no circumstances and under no legal theory, whether tort *
-* (including negligence), contract, or otherwise, shall any *
-* Contributor, or anyone who distributes Covered Software as *
-* permitted above, be liable to You for any direct, indirect, *
-* special, incidental, or consequential damages of any character *
-* including, without limitation, damages for lost profits, loss of *
-* goodwill, work stoppage, computer failure or malfunction, or any *
-* and all other commercial damages or losses, even if such party *
-* shall have been informed of the possibility of such damages. This *
-* limitation of liability shall not apply to liability for death or *
-* personal injury resulting from such party's negligence to the *
-* extent applicable law prohibits such limitation. Some *
-* jurisdictions do not allow the exclusion or limitation of *
-* incidental or consequential damages, so this exclusion and *
-* limitation may not apply to You. *
-* *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
- This Source Code Form is "Incompatible With Secondary Licenses", as
- defined by the Mozilla Public License, v. 2.0.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to PC/SC Lite for Suse Linux v.1.1.1,
-which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
-
---- begin of LICENSE ---
-
-Copyright (c) 1999-2004 David Corcoran <corcoran@linuxnet.com>
-Copyright (c) 1999-2004 Ludovic Rousseau <ludovic.rousseau (at) free.fr>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement:
- This product includes software developed by:
- David Corcoran <corcoran@linuxnet.com>
- http://www.linuxnet.com (MUSCLE)
-4. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-Changes to this license can be made only by the copyright author with
-explicit written consent.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to PorterStemmer v4, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-See: http://tartarus.org/~martin/PorterStemmer
-
-The software is completely free for any purpose, unless notes at the head of
-the program text indicates otherwise (which is rare). In any case, the notes
-about licensing are never more restrictive than the BSD License.
-
-In every case where the software is not written by me (Martin Porter), this
-licensing arrangement has been endorsed by the contributor, and it is
-therefore unnecessary to ask the contributor again to confirm it.
-
-I have not asked any contributors (or their employers, if they have them) for
-proofs that they have the right to distribute their software in this way.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Relax NG Object/Parser v.20050510,
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) Kohsuke Kawaguchi
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions: The above copyright
-notice and this permission notice shall be included in all copies or
-substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to RelaxNGCC v1.12, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-3. The end-user documentation included with the redistribution, if any, must
- include the following acknowledgment:
-
- "This product includes software developed by Daisuke Okajima
- and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)."
-
-Alternately, this acknowledgment may appear in the software itself, if and
-wherever such third-party acknowledgments normally appear.
-
-4. The names of the copyright holders must not be used to endorse or promote
- products derived from this software without prior written permission. For
- written permission, please contact the copyright holders.
-
-5. Products derived from this software may not be called "RELAXNGCC", nor may
- "RELAXNGCC" appear in their name, without prior written permission of the
- copyright holders.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE
-SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to SAX 2.0.1, which may be included
-with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- SAX is free!
-
- In fact, it's not possible to own a license to SAX, since it's been placed in
- the public domain.
-
- No Warranty
-
- Because SAX is released to the public domain, there is no warranty for the
- design or for the software implementation, to the extent permitted by
- applicable law. Except when otherwise stated in writing the copyright holders
- and/or other parties provide SAX "as is" without warranty of any kind, either
- expressed or implied, including, but not limited to, the implied warranties
- of merchantability and fitness for a particular purpose. The entire risk as
- to the quality and performance of SAX is with you. Should SAX prove
- defective, you assume the cost of all necessary servicing, repair or
- correction.
-
- In no event unless required by applicable law or agreed to in writing will
- any copyright holder, or any other party who may modify and/or redistribute
- SAX, be liable to you for damages, including any general, special, incidental
- or consequential damages arising out of the use or inability to use SAX
- (including but not limited to loss of data or data being rendered inaccurate
- or losses sustained by you or third parties or a failure of the SAX to
- operate with any other programs), even if such holder or other party has been
- advised of the possibility of such damages.
-
- Copyright Disclaimers
-
- This page includes statements to that effect by David Megginson, who would
- have been able to claim copyright for the original work. SAX 1.0
-
- Version 1.0 of the Simple API for XML (SAX), created collectively by the
- membership of the XML-DEV mailing list, is hereby released into the public
- domain.
-
- No one owns SAX: you may use it freely in both commercial and non-commercial
- applications, bundle it with your software distribution, include it on a
- CD-ROM, list the source code in a book, mirror the documentation at your own
- web site, or use it in any other way you see fit.
-
- David Megginson, sax@megginson.com
- 1998-05-11
-
- SAX 2.0
-
- I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and
- release all of the SAX 2.0 source code, compiled code, and documentation
- contained in this distribution into the Public Domain. SAX comes with NO
- WARRANTY or guarantee of fitness for any purpose.
-
- David Megginson, david@megginson.com
- 2000-05-05
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to SoftFloat version 2b, which may be
-included with JRE 8, JDK 8, and OpenJDK 8 on Linux/ARM.
-
---- begin of LICENSE ---
-
-Use of any of this software is governed by the terms of the license below:
-
-SoftFloat was written by me, John R. Hauser. This work was made possible in
-part by the International Computer Science Institute, located at Suite 600,
-1947 Center Street, Berkeley, California 94704. Funding was partially
-provided by the National Science Foundation under grant MIP-9311980. The
-original version of this code was written as part of a project to build
-a fixed-point vector processor in collaboration with the University of
-California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL
-LOSSES, COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO
-FURTHERMORE EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER
-SCIENCE INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES,
-COSTS, OR OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE
-SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, provided
-that the minimal documentation requirements stated in the source code are
-satisfied.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Sparkle 1.5,
-which may be included with JRE 8 on Mac OS X.
-
---- begin of LICENSE ---
-
-Copyright (c) 2012 Sparkle.org and Andy Matuschak
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% Portions licensed from Taligent, Inc.
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Thai Dictionary, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (C) 1982 The Royal Institute, Thai Royal Government.
-
-Copyright (C) 1998 National Electronics and Computer Technology Center,
-National Science and Technology Development Agency,
-Ministry of Science Technology and Environment,
-Thai Royal Government.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Unicode 6.2.0 & CLDR 21.0.1
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Unicode Terms of Use
-
-For the general privacy policy governing access to this site, see the Unicode
-Privacy Policy. For trademark usage, see the Unicode® Consortium Name and
-Trademark Usage Policy.
-
-A. Unicode Copyright.
- 1. Copyright © 1991-2013 Unicode, Inc. All rights reserved.
-
- 2. Certain documents and files on this website contain a legend indicating
- that "Modification is permitted." Any person is hereby authorized,
- without fee, to modify such documents and files to create derivative
- works conforming to the Unicode® Standard, subject to Terms and
- Conditions herein.
-
- 3. Any person is hereby authorized, without fee, to view, use, reproduce,
- and distribute all documents and files solely for informational
- purposes in the creation of products supporting the Unicode Standard,
- subject to the Terms and Conditions herein.
-
- 4. Further specifications of rights and restrictions pertaining to the use
- of the particular set of data files known as the "Unicode Character
- Database" can be found in Exhibit 1.
-
- 5. Each version of the Unicode Standard has further specifications of
- rights and restrictions of use. For the book editions (Unicode 5.0 and
- earlier), these are found on the back of the title page. The online
- code charts carry specific restrictions. All other files, including
- online documentation of the core specification for Unicode 6.0 and
- later, are covered under these general Terms of Use.
-
- 6. No license is granted to "mirror" the Unicode website where a fee is
- charged for access to the "mirror" site.
-
- 7. Modification is not permitted with respect to this document. All copies
- of this document must be verbatim.
-
-B. Restricted Rights Legend. Any technical data or software which is licensed
- to the United States of America, its agencies and/or instrumentalities
- under this Agreement is commercial technical data or commercial computer
- software developed exclusively at private expense as defined in FAR 2.101,
- or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use,
- duplication, or disclosure by the Government is subject to restrictions as
- set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov
- 1995) and this Agreement. For Software, in accordance with FAR 12-212 or
- DFARS 227-7202, as applicable, use, duplication or disclosure by the
- Government is subject to the restrictions set forth in this Agreement.
-
-C. Warranties and Disclaimers.
- 1. This publication and/or website may include technical or typographical
- errors or other inaccuracies . Changes are periodically added to the
- information herein; these changes will be incorporated in new editions
- of the publication and/or website. Unicode may make improvements and/or
- changes in the product(s) and/or program(s) described in this
- publication and/or website at any time.
-
- 2. If this file has been purchased on magnetic or optical media from
- Unicode, Inc. the sole and exclusive remedy for any claim will be
- exchange of the defective media within ninety (90) days of original
- purchase.
-
- 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS
- PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED,
- OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
- UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR
- OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH
- ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE.
-
-D. Waiver of Damages. In no event shall Unicode or its licensors be liable for
- any special, incidental, indirect or consequential damages of any kind, or
- any damages whatsoever, whether or not Unicode was advised of the
- possibility of the damage, including, without limitation, those resulting
- from the following: loss of use, data or profits, in connection with the
- use, modification or distribution of this information or its derivatives.
-
-E.Trademarks & Logos.
- 1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode,
- Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of
- Unicode, Inc. Use of the information and materials found on this
- website indicates your acknowledgement of Unicode, Inc.’s exclusive
- worldwide rights in the Unicode Word Mark, the Unicode Logo, and the
- Unicode trade names.
-
- 2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark
- Policy”) are incorporated herein by reference and you agree to abide by
- the provisions of the Trademark Policy, which may be changed from time
- to time in the sole discretion of Unicode, Inc.
-
- 3. All third party trademarks referenced herein are the property of their
- respective owners.
-
-Miscellaneous.
- 1. Jurisdiction and Venue. This server is operated from a location in the
- State of California, United States of America. Unicode makes no
- representation that the materials are appropriate for use in other
- locations. If you access this server from other locations, you are
- responsible for compliance with local laws. This Agreement, all use of
- this site and any claims and damages resulting from use of this site are
- governed solely by the laws of the State of California without regard to
- any principles which would apply the laws of a different jurisdiction.
- The user agrees that any disputes regarding this site shall be resolved
- solely in the courts located in Santa Clara County, California. The user
- agrees said courts have personal jurisdiction and agree to waive any
- right to transfer the dispute to any other forum.
-
- 2. Modification by Unicode. Unicode shall have the right to modify this
- Agreement at any time by posting it to this site. The user may not
- assign any part of this Agreement without Unicode’s prior written
- consent.
-
- 3. Taxes. The user agrees to pay any taxes arising from access to this
- website or use of the information herein, except for those based on
- Unicode’s net income.
-
- 4. Severability. If any provision of this Agreement is declared invalid or
- unenforceable, the remaining provisions of this Agreement shall remain
- in effect.
-
- 5. Entire Agreement. This Agreement constitutes the entire agreement
- between the parties.
-
-EXHIBIT 1
-UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
-
-Unicode Data Files include all data files under the directories
-http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
-http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF
-online code charts under the directory http://www.unicode.org/Public/.
-Software includes any source code published in the Unicode Standard or under
-the directories http://www.unicode.org/Public/,
-http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/.
-
-NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
-INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA
-FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO
-BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT
-AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR
-SOFTWARE.
-
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under the
-Terms of Use in http://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of the Unicode data files and any associated documentation (the "Data Files")
-or Unicode software and any associated documentation (the "Software") to deal
-in the Data Files or Software without restriction, including without
-limitation the rights to use, copy, modify, merge, publish, distribute, and/or
-sell copies of the Data Files or Software, and to permit persons to whom the
-Data Files or Software are furnished to do so, provided that (a) the above
-copyright notice(s) and this permission notice appear with all copies of the
-Data Files or Software, (b) both the above copyright notice(s) and this
-permission notice appear in associated documentation, and (c) there is clear
-notice in each modified Data File or in the Software as well as in the
-documentation associated with the Data File(s) or Software that the data or
-software has been modified.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD
-PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
-THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE
-DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in these Data Files or Software without prior written authorization of the
-copyright holder.
-
-Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United
-States and other countries. All third party trademarks referenced herein are
-the property of their respective owners.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to UPX v3.01, which may be included
-with JRE 8 on Windows.
-
---- begin of LICENSE ---
-
-Use of any of this software is governed by the terms of the license below:
-
-
- ooooo ooo ooooooooo. ooooooo ooooo
- `888' `8' `888 `Y88. `8888 d8'
- 888 8 888 .d88' Y888..8P
- 888 8 888ooo88P' `8888'
- 888 8 888 .8PY888.
- `88. .8' 888 d8' `888b
- `YbodP' o888o o888o o88888o
-
-
- The Ultimate Packer for eXecutables
- Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar
- http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
- http://www.nexus.hu/upx
- http://upx.tsx.org
-
-
-PLEASE CAREFULLY READ THIS LICENSE AGREEMENT, ESPECIALLY IF YOU PLAN
-TO MODIFY THE UPX SOURCE CODE OR USE A MODIFIED UPX VERSION.
-
-
-ABSTRACT
-========
-
- UPX and UCL are copyrighted software distributed under the terms
- of the GNU General Public License (hereinafter the "GPL").
-
- The stub which is imbedded in each UPX compressed program is part
- of UPX and UCL, and contains code that is under our copyright. The
- terms of the GNU General Public License still apply as compressing
- a program is a special form of linking with our stub.
-
- As a special exception we grant the free usage of UPX for all
- executables, including commercial programs.
- See below for details and restrictions.
-
-
-COPYRIGHT
-=========
-
- UPX and UCL are copyrighted software. All rights remain with the authors.
-
- UPX is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
- UPX is Copyright (C) 1996-2000 Laszlo Molnar
-
- UCL is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
-
-
-GNU GENERAL PUBLIC LICENSE
-==========================
-
- UPX and the UCL library are free software; you can redistribute them
- and/or modify them under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
-
- UPX and UCL are distributed in the hope that they 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 for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING.
-
-
-SPECIAL EXCEPTION FOR COMPRESSED EXECUTABLES
-============================================
-
- The stub which is imbedded in each UPX compressed program is part
- of UPX and UCL, and contains code that is under our copyright. The
- terms of the GNU General Public License still apply as compressing
- a program is a special form of linking with our stub.
-
- Hereby Markus F.X.J. Oberhumer and Laszlo Molnar grant you special
- permission to freely use and distribute all UPX compressed programs
- (including commercial ones), subject to the following restrictions:
-
- 1. You must compress your program with a completely unmodified UPX
- version; either with our precompiled version, or (at your option)
- with a self compiled version of the unmodified UPX sources as
- distributed by us.
- 2. This also implies that the UPX stub must be completely unmodfied, i.e.
- the stub imbedded in your compressed program must be byte-identical
- to the stub that is produced by the official unmodified UPX version.
- 3. The decompressor and any other code from the stub must exclusively get
- used by the unmodified UPX stub for decompressing your program at
- program startup. No portion of the stub may get read, copied,
- called or otherwise get used or accessed by your program.
-
-
-ANNOTATIONS
-===========
-
- - You can use a modified UPX version or modified UPX stub only for
- programs that are compatible with the GNU General Public License.
-
- - We grant you special permission to freely use and distribute all UPX
- compressed programs. But any modification of the UPX stub (such as,
- but not limited to, removing our copyright string or making your
- program non-decompressible) will immediately revoke your right to
- use and distribute a UPX compressed program.
-
- - UPX is not a software protection tool; by requiring that you use
- the unmodified UPX version for your proprietary programs we
- make sure that any user can decompress your program. This protects
- both you and your users as nobody can hide malicious code -
- any program that cannot be decompressed is highly suspicious
- by definition.
-
- - You can integrate all or part of UPX and UCL into projects that
- are compatible with the GNU GPL, but obviously you cannot grant
- any special exceptions beyond the GPL for our code in your project.
-
- - We want to actively support manufacturers of virus scanners and
- similar security software. Please contact us if you would like to
- incorporate parts of UPX or UCL into such a product.
-
-
-
-Markus F.X.J. Oberhumer Laszlo Molnar
-markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu
-
-Linz, Austria, 25 Feb 2000
-
-Additional License(s)
-
-The UPX license file is at http://upx.sourceforge.net/upx-license.html.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Xfree86-VidMode Extension 1.0,
-which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
-
---- begin of LICENSE ---
-
-Version 1.1 of XFree86 ProjectLicence.
-
-Copyright (C) 1994-2004 The XFree86 Project, Inc. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicence, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so,subject to the following conditions:
-
- 1. Redistributions of source code must retain the above copyright
- notice,this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution, and in the same place
- and form as other copyright, license and disclaimer information.
-
- 3. The end-user documentation included with the redistribution, if any,must
- include the following acknowledgment: "This product includes
- software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and
- its contributors", in the same place and form as other third-party
- acknowledgments. Alternately, this acknowledgment may appear in the software
- itself, in the same form and location as other such third-party
- acknowledgments.
-
- 4. Except as contained in this notice, the name of The XFree86 Project,Inc
- shall not be used in advertising or otherwise to promote the sale, use
- or other dealings in this Software without prior written authorization from
- The XFree86 Project, Inc.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- EVENT SHALL THE XFREE86 PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to X Window System 6.8.2, which may be
-included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
-
---- begin of LICENSE ---
-
- Licenses
-The X.Org Foundation March 2004
-
-1. Introduction
-
-The X.org Foundation X Window System distribution is a compilation of code and
-documentation from many sources. This document is intended primarily as a
-guide to the licenses used in the distribution: you must check each file
-and/or package for precise redistribution terms. None-the-less, this summary
-may be useful to many users. No software incorporating the XFree86 1.1 license
-has been incorporated.
-
-This document is based on the compilation from XFree86.
-
-2. XFree86 License
-
-XFree86 code without an explicit copyright is covered by the following
-copyright/license:
-
-Copyright (C) 1994-2003 The XFree86 Project, Inc. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the XFree86 Project shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the XFree86 Project.
-
-3. Other Licenses
-
-Portions of code are covered by the following licenses/copyrights. See
-individual files for the copyright dates.
-
-3.1. X/MIT Copyrights
-
-3.1.1. X Consortium
-
-Copyright (C) <date> X Consortium
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
-CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings in
-this Software without prior written authorization from the X Consortium.
-
-X Window System is a trademark of X Consortium, Inc.
-
-3.1.2. The Open Group
-
-Copyright <date> The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that the
-above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings in
-this Software without prior written authorization from The Open Group. 3.2.
-Berkeley-based copyrights:
-
-o
-3.2.1. General
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.2.2. UCB/LBL
-
-Copyright (c) 1993 The Regents of the University of California. All rights
-reserved.
-
-This software was developed by the Computer Systems Engineering group at
-Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and contributed to
-Berkeley.
-
-All advertising materials mentioning features or use of this software must
-display the following acknowledgement: This product includes software
-developed by the University of California, Lawrence Berkeley Laboratory.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement: This product includes software
- developed by the University of California, Berkeley and its contributors.
-
- 4. Neither the name of the University nor the names of its contributors may
- be used to endorse or promote products derived from this software without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.3. The
-NetBSD Foundation, Inc.
-
-Copyright (c) 2003 The NetBSD Foundation, Inc. All rights reserved.
-
-This code is derived from software contributed to The NetBSD Foundation by Ben
-Collver <collver1@attbi.com>
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement: This product includes software
- developed by the NetBSD Foundation, Inc. and its contributors.
-
- 4. Neither the name of The NetBSD Foundation nor the names of its
- contributors may be used to endorse or promote products derived from this
- software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS
-IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.4. Theodore
-Ts'o.
-
-Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All rights
-reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- and the entire permission notice in its entirety, including the disclaimer
- of warranties.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. he name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE, ALL OF WHICH ARE HEREBY DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.2.5. Theo de Raadt and Damien Miller
-
-Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. Copyright (c)
-2001-2002 Damien Miller. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.2.6. Todd C. Miller
-
-Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
-
-Permission to use, copy, modify, and distribute this software for any purpose
-with or without fee is hereby granted, provided that the above copyright
-notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 3.2.7. Thomas
-Winischhofer
-
-Copyright (C) 2001-2004 Thomas Winischhofer
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.3. NVIDIA Corp
-
-Copyright (c) 1996 NVIDIA, Corp. All rights reserved.
-
-NOTICE TO USER: The source code is copyrighted under U.S. and international
-laws. NVIDIA, Corp. of Sunnyvale, California owns the copyright and as design
-patents pending on the design and interface of the NV chips. Users and
-possessors of this source code are hereby granted a nonexclusive, royalty-free
-copyright and design patent license to use this code in individual and
-commercial software.
-
-Any use of this source code must include, in the user documentation and
-internal comments to the code, notices to the end user as follows:
-
-Copyright (c) 1996 NVIDIA, Corp. NVIDIA design patents pending in the U.S. and
-foreign countries.
-
-NVIDIA, CORP. MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
-CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
-WARRANTY OF ANY KIND. NVIDIA, CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORP. BE LIABLE
-FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
-DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. 3.4. GLX Public
-License
-
-GLX PUBLIC LICENSE (Version 1.0 (2/11/99)) ("License")
-
-Subject to any third party claims, Silicon Graphics, Inc. ("SGI") hereby
-grants permission to Recipient (defined below), under Recipient's copyrights
-in the Original Software (defined below), to use, copy, modify, merge,
-publish, distribute, sublicense and/or sell copies of Subject Software
-(defined below), and to permit persons to whom the Subject Software is
-furnished in accordance with this License to do the same, subject to all of
-the following terms and conditions, which Recipient accepts by engaging in any
-such use, copying, modifying, merging, publishing, distributing, sublicensing
-or selling:
-
-1. Definitions.
-
- (a) "Original Software" means source code of computer software code which
- is described in Exhibit A as Original Software.
-
- (b) "Modifications" means any addition to or deletion from the substance
- or structure of either the Original Software or any previous
- Modifications. When Subject Software is released as a series of files, a
- Modification means (i) any addition to or deletion from the contents of a
- file containing Original Software or previous Modifications and (ii) any
- new file that contains any part of the Original Code or previous
- Modifications.
-
- (c) "Subject Software" means the Original Software or Modifications or the
- combination of the Original Software and Modifications, or portions of any
- of the foregoing.
-
- (d) "Recipient" means an individual or a legal entity exercising rights
- under, and complying with all of the terms of, this License. For legal
- entities, "Recipient" includes any entity which controls, is controlled
- by, or is under common control with Recipient. For purposes of this
- definition, "control" of an entity means (a) the power, direct or
- indirect, to direct or manage such entity, or (b) ownership of fifty
- percent (50%) or more of the outstanding shares or beneficial ownership of
- such entity.
-
-2. Redistribution of Source Code Subject to These Terms. Redistributions of
-Subject Software in source code form must retain the notice set forth in
-Exhibit A, below, in every file. A copy of this License must be included in
-any documentation for such Subject Software where the recipients' rights
-relating to Subject Software are described. Recipient may distribute the
-source code version of Subject Software under a license of Recipient's choice,
-which may contain terms different from this License, provided that (i)
-Recipient is in compliance with the terms of this License, and (ii) the
-license terms include this Section 2 and Sections 3, 4, 7, 8, 10, 12 and 13 of
-this License, which terms may not be modified or superseded by any other terms
-of such license. If Recipient distributes the source code version under a
-different license Recipient must make it absolutely clear that any terms which
-differ from this License are offered by Recipient alone, not by SGI. Recipient
-hereby agrees to indemnify SGI for any liability incurred by SGI as a result
-of any such terms Recipient offers.
-
-3. Redistribution in Executable Form. The notice set forth in Exhibit A must
-be conspicuously included in any notice in an executable version of Subject
-Software, related documentation or collateral in which Recipient describes the
-user's rights relating to the Subject Software. Recipient may distribute the
-executable version of Subject Software under a license of Recipient's choice,
-which may contain terms different from this License, provided that (i)
-Recipient is in compliance with the terms of this License, and (ii) the
-license terms include this Section 3 and Sections 4, 7, 8, 10, 12 and 13 of
-this License, which terms may not be modified or superseded by any other terms
-of such license. If Recipient distributes the executable version under a
-different license Recipient must make it absolutely clear that any terms which
-differ from this License are offered by Recipient alone, not by SGI. Recipient
-hereby agrees to indemnify SGI for any liability incurred by SGI as a result
-of any such terms Recipient offers.
-
-4. Termination. This License and the rights granted hereunder will terminate
-automatically if Recipient fails to comply with terms herein and fails to cure
-such breach within 30 days of the breach. Any sublicense to the Subject
-Software which is properly granted shall survive any termination of this
-License absent termination by the terms of such sublicense. Provisions which,
-by their nature, must remain in effect beyond the termination of this License
-shall survive.
-
-5. No Trademark Rights. This License does not grant any rights to use any
-trade name, trademark or service mark whatsoever. No trade name, trademark or
-service mark of SGI may be used to endorse or promote products derived from
-the Subject Software without prior written permission of SGI.
-
-6. No Other Rights. This License does not grant any rights with respect to the
-OpenGL API or to any software or hardware implementation thereof or to any
-other software whatsoever, nor shall any other rights or licenses not
-expressly granted hereunder arise by implication, estoppel or otherwise with
-respect to the Subject Software. Title to and ownership of the Original
-Software at all times remains with SGI. All rights in the Original Software
-not expressly granted under this License are reserved.
-
-7. Compliance with Laws; Non-Infringement. Recipient shall comply with all
-applicable laws and regulations in connection with use and distribution of the
-Subject Software, including but not limited to, all export and import control
-laws and regulations of the U.S. government and other countries. Recipient may
-not distribute Subject Software that (i) in any way infringes (directly or
-contributorily) the rights (including patent, copyright, trade secret,
-trademark or other intellectual property rights of any kind) of any other
-person or entity or (ii) breaches any representation or warranty, express,
-implied or statutory, which under any applicable law it might be deemed to
-have been distributed.
-
-8. Claims of Infringement. If Recipient at any time has knowledge of any one
-or more third party claims that reproduction, modification, use, distribution,
-import or sale of Subject Software (including particular functionality or code
-incorporated in Subject Software) infringes the third party's intellectual
-property rights, Recipient must place in a well-identified web page bearing
-the title "LEGAL" a description of each such claim and a description of the
-party making each such claim in sufficient detail that a user of the Subject
-Software will know whom to contact regarding the claim. Also, upon gaining
-such knowledge of any such claim, Recipient must conspicuously include the URL
-for such web page in the Exhibit A notice required under Sections 2 and 3,
-above, and in the text of any related documentation, license agreement or
-collateral in which Recipient describes end user's rights relating to the
-Subject Software. If Recipient obtains such knowledge after it makes Subject
-Software available to any other person or entity, Recipient shall take other
-steps (such as notifying appropriate mailing lists or newsgroups) reasonably
-calculated to inform those who received the Subject Software that new
-knowledge has been obtained.
-
-9. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
-WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
-LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
-MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- INFRINGING. SGI ASSUMES NO
-RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
-PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
-SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
-ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
-HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
-WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
-CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
-CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK
-STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
-COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
-THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY
-TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO
-THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT
-ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
-THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT.
-
-11. Indemnity. Recipient shall be solely responsible for damages arising,
-directly or indirectly, out of its utilization of rights under this License.
-Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from
-and against any loss, liability, damages, costs or expenses (including the
-payment of reasonable attorneys fees) arising out of Recipient's use,
-modification, reproduction and distribution of the Subject Software or out of
-any representation or warranty made by Recipient.
-
-12. U.S. Government End Users. The Subject Software is a "commercial item"
-consisting of "commercial computer software" as such terms are defined in
-title 48 of the Code of Federal Regulations and all U.S. Government End Users
-acquire only the rights set forth in this License and are subject to the terms
-of this License.
-
-13. Miscellaneous. This License represents the complete agreement concerning
-subject matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed so as to achieve as nearly as
-possible the same economic effect as the original provision and the remainder
-of this License will remain in effect. This License shall be governed by and
-construed in accordance with the laws of the United States and the State of
-California as applied to agreements entered into and to be performed entirely
-within California between California residents. Any litigation relating to
-this License shall be subject to the exclusive jurisdiction of the Federal
-Courts of the Northern District of California (or, absent subject matter
-jurisdiction in such courts, the courts of the State of California), with
-venue lying exclusively in Santa Clara County, California, with the losing
-party responsible for costs, including without limitation, court costs and
-reasonable attorneys fees and expenses. The application of the United Nations
-Convention on Contracts for the International Sale of Goods is expressly
-excluded. Any law or regulation which provides that the language of a contract
-shall be construed against the drafter shall not apply to this License.
-
-Exhibit A
-
-The contents of this file are subject to Sections 2, 3, 4, 7, 8, 10, 12 and 13
-of the GLX Public License Version 1.0 (the "License"). You may not use this
-file except in compliance with those sections of the License. You may obtain a
-copy of the License at Silicon Graphics, Inc., attn: Legal Services, 2011 N.
-Shoreline Blvd., Mountain View, CA 94043 or at
-http://www.sgi.com/software/opensource/glx/license.html.
-
-Software distributed under the License is distributed on an "AS IS" basis. ALL
-WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
-WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF NON-
-INFRINGEMENT. See the License for the specific language governing rights and
-limitations under the License.
-
-The Original Software is GLX version 1.2 source code, released February, 1999.
-The developer of the Original Software is Silicon Graphics, Inc. Those
-portions of the Subject Software created by Silicon Graphics, Inc. are
-Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. 3.5. CID
-Font Code Public License
-
-CID FONT CODE PUBLIC LICENSE (Version 1.0 (3/31/99))("License")
-
-Subject to any applicable third party claims, Silicon Graphics, Inc. ("SGI")
-hereby grants permission to Recipient (defined below), under SGI's copyrights
-in the Original Software (defined below), to use, copy, modify, merge,
-publish, distribute, sublicense and/or sell copies of Subject Software
-(defined below) in both source code and executable form, and to permit persons
-to whom the Subject Software is furnished in accordance with this License to
-do the same, subject to all of the following terms and conditions, which
-Recipient accepts by engaging in any such use, copying, modifying, merging,
-publication, distributing, sublicensing or selling:
-
-1. Definitions.
-
- a. "Original Software" means source code of computer software code that is
- described in Exhibit A as Original Software.
-
- b. "Modifications" means any addition to or deletion from the substance or
- structure of either the Original Software or any previous Modifications.
- When Subject Software is released as a series of files, a Modification
- means (i) any addition to or deletion from the contents of a file
- containing Original Software or previous Modifications and (ii) any new
- file that contains any part of the Original Code or previous
- Modifications.
-
- c. "Subject Software" means the Original Software or Modifications or the
- combination of the Original Software and Modifications, or portions of any
- of the foregoing.
-
- d. "Recipient" means an individual or a legal entity exercising rights
- under the terms of this License. For legal entities, "Recipient" includes
- any entity that controls, is controlled by, or is under common control
- with Recipient. For purposes of this definition, "control" of an entity
- means (i) the power, direct or indirect, to direct or manage such entity,
- or (ii) ownership of fifty percent (50%) or more of the outstanding shares
- or beneficial ownership of such entity.
-
- e. "Required Notice" means the notice set forth in Exhibit A to this
- License.
-
- f. "Accompanying Technology" means any software or other technology that
- is not a Modification and that is distributed or made publicly available
- by Recipient with the Subject Software. Separate software files that do
- not contain any Original Software or any previous Modification shall not
- be deemed a Modification, even if such software files are aggregated as
- part of a product, or in any medium of storage, with any file that does
- contain Original Software or any previous Modification.
-
-2. License Terms. All distribution of the Subject Software must be made
-subject to the terms of this License. A copy of this License and the Required
-Notice must be included in any documentation for Subject Software where
-Recipient's rights relating to Subject Software and/or any Accompanying
-Technology are described. Distributions of Subject Software in source code
-form must also include the Required Notice in every file distributed. In
-addition, a ReadMe file entitled "Important Legal Notice" must be distributed
-with each distribution of one or more files that incorporate Subject Software.
-That file must be included with distributions made in both source code and
-executable form. A copy of the License and the Required Notice must be
-included in that file. Recipient may distribute Accompanying Technology under
-a license of Recipient's choice, which may contain terms different from this
-License, provided that (i) Recipient is in compliance with the terms of this
-License, (ii) such other license terms do not modify or supersede the terms of
-this License as applicable to the Subject Software, (iii) Recipient hereby
-indemnifies SGI for any liability incurred by SGI as a result of the
-distribution of Accompanying Technology or the use of other license terms.
-
-3. Termination. This License and the rights granted hereunder will terminate
-automatically if Recipient fails to comply with terms herein and fails to cure
-such breach within 30 days of the breach. Any sublicense to the Subject
-Software that is properly granted shall survive any termination of this
-License absent termination by the terms of such sublicense. Provisions which,
-by their nature, must remain in effect beyond the termination of this License
-shall survive.
-
-4. Trademark Rights. This License does not grant any rights to use any trade
-name, trademark or service mark whatsoever. No trade name, trademark or
-service mark of SGI may be used to endorse or promote products derived from or
-incorporating any Subject Software without prior written permission of SGI.
-
-5. No Other Rights. No rights or licenses not expressly granted hereunder
-shall arise by implication, estoppel or otherwise. Title to and ownership of
-the Original Software at all times remains with SGI. All rights in the
-Original Software not expressly granted under this License are reserved.
-
-6. Compliance with Laws; Non-Infringement. Recipient shall comply with all
-applicable laws and regulations in connection with use and distribution of the
-Subject Software, including but not limited to, all export and import control
-laws and regulations of the U.S. government and other countries. Recipient may
-not distribute Subject Software that (i) in any way infringes (directly or
-contributorily) the rights (including patent, copyright, trade secret,
-trademark or other intellectual property rights of any kind) of any other
-person or entity, or (ii) breaches any representation or warranty, express,
-implied or statutory, which under any applicable law it might be deemed to
-have been distributed.
-
-7. Claims of Infringement. If Recipient at any time has knowledge of any one
-or more third party claims that reproduction, modification, use, distribution,
-import or sale of Subject Software (including particular functionality or code
-incorporated in Subject Software) infringes the third party's intellectual
-property rights, Recipient must place in a well-identified web page bearing
-the title "LEGAL" a description of each such claim and a description of the
-party making each such claim in sufficient detail that a user of the Subject
-Software will know whom to contact regarding the claim. Also, upon gaining
-such knowledge of any such claim, Recipient must conspicuously include the URL
-for such web page in the Required Notice, and in the text of any related
-documentation, license agreement or collateral in which Recipient describes
-end user's rights relating to the Subject Software. If Recipient obtains such
-knowledge after it makes Subject Software available to any other person or
-entity, Recipient shall take other steps (such as notifying appropriate
-mailing lists or newsgroups) reasonably calculated to provide such knowledge
-to those who received the Subject Software.
-
-8. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
-WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
-LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
-MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. SGI ASSUMES NO
-RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
-PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
-SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
-ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
-HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
-WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
-CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SUBJECT SOFTWARE OR
-THE USE OR OTHER DEALINGS IN THE SUBJECT SOFTWARE. SOME JURISDICTIONS DO NOT
-ALLOW THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES, SO THIS EXCLUSION AND
-LIMITATION MAY NOT APPLY TO RECIPIENT TO THE EXTENT SO DISALLOWED.
-
-10. Indemnity. Recipient shall be solely responsible for damages arising,
-directly or indirectly, out of its utilization of rights under this License.
-Recipient will defend, indemnify and hold SGI and its successors and assigns
-harmless from and against any loss, liability, damages, costs or expenses
-(including the payment of reasonable attorneys fees) arising out of
-(Recipient's use, modification, reproduction and distribution of the Subject
-Software or out of any representation or warranty made by Recipient.
-
-11. U.S. Government End Users. The Subject Software is a "commercial item"
-consisting of "commercial computer software" as such terms are defined in
-title 48 of the Code of Federal Regulations and all U.S. Government End Users
-acquire only the rights set forth in this License and are subject to the terms
-of this License.
-
-12. Miscellaneous. This License represents the complete agreement concerning
-subject matter hereof. If any provision of this License is held to be
-unenforceable by any judicial or administrative authority having proper
-jurisdiction with respect thereto, such provision shall be reformed so as to
-achieve as nearly as possible the same economic effect as the original
-provision and the remainder of this License will remain in effect. This
-License shall be governed by and construed in accordance with the laws of the
-United States and the State of California as applied to agreements entered
-into and to be performed entirely within California between California
-residents. Any litigation relating to this License shall be subject to the
-exclusive jurisdiction of the Federal Courts of the Northern District of
-California (or, absent subject matter jurisdiction in such courts, the courts
-of the State of California), with venue lying exclusively in Santa Clara
-County, California, with the losing party responsible for costs, including
-without limitation, court costs and reasonable attorneys fees and expenses.
-The application of the United Nations Convention on Contracts for the
-International Sale of Goods is expressly excluded. Any law or regulation that
-provides that the language of a contract shall be construed against the
-drafter shall not apply to this License.
-
-Exhibit A
-
-Copyright (c) 1994-1999 Silicon Graphics, Inc.
-
-The contents of this file are subject to the CID Font Code Public License
-Version 1.0 (the "License"). You may not use this file except in compliance
-with the License. You may obtain a copy of the License at Silicon Graphics,
-Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043
-or at http://www.sgi.com/software/opensource/cid/license.html
-
-Software distributed under the License is distributed on an "AS IS" basis. ALL
-WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
-WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF
-NON-INFRINGEMENT. See the License for the specific language governing rights
-and limitations under the License.
-
-The Original Software (as defined in the License) is CID font code that was
-developed by Silicon Graphics, Inc. Those portions of the Subject Software (as
-defined in the License) that were created by Silicon Graphics, Inc. are
-Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved.
-
-[NOTE: When using this text in connection with Subject Software delivered
-solely in object code form, Recipient may replace the words "this file" with
-"this software" in both the first and second sentences.] 3.6. Bitstream Vera
-Fonts Copyright
-
-The fonts have a generous copyright, allowing derivative works (as long as
-"Bitstream" or "Vera" are not in the names), and full redistribution (so long
-as they are not *sold* by themselves). They can be be bundled, redistributed
-and sold with any software.
-
-The fonts are distributed under the following copyright:
-
-Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a
-trademark of Bitstream, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of the fonts accompanying this license ("Fonts") and associated documentation
-files (the "Font Software"), to reproduce and distribute the Font Software,
-including without limitation the rights to use, copy, merge, publish,
-distribute, and/or sell copies of the Font Software, and to permit persons to
-whom the Font Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright and trademark notices and this permission notice shall be
-included in all copies of one or more of the Font Software typefaces.
-
-The Font Software may be modified, altered, or added to, and in particular the
-designs of glyphs or characters in the Fonts may be modified and additional
-glyphs or characters may be added to the Fonts, only if the fonts are renamed
-to names not containing either the words "Bitstream" or the word "Vera".
-
-This License becomes null and void to the extent applicable to Fonts or Font
-Software that has been modified and is distributed under the "Bitstream Vera"
-names.
-
-The Font Software may be sold as part of a larger software package but no copy
-of one or more of the Font Software typefaces may be sold by itself.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
-TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION
-BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL,
-SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO
-USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
-
-Except as contained in this notice, the names of Gnome, the Gnome Foundation,
-and Bitstream Inc., shall not be used in advertising or otherwise to promote
-the sale, use or other dealings in this Font Software without prior written
-authorization from the Gnome Foundation or Bitstream Inc., respectively. For
-further information, contact: fonts at gnome dot org. 3.7. Bigelow & Holmes
-Inc and URW++ GmbH Luxi font license
-
-Luxi fonts copyright (c) 2001 by Bigelow & Holmes Inc. Luxi font instruction
-code copyright (c) 2001 by URW++ GmbH. All Rights Reserved. Luxi is a
-registered trademark of Bigelow & Holmes Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of these Fonts and associated documentation files (the "Font Software"), to
-deal in the Font Software, including without limitation the rights to use,
-copy, merge, publish, distribute, sublicense, and/or sell copies of the Font
-Software, and to permit persons to whom the Font Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright and trademark notices and this permission notice shall be
-included in all copies of one or more of the Font Software.
-
-The Font Software may not be modified, altered, or added to, and in particular
-the designs of glyphs or characters in the Fonts may not be modified nor may
-additional glyphs or characters be added to the Fonts. This License becomes
-null and void when the Fonts or Font Software have been modified.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
-TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BIGELOW & HOLMES INC. OR URW++
-GMBH. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY
-GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR
-INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT
-SOFTWARE.
-
-Except as contained in this notice, the names of Bigelow & Holmes Inc. and
-URW++ GmbH. shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in this Font Software without prior written
-authorization from Bigelow & Holmes Inc. and URW++ GmbH.
-
-For further information, contact:
-
-info@urwpp.de or design@bigelowandholmes.com
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to zlib v1.2.5, which may be included
-with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- version 1.2.5, July 18th, 2005
-
- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to the following which may be
-included with JRE 8, JDK 8, and OpenJDK 8, except where noted:
-
- Apache Commons Math 2.2
- Apache Derby 10.10.1.2 [included with JDK 8]
- Apache Jakarta BCEL 5.2
- Apache Jakarta Regexp 1.4
- Apache Santuario XML Security for Java 1.5.4
- Apache Xalan-Java 2.7.1
- Apache Xerces Java 2.10.0
- Apache XML Resolver 1.1
- Dynalink 0.5
-
-
---- begin of LICENSE ---
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
diff --git a/hotspot/make/lib/CompileDtracePostJvm.gmk b/hotspot/make/lib/CompileDtracePostJvm.gmk
index 6b98014..77a4e30 100644
--- a/hotspot/make/lib/CompileDtracePostJvm.gmk
+++ b/hotspot/make/lib/CompileDtracePostJvm.gmk
@@ -188,7 +188,6 @@
LIBS := $(LIBDL) -lc -lthread -ldoor, \
MAPFILE := $(HOTSPOT_TOPDIR)/make/mapfiles/libjvm_dtrace/mapfile-vers, \
OBJECT_DIR := $(LIBJVM_DTRACE_OUTPUTDIR)/objs, \
- STRIP_SYMBOLS := true, \
))
LIBJVM_DB_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm_db
@@ -206,7 +205,6 @@
LIBS := -lc, \
MAPFILE := $(HOTSPOT_TOPDIR)/make/mapfiles/libjvm_db/mapfile-vers, \
OBJECT_DIR := $(LIBJVM_DB_OUTPUTDIR)/objs, \
- STRIP_SYMBOLS := true, \
))
# We need the generated JvmOffsets.h before we can compile the libjvm_db source code.
diff --git a/hotspot/make/lib/CompileGtest.gmk b/hotspot/make/lib/CompileGtest.gmk
index a4c2c0c..2920943 100644
--- a/hotspot/make/lib/CompileGtest.gmk
+++ b/hotspot/make/lib/CompileGtest.gmk
@@ -54,6 +54,13 @@
# Disabling switch warning for clang because of test source.
+# Note: On AIX, the gtest test classes linked into the libjvm.so push the TOC
+# size beyond 64k, so we need to link with bigtoc. However, this means that
+# -qpic=large would be advisable to lessen the performance effect of bigtoc.
+# But we want to avoid imposing -qpic=large onto the regular libjvm.so, which
+# has no problem with its TOC, so do this only for object files which are
+# exclusive to the gtest libjvm.so.
+
$(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \
TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
LIBRARY := jvm, \
@@ -72,6 +79,7 @@
CFLAGS_windows := -EHsc, \
CFLAGS_solaris := -DGTEST_HAS_EXCEPTIONS=0 -library=stlport4, \
CFLAGS_macosx := -DGTEST_OS_MAC=1, \
+ CFLAGS_aix := -qpic=large, \
CFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \
CXXFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \
DISABLED_WARNINGS_gcc := undef, \
@@ -80,12 +88,14 @@
DISABLED_WARNINGS_solstudio := identexpected, \
LDFLAGS := $(JVM_LDFLAGS), \
LDFLAGS_solaris := -library=stlport4 $(call SET_SHARED_LIBRARY_ORIGIN), \
+ LDFLAGS_aix := -bbigtoc, \
LIBS := $(JVM_LIBS), \
OPTIMIZATION := $(JVM_OPTIMIZATION), \
MAPFILE := $(GTEST_JVM_MAPFILE), \
USE_MAPFILE_FOR_SYMBOLS := true, \
COPY_DEBUG_SYMBOLS := $(GTEST_COPY_DEBUG_SYMBOLS), \
ZIP_EXTERNAL_DEBUG_SYMBOLS := false, \
+ STRIP_SYMBOLS := false, \
PRECOMPILED_HEADER := $(JVM_PRECOMPILED_HEADER), \
PRECOMPILED_HEADER_EXCLUDE := gtest-all.cc gtestMain.cpp, \
))
diff --git a/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk b/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk
index 8942652..f6b4a22 100644
--- a/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk
+++ b/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk
@@ -113,7 +113,6 @@
LIBS := $(SA_LIBS), \
MAPFILE := $(SA_MAPFILE), \
OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libsa, \
- STRIP_SYMBOLS := true, \
))
TARGETS += $(BUILD_LIBSA)
diff --git a/hotspot/src/cpu/aarch64/vm/aarch64.ad b/hotspot/src/cpu/aarch64/vm/aarch64.ad
index 24bce03..2294bab 100644
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad
@@ -14086,7 +14086,7 @@
format %{ "mul rscratch1, $op1, $op2\t#overflow check long\n\t"
"smulh rscratch2, $op1, $op2\n\t"
- "cmp rscratch2, rscratch1, ASR #31\n\t"
+ "cmp rscratch2, rscratch1, ASR #63\n\t"
"movw rscratch1, #0x80000000\n\t"
"cselw rscratch1, rscratch1, zr, NE\n\t"
"cmpw rscratch1, #1" %}
@@ -14094,7 +14094,7 @@
ins_encode %{
__ mul(rscratch1, $op1$$Register, $op2$$Register); // Result bits 0..63
__ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127
- __ cmp(rscratch2, rscratch1, Assembler::ASR, 31); // Top is pure sign ext
+ __ cmp(rscratch2, rscratch1, Assembler::ASR, 63); // Top is pure sign ext
__ movw(rscratch1, 0x80000000); // Develop 0 (EQ),
__ cselw(rscratch1, rscratch1, zr, Assembler::NE); // or 0x80000000 (NE)
__ cmpw(rscratch1, 1); // 0x80000000 - 1 => VS
@@ -14112,7 +14112,7 @@
format %{ "mul rscratch1, $op1, $op2\t#overflow check long\n\t"
"smulh rscratch2, $op1, $op2\n\t"
- "cmp rscratch2, rscratch1, ASR #31\n\t"
+ "cmp rscratch2, rscratch1, ASR #63\n\t"
"b$cmp $labl" %}
ins_cost(4 * INSN_COST); // Branch is rare so treat as INSN_COST
ins_encode %{
@@ -14120,7 +14120,7 @@
Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
__ mul(rscratch1, $op1$$Register, $op2$$Register); // Result bits 0..63
__ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127
- __ cmp(rscratch2, rscratch1, Assembler::ASR, 31); // Top is pure sign ext
+ __ cmp(rscratch2, rscratch1, Assembler::ASR, 63); // Top is pure sign ext
__ br(cond == Assembler::VS ? Assembler::NE : Assembler::EQ, *L);
%}
diff --git a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
index 66686fd..70c8f90 100644
--- a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
+++ b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
@@ -3111,7 +3111,7 @@
}
void LIR_Assembler::atomic_op(LIR_Code code, LIR_Opr src, LIR_Opr data, LIR_Opr dest, LIR_Opr tmp_op) {
- Address addr = as_Address(src->as_address_ptr(), noreg);
+ Address addr = as_Address(src->as_address_ptr());
BasicType type = src->type();
bool is_oop = type == T_OBJECT || type == T_ARRAY;
diff --git a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp
index 046be55..47fda46 100644
--- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp
+++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp
@@ -195,95 +195,22 @@
}
}
-// Zero words; len is in bytes
-// Destroys all registers except addr
-// len must be a nonzero multiple of wordSize
-void C1_MacroAssembler::zero_memory(Register addr, Register len, Register t1) {
- assert_different_registers(addr, len, t1, rscratch1, rscratch2);
-
-#ifdef ASSERT
- { Label L;
- tst(len, BytesPerWord - 1);
- br(Assembler::EQ, L);
- stop("len is not a multiple of BytesPerWord");
- bind(L);
- }
-#endif
-
-#ifndef PRODUCT
- block_comment("zero memory");
-#endif
-
- Label loop;
- Label entry;
-
-// Algorithm:
-//
-// scratch1 = cnt & 7;
-// cnt -= scratch1;
-// p += scratch1;
-// switch (scratch1) {
-// do {
-// cnt -= 8;
-// p[-8] = 0;
-// case 7:
-// p[-7] = 0;
-// case 6:
-// p[-6] = 0;
-// // ...
-// case 1:
-// p[-1] = 0;
-// case 0:
-// p += 8;
-// } while (cnt);
-// }
-
- const int unroll = 8; // Number of str(zr) instructions we'll unroll
-
- lsr(len, len, LogBytesPerWord);
- andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll
- sub(len, len, rscratch1); // cnt -= unroll
- // t1 always points to the end of the region we're about to zero
- add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord);
- adr(rscratch2, entry);
- sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2);
- br(rscratch2);
- bind(loop);
- sub(len, len, unroll);
- for (int i = -unroll; i < 0; i++)
- str(zr, Address(t1, i * wordSize));
- bind(entry);
- add(t1, t1, unroll * wordSize);
- cbnz(len, loop);
-}
-
// preserves obj, destroys len_in_bytes
void C1_MacroAssembler::initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1) {
+ assert(hdr_size_in_bytes >= 0, "header size must be positive or 0");
Label done;
- assert(obj != len_in_bytes && obj != t1 && t1 != len_in_bytes, "registers must be different");
- assert((hdr_size_in_bytes & (BytesPerWord - 1)) == 0, "header size is not a multiple of BytesPerWord");
- Register index = len_in_bytes;
- // index is positive and ptr sized
- subs(index, index, hdr_size_in_bytes);
+
+ // len_in_bytes is positive and ptr sized
+ subs(len_in_bytes, len_in_bytes, hdr_size_in_bytes);
br(Assembler::EQ, done);
- // note: for the remaining code to work, index must be a multiple of BytesPerWord
-#ifdef ASSERT
- { Label L;
- tst(index, BytesPerWord - 1);
- br(Assembler::EQ, L);
- stop("index is not a multiple of BytesPerWord");
- bind(L);
- }
-#endif
// Preserve obj
if (hdr_size_in_bytes)
add(obj, obj, hdr_size_in_bytes);
- zero_memory(obj, index, t1);
+ zero_memory(obj, len_in_bytes, t1);
if (hdr_size_in_bytes)
sub(obj, obj, hdr_size_in_bytes);
- // done
bind(done);
}
@@ -294,57 +221,59 @@
try_allocate(obj, noreg, object_size * BytesPerWord, t1, t2, slow_case);
- initialize_object(obj, klass, noreg, object_size * HeapWordSize, t1, t2);
+ initialize_object(obj, klass, noreg, object_size * HeapWordSize, t1, t2, UseTLAB);
}
-void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2) {
+void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, bool is_tlab_allocated) {
assert((con_size_in_bytes & MinObjAlignmentInBytesMask) == 0,
"con_size_in_bytes is not multiple of alignment");
const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
initialize_header(obj, klass, noreg, t1, t2);
- // clear rest of allocated space
- const Register index = t2;
- const int threshold = 16 * BytesPerWord; // approximate break even point for code size (see comments below)
- if (var_size_in_bytes != noreg) {
- mov(index, var_size_in_bytes);
- initialize_body(obj, index, hdr_size_in_bytes, t1);
- } else if (con_size_in_bytes <= threshold) {
- // use explicit null stores
- int i = hdr_size_in_bytes;
- if (i < con_size_in_bytes && (con_size_in_bytes % (2 * BytesPerWord))) {
- str(zr, Address(obj, i));
- i += BytesPerWord;
- }
- for (; i < con_size_in_bytes; i += 2 * BytesPerWord)
- stp(zr, zr, Address(obj, i));
- } else if (con_size_in_bytes > hdr_size_in_bytes) {
- block_comment("zero memory");
- // use loop to null out the fields
+ if (!(UseTLAB && ZeroTLAB && is_tlab_allocated)) {
+ // clear rest of allocated space
+ const Register index = t2;
+ const int threshold = 16 * BytesPerWord; // approximate break even point for code size (see comments below)
+ if (var_size_in_bytes != noreg) {
+ mov(index, var_size_in_bytes);
+ initialize_body(obj, index, hdr_size_in_bytes, t1);
+ } else if (con_size_in_bytes <= threshold) {
+ // use explicit null stores
+ int i = hdr_size_in_bytes;
+ if (i < con_size_in_bytes && (con_size_in_bytes % (2 * BytesPerWord))) {
+ str(zr, Address(obj, i));
+ i += BytesPerWord;
+ }
+ for (; i < con_size_in_bytes; i += 2 * BytesPerWord)
+ stp(zr, zr, Address(obj, i));
+ } else if (con_size_in_bytes > hdr_size_in_bytes) {
+ block_comment("zero memory");
+ // use loop to null out the fields
- int words = (con_size_in_bytes - hdr_size_in_bytes) / BytesPerWord;
- mov(index, words / 8);
+ int words = (con_size_in_bytes - hdr_size_in_bytes) / BytesPerWord;
+ mov(index, words / 8);
- const int unroll = 8; // Number of str(zr) instructions we'll unroll
- int remainder = words % unroll;
- lea(rscratch1, Address(obj, hdr_size_in_bytes + remainder * BytesPerWord));
+ const int unroll = 8; // Number of str(zr) instructions we'll unroll
+ int remainder = words % unroll;
+ lea(rscratch1, Address(obj, hdr_size_in_bytes + remainder * BytesPerWord));
- Label entry_point, loop;
- b(entry_point);
+ Label entry_point, loop;
+ b(entry_point);
- bind(loop);
- sub(index, index, 1);
- for (int i = -unroll; i < 0; i++) {
- if (-i == remainder)
- bind(entry_point);
- str(zr, Address(rscratch1, i * wordSize));
- }
- if (remainder == 0)
- bind(entry_point);
- add(rscratch1, rscratch1, unroll * wordSize);
- cbnz(index, loop);
+ bind(loop);
+ sub(index, index, 1);
+ for (int i = -unroll; i < 0; i++) {
+ if (-i == remainder)
+ bind(entry_point);
+ str(zr, Address(rscratch1, i * wordSize));
+ }
+ if (remainder == 0)
+ bind(entry_point);
+ add(rscratch1, rscratch1, unroll * wordSize);
+ cbnz(index, loop);
+ }
}
membar(StoreStore);
diff --git a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp
index 2438964..490e225 100644
--- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp
+++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp
@@ -36,7 +36,6 @@
// initialization
void pd_init() { _rsp_offset = 0; }
-void zero_memory(Register addr, Register len, Register t1);
public:
void try_allocate(
@@ -75,7 +74,8 @@
Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
int con_size_in_bytes, // object size in bytes if known at compile time
Register t1, // temp register
- Register t2 // temp register
+ Register t2, // temp register
+ bool is_tlab_allocated // the object was allocated in a TLAB; relevant for the implementation of ZeroTLAB
);
// allocation of fixed-size objects
diff --git a/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp
index f6339d7..58ba9c0 100644
--- a/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp
+++ b/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp
@@ -728,7 +728,7 @@
__ tlab_allocate(obj, obj_size, 0, t1, t2, slow_path);
- __ initialize_object(obj, klass, obj_size, 0, t1, t2);
+ __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ true);
__ verify_oop(obj);
__ ldp(r5, r19, Address(__ post(sp, 2 * wordSize)));
__ ret(lr);
@@ -740,7 +740,7 @@
__ eden_allocate(obj, obj_size, 0, t1, slow_path);
__ incr_allocated_bytes(rthread, obj_size, 0, rscratch1);
- __ initialize_object(obj, klass, obj_size, 0, t1, t2);
+ __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ false);
__ verify_oop(obj);
__ ldp(r5, r19, Address(__ post(sp, 2 * wordSize)));
__ ret(lr);
@@ -853,7 +853,9 @@
__ andr(t1, t1, Klass::_lh_header_size_mask);
__ sub(arr_size, arr_size, t1); // body length
__ add(t1, t1, obj); // body start
- __ initialize_body(t1, arr_size, 0, t2);
+ if (!ZeroTLAB) {
+ __ initialize_body(t1, arr_size, 0, t2);
+ }
__ verify_oop(obj);
__ ret(lr);
diff --git a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
index 76ffc9d..dc90886 100644
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
@@ -3944,12 +3944,82 @@
add(top, top, t1);
sub(top, top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes());
str(top, Address(rthread, in_bytes(JavaThread::tlab_end_offset())));
+
+ if (ZeroTLAB) {
+ // This is a fast TLAB refill, therefore the GC is not notified of it.
+ // So compiled code must fill the new TLAB with zeroes.
+ ldr(top, Address(rthread, in_bytes(JavaThread::tlab_start_offset())));
+ zero_memory(top,t1,t2);
+ }
+
verify_tlab();
b(retry);
return rthread; // for use by caller
}
+// Zero words; len is in bytes
+// Destroys all registers except addr
+// len must be a nonzero multiple of wordSize
+void MacroAssembler::zero_memory(Register addr, Register len, Register t1) {
+ assert_different_registers(addr, len, t1, rscratch1, rscratch2);
+
+#ifdef ASSERT
+ { Label L;
+ tst(len, BytesPerWord - 1);
+ br(Assembler::EQ, L);
+ stop("len is not a multiple of BytesPerWord");
+ bind(L);
+ }
+#endif
+
+#ifndef PRODUCT
+ block_comment("zero memory");
+#endif
+
+ Label loop;
+ Label entry;
+
+// Algorithm:
+//
+// scratch1 = cnt & 7;
+// cnt -= scratch1;
+// p += scratch1;
+// switch (scratch1) {
+// do {
+// cnt -= 8;
+// p[-8] = 0;
+// case 7:
+// p[-7] = 0;
+// case 6:
+// p[-6] = 0;
+// // ...
+// case 1:
+// p[-1] = 0;
+// case 0:
+// p += 8;
+// } while (cnt);
+// }
+
+ const int unroll = 8; // Number of str(zr) instructions we'll unroll
+
+ lsr(len, len, LogBytesPerWord);
+ andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll
+ sub(len, len, rscratch1); // cnt -= unroll
+ // t1 always points to the end of the region we're about to zero
+ add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord);
+ adr(rscratch2, entry);
+ sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2);
+ br(rscratch2);
+ bind(loop);
+ sub(len, len, unroll);
+ for (int i = -unroll; i < 0; i++)
+ str(zr, Address(t1, i * wordSize));
+ bind(entry);
+ add(t1, t1, unroll * wordSize);
+ cbnz(len, loop);
+}
+
// Defines obj, preserves var_size_in_bytes
void MacroAssembler::eden_allocate(Register obj,
Register var_size_in_bytes,
diff --git a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
index 207292a..3418189 100644
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
@@ -857,6 +857,7 @@
Label& slow_case // continuation point if fast allocation fails
);
Register tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case); // returns TLS address
+ void zero_memory(Register addr, Register len, Register t1);
void verify_tlab();
void incr_allocated_bytes(Register thread,
diff --git a/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp
index c8bb354..01e0eeb 100644
--- a/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp
+++ b/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp
@@ -282,7 +282,7 @@
regs[i].set_bad();
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -303,7 +303,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_j) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
} else {
@@ -840,7 +840,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -862,7 +862,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_c) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
} else {
diff --git a/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp b/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp
index 7096d9b..9b37b4f 100644
--- a/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp
+++ b/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp
@@ -453,7 +453,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
// fall through
case T_ARRAY:
case T_OBJECT:
@@ -478,7 +478,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
if (fp_reg < FPR_PARAMS) {
FloatRegister r = as_FloatRegister(fp_reg);
regs[i].set2(r->as_VMReg());
@@ -532,7 +532,7 @@
#ifndef __ABI_HARD__
case T_DOUBLE:
#endif // !__ABI_HARD__
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
if (ireg <= 2) {
#if (ALIGN_WIDE_ARGUMENTS == 1)
if(ireg & 1) ireg++; // Aligned location required
diff --git a/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp b/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp
index 933a2f4..9aa1370 100644
--- a/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp
@@ -51,19 +51,25 @@
return i;
}
-// Support abs and sqrt like in compiler.
-// For others we can use a normal (native) entry.
-bool AbstractInterpreter::math_entry_available(AbstractInterpreter::MethodKind kind) {
- if (!InlineIntrinsics) return false;
-
- return ((kind==Interpreter::java_lang_math_sqrt && VM_Version::has_fsqrt()) ||
- (kind==Interpreter::java_lang_math_abs));
-}
-
// These should never be compiled since the interpreter will prefer
// the compiled version to the intrinsic version.
bool AbstractInterpreter::can_be_compiled(methodHandle m) {
- return !math_entry_available(method_kind(m));
+ switch (method_kind(m)) {
+ case Interpreter::java_lang_math_sin : // fall thru
+ case Interpreter::java_lang_math_cos : // fall thru
+ case Interpreter::java_lang_math_tan : // fall thru
+ case Interpreter::java_lang_math_abs : // fall thru
+ case Interpreter::java_lang_math_log : // fall thru
+ case Interpreter::java_lang_math_log10 : // fall thru
+ case Interpreter::java_lang_math_sqrt : // fall thru
+ case Interpreter::java_lang_math_pow : // fall thru
+ case Interpreter::java_lang_math_exp : // fall thru
+ case Interpreter::java_lang_math_fmaD : // fall thru
+ case Interpreter::java_lang_math_fmaF :
+ return false;
+ default:
+ return true;
+ }
}
// How much stack a method activation needs in stack slots.
diff --git a/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp b/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp
index a053044..09217a4 100644
--- a/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp
+++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp
@@ -460,16 +460,15 @@
FCTIWZ_OPCODE = (63u << OPCODE_SHIFT | 15u << 1),
FRSP_OPCODE = (63u << OPCODE_SHIFT | 12u << 1),
- // WARNING: using fmadd results in a non-compliant vm. Some floating
- // point tck tests will fail.
- FMADD_OPCODE = (59u << OPCODE_SHIFT | 29u << 1),
- DMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1),
- FMSUB_OPCODE = (59u << OPCODE_SHIFT | 28u << 1),
- DMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1),
- FNMADD_OPCODE = (59u << OPCODE_SHIFT | 31u << 1),
- DNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1),
- FNMSUB_OPCODE = (59u << OPCODE_SHIFT | 30u << 1),
- DNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1),
+ // Fused multiply-accumulate instructions.
+ FMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1),
+ FMADDS_OPCODE = (59u << OPCODE_SHIFT | 29u << 1),
+ FMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1),
+ FMSUBS_OPCODE = (59u << OPCODE_SHIFT | 28u << 1),
+ FNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1),
+ FNMADDS_OPCODE = (59u << OPCODE_SHIFT | 31u << 1),
+ FNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1),
+ FNMSUBS_OPCODE = (59u << OPCODE_SHIFT | 30u << 1),
LFD_OPCODE = (50u << OPCODE_SHIFT | 00u << 1),
LFDU_OPCODE = (51u << OPCODE_SHIFT | 00u << 1),
@@ -1939,6 +1938,26 @@
inline void fdivs( FloatRegister d, FloatRegister a, FloatRegister b);
inline void fdivs_(FloatRegister d, FloatRegister a, FloatRegister b);
+ // Fused multiply-accumulate instructions.
+ // WARNING: Use only when rounding between the 2 parts is not desired.
+ // Some floating point tck tests will fail if used incorrectly.
+ inline void fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+
// PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions
inline void frsp( FloatRegister d, FloatRegister b);
inline void fctid( FloatRegister d, FloatRegister b);
diff --git a/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp b/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp
index 45f4ec5..7f42d6b 100644
--- a/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp
+++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp
@@ -700,6 +700,26 @@
inline void Assembler::fdivs( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); }
inline void Assembler::fdivs_(FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); }
+// Fused multiply-accumulate instructions.
+// WARNING: Use only when rounding between the 2 parts is not desired.
+// Some floating point tck tests will fail if used incorrectly.
+inline void Assembler::fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+
// PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions
inline void Assembler::frsp( FloatRegister d, FloatRegister b) { emit_int32( FRSP_OPCODE | frt(d) | frb(b) | rc(0)); }
inline void Assembler::fctid( FloatRegister d, FloatRegister b) { emit_int32( FCTID_OPCODE | frt(d) | frb(b) | rc(0)); }
diff --git a/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp b/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp
index bba0c6d..127403f 100644
--- a/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp
@@ -292,28 +292,28 @@
}
-void LIR_Assembler::emit_op3(LIR_Op3* op) {
- const bool is_int = op->result_opr()->is_single_cpu();
- Register Rdividend = is_int ? op->in_opr1()->as_register() : op->in_opr1()->as_register_lo();
+void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr temp, LIR_Opr result, CodeEmitInfo* info) {
+ const bool is_int = result->is_single_cpu();
+ Register Rdividend = is_int ? left->as_register() : left->as_register_lo();
Register Rdivisor = noreg;
- Register Rscratch = op->in_opr3()->as_register();
- Register Rresult = is_int ? op->result_opr()->as_register() : op->result_opr()->as_register_lo();
+ Register Rscratch = temp->as_register();
+ Register Rresult = is_int ? result->as_register() : result->as_register_lo();
long divisor = -1;
- if (op->in_opr2()->is_register()) {
- Rdivisor = is_int ? op->in_opr2()->as_register() : op->in_opr2()->as_register_lo();
+ if (right->is_register()) {
+ Rdivisor = is_int ? right->as_register() : right->as_register_lo();
} else {
- divisor = is_int ? op->in_opr2()->as_constant_ptr()->as_jint()
- : op->in_opr2()->as_constant_ptr()->as_jlong();
+ divisor = is_int ? right->as_constant_ptr()->as_jint()
+ : right->as_constant_ptr()->as_jlong();
}
assert(Rdividend != Rscratch, "");
assert(Rdivisor != Rscratch, "");
- assert(op->code() == lir_idiv || op->code() == lir_irem, "Must be irem or idiv");
+ assert(code == lir_idiv || code == lir_irem, "Must be irem or idiv");
if (Rdivisor == noreg) {
if (divisor == 1) { // stupid, but can happen
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
__ mr_if_needed(Rresult, Rdividend);
} else {
__ li(Rresult, 0);
@@ -340,7 +340,7 @@
}
__ add(Rscratch, Rdividend, Rscratch);
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
if (is_int) {
__ srawi(Rresult, Rscratch, log2);
} else {
@@ -352,7 +352,7 @@
}
} else if (divisor == -1) {
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
__ neg(Rresult, Rdividend);
} else {
__ li(Rresult, 0);
@@ -360,7 +360,7 @@
} else {
__ load_const_optimized(Rscratch, divisor);
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
if (is_int) {
__ divw(Rresult, Rdividend, Rscratch); // Can't divide minint/-1.
} else {
@@ -389,7 +389,7 @@
__ cmpdi(CCR0, Rdivisor, -1);
}
__ bne(CCR0, regular);
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
__ neg(Rresult, Rdividend);
__ b(done);
__ bind(regular);
@@ -415,6 +415,26 @@
}
+void LIR_Assembler::emit_op3(LIR_Op3* op) {
+ switch (op->code()) {
+ case lir_idiv:
+ case lir_irem:
+ arithmetic_idiv(op->code(), op->in_opr1(), op->in_opr2(), op->in_opr3(),
+ op->result_opr(), op->info());
+ break;
+ case lir_fmad:
+ __ fmadd(op->result_opr()->as_double_reg(), op->in_opr1()->as_double_reg(),
+ op->in_opr2()->as_double_reg(), op->in_opr3()->as_double_reg());
+ break;
+ case lir_fmaf:
+ __ fmadds(op->result_opr()->as_float_reg(), op->in_opr1()->as_float_reg(),
+ op->in_opr2()->as_float_reg(), op->in_opr3()->as_float_reg());
+ break;
+ default: ShouldNotReachHere(); break;
+ }
+}
+
+
void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) {
#ifdef ASSERT
assert(op->block() == NULL || op->block()->label() == op->label(), "wrong label");
diff --git a/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp b/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp
index 2cb7fe7..86eacda 100644
--- a/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp
@@ -1435,7 +1435,26 @@
}
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
- fatal("FMA intrinsic is not implemented on this platform");
+ assert(x->number_of_arguments() == 3, "wrong type");
+ assert(UseFMA, "Needs FMA instructions support.");
+ LIRItem value(x->argument_at(0), this);
+ LIRItem value1(x->argument_at(1), this);
+ LIRItem value2(x->argument_at(2), this);
+
+ value.load_item();
+ value1.load_item();
+ value2.load_item();
+
+ LIR_Opr calc_input = value.result();
+ LIR_Opr calc_input1 = value1.result();
+ LIR_Opr calc_input2 = value2.result();
+ LIR_Opr calc_result = rlock_result(x);
+
+ switch (x->id()) {
+ case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break;
+ case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break;
+ default: ShouldNotReachHere();
+ }
}
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
diff --git a/hotspot/src/cpu/ppc/vm/globals_ppc.hpp b/hotspot/src/cpu/ppc/vm/globals_ppc.hpp
index 4173008..bf4ca17 100644
--- a/hotspot/src/cpu/ppc/vm/globals_ppc.hpp
+++ b/hotspot/src/cpu/ppc/vm/globals_ppc.hpp
@@ -42,6 +42,9 @@
#define DEFAULT_STACK_YELLOW_PAGES (2)
#define DEFAULT_STACK_RED_PAGES (1)
+// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the
+// stack if compiled for unix and LP64. To pass stack overflow tests we need
+// 20 shadow pages.
#define DEFAULT_STACK_SHADOW_PAGES (20 DEBUG_ONLY(+2))
#define DEFAULT_STACK_RESERVED_PAGES (1)
diff --git a/hotspot/src/cpu/ppc/vm/ppc.ad b/hotspot/src/cpu/ppc/vm/ppc.ad
index a8c42b7..6c3d9cf 100644
--- a/hotspot/src/cpu/ppc/vm/ppc.ad
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad
@@ -9569,6 +9569,117 @@
ins_pipe(pipe_class_default);
%}
+
+// Multiply-Accumulate
+// src1 * src2 + src3
+instruct maddF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF src3 (Binary src1 src2)));
+
+ format %{ "FMADDS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmadds);
+ __ fmadds($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// src1 * src2 + src3
+instruct maddD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD src3 (Binary src1 src2)));
+
+ format %{ "FMADD $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmadd);
+ __ fmadd($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 + src3 = -(src1*src2-src3)
+instruct mnsubF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF src3 (Binary (NegF src1) src2)));
+ match(Set dst (FmaF src3 (Binary src1 (NegF src2))));
+
+ format %{ "FNMSUBS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmsubs);
+ __ fnmsubs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 + src3 = -(src1*src2-src3)
+instruct mnsubD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD src3 (Binary (NegD src1) src2)));
+ match(Set dst (FmaD src3 (Binary src1 (NegD src2))));
+
+ format %{ "FNMSUB $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmsub);
+ __ fnmsub($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 - src3 = -(src1*src2+src3)
+instruct mnaddF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF (NegF src3) (Binary (NegF src1) src2)));
+ match(Set dst (FmaF (NegF src3) (Binary src1 (NegF src2))));
+
+ format %{ "FNMADDS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmadds);
+ __ fnmadds($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 - src3 = -(src1*src2+src3)
+instruct mnaddD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD (NegD src3) (Binary (NegD src1) src2)));
+ match(Set dst (FmaD (NegD src3) (Binary src1 (NegD src2))));
+
+ format %{ "FNMADD $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmadd);
+ __ fnmadd($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// src1 * src2 - src3
+instruct msubF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF (NegF src3) (Binary src1 src2)));
+
+ format %{ "FMSUBS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmsubs);
+ __ fmsubs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// src1 * src2 - src3
+instruct msubD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD (NegD src3) (Binary src1 src2)));
+
+ format %{ "FMSUB $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmsub);
+ __ fmsub($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+
//----------Logical Instructions-----------------------------------------------
// And Instructions
diff --git a/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp b/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp
index 5044e80..784595f 100644
--- a/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp
@@ -594,7 +594,7 @@
regs[i].set1(reg);
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (ireg < num_java_iarg_registers) {
// Put long in register.
reg = java_iarg_reg[ireg];
@@ -637,7 +637,7 @@
regs[i].set1(reg);
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < num_java_farg_registers) {
// Put double in register.
reg = java_farg_reg[freg];
@@ -809,7 +809,7 @@
regs[i].set1(reg);
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < Argument::n_float_register_parameters_c) {
// Put double in register ...
reg = farg_reg[freg];
diff --git a/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp b/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp
index cadde26..5681093 100644
--- a/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp
@@ -1134,14 +1134,57 @@
// End of helpers
address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) {
- if (!Interpreter::math_entry_available(kind)) {
- NOT_PRODUCT(__ should_not_reach_here();)
- return NULL;
+
+ // Decide what to do: Use same platform specific instructions and runtime calls as compilers.
+ bool use_instruction = false;
+ address runtime_entry = NULL;
+ int num_args = 1;
+ bool double_precision = true;
+
+ // PPC64 specific:
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt: use_instruction = VM_Version::has_fsqrt(); break;
+ case Interpreter::java_lang_math_abs: use_instruction = true; break;
+ case Interpreter::java_lang_math_fmaF:
+ case Interpreter::java_lang_math_fmaD: use_instruction = UseFMA; break;
+ default: break; // Fall back to runtime call.
}
+ switch (kind) {
+ case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break;
+ case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break;
+ case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break;
+ case Interpreter::java_lang_math_abs : /* run interpreted */ break;
+ case Interpreter::java_lang_math_sqrt : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsqrt); break;
+ case Interpreter::java_lang_math_log : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog); break;
+ case Interpreter::java_lang_math_log10: runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); break;
+ case Interpreter::java_lang_math_pow : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); num_args = 2; break;
+ case Interpreter::java_lang_math_exp : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); break;
+ case Interpreter::java_lang_math_fmaF : /* run interpreted */ num_args = 3; double_precision = false; break;
+ case Interpreter::java_lang_math_fmaD : /* run interpreted */ num_args = 3; break;
+ default: ShouldNotReachHere();
+ }
+
+ // Use normal entry if neither instruction nor runtime call is used.
+ if (!use_instruction && runtime_entry == NULL) return NULL;
+
address entry = __ pc();
- __ lfd(F1_RET, Interpreter::stackElementSize, R15_esp);
+ // Load arguments
+ assert(num_args <= 13, "passed in registers");
+ if (double_precision) {
+ int offset = (2 * num_args - 1) * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ lfd(as_FloatRegister(F1_ARG1->encoding() + i), offset, R15_esp);
+ offset -= 2 * Interpreter::stackElementSize;
+ }
+ } else {
+ int offset = num_args * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ lfs(as_FloatRegister(F1_ARG1->encoding() + i), offset, R15_esp);
+ offset -= Interpreter::stackElementSize;
+ }
+ }
// Pop c2i arguments (if any) off when we return.
#ifdef ASSERT
@@ -1152,15 +1195,30 @@
#endif // ASSERT
__ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started.
- if (kind == Interpreter::java_lang_math_sqrt) {
- __ fsqrt(F1_RET, F1_RET);
- } else if (kind == Interpreter::java_lang_math_abs) {
- __ fabs(F1_RET, F1_RET);
+ if (use_instruction) {
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt: __ fsqrt(F1_RET, F1); break;
+ case Interpreter::java_lang_math_abs: __ fabs(F1_RET, F1); break;
+ case Interpreter::java_lang_math_fmaF: __ fmadds(F1_RET, F1, F2, F3); break;
+ case Interpreter::java_lang_math_fmaD: __ fmadd(F1_RET, F1, F2, F3); break;
+ default: ShouldNotReachHere();
+ }
} else {
- ShouldNotReachHere();
+ // Comment: Can use tail call if the unextended frame is always C ABI compliant:
+ //__ load_const_optimized(R12_scratch2, runtime_entry, R0);
+ //__ call_c_and_return_to_caller(R12_scratch2);
+
+ // Push a new C frame and save LR.
+ __ save_LR_CR(R0);
+ __ push_frame_reg_args(0, R11_scratch1);
+
+ __ call_VM_leaf(runtime_entry);
+
+ // Pop the C frame and restore LR.
+ __ pop_frame();
+ __ restore_LR_CR(R0);
}
- // And we're done.
__ blr();
__ flush();
diff --git a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
index 190d83d..6c6b83d 100644
--- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
@@ -230,9 +230,8 @@
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
}
- if (UseFMA) {
- warning("FMA instructions are not available on this CPU");
- FLAG_SET_DEFAULT(UseFMA, false);
+ if (FLAG_IS_DEFAULT(UseFMA)) {
+ FLAG_SET_DEFAULT(UseFMA, true);
}
if (UseSHA) {
diff --git a/hotspot/src/cpu/s390/vm/assembler_s390.hpp b/hotspot/src/cpu/s390/vm/assembler_s390.hpp
index dee3887..0873d71 100644
--- a/hotspot/src/cpu/s390/vm/assembler_s390.hpp
+++ b/hotspot/src/cpu/s390/vm/assembler_s390.hpp
@@ -790,6 +790,16 @@
#define MDB_ZOPC (unsigned long)(237L << 40 | 28)
#define MXDB_ZOPC (unsigned long)(237L << 40 | 7)
+// Multiply-Add
+#define MAEBR_ZOPC (unsigned int)(179 << 24 | 14 << 16)
+#define MADBR_ZOPC (unsigned int)(179 << 24 | 30 << 16)
+#define MSEBR_ZOPC (unsigned int)(179 << 24 | 15 << 16)
+#define MSDBR_ZOPC (unsigned int)(179 << 24 | 31 << 16)
+#define MAEB_ZOPC (unsigned long)(237L << 40 | 14)
+#define MADB_ZOPC (unsigned long)(237L << 40 | 30)
+#define MSEB_ZOPC (unsigned long)(237L << 40 | 15)
+#define MSDB_ZOPC (unsigned long)(237L << 40 | 31)
+
// Divide
// RR, signed
#define DSGFR_ZOPC (unsigned int)(0xb91d << 16)
@@ -2205,6 +2215,20 @@
inline void z_meeb( FloatRegister f1, const Address& a);
inline void z_mdb( FloatRegister f1, const Address& a);
+ // MUL-ADD
+ inline void z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; float
+ inline void z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; double
+ inline void z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; float
+ inline void z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; double
+ inline void z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; float
+ inline void z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; double
+ inline void z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; float
+ inline void z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; double
+ inline void z_maeb(FloatRegister f1, FloatRegister f3, const Address& a);
+ inline void z_madb(FloatRegister f1, FloatRegister f3, const Address& a);
+ inline void z_mseb(FloatRegister f1, FloatRegister f3, const Address& a);
+ inline void z_msdb(FloatRegister f1, FloatRegister f3, const Address& a);
+
// DIV
inline void z_debr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; float
inline void z_ddbr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; double
diff --git a/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp b/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp
index 42038c8..18e1ad7 100644
--- a/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp
+++ b/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp
@@ -778,6 +778,23 @@
//---------------
+// MUL-ADD
+//---------------
+inline void Assembler::z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MAEBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MADBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MSEBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MSDBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MAEB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MADB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MSEB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MSDB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_maeb(FloatRegister f1, FloatRegister f3, const Address& a) { z_maeb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_madb(FloatRegister f1, FloatRegister f3, const Address& a) { z_madb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_mseb(FloatRegister f1, FloatRegister f3, const Address& a) { z_mseb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_msdb(FloatRegister f1, FloatRegister f3, const Address& a) { z_msdb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+
+
+//---------------
// DIV
//---------------
inline void Assembler::z_debr( FloatRegister f1, FloatRegister f2) { emit_32( DEBR_ZOPC | fregt( f1, 24, 32) | freg( f2, 28, 32));}
diff --git a/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp b/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp
index 4299728..524a91f 100644
--- a/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp
+++ b/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp
@@ -324,6 +324,22 @@
op->result_opr(),
op->info());
break;
+ case lir_fmad: {
+ const FloatRegister opr1 = op->in_opr1()->as_double_reg(),
+ opr2 = op->in_opr2()->as_double_reg(),
+ opr3 = op->in_opr3()->as_double_reg(),
+ res = op->result_opr()->as_double_reg();
+ __ z_madbr(opr3, opr1, opr2);
+ if (res != opr3) { __ z_ldr(res, opr3); }
+ } break;
+ case lir_fmaf: {
+ const FloatRegister opr1 = op->in_opr1()->as_float_reg(),
+ opr2 = op->in_opr2()->as_float_reg(),
+ opr3 = op->in_opr3()->as_float_reg(),
+ res = op->result_opr()->as_float_reg();
+ __ z_maebr(opr3, opr1, opr2);
+ if (res != opr3) { __ z_ler(res, opr3); }
+ } break;
default: ShouldNotReachHere(); break;
}
}
diff --git a/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp b/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp
index d0d0110..98489aa 100644
--- a/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp
+++ b/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp
@@ -1237,7 +1237,28 @@
}
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
- fatal("FMA intrinsic is not implemented on this platform");
+ assert(x->number_of_arguments() == 3, "wrong type");
+ assert(UseFMA, "Needs FMA instructions support.");
+ LIRItem value(x->argument_at(0), this);
+ LIRItem value1(x->argument_at(1), this);
+ LIRItem value2(x->argument_at(2), this);
+
+ value2.set_destroys_register();
+
+ value.load_item();
+ value1.load_item();
+ value2.load_item();
+
+ LIR_Opr calc_input = value.result();
+ LIR_Opr calc_input1 = value1.result();
+ LIR_Opr calc_input2 = value2.result();
+ LIR_Opr calc_result = rlock_result(x);
+
+ switch (x->id()) {
+ case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break;
+ case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break;
+ default: ShouldNotReachHere();
+ }
}
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
diff --git a/hotspot/src/cpu/s390/vm/s390.ad b/hotspot/src/cpu/s390/vm/s390.ad
index f242833..8ab6a50 100644
--- a/hotspot/src/cpu/s390/vm/s390.ad
+++ b/hotspot/src/cpu/s390/vm/s390.ad
@@ -7249,6 +7249,171 @@
ins_pipe(pipe_class_dummy);
%}
+// Multiply-Accumulate
+// src1 * src2 + dst
+instruct maddF_reg_reg(regF dst, regF src1, regF src2) %{
+ match(Set dst (FmaF dst (Binary src1 src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MAEBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_maebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddD_reg_reg(regD dst, regD src1, regD src2) %{
+ match(Set dst (FmaD dst (Binary src1 src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MADBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_madbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubF_reg_reg(regF dst, regF src1, regF src2) %{
+ match(Set dst (FmaF (NegF dst) (Binary src1 src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MSEBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubD_reg_reg(regD dst, regD src1, regD src2) %{
+ match(Set dst (FmaD (NegD dst) (Binary src1 src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MSDBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msdbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddF_reg_mem(regF dst, regF src1, memoryRX src2) %{
+ match(Set dst (FmaF dst (Binary src1 (LoadF src2))));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MAEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_maeb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddD_reg_mem(regD dst, regD src1, memoryRX src2) %{
+ match(Set dst (FmaD dst (Binary src1 (LoadD src2))));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MADB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_madb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubF_reg_mem(regF dst, regF src1, memoryRX src2) %{
+ match(Set dst (FmaF (NegF dst) (Binary src1 (LoadF src2))));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_mseb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubD_reg_mem(regD dst, regD src1, memoryRX src2) %{
+ match(Set dst (FmaD (NegD dst) (Binary src1 (LoadD src2))));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSDB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msdb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddF_mem_reg(regF dst, memoryRX src1, regF src2) %{
+ match(Set dst (FmaF dst (Binary (LoadF src1) src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MAEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_maeb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddD_mem_reg(regD dst, memoryRX src1, regD src2) %{
+ match(Set dst (FmaD dst (Binary (LoadD src1) src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MADB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_madb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubF_mem_reg(regF dst, memoryRX src1, regF src2) %{
+ match(Set dst (FmaF (NegF dst) (Binary (LoadF src1) src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_mseb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubD_mem_reg(regD dst, memoryRX src1, regD src2) %{
+ match(Set dst (FmaD (NegD dst) (Binary (LoadD src1) src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSDB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msdb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
// DIV
// Div float single precision
diff --git a/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp b/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp
index e28d2ef..ea498e3 100644
--- a/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp
+++ b/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp
@@ -683,7 +683,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (ireg < z_num_iarg_registers) {
// Put long in register.
regs[i].set2(z_iarg_reg[ireg]);
@@ -723,7 +723,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < z_num_farg_registers) {
// Put double in register.
regs[i].set2(z_farg_reg[freg]);
@@ -822,7 +822,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < z_num_farg_registers) {
regs[i].set2(z_farg_reg[freg]);
++freg;
diff --git a/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp b/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp
index c2584c5..8b872c5 100644
--- a/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp
+++ b/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp
@@ -2038,15 +2038,15 @@
generate_push_parmBlk(keylen, fCode, parmBlk, key, cv, true);
// Prepare other registers for instruction.
- // __ z_lgr(src, from); // Not needed, registers are the same.
+ // __ z_lgr(src, from); // Not needed, registers are the same.
__ z_lgr(dst, to);
- __ z_lgr(srclen, msglen);
+ __ z_llgfr(srclen, msglen); // We pass the offsets as ints, not as longs as required.
- __ kmc(dst, src); // Decipher the message.
+ __ kmc(dst, src); // Decipher the message.
generate_pop_parmBlk(keylen, parmBlk, key, cv);
- __ z_lgr(Z_RET, msglen);
+ __ z_llgfr(Z_RET, msglen); // We pass the offsets as ints, not as longs as required.
__ z_br(Z_R14);
return __ addr_at(start_off);
diff --git a/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp b/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp
index 74dd091..de266db 100644
--- a/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp
+++ b/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp
@@ -1297,36 +1297,96 @@
// Math function, frame manager must set up an interpreter state, etc.
address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) {
- if (!InlineIntrinsics) { return NULL; } // Generate a vanilla entry.
+ // Decide what to do: Use same platform specific instructions and runtime calls as compilers.
+ bool use_instruction = false;
+ address runtime_entry = NULL;
+ int num_args = 1;
+ bool double_precision = true;
- // Only support absolute value and square root.
- if (kind != Interpreter::java_lang_math_abs && kind != Interpreter::java_lang_math_sqrt) {
- return NULL;
+ // s390 specific:
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt:
+ case Interpreter::java_lang_math_abs: use_instruction = true; break;
+ case Interpreter::java_lang_math_fmaF:
+ case Interpreter::java_lang_math_fmaD: use_instruction = UseFMA; break;
+ default: break; // Fall back to runtime call.
}
- BLOCK_COMMENT("math_entry {");
+ switch (kind) {
+ case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break;
+ case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break;
+ case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break;
+ case Interpreter::java_lang_math_abs : /* run interpreted */ break;
+ case Interpreter::java_lang_math_sqrt : /* runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsqrt); not available */ break;
+ case Interpreter::java_lang_math_log : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog); break;
+ case Interpreter::java_lang_math_log10: runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); break;
+ case Interpreter::java_lang_math_pow : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); num_args = 2; break;
+ case Interpreter::java_lang_math_exp : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); break;
+ case Interpreter::java_lang_math_fmaF : /* run interpreted */ num_args = 3; double_precision = false; break;
+ case Interpreter::java_lang_math_fmaD : /* run interpreted */ num_args = 3; break;
+ default: ShouldNotReachHere();
+ }
- address math_entry = __ pc();
+ // Use normal entry if neither instruction nor runtime call is used.
+ if (!use_instruction && runtime_entry == NULL) return NULL;
- if (kind == Interpreter::java_lang_math_abs) {
- // Load operand from stack.
- __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize));
- __ z_lpdbr(Z_FRET);
+ address entry = __ pc();
+
+ if (use_instruction) {
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt:
+ // Can use memory operand directly.
+ __ z_sqdb(Z_FRET, Interpreter::stackElementSize, Z_esp);
+ break;
+ case Interpreter::java_lang_math_abs:
+ // Load operand from stack.
+ __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize));
+ __ z_lpdbr(Z_FRET);
+ break;
+ case Interpreter::java_lang_math_fmaF:
+ __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); // result reg = arg3
+ __ mem2freg_opt(Z_FARG2, Address(Z_esp, 3 * Interpreter::stackElementSize)); // arg1
+ __ z_maeb(Z_FRET, Z_FARG2, Address(Z_esp, 2 * Interpreter::stackElementSize));
+ break;
+ case Interpreter::java_lang_math_fmaD:
+ __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); // result reg = arg3
+ __ mem2freg_opt(Z_FARG2, Address(Z_esp, 5 * Interpreter::stackElementSize)); // arg1
+ __ z_madb(Z_FRET, Z_FARG2, Address(Z_esp, 3 * Interpreter::stackElementSize));
+ break;
+ default: ShouldNotReachHere();
+ }
} else {
- // sqrt
- // Can use memory operand directly.
- __ z_sqdb(Z_FRET, Interpreter::stackElementSize, Z_esp);
+ // Load arguments
+ assert(num_args <= 4, "passed in registers");
+ if (double_precision) {
+ int offset = (2 * num_args - 1) * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ mem2freg_opt(as_FloatRegister(Z_FARG1->encoding() + 2 * i), Address(Z_esp, offset));
+ offset -= 2 * Interpreter::stackElementSize;
+ }
+ } else {
+ int offset = num_args * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ mem2freg_opt(as_FloatRegister(Z_FARG1->encoding() + 2 * i), Address(Z_esp, offset));
+ offset -= Interpreter::stackElementSize;
+ }
+ }
+ // Call runtime
+ __ save_return_pc(); // Save Z_R14.
+ __ push_frame_abi160(0); // Without new frame the RT call could overwrite the saved Z_R14.
+
+ __ call_VM_leaf(runtime_entry);
+
+ __ pop_frame();
+ __ restore_return_pc(); // Restore Z_R14.
}
- // Restore caller sp for c2i case.
+ // Pop c2i arguments (if any) off when we return.
__ resize_frame_absolute(Z_R10, Z_R0, true); // Cut the stack back to where the caller started.
- // We are done, return.
__ z_br(Z_R14);
- BLOCK_COMMENT("} math_entry");
-
- return math_entry;
+ return entry;
}
// Interpreter stub for calling a native method. (asm interpreter).
diff --git a/hotspot/src/cpu/s390/vm/vm_version_s390.cpp b/hotspot/src/cpu/s390/vm/vm_version_s390.cpp
index 7c40162..55dbd30 100644
--- a/hotspot/src/cpu/s390/vm/vm_version_s390.cpp
+++ b/hotspot/src/cpu/s390/vm/vm_version_s390.cpp
@@ -155,9 +155,8 @@
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
}
- if (UseFMA) {
- warning("FMA instructions are not available on this CPU");
- FLAG_SET_DEFAULT(UseFMA, false);
+ if (FLAG_IS_DEFAULT(UseFMA)) {
+ FLAG_SET_DEFAULT(UseFMA, true);
}
// On z/Architecture, we take UseSHA as the general switch to enable/disable the SHA intrinsics.
diff --git a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp
index 06ca126..7b4dcf1 100644
--- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp
@@ -425,7 +425,7 @@
#ifdef _LP64
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting VOID in other half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting VOID in other half");
// fall-through
case T_OBJECT:
case T_ARRAY:
@@ -441,7 +441,7 @@
break;
#else
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting VOID in other half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting VOID in other half");
// On 32-bit SPARC put longs always on the stack to keep the pressure off
// integer argument registers. They should be used for oops.
slot = round_to(slot, 2); // align
@@ -460,7 +460,7 @@
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (round_to(flt_reg, 2) + 1 < flt_reg_max) {
flt_reg = round_to(flt_reg, 2); // align
FloatRegister r = as_FloatRegister(flt_reg);
@@ -1174,7 +1174,7 @@
regs[i].set1(int_stk_helper(j));
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
case T_ADDRESS: // raw pointers, like current thread, for VM calls
case T_ARRAY:
case T_OBJECT:
@@ -1209,7 +1209,7 @@
break;
case T_DOUBLE:
{
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// V9ism: doubles go in EVEN/ODD regs and stack slots
int double_index = (j << 1);
param_array_reg.set2(VMRegImpl::stack2reg(double_index));
@@ -1261,7 +1261,7 @@
break;
case T_DOUBLE:
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
regs[i].set_pair(int_stk_helper(i + 1), int_stk_helper(i));
break;
case T_VOID: regs[i].set_bad(); break;
diff --git a/hotspot/src/cpu/x86/vm/globals_x86.hpp b/hotspot/src/cpu/x86/vm/globals_x86.hpp
index 9081d0c..5673abb 100644
--- a/hotspot/src/cpu/x86/vm/globals_x86.hpp
+++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp
@@ -63,9 +63,10 @@
#define MIN_STACK_RED_PAGES DEFAULT_STACK_RED_PAGES
#define MIN_STACK_RESERVED_PAGES (0)
-#ifdef AMD64
-// Very large C++ stack frames using solaris-amd64 optimized builds
-// due to lack of optimization caused by C++ compiler bugs
+#ifdef _LP64
+// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the
+// stack if compiled for unix and LP64. To pass stack overflow tests we need
+// 20 shadow pages.
#define DEFAULT_STACK_SHADOW_PAGES (NOT_WIN64(20) WIN64_ONLY(7) DEBUG_ONLY(+2))
// For those clients that do not use write socket, we allow
// the min range value to be below that of the default
@@ -73,7 +74,7 @@
#else
#define DEFAULT_STACK_SHADOW_PAGES (4 DEBUG_ONLY(+5))
#define MIN_STACK_SHADOW_PAGES DEFAULT_STACK_SHADOW_PAGES
-#endif // AMD64
+#endif // _LP64
define_pd_global(intx, StackYellowPages, DEFAULT_STACK_YELLOW_PAGES);
define_pd_global(intx, StackRedPages, DEFAULT_STACK_RED_PAGES);
diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
index c69ef9a..ed31755 100644
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
@@ -478,12 +478,12 @@
}
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
regs[i].set2(VMRegImpl::stack2reg(dstack));
dstack += 2;
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
if( freg_arg0 == (uint)i ) {
regs[i].set2(xmm0->as_VMReg());
} else if( freg_arg1 == (uint)i ) {
@@ -1001,7 +1001,7 @@
case T_DOUBLE: // The stack numbering is reversed from Java
// Since C arguments do not get reversed, the ordering for
// doubles on the stack must be opposite the Java convention
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
regs[i].set2(VMRegImpl::stack2reg(stack));
stack += 2;
break;
diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
index 195c681..4587b8c 100644
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
@@ -474,7 +474,7 @@
regs[i].set_bad();
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -495,7 +495,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_j) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
} else {
@@ -1014,7 +1014,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -1045,7 +1045,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_c) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
#ifdef _WIN64
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java
index 4d34f99..947701c 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,10 +44,14 @@
Type type = db.lookupType("ClassLoaderData");
classLoaderField = type.getOopField("_class_loader");
nextField = type.getAddressField("_next");
+ klassesField = type.getAddressField("_klasses");
+ isAnonymousField = new CIntField(type.getCIntegerField("_is_anonymous"), 0);
}
private static sun.jvm.hotspot.types.OopField classLoaderField;
private static AddressField nextField;
+ private static AddressField klassesField;
+ private static CIntField isAnonymousField;
public ClassLoaderData(Address addr) {
super(addr);
@@ -63,4 +67,16 @@
public Oop getClassLoader() {
return VM.getVM().getObjectHeap().newOop(classLoaderField.getValue(getAddress()));
}
+
+ public boolean getIsAnonymous() {
+ return isAnonymousField.getValue(this) != 0;
+ }
+
+ public ClassLoaderData next() {
+ return instantiateWrapperFor(nextField.getValue(getAddress()));
+ }
+
+ public Klass getKlasses() {
+ return (InstanceKlass)Metadata.instantiateWrapperFor(klassesField.getValue(getAddress()));
+ }
}
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java
new file mode 100644
index 0000000..fbc9a76
--- /dev/null
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.classfile;
+
+import java.io.PrintStream;
+import java.util.*;
+import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.oops.*;
+import sun.jvm.hotspot.types.*;
+
+public class ClassLoaderDataGraph {
+ static {
+ VM.registerVMInitializedObserver(new Observer() {
+ public void update(Observable o, Object data) {
+ initialize(VM.getVM().getTypeDataBase());
+ }
+ });
+ }
+
+ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
+ Type type = db.lookupType("ClassLoaderDataGraph");
+
+ headField = type.getAddressField("_head");
+ }
+
+ private static AddressField headField;
+
+ public ClassLoaderData getClassLoaderGraphHead() {
+ return ClassLoaderData.instantiateWrapperFor(headField.getValue());
+ }
+
+ public static interface KlassVisitor {
+ public void visit(Klass k);
+ }
+
+ /** Iterate over all anonymous class loaders and the klasses in those */
+ public void allAnonymousKlassesDo(final KlassVisitor v) {
+ for (ClassLoaderData cl = getClassLoaderGraphHead();
+ cl != null;
+ cl = cl.next()) {
+ if (cl.getIsAnonymous() == true) {
+ for (Klass k = cl.getKlasses(); k != null; k = k.getNextLinkKlass()) {
+ v.visit(k);
+ }
+ }
+ }
+ }
+
+}
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java
index b5d93a85..afa0027 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java
@@ -61,6 +61,7 @@
}
subklass = new MetadataField(type.getAddressField("_subklass"), 0);
nextSibling = new MetadataField(type.getAddressField("_next_sibling"), 0);
+ nextLink = new MetadataField(type.getAddressField("_next_link"), 0);
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
LH_INSTANCE_SLOW_PATH_BIT = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue();
@@ -92,6 +93,7 @@
private static CIntField accessFlags;
private static MetadataField subklass;
private static MetadataField nextSibling;
+ private static MetadataField nextLink;
private static sun.jvm.hotspot.types.Field traceIDField;
private static CIntField vtableLen;
@@ -114,6 +116,7 @@
public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); }
public Klass getSubklassKlass() { return (Klass) subklass.getValue(this); }
public Klass getNextSiblingKlass() { return (Klass) nextSibling.getValue(this); }
+ public Klass getNextLinkKlass() { return (Klass) nextLink.getValue(this); }
public long getVtableLen() { return vtableLen.getValue(this); }
public long traceID() {
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java
index 22bdcf9..bd49345 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java
@@ -38,6 +38,7 @@
import sun.jvm.hotspot.types.*;
import sun.jvm.hotspot.utilities.*;
import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.classfile.*;
/** <P> This class encapsulates the global state of the VM; the
universe, object heap, interpreter, etc. It is a Singleton and
@@ -80,6 +81,7 @@
private SymbolTable symbols;
private StringTable strings;
private SystemDictionary dict;
+ private ClassLoaderDataGraph cldGraph;
private Threads threads;
private ObjectSynchronizer synchronizer;
private JNIHandles handles;
@@ -660,6 +662,13 @@
return dict;
}
+ public ClassLoaderDataGraph getClassLoaderDataGraph() {
+ if (cldGraph == null) {
+ cldGraph = new ClassLoaderDataGraph();
+ }
+ return cldGraph;
+ }
+
public Threads getThreads() {
if (threads == null) {
threads = new Threads();
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
index 319aecd..9da4374 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,7 @@
import sun.jvm.hotspot.memory.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.classfile.*;
/*
* This class writes Java heap in hprof binary format. This format is
@@ -379,6 +380,8 @@
private static final int JVM_SIGNATURE_ARRAY = '[';
private static final int JVM_SIGNATURE_CLASS = 'L';
+ int serialNum = 1;
+
public synchronized void write(String fileName) throws IOException {
// open file stream and create buffered data output stream
fos = new FileOutputStream(fileName);
@@ -516,6 +519,7 @@
private void writeClassDumpRecords() throws IOException {
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
+ ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph();
try {
sysDict.allClassesDo(new SystemDictionary.ClassVisitor() {
public void visit(Klass k) {
@@ -528,6 +532,19 @@
}
}
});
+ // Add the anonymous classes also which are not present in the
+ // System Dictionary
+ cldGraph.allAnonymousKlassesDo(new ClassLoaderDataGraph.KlassVisitor() {
+ public void visit(Klass k) {
+ try {
+ writeHeapRecordPrologue();
+ writeClassDumpRecord(k);
+ writeHeapRecordEpilogue();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
} catch (RuntimeException re) {
handleRuntimeException(re);
}
@@ -799,17 +816,6 @@
writeObjectID(klass.getJavaMirror());
ClassData cd = (ClassData) classDataCache.get(klass);
- if (cd == null) {
- // The class is not present in the system dictionary, probably Lambda.
- // Add it to cache here
- if (klass instanceof InstanceKlass) {
- InstanceKlass ik = (InstanceKlass) klass;
- List fields = getInstanceFields(ik);
- int instSize = getSizeForFields(fields);
- cd = new ClassData(instSize, fields);
- classDataCache.put(ik, cd);
- }
- }
if (Assert.ASSERTS_ENABLED) {
Assert.that(cd != null, "can not get class data for " + klass.getName().asString() + klass.getAddress());
@@ -950,9 +956,24 @@
private void writeClasses() throws IOException {
// write class list (id, name) association
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
+ ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph();
try {
sysDict.allClassesDo(new SystemDictionary.ClassVisitor() {
- private int serialNum = 1;
+ public void visit(Klass k) {
+ try {
+ Instance clazz = k.getJavaMirror();
+ writeHeader(HPROF_LOAD_CLASS, 2 * (OBJ_ID_SIZE + 4));
+ out.writeInt(serialNum);
+ writeObjectID(clazz);
+ out.writeInt(DUMMY_STACK_TRACE_ID);
+ writeSymbolID(k.getName());
+ serialNum++;
+ } catch (IOException exp) {
+ throw new RuntimeException(exp);
+ }
+ }
+ });
+ cldGraph.allAnonymousKlassesDo(new ClassLoaderDataGraph.KlassVisitor() {
public void visit(Klass k) {
try {
Instance clazz = k.getJavaMirror();
diff --git a/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java b/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java
index cd21784..1e72687 100644
--- a/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java
+++ b/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java
@@ -53,6 +53,7 @@
import org.graalvm.compiler.hotspot.stubs.Stub;
import org.graalvm.compiler.hotspot.stubs.UnwindExceptionToCallerStub;
import org.graalvm.compiler.hotspot.word.KlassPointer;
+import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
import org.graalvm.compiler.lir.LIR;
import org.graalvm.compiler.lir.LIRFrameState;
import org.graalvm.compiler.lir.LIRInstruction;
@@ -316,8 +317,8 @@
/**
* Tiered support.
*/
- public static final ForeignCallDescriptor INVOCATION_EVENT = new ForeignCallDescriptor("invocation_event", void.class, Word.class);
- public static final ForeignCallDescriptor BACKEDGE_EVENT = new ForeignCallDescriptor("backedge_event", void.class, Word.class, int.class, int.class);
+ public static final ForeignCallDescriptor INVOCATION_EVENT = new ForeignCallDescriptor("invocation_event", void.class, MethodCountersPointer.class);
+ public static final ForeignCallDescriptor BACKEDGE_EVENT = new ForeignCallDescriptor("backedge_event", void.class, MethodCountersPointer.class, int.class, int.class);
/**
* @see UncommonTrapCallNode
diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index f2a3b69..e900ce0 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -848,13 +848,13 @@
assert(thread->osthread() == NULL, "caller responsible");
- // Allocate the OSThread object
+ // Allocate the OSThread object.
OSThread* osthread = new OSThread(NULL, NULL);
if (osthread == NULL) {
return false;
}
- // set the correct thread state
+ // Set the correct thread state.
osthread->set_thread_type(thr_type);
// Initial state is ALLOCATED but not INITIALIZED
@@ -862,7 +862,7 @@
thread->set_osthread(osthread);
- // init thread attributes
+ // Init thread attributes.
pthread_attr_t attr;
pthread_attr_init(&attr);
guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???");
@@ -871,15 +871,18 @@
if (os::Aix::on_aix()) {
guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???");
guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???");
- } // end: aix
+ }
// Start in suspended state, and in os::thread_start, wake the thread up.
guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???");
- // calculate stack size if it's not specified by caller
+ // Calculate stack size if it's not specified by caller.
size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size);
pthread_attr_setstacksize(&attr, stack_size);
+ // Configure libc guard page.
+ pthread_attr_setguardsize(&attr, os::Aix::default_guard_size(thr_type));
+
pthread_t tid;
int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
@@ -895,7 +898,7 @@
pthread_attr_destroy(&attr);
if (ret != 0) {
- // Need to clean up stuff we've allocated so far
+ // Need to clean up stuff we've allocated so far.
thread->set_osthread(NULL);
delete osthread;
return false;
@@ -3032,6 +3035,19 @@
return chained;
}
+size_t os::Aix::default_guard_size(os::ThreadType thr_type) {
+ // Creating guard page is very expensive. Java thread has HotSpot
+ // guard pages, only enable glibc guard page for non-Java threads.
+ // (Remember: compiler thread is a Java thread, too!)
+ //
+ // Aix can have different page sizes for stack (4K) and heap (64K).
+ // As Hotspot knows only one page size, we assume the stack has
+ // the same page size as the heap. Returning page_size() here can
+ // cause 16 guard pages which we want to avoid. Thus we return 4K
+ // which will be rounded to the real page size by the OS.
+ return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : 4 * K);
+}
+
struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
if (sigismember(&sigs, sig)) {
return &sigact[sig];
diff --git a/hotspot/src/os/aix/vm/os_aix.hpp b/hotspot/src/os/aix/vm/os_aix.hpp
index 8385804..a226fa4 100644
--- a/hotspot/src/os/aix/vm/os_aix.hpp
+++ b/hotspot/src/os/aix/vm/os_aix.hpp
@@ -140,6 +140,9 @@
// libpthread version string
static void libpthread_init();
+ // Return default libc guard size for the specified thread type.
+ static size_t default_guard_size(os::ThreadType thr_type);
+
// Function returns true if we run on OS/400 (pase), false if we run
// on AIX.
static bool on_pase() {
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index 3b6122f..bcce508 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -716,11 +716,18 @@
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- // calculate stack size if it's not specified by caller
+ // Calculate stack size if it's not specified by caller.
size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size);
+ // In the Linux NPTL pthread implementation the guard size mechanism
+ // is not implemented properly. The posix standard requires adding
+ // the size of the guard pages to the stack size, instead Linux
+ // takes the space out of 'stacksize'. Thus we adapt the requested
+ // stack_size by the size of the guard pages to mimick proper
+ // behaviour.
+ stack_size = align_size_up(stack_size + os::Linux::default_guard_size(thr_type), vm_page_size());
pthread_attr_setstacksize(&attr, stack_size);
- // glibc guard page
+ // Configure glibc guard page.
pthread_attr_setguardsize(&attr, os::Linux::default_guard_size(thr_type));
ThreadState state;
@@ -920,9 +927,21 @@
// Locate initial thread stack. This special handling of initial thread stack
// is needed because pthread_getattr_np() on most (all?) Linux distros returns
-// bogus value for initial thread.
+// bogus value for the primordial process thread. While the launcher has created
+// the VM in a new thread since JDK 6, we still have to allow for the use of the
+// JNI invocation API from a primordial thread.
void os::Linux::capture_initial_stack(size_t max_size) {
- // stack size is the easy part, get it from RLIMIT_STACK
+
+ // max_size is either 0 (which means accept OS default for thread stacks) or
+ // a user-specified value known to be at least the minimum needed. If we
+ // are actually on the primordial thread we can make it appear that we have a
+ // smaller max_size stack by inserting the guard pages at that location. But we
+ // cannot do anything to emulate a larger stack than what has been provided by
+ // the OS or threading library. In fact if we try to use a stack greater than
+ // what is set by rlimit then we will crash the hosting process.
+
+ // Maximum stack size is the easy part, get it from RLIMIT_STACK.
+ // If this is "unlimited" then it will be a huge value.
struct rlimit rlim;
getrlimit(RLIMIT_STACK, &rlim);
size_t stack_size = rlim.rlim_cur;
@@ -932,17 +951,6 @@
// so we won't install guard page on ld.so's data section.
stack_size -= 2 * page_size();
- // 4441425: avoid crash with "unlimited" stack size on SuSE 7.1 or Redhat
- // 7.1, in both cases we will get 2G in return value.
- // 4466587: glibc 2.2.x compiled w/o "--enable-kernel=2.4.0" (RH 7.0,
- // SuSE 7.2, Debian) can not handle alternate signal stack correctly
- // for initial thread if its stack size exceeds 6M. Cap it at 2M,
- // in case other parts in glibc still assumes 2M max stack size.
- // FIXME: alt signal stack is gone, maybe we can relax this constraint?
- // Problem still exists RH7.2 (IA64 anyway) but 2MB is a little small
- if (stack_size > 2 * K * K IA64_ONLY(*2)) {
- stack_size = 2 * K * K IA64_ONLY(*2);
- }
// Try to figure out where the stack base (top) is. This is harder.
//
// When an application is started, glibc saves the initial stack pointer in
@@ -1102,14 +1110,29 @@
// stack_top could be partially down the page so align it
stack_top = align_size_up(stack_top, page_size());
- if (max_size && stack_size > max_size) {
- _initial_thread_stack_size = max_size;
+ // Allowed stack value is minimum of max_size and what we derived from rlimit
+ if (max_size > 0) {
+ _initial_thread_stack_size = MIN2(max_size, stack_size);
} else {
- _initial_thread_stack_size = stack_size;
+ // Accept the rlimit max, but if stack is unlimited then it will be huge, so
+ // clamp it at 8MB as we do on Solaris
+ _initial_thread_stack_size = MIN2(stack_size, 8*M);
}
-
_initial_thread_stack_size = align_size_down(_initial_thread_stack_size, page_size());
_initial_thread_stack_bottom = (address)stack_top - _initial_thread_stack_size;
+
+ assert(_initial_thread_stack_bottom < (address)stack_top, "overflow!");
+
+ if (log_is_enabled(Info, os, thread)) {
+ // See if we seem to be on primordial process thread
+ bool primordial = uintptr_t(&rlim) > uintptr_t(_initial_thread_stack_bottom) &&
+ uintptr_t(&rlim) < stack_top;
+
+ log_info(os, thread)("Capturing initial stack in %s thread: req. size: " SIZE_FORMAT "K, actual size: "
+ SIZE_FORMAT "K, top=" INTPTR_FORMAT ", bottom=" INTPTR_FORMAT,
+ primordial ? "primordial" : "user", max_size / K, _initial_thread_stack_size / K,
+ stack_top, intptr_t(_initial_thread_stack_bottom));
+ }
}
////////////////////////////////////////////////////////////////////////////////
@@ -2833,6 +2856,13 @@
return false;
}
+size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
+ // Creating guard page is very expensive. Java thread has HotSpot
+ // guard pages, only enable glibc guard page for non-Java threads.
+ // (Remember: compiler thread is a Java thread, too!)
+ return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : page_size());
+}
+
// rebuild_cpu_to_node_map() constructs a table mapping cpud id to node id.
// The table is later used in get_node_by_cpu().
void os::Linux::rebuild_cpu_to_node_map() {
@@ -6065,6 +6095,101 @@
return yes;
}
+
+// Java/Compiler thread:
+//
+// Low memory addresses
+// P0 +------------------------+
+// | |\ Java thread created by VM does not have glibc
+// | glibc guard page | - guard page, attached Java thread usually has
+// | |/ 1 glibc guard page.
+// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
+// | |\
+// | HotSpot Guard Pages | - red, yellow and reserved pages
+// | |/
+// +------------------------+ JavaThread::stack_reserved_zone_base()
+// | |\
+// | Normal Stack | -
+// | |/
+// P2 +------------------------+ Thread::stack_base()
+//
+// Non-Java thread:
+//
+// Low memory addresses
+// P0 +------------------------+
+// | |\
+// | glibc guard page | - usually 1 page
+// | |/
+// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
+// | |\
+// | Normal Stack | -
+// | |/
+// P2 +------------------------+ Thread::stack_base()
+//
+// ** P1 (aka bottom) and size (P2 = P1 - size) are the address and stack size
+// returned from pthread_attr_getstack().
+// ** Due to NPTL implementation error, linux takes the glibc guard page out
+// of the stack size given in pthread_attr. We work around this for
+// threads created by the VM. (We adapt bottom to be P1 and size accordingly.)
+//
+#ifndef ZERO
+static void current_stack_region(address * bottom, size_t * size) {
+ if (os::Linux::is_initial_thread()) {
+ // initial thread needs special handling because pthread_getattr_np()
+ // may return bogus value.
+ *bottom = os::Linux::initial_thread_stack_bottom();
+ *size = os::Linux::initial_thread_stack_size();
+ } else {
+ pthread_attr_t attr;
+
+ int rslt = pthread_getattr_np(pthread_self(), &attr);
+
+ // JVM needs to know exact stack location, abort if it fails
+ if (rslt != 0) {
+ if (rslt == ENOMEM) {
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
+ } else {
+ fatal("pthread_getattr_np failed with error = %d", rslt);
+ }
+ }
+
+ if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
+ fatal("Cannot locate current stack attributes!");
+ }
+
+ // Work around NPTL stack guard error.
+ size_t guard_size = 0;
+ rslt = pthread_attr_getguardsize(&attr, &guard_size);
+ if (rslt != 0) {
+ fatal("pthread_attr_getguardsize failed with error = %d", rslt);
+ }
+ *bottom += guard_size;
+ *size -= guard_size;
+
+ pthread_attr_destroy(&attr);
+
+ }
+ assert(os::current_stack_pointer() >= *bottom &&
+ os::current_stack_pointer() < *bottom + *size, "just checking");
+}
+
+address os::current_stack_base() {
+ address bottom;
+ size_t size;
+ current_stack_region(&bottom, &size);
+ return (bottom + size);
+}
+
+size_t os::current_stack_size() {
+ // This stack size includes the usable stack and HotSpot guard pages
+ // (for the threads that have Hotspot guard pages).
+ address bottom;
+ size_t size;
+ current_stack_region(&bottom, &size);
+ return size;
+}
+#endif
+
static inline struct timespec get_mtime(const char* filename) {
struct stat st;
int ret = os::stat(filename, &st);
diff --git a/hotspot/src/os/posix/vm/os_posix.cpp b/hotspot/src/os/posix/vm/os_posix.cpp
index bf95c2a..5885906 100644
--- a/hotspot/src/os/posix/vm/os_posix.cpp
+++ b/hotspot/src/os/posix/vm/os_posix.cpp
@@ -1096,6 +1096,8 @@
int detachstate = 0;
pthread_attr_getstacksize(attr, &stack_size);
pthread_attr_getguardsize(attr, &guard_size);
+ // Work around linux NPTL implementation error, see also os::create_thread() in os_linux.cpp.
+ LINUX_ONLY(stack_size -= guard_size);
pthread_attr_getdetachstate(attr, &detachstate);
jio_snprintf(buf, buflen, "stacksize: " SIZE_FORMAT "k, guardsize: " SIZE_FORMAT "k, %s",
stack_size / 1024, guard_size / 1024,
@@ -1105,14 +1107,18 @@
// Check minimum allowable stack sizes for thread creation and to initialize
// the java system classes, including StackOverflowError - depends on page
-// size. Add two 4K pages for compiler2 recursion in main thread.
-// Add in 4*BytesPerWord 4K pages to account for VM stack during
-// class initialization depending on 32 or 64 bit VM.
+// size.
+// The space needed for frames during startup is platform dependent. It
+// depends on word size, platform calling conventions, C frame layout and
+// interpreter/C1/C2 design decisions. Therefore this is given in a
+// platform (os/cpu) dependent constant.
+// To this, space for guard mechanisms is added, which depends on the
+// page size which again depends on the concrete system the VM is running
+// on. Space for libc guard pages is not included in this size.
jint os::Posix::set_minimum_stack_sizes() {
- _java_thread_min_stack_allowed = MAX2(_java_thread_min_stack_allowed,
- JavaThread::stack_guard_zone_size() +
- JavaThread::stack_shadow_zone_size() +
- (4 * BytesPerWord COMPILER2_PRESENT(+ 2)) * 4 * K);
+ _java_thread_min_stack_allowed = _java_thread_min_stack_allowed +
+ JavaThread::stack_guard_zone_size() +
+ JavaThread::stack_shadow_zone_size();
_java_thread_min_stack_allowed = align_size_up(_java_thread_min_stack_allowed, vm_page_size());
@@ -1128,28 +1134,14 @@
return JNI_ERR;
}
-#ifdef SOLARIS
- // For 64kbps there will be a 64kb page size, which makes
- // the usable default stack size quite a bit less. Increase the
- // stack for 64kb (or any > than 8kb) pages, this increases
- // virtual memory fragmentation (since we're not creating the
- // stack on a power of 2 boundary. The real fix for this
- // should be to fix the guard page mechanism.
-
- if (vm_page_size() > 8*K) {
- stack_size_in_bytes = (stack_size_in_bytes != 0)
- ? stack_size_in_bytes +
- JavaThread::stack_red_zone_size() +
- JavaThread::stack_yellow_zone_size()
- : 0;
- ThreadStackSize = stack_size_in_bytes/K;
- }
-#endif // SOLARIS
-
// Make the stack size a multiple of the page size so that
// the yellow/red zones can be guarded.
- JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes,
- vm_page_size()));
+ JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes, vm_page_size()));
+
+ // Reminder: a compiler thread is a Java thread.
+ _compiler_thread_min_stack_allowed = _compiler_thread_min_stack_allowed +
+ JavaThread::stack_guard_zone_size() +
+ JavaThread::stack_shadow_zone_size();
_compiler_thread_min_stack_allowed = align_size_up(_compiler_thread_min_stack_allowed, vm_page_size());
diff --git a/hotspot/src/os/posix/vm/os_posix.hpp b/hotspot/src/os/posix/vm/os_posix.hpp
index 8120bde..ccd42fd 100644
--- a/hotspot/src/os/posix/vm/os_posix.hpp
+++ b/hotspot/src/os/posix/vm/os_posix.hpp
@@ -43,7 +43,11 @@
static void print_load_average(outputStream* st);
// Minimum stack size a thread can be created with (allowing
- // the VM to completely create the thread and enter user code)
+ // the VM to completely create the thread and enter user code).
+ // The initial values exclude any guard pages (by HotSpot or libc).
+ // set_minimum_stack_sizes() will add the size required for
+ // HotSpot guard pages depending on page size and flag settings.
+ // Libc guard pages are never considered by these values.
static size_t _compiler_thread_min_stack_allowed;
static size_t _java_thread_min_stack_allowed;
static size_t _vm_internal_thread_min_stack_allowed;
diff --git a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp
index 1e440ca..9bbb938 100644
--- a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp
+++ b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp
@@ -535,13 +535,15 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 192 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
-// return default stack size for thr_type
+// Return default stack size for thr_type.
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
- // default stack size (compiler thread needs larger stack)
+ // Default stack size (compiler thread needs larger stack).
size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
return s;
}
diff --git a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
index d9d8da7..b4b27f5 100644
--- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
+++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
@@ -839,19 +839,20 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-#ifdef AMD64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 48 * K;
+#ifdef _LP64
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
+#endif // _LP64
+#ifndef AMD64
#ifdef __GNUC__
#define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
#endif
-
#endif // AMD64
// return default stack size for thr_type
@@ -870,14 +871,14 @@
//
// Low memory addresses
// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
+// | |\ Java thread created by VM does not have glibc
// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
+// | |/ 1 glibc guard page.
// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
// | |\
-// | HotSpot Guard Pages | - red and yellow pages
+// | HotSpot Guard Pages | - red, yellow and reserved pages
// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
+// +------------------------+ JavaThread::stack_reserved_zone_base()
// | |\
// | Normal Stack | -
// | |/
@@ -925,7 +926,7 @@
int rslt = pthread_stackseg_np(pthread_self(), &ss);
if (rslt != 0)
- fatal("pthread_stackseg_np failed with err = %d", rslt);
+ fatal("pthread_stackseg_np failed with error = %d", rslt);
*bottom = (address)((char *)ss.ss_sp - ss.ss_size);
*size = ss.ss_size;
@@ -936,12 +937,12 @@
// JVM needs to know exact stack location, abort if it fails
if (rslt != 0)
- fatal("pthread_attr_init failed with err = %d", rslt);
+ fatal("pthread_attr_init failed with error = %d", rslt);
rslt = pthread_attr_get_np(pthread_self(), &attr);
if (rslt != 0)
- fatal("pthread_attr_get_np failed with err = %d", rslt);
+ fatal("pthread_attr_get_np failed with error = %d", rslt);
if (pthread_attr_getstackaddr(&attr, (void **)bottom) != 0 ||
pthread_attr_getstacksize(&attr, size) != 0) {
diff --git a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp
index 9a6b38b..15a5b7d 100644
--- a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp
+++ b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp
@@ -310,7 +310,7 @@
int rslt = pthread_stackseg_np(pthread_self(), &ss);
if (rslt != 0)
- fatal("pthread_stackseg_np failed with err = " INT32_FORMAT, rslt);
+ fatal("pthread_stackseg_np failed with error = " INT32_FORMAT, rslt);
stack_top = (address) ss.ss_sp;
stack_bytes = ss.ss_size;
@@ -322,12 +322,12 @@
// JVM needs to know exact stack location, abort if it fails
if (rslt != 0)
- fatal("pthread_attr_init failed with err = " INT32_FORMAT, rslt);
+ fatal("pthread_attr_init failed with error = " INT32_FORMAT, rslt);
rslt = pthread_attr_get_np(pthread_self(), &attr);
if (rslt != 0)
- fatal("pthread_attr_get_np failed with err = " INT32_FORMAT, rslt);
+ fatal("pthread_attr_get_np failed with error = " INT32_FORMAT, rslt);
if (pthread_attr_getstackaddr(&attr, (void **) &stack_bottom) != 0 ||
pthread_attr_getstacksize(&attr, &stack_bytes) != 0) {
diff --git a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
index 21d185d..4c425c4 100644
--- a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
+++ b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
@@ -473,8 +473,10 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 32 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
// return default stack size for thr_type
@@ -484,91 +486,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
@@ -606,8 +523,10 @@
st->print(" TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]);
st->cr();
#else
- for (int r = 0; r < 31; r++)
- st->print_cr( "R%d=" INTPTR_FORMAT, r, (size_t)uc->uc_mcontext.regs[r]);
+ for (int r = 0; r < 31; r++) {
+ st->print("R%-2d=", r);
+ print_location(st, uc->uc_mcontext.regs[r]);
+ }
#endif
st->cr();
diff --git a/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp b/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp
index 594a170..34902c3 100644
--- a/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp
+++ b/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp
@@ -526,8 +526,10 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K;
+size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
// return default stack size for thr_type
@@ -537,91 +539,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed");
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
diff --git a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
index c0aeb99..6be73f7 100644
--- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
+++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
@@ -535,100 +535,19 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
-// return default stack size for thr_type
+// Return default stack size for thr_type.
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
- // default stack size (compiler thread needs larger stack)
+ // Default stack size (compiler thread needs larger stack).
size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K);
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- return 2 * page_size();
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
diff --git a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp
index 1ca241d..684853c 100644
--- a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp
+++ b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp
@@ -473,103 +473,19 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = (52 DEBUG_ONLY(+ 32)) * K;
+size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 8)) * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 32 * K;
-// return default stack size for thr_type
+// Return default stack size for thr_type.
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
- // default stack size (compiler thread needs larger stack)
+ // Default stack size (compiler thread needs larger stack).
size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K);
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // z/Architecture: put 2 guard pages right in the middle of thread stack. This value
- // should be consistent with the value used by register stack handling code.
- return 2 * page_size();
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - Right in the middle of stack, 2 pages
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - Right in the middle of stack, 2 pages
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P2 is the address returned from pthread_attr_getstackaddr(), P2 - P1
-// is the stack size returned by pthread_attr_getstacksize().
-
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // Initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
diff --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp
index a5d435c..f9a20d5 100644
--- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp
+++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp
@@ -156,51 +156,6 @@
return (address)sp;
}
-static void current_stack_region(address* bottom, size_t* size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void**)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return bottom + size;
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
char* os::non_memory_address_word() {
// Must never look like an address returned by reserve_memory,
// even in its subfields (as defined by the CPU immediate fields,
@@ -726,8 +681,10 @@
///////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
// return default stack size for thr_type
@@ -737,12 +694,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
#ifndef PRODUCT
void os::verify_stack_alignment() {
}
diff --git a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
index 0bf4b8d..a76f8d6 100644
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
@@ -677,15 +677,15 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-#ifdef AMD64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 40 * K;
+#ifdef _LP64
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-#endif // AMD64
+#endif // _LP64
// return default stack size for thr_type
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
@@ -698,91 +698,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
diff --git a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp
index b5d7401..87c8969 100644
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp
@@ -320,12 +320,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Only enable glibc guard pages for non-Java threads
- // (Java threads have HotSpot guard pages)
- return (thr_type == java_thread ? 0 : page_size());
-}
-
static void current_stack_region(address *bottom, size_t *size) {
pthread_attr_t attr;
int res = pthread_getattr_np(pthread_self(), &attr);
@@ -334,7 +328,7 @@
vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
}
else {
- fatal("pthread_getattr_np failed with errno = %d", res);
+ fatal("pthread_getattr_np failed with error = %d", res);
}
}
@@ -342,7 +336,7 @@
size_t stack_bytes;
res = pthread_attr_getstack(&attr, (void **) &stack_bottom, &stack_bytes);
if (res != 0) {
- fatal("pthread_attr_getstack failed with errno = %d", res);
+ fatal("pthread_attr_getstack failed with error = %d", res);
}
address stack_top = stack_bottom + stack_bytes;
diff --git a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp
index 864080d..c8c938e 100644
--- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp
@@ -81,15 +81,13 @@
#define MAX_PATH (2 * K)
-// Minimum stack size for the VM. It's easier to document a constant
-// but it's different for x86 and sparc because the page sizes are different.
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 104 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 86 * K;
#ifdef _LP64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = 96 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 96 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 96 * K;
#endif
diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
index 530f703..f5c0ff3 100644
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
@@ -86,19 +86,23 @@
#define MAX_PATH (2 * K)
-// Minimum stack sizes for the VM. It's easier to document a constant value
-// but it's different for x86 and sparc because the page sizes are different.
-#ifdef AMD64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 394 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 224 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+#ifdef _LP64
+size_t os::Posix::_compiler_thread_min_stack_allowed = 202 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 48 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K;
+#else
+size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 32 * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
+#endif // _LP64
+
+#ifdef AMD64
#define REG_SP REG_RSP
#define REG_PC REG_RIP
#define REG_FP REG_RBP
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
#define REG_SP UESP
#define REG_PC EIP
#define REG_FP EBP
diff --git a/hotspot/src/share/vm/c1/c1_LIR.cpp b/hotspot/src/share/vm/c1/c1_LIR.cpp
index a8bbf93..05f3947 100644
--- a/hotspot/src/share/vm/c1/c1_LIR.cpp
+++ b/hotspot/src/share/vm/c1/c1_LIR.cpp
@@ -677,9 +677,7 @@
// LIR_Op3
case lir_idiv:
- case lir_irem:
- case lir_fmad:
- case lir_fmaf: {
+ case lir_irem: {
assert(op->as_Op3() != NULL, "must be");
LIR_Op3* op3= (LIR_Op3*)op;
@@ -697,6 +695,17 @@
break;
}
+ case lir_fmad:
+ case lir_fmaf: {
+ assert(op->as_Op3() != NULL, "must be");
+ LIR_Op3* op3= (LIR_Op3*)op;
+ assert(op3->_info == NULL, "no info");
+ do_input(op3->_opr1);
+ do_input(op3->_opr2);
+ do_input(op3->_opr3);
+ do_output(op3->_result);
+ break;
+ }
// LIR_OpJavaCall
case lir_static_call:
diff --git a/hotspot/src/share/vm/classfile/classLoader.cpp b/hotspot/src/share/vm/classfile/classLoader.cpp
index 62ede6e..e0b7c84 100644
--- a/hotspot/src/share/vm/classfile/classLoader.cpp
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp
@@ -84,7 +84,6 @@
typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
typedef jboolean (JNICALL *ZipInflateFully_t)(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg);
typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len);
-typedef void (JNICALL *FreeEntry_t)(jzfile *zip, jzentry *entry);
static ZipOpen_t ZipOpen = NULL;
static ZipClose_t ZipClose = NULL;
@@ -94,7 +93,6 @@
static canonicalize_fn_t CanonicalizeEntry = NULL;
static ZipInflateFully_t ZipInflateFully = NULL;
static Crc32_t Crc32 = NULL;
-static FreeEntry_t FreeEntry = NULL;
// Entry points for jimage.dll for loading jimage file entries
@@ -150,7 +148,6 @@
GrowableArray<char*>* ClassLoader::_boot_modules_array = NULL;
GrowableArray<char*>* ClassLoader::_platform_modules_array = NULL;
SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL;
-int ClassLoader::_num_patch_mod_prefixes = 0;
#endif
// helper routines
@@ -320,20 +317,6 @@
FREE_C_HEAP_ARRAY(char, _zip_name);
}
-bool ClassPathZipEntry::stream_exists(const char* name) {
- // enable call to C land
- JavaThread* thread = JavaThread::current();
- ThreadToNativeFromVM ttn(thread);
- // check whether zip archive contains name
- jint name_len, filesize;
- jzentry* entry = (*FindEntry)(_zip, name, &filesize, &name_len);
- if (entry != NULL) {
- (*FreeEntry)(_zip, entry);
- return true;
- }
- return false;
-}
-
u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
// enable call to C land
JavaThread* thread = JavaThread::current();
@@ -1090,7 +1073,6 @@
GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
ZipInflateFully = CAST_TO_FN_PTR(ZipInflateFully_t, os::dll_lookup(handle, "ZIP_InflateFully"));
Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32"));
- FreeEntry = CAST_TO_FN_PTR(FreeEntry_t, os::dll_lookup(handle, "ZIP_FreeEntry"));
// ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL ||
@@ -1418,57 +1400,6 @@
return NULL;
}
-#if INCLUDE_CDS
-// The following function is only used during CDS dump time.
-// It checks if a class can be found in the jar entries of the _patch_mod_entries.
-// It does not support non-jar entries.
-bool ClassLoader::is_in_patch_module(const char* const file_name) {
- assert(DumpSharedSpaces, "dump time only");
- if (_patch_mod_entries == NULL) {
- return false;
- }
-
- int num_of_entries = _patch_mod_entries->length();
- char* class_module_name = NULL;
- ResourceMark rm;
- const char *pkg_name = package_from_name(file_name);
- // Using the jimage to obtain the class' module name.
- // The ModuleEntryTable cannot be used at this point during dump time
- // because the module system hasn't been initialized yet.
- if (pkg_name != NULL) {
- JImageFile *jimage = _jrt_entry->jimage();
- class_module_name = (char*)(*JImagePackageToModule)(jimage, pkg_name);
- }
-
- if (class_module_name == NULL) {
- return false;
- }
-
- // Loop through all the patch module entries looking for module
- for (int i = 0; i < num_of_entries; i++) {
- ModuleClassPathList* module_cpl = _patch_mod_entries->at(i);
- Symbol* module_cpl_name = module_cpl->module_name();
-
- if (strcmp(module_cpl_name->as_C_string(), class_module_name) == 0) {
- // Class' module has been located, attempt to locate
- // the class from the module's ClassPathEntry list.
- ClassPathEntry* e = module_cpl->module_first_entry();
- while (e != NULL) {
- if (e->is_jar_file()) {
- if (e->stream_exists(file_name)) {
- return true;
- } else {
- e = e->next();
- }
- }
- }
- }
- }
-
- return false;
-}
-#endif // INCLUDE_CDS
-
instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
assert(name != NULL, "invariant");
assert(THREAD->is_Java_thread(), "must be a JavaThread");
@@ -1494,8 +1425,6 @@
// If DumpSharedSpaces is true boot loader visibility boundaries are set to:
// - [jimage] + [_first_append_entry to _last_append_entry] (all path entries).
- // If a class is found in the --patch-module entries, the class will not be included in the
- // CDS archive. Also, CDS is not supported if exploded module builds are used.
//
// If search_append_only is true, boot loader visibility boundaries are
// set to be _first_append_entry to the end. This includes:
@@ -1519,15 +1448,13 @@
// Note: The --patch-module entries are never searched if the boot loader's
// visibility boundary is limited to only searching the append entries.
if (_patch_mod_entries != NULL && !search_append_only) {
+ // At CDS dump time, the --patch-module entries are ignored. That means a
+ // class is still loaded from the runtime image even if it might
+ // appear in the _patch_mod_entries. The runtime shared class visibility
+ // check will determine if a shared class is visible based on the runtime
+ // environemnt, including the runtime --patch-module setting.
if (!DumpSharedSpaces) {
stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
- } else {
-#if INCLUDE_CDS
- if (is_in_patch_module(file_name)) {
- tty->print_cr("Preload Warning: Skip archiving class %s found in --patch-module entry", class_name);
- return NULL;
- }
-#endif
}
}
@@ -1679,57 +1606,8 @@
}
#if INCLUDE_CDS
-// Capture all the --patch-module entries specified during CDS dump time.
-// It also captures the non-existing path(s) and the required file(s) during inspecting
-// the entries.
-void ClassLoader::setup_patch_mod_path() {
- assert(DumpSharedSpaces, "only used with -Xshare:dump");
- ResourceMark rm;
- GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
- if (patch_mod_args != NULL) {
- int num_of_entries = patch_mod_args->length();
- for (int i = 0; i < num_of_entries; i++) {
- const char* module_name = (patch_mod_args->at(i))->module_name();
- const char* module_path = (patch_mod_args->at(i))->path_string();
- int path_len = (int)strlen(module_path);
- int name_len = (int)strlen(module_name);
- int buf_len = name_len + path_len + 2; // add 2 for the '=' and NULL terminator
- int end = 0;
- char* buf = NEW_C_HEAP_ARRAY(char, buf_len, mtInternal);
- // Iterate over the module's class path entries
- for (int start = 0; start < path_len; start = end) {
- while (module_path[end] && module_path[end] != os::path_separator()[0]) {
- end++;
- }
- strncpy(buf, &module_path[start], end - start);
- buf[end - start] = '\0';
- struct stat st;
- if (os::stat(buf, &st) != 0) {
- // File not found
- _shared_paths_misc_info->add_nonexist_path(buf);
- } else {
- if ((st.st_mode & S_IFMT) != S_IFREG) { // is not a regular file
- vm_exit_during_initialization(
- "--patch-module requires a regular file during dumping", buf);
- } else {
- _shared_paths_misc_info->add_required_file(buf);
- }
- }
- while (module_path[end] == os::path_separator()[0]) {
- end++;
- }
- };
- jio_snprintf(buf, buf_len, "%s=%s", module_name, module_path);
- _shared_paths_misc_info->add_patch_mod_classpath((const char*)buf);
- _num_patch_mod_prefixes++;
- FREE_C_HEAP_ARRAY(char, buf);
- }
- }
-}
-
void ClassLoader::initialize_shared_path() {
if (DumpSharedSpaces) {
- setup_patch_mod_path();
ClassLoaderExt::setup_search_paths();
_shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check()
}
diff --git a/hotspot/src/share/vm/classfile/classLoader.hpp b/hotspot/src/share/vm/classfile/classLoader.hpp
index b7f494c..473e2ee 100644
--- a/hotspot/src/share/vm/classfile/classLoader.hpp
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp
@@ -69,7 +69,6 @@
// Attempt to locate file_name through this class path entry.
// Returns a class file parsing stream if successfull.
virtual ClassFileStream* open_stream(const char* name, TRAPS) = 0;
- virtual bool stream_exists(const char* name) = 0;
// Debugging
NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;)
};
@@ -84,7 +83,6 @@
JImageFile* jimage() const { return NULL; }
ClassPathDirEntry(const char* dir);
ClassFileStream* open_stream(const char* name, TRAPS);
- bool stream_exists(const char* name) { return false; }
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
};
@@ -128,7 +126,6 @@
ClassFileStream* open_stream(const char* name, TRAPS);
void contents_do(void f(const char* name, void* context), void* context);
bool is_multiple_versioned(TRAPS) NOT_CDS_RETURN_(false);
- bool stream_exists(const char* name);
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
};
@@ -148,7 +145,6 @@
ClassPathImageEntry(JImageFile* jimage, const char* name);
~ClassPathImageEntry();
ClassFileStream* open_stream(const char* name, TRAPS);
- bool stream_exists(const char* name) { return false; }
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
@@ -259,7 +255,6 @@
// Info used by CDS
CDS_ONLY(static SharedPathsMiscInfo * _shared_paths_misc_info;)
- CDS_ONLY(static int _num_patch_mod_prefixes;)
// Initialization:
// - setup the boot loader's system class path
@@ -434,9 +429,6 @@
static void initialize_module_loader_map(JImageFile* jimage);
static s2 classloader_type(Symbol* class_name, ClassPathEntry* e,
int classpath_index, TRAPS);
- static bool is_in_patch_module(const char* const file_name);
- static void setup_patch_mod_path(); // Only when -Xshare:dump
- static int num_patch_mod_prefixes() { return _num_patch_mod_prefixes; }
#endif
static void trace_class_path(const char* msg, const char* name = NULL);
diff --git a/hotspot/src/share/vm/classfile/moduleEntry.cpp b/hotspot/src/share/vm/classfile/moduleEntry.cpp
index 2b8279f..9402f5d 100644
--- a/hotspot/src/share/vm/classfile/moduleEntry.cpp
+++ b/hotspot/src/share/vm/classfile/moduleEntry.cpp
@@ -108,6 +108,18 @@
}
MutexLocker m1(Module_lock);
+ // This is a guard against possible race between agent threads that redefine
+ // or retransform classes in this module. Only one of them is adding the
+ // default read edges to the unnamed modules of the boot and app class loaders
+ // with an upcall to jdk.internal.module.Modules.transformedByAgent.
+ // At the same time, another thread can instrument the module classes by
+ // injecting dependencies that require the default read edges for resolution.
+ if (this->has_default_read_edges() && !m->is_named()) {
+ ClassLoaderData* cld = m->loader_data();
+ if (cld->is_the_null_class_loader_data() || cld->is_system_class_loader_data()) {
+ return true; // default read edge
+ }
+ }
if (!has_reads()) {
return false;
} else {
diff --git a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp
index 1784449..c9d2c64 100644
--- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp
+++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp
@@ -86,9 +86,6 @@
case REQUIRED:
out->print("Expecting that file %s must exist and is not altered", path);
break;
- case PATCH_MOD:
- out->print("Expecting --patch-module=%s", path);
- break;
default:
ShouldNotReachHere();
}
@@ -167,26 +164,6 @@
}
}
break;
- case PATCH_MOD:
- {
- GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
- if (patch_mod_args != NULL) {
- int num_of_entries = patch_mod_args->length();
- for (int i = 0; i < num_of_entries; i++) {
- const char* module_name = (patch_mod_args->at(i))->module_name();
- const char* path_string = (patch_mod_args->at(i))->path_string();
- size_t n = strlen(module_name);
- // path contains the module name, followed by '=', and one or more entries.
- // E.g.: "java.base=foo" or "java.naming=dir1:dir2:dir3"
- if ((strncmp(module_name, path, n) != 0) ||
- (path[n] != '=') ||
- (strcmp(path + n + 1, path_string) != 0)) {
- return fail("--patch-module mismatch, path not found in run time: ", path);
- }
- }
- }
- }
- break;
default:
return fail("Corrupted archive file header");
}
diff --git a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp
index c680d3f..77de03b 100644
--- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp
+++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp
@@ -104,28 +104,10 @@
add_path(path, NON_EXIST);
}
- // The path must exist and have required size and modification time
- void add_required_file(const char* path) {
- add_path(path, REQUIRED);
-
- struct stat st;
- if (os::stat(path, &st) != 0) {
- assert(0, "sanity");
-#if INCLUDE_CDS
- ClassLoader::exit_with_path_failure("failed to os::stat(%s)", path); // should not happen
-#endif
- }
- write_time(st.st_mtime);
- write_long(st.st_size);
- }
-
// The path must exist, and must contain exactly <num_entries> files/dirs
void add_boot_classpath(const char* path) {
add_path(path, BOOT);
}
- void add_patch_mod_classpath(const char* path) {
- add_path(path, PATCH_MOD);
- }
int write_jint(jint num) {
write(&num, sizeof(num));
return 0;
@@ -147,8 +129,7 @@
enum {
BOOT = 1,
NON_EXIST = 2,
- REQUIRED = 3,
- PATCH_MOD = 4
+ REQUIRED = 3
};
virtual const char* type_name(int type) {
@@ -156,7 +137,6 @@
case BOOT: return "BOOT";
case NON_EXIST: return "NON_EXIST";
case REQUIRED: return "REQUIRED";
- case PATCH_MOD: return "PATCH_MOD";
default: ShouldNotReachHere(); return "?";
}
}
diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp
index 25d6783..e29fd13 100644
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp
@@ -1231,6 +1231,8 @@
bool SystemDictionary::is_shared_class_visible(Symbol* class_name,
instanceKlassHandle ik,
Handle class_loader, TRAPS) {
+ assert(!ModuleEntryTable::javabase_moduleEntry()->is_patched(),
+ "Cannot use sharing if java.base is patched");
ResourceMark rm;
int path_index = ik->shared_classpath_index();
SharedClassPathEntry* ent =
@@ -1258,6 +1260,12 @@
}
}
+ // If the archived class is from a module that has been patched at runtime,
+ // the class cannot be loaded from the archive.
+ if (mod_entry != NULL && mod_entry->is_patched()) {
+ return false;
+ }
+
if (class_loader.is_null()) {
assert(ent != NULL, "Shared class for NULL classloader must have valid SharedClassPathEntry");
// The NULL classloader can load archived class originated from the
diff --git a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
index fc763d7..9b815a7 100644
--- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
+++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
@@ -299,10 +299,6 @@
}
static void initialize_method_handle_entries();
-
- // PPC-only: Support abs and sqrt like in compiler.
- // For others we can use a normal (native) entry.
- static bool math_entry_available(MethodKind kind);
};
//------------------------------------------------------------------------------------------------------------------------
diff --git a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp
index db808a9..4c8df9d 100644
--- a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp
+++ b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp
@@ -57,6 +57,8 @@
method_entry(java_lang_math_log10 );
method_entry(java_lang_math_pow );
method_entry(java_lang_math_exp );
+ method_entry(java_lang_math_fmaD );
+ method_entry(java_lang_math_fmaF );
method_entry(java_lang_ref_reference_get);
AbstractInterpreter::initialize_method_handle_entries();
@@ -95,7 +97,9 @@
case Interpreter::java_lang_math_log10 : // fall thru
case Interpreter::java_lang_math_sqrt : // fall thru
case Interpreter::java_lang_math_pow : // fall thru
- case Interpreter::java_lang_math_exp : entry_point = generate_math_entry(kind); break;
+ case Interpreter::java_lang_math_exp : // fall thru
+ case Interpreter::java_lang_math_fmaD : // fall thru
+ case Interpreter::java_lang_math_fmaF : entry_point = generate_math_entry(kind); break;
case Interpreter::java_lang_ref_reference_get
: entry_point = generate_Reference_get_entry(); break;
default:
diff --git a/hotspot/src/share/vm/interpreter/rewriter.cpp b/hotspot/src/share/vm/interpreter/rewriter.cpp
index dfc110b..8158776 100644
--- a/hotspot/src/share/vm/interpreter/rewriter.cpp
+++ b/hotspot/src/share/vm/interpreter/rewriter.cpp
@@ -426,15 +426,16 @@
Symbol* field_sig = cp->signature_ref_at(bc_index);
fieldDescriptor fd;
- klass->find_field(field_name, field_sig, &fd);
- if (fd.access_flags().is_final()) {
- if (fd.access_flags().is_static()) {
- if (!method->is_static_initializer()) {
- fd.set_has_initialized_final_update(true);
- }
- } else {
- if (!method->is_object_initializer()) {
- fd.set_has_initialized_final_update(true);
+ if (klass->find_field(field_name, field_sig, &fd) != NULL) {
+ if (fd.access_flags().is_final()) {
+ if (fd.access_flags().is_static()) {
+ if (!method->is_static_initializer()) {
+ fd.set_has_initialized_final_update(true);
+ }
+ } else {
+ if (!method->is_object_initializer()) {
+ fd.set_has_initialized_final_update(true);
+ }
}
}
}
diff --git a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp
index f5e7e7a..745fb51 100644
--- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp
+++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp
@@ -967,7 +967,7 @@
return objects;
}
-void CodeInstaller::record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS) {
+void CodeInstaller::record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, bool return_oop, TRAPS) {
Handle position = DebugInfo::bytecodePosition(debug_info);
if (position.is_null()) {
// Stubs do not record scope info, just oop maps
@@ -980,10 +980,10 @@
} else {
objectMapping = NULL;
}
- record_scope(pc_offset, position, scope_mode, objectMapping, CHECK);
+ record_scope(pc_offset, position, scope_mode, objectMapping, return_oop, CHECK);
}
-void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, TRAPS) {
+void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, bool return_oop, TRAPS) {
Handle frame;
if (scope_mode == CodeInstaller::FullFrame) {
if (!position->is_a(BytecodeFrame::klass())) {
@@ -993,7 +993,7 @@
}
Handle caller_frame = BytecodePosition::caller(position);
if (caller_frame.not_null()) {
- record_scope(pc_offset, caller_frame, scope_mode, objects, CHECK);
+ record_scope(pc_offset, caller_frame, scope_mode, objects, return_oop, CHECK);
}
Handle hotspot_method = BytecodePosition::method(position);
@@ -1083,7 +1083,7 @@
throw_exception = BytecodeFrame::rethrowException(frame) == JNI_TRUE;
}
- _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, false,
+ _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, return_oop,
locals_token, expressions_token, monitors_token);
}
@@ -1139,7 +1139,10 @@
if (debug_info.not_null()) {
OopMap *map = create_oop_map(debug_info, CHECK);
_debug_recorder->add_safepoint(next_pc_offset, map);
- record_scope(next_pc_offset, debug_info, CodeInstaller::FullFrame, CHECK);
+
+ bool return_oop = hotspot_method.not_null() && getMethodFromHotSpotMethod(hotspot_method())->is_returning_oop();
+
+ record_scope(next_pc_offset, debug_info, CodeInstaller::FullFrame, return_oop, CHECK);
}
if (foreign_call.not_null()) {
diff --git a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp
index d5e2d32..775a8c1 100644
--- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp
+++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp
@@ -254,8 +254,11 @@
FullFrame
};
- void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS);
- void record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, TRAPS);
+ void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, bool return_oop, TRAPS);
+ void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS) {
+ record_scope(pc_offset, debug_info, scope_mode, false /* return_oop */, THREAD);
+ }
+ void record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, bool return_oop, TRAPS);
void record_object_value(ObjectValue* sv, Handle value, GrowableArray<ScopeValue*>* objects, TRAPS);
GrowableArray<ScopeValue*>* record_virtual_objects(Handle debug_info, TRAPS);
diff --git a/hotspot/src/share/vm/logging/logFileStreamOutput.cpp b/hotspot/src/share/vm/logging/logFileStreamOutput.cpp
index 01ac7d1..70772e8 100644
--- a/hotspot/src/share/vm/logging/logFileStreamOutput.cpp
+++ b/hotspot/src/share/vm/logging/logFileStreamOutput.cpp
@@ -29,11 +29,17 @@
#include "memory/allocation.inline.hpp"
static bool initialized;
-static char stdoutmem[sizeof(LogStdoutOutput)];
-static char stderrmem[sizeof(LogStderrOutput)];
+static union {
+ char stdoutmem[sizeof(LogStdoutOutput)];
+ jlong dummy;
+} aligned_stdoutmem;
+static union {
+ char stderrmem[sizeof(LogStderrOutput)];
+ jlong dummy;
+} aligned_stderrmem;
-LogStdoutOutput &StdoutLog = reinterpret_cast<LogStdoutOutput&>(stdoutmem);
-LogStderrOutput &StderrLog = reinterpret_cast<LogStderrOutput&>(stderrmem);
+LogStdoutOutput &StdoutLog = reinterpret_cast<LogStdoutOutput&>(aligned_stdoutmem.stdoutmem);
+LogStderrOutput &StderrLog = reinterpret_cast<LogStderrOutput&>(aligned_stderrmem.stderrmem);
LogFileStreamInitializer::LogFileStreamInitializer() {
if (!initialized) {
diff --git a/hotspot/src/share/vm/memory/filemap.cpp b/hotspot/src/share/vm/memory/filemap.cpp
index 70f9f98..fbc9f0d 100644
--- a/hotspot/src/share/vm/memory/filemap.cpp
+++ b/hotspot/src/share/vm/memory/filemap.cpp
@@ -179,7 +179,6 @@
_classpath_entry_table_size = mapinfo->_classpath_entry_table_size;
_classpath_entry_table = mapinfo->_classpath_entry_table;
_classpath_entry_size = mapinfo->_classpath_entry_size;
- _num_patch_mod_prefixes = ClassLoader::num_patch_mod_prefixes();
// The following fields are for sanity checks for whether this archive
// will function correctly with this JVM and the bootclasspath it's
@@ -948,23 +947,6 @@
return false;
}
- // Check if there is a mismatch in --patch-module entry counts between dump time and run time.
- // More checks will be performed on individual --patch-module entry in the
- // SharedPathsMiscInfo::check() function.
- GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
- if (patch_mod_args != NULL) {
- if (_num_patch_mod_prefixes == 0) {
- FileMapInfo::fail_stop("--patch-module found in run time but none was specified in dump time");
- }
- if (patch_mod_args->length() != _num_patch_mod_prefixes) {
- FileMapInfo::fail_stop("mismatched --patch-module entry counts between dump time and run time");
- }
- } else {
- if (_num_patch_mod_prefixes > 0) {
- FileMapInfo::fail_stop("--patch-module specified in dump time but none was specified in run time");
- }
- }
-
return true;
}
diff --git a/hotspot/src/share/vm/memory/filemap.hpp b/hotspot/src/share/vm/memory/filemap.hpp
index 086533e..7424b81 100644
--- a/hotspot/src/share/vm/memory/filemap.hpp
+++ b/hotspot/src/share/vm/memory/filemap.hpp
@@ -155,7 +155,6 @@
// loading failures during runtime.
int _classpath_entry_table_size;
size_t _classpath_entry_size;
- int _num_patch_mod_prefixes; // number of --patch-module entries
SharedClassPathEntry* _classpath_entry_table;
char* region_addr(int idx);
diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp
index 51f0784..47e9821 100644
--- a/hotspot/src/share/vm/opto/runtime.cpp
+++ b/hotspot/src/share/vm/opto/runtime.cpp
@@ -59,7 +59,6 @@
#include "opto/mulnode.hpp"
#include "opto/runtime.hpp"
#include "opto/subnode.hpp"
-#include "prims/jvmtiThreadState.hpp"
#include "runtime/atomic.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/handles.inline.hpp"
@@ -1458,11 +1457,6 @@
}
#endif
- JvmtiThreadState *state = thread->jvmti_thread_state();
- if (state != NULL) {
- state->set_exception_detected();
- }
-
thread->set_vm_result(exception);
// Frame not compiled (handles deoptimization blob)
return SharedRuntime::raw_exception_handler_for_return_address(thread, ret_pc);
diff --git a/hotspot/src/share/vm/prims/jvmtiExport.cpp b/hotspot/src/share/vm/prims/jvmtiExport.cpp
index 1f56b22..52350da 100644
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp
@@ -130,15 +130,15 @@
private:
JavaThread *_thread;
JNIEnv* _jni_env;
- bool _exception_detected;
- bool _exception_caught;
+ JvmtiThreadState::ExceptionState _saved_exception_state;
#if 0
JNIHandleBlock* _hblock;
#endif
public:
JvmtiEventMark(JavaThread *thread) : _thread(thread),
- _jni_env(thread->jni_environment()) {
+ _jni_env(thread->jni_environment()),
+ _saved_exception_state(JvmtiThreadState::ES_CLEARED) {
#if 0
_hblock = thread->active_handles();
_hblock->clear_thoroughly(); // so we can be safe
@@ -149,11 +149,7 @@
// we are before an event.
// Save current jvmti thread exception state.
if (state != NULL) {
- _exception_detected = state->is_exception_detected();
- _exception_caught = state->is_exception_caught();
- } else {
- _exception_detected = false;
- _exception_caught = false;
+ _saved_exception_state = state->get_exception_state();
}
JNIHandleBlock* old_handles = thread->active_handles();
@@ -186,12 +182,7 @@
// we are continuing after an event.
if (state != NULL) {
// Restore the jvmti thread exception state.
- if (_exception_detected) {
- state->set_exception_detected();
- }
- if (_exception_caught) {
- state->set_exception_caught();
- }
+ state->restore_exception_state(_saved_exception_state);
}
}
@@ -1552,7 +1543,6 @@
}
}
-
void JvmtiExport::post_exception_throw(JavaThread *thread, Method* method, address location, oop exception) {
HandleMark hm(thread);
methodHandle mh(thread, method);
@@ -2454,7 +2444,7 @@
JvmtiThreadState* state = thread->jvmti_thread_state();
if (state != NULL) {
- state->clear_exception_detected();
+ state->clear_exception_state();
}
}
diff --git a/hotspot/src/share/vm/prims/jvmtiThreadState.cpp b/hotspot/src/share/vm/prims/jvmtiThreadState.cpp
index 1e3a6e8..099f705 100644
--- a/hotspot/src/share/vm/prims/jvmtiThreadState.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiThreadState.cpp
@@ -50,8 +50,7 @@
: _thread_event_enable() {
assert(JvmtiThreadState_lock->is_locked(), "sanity check");
_thread = thread;
- _exception_detected = false;
- _exception_caught = false;
+ _exception_state = ES_CLEARED;
_debuggable = true;
_hide_single_stepping = false;
_hide_level = 0;
@@ -310,7 +309,7 @@
// an exception.
//
if (is_exception_detected()) {
- clear_exception_detected();
+ clear_exception_state();
}
// If step is pending for popframe then it may not be
// a repeat step. The new_bci and method_id is same as current_bci
@@ -385,7 +384,7 @@
// an exception.
//
if (is_exception_detected()) {
- clear_exception_detected();
+ clear_exception_state();
}
// If step is pending for earlyret then it may not be a repeat step.
// The new_bci and method_id is same as current_bci and current
diff --git a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp
index b72d495..06a091b 100644
--- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp
+++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp
@@ -76,13 +76,21 @@
private:
friend class JvmtiEnv;
JavaThread *_thread;
- bool _exception_detected;
- bool _exception_caught;
bool _hide_single_stepping;
bool _pending_step_for_popframe;
bool _pending_step_for_earlyret;
int _hide_level;
+ public:
+ enum ExceptionState {
+ ES_CLEARED,
+ ES_DETECTED,
+ ES_CAUGHT
+ };
+
+ private:
+ ExceptionState _exception_state;
+
// Used to send class being redefined/retransformed and kind of transform
// info to the class file load hook event handler.
KlassHandle *_class_being_redefined;
@@ -161,16 +169,18 @@
int count_frames();
inline JavaThread *get_thread() { return _thread; }
- inline bool is_exception_detected() { return _exception_detected; }
- inline bool is_exception_caught() { return _exception_caught; }
- inline void set_exception_detected() { _exception_detected = true;
- _exception_caught = false; }
- inline void clear_exception_detected() {
- _exception_detected = false;
- assert(_exception_caught == false, "_exception_caught is out of phase");
- }
- inline void set_exception_caught() { _exception_caught = true;
- _exception_detected = false; }
+
+ inline bool is_exception_detected() { return _exception_state == ES_DETECTED; }
+ inline bool is_exception_caught() { return _exception_state == ES_CAUGHT; }
+
+ inline void set_exception_detected() { _exception_state = ES_DETECTED; }
+ inline void set_exception_caught() { _exception_state = ES_CAUGHT; }
+
+ inline void clear_exception_state() { _exception_state = ES_CLEARED; }
+
+ // We need to save and restore exception state inside JvmtiEventMark
+ inline ExceptionState get_exception_state() { return _exception_state; }
+ inline void restore_exception_state(ExceptionState state) { _exception_state = state; }
inline void clear_hide_single_stepping() {
if (_hide_level > 0) {
diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
index f1e90f9..e7e9108 100644
--- a/hotspot/src/share/vm/runtime/arguments.cpp
+++ b/hotspot/src/share/vm/runtime/arguments.cpp
@@ -1323,26 +1323,32 @@
"jdk.module.limitmods",
"jdk.module.path",
"jdk.module.upgrade.path",
- "jdk.module.addmods.0" };
- const char* unsupported_options[] = { "-m",
- "--limit-modules",
- "--module-path",
- "--upgrade-module-path",
- "--add-modules" };
+ "jdk.module.addmods.0",
+ "jdk.module.patch.0" };
+ const char* unsupported_options[] = { "-m", // cannot use at dump time
+ "--limit-modules", // ignored at dump time
+ "--module-path", // ignored at dump time
+ "--upgrade-module-path", // ignored at dump time
+ "--add-modules", // ignored at dump time
+ "--patch-module" // ignored at dump time
+ };
assert(ARRAY_SIZE(unsupported_properties) == ARRAY_SIZE(unsupported_options), "must be");
- // If a vm option is found in the unsupported_options array with index less than the warning_idx,
- // vm will exit with an error message. Otherwise, it will result in a warning message.
- uint warning_idx = 2;
+ // If a vm option is found in the unsupported_options array with index less than the info_idx,
+ // vm will exit with an error message. Otherwise, it will print an informational message if
+ // PrintSharedSpaces is enabled.
+ uint info_idx = 1;
SystemProperty* sp = system_properties();
while (sp != NULL) {
for (uint i = 0; i < ARRAY_SIZE(unsupported_properties); i++) {
if (strcmp(sp->key(), unsupported_properties[i]) == 0) {
- if (i < warning_idx) {
+ if (i < info_idx) {
vm_exit_during_initialization(
"Cannot use the following option when dumping the shared archive", unsupported_options[i]);
} else {
- warning(
- "the %s option is ignored when dumping the shared archive", unsupported_options[i]);
+ if (PrintSharedSpaces) {
+ tty->print_cr(
+ "Info: the %s option is ignored when dumping the shared archive", unsupported_options[i]);
+ }
}
}
}
@@ -1419,10 +1425,8 @@
}
}
-#if defined(COMPILER2) || INCLUDE_JVMCI || defined(_LP64) || !INCLUDE_CDS
// Conflict: required to use shared spaces (-Xshare:on), but
// incompatible command line options were chosen.
-
static void no_shared_spaces(const char* message) {
if (RequireSharedSpaces) {
jio_fprintf(defaultStream::error_stream(),
@@ -1432,7 +1436,6 @@
FLAG_SET_DEFAULT(UseSharedSpaces, false);
}
}
-#endif
// Returns threshold scaled with the value of scale.
// If scale < 0.0, threshold is returned without scaling.
@@ -2680,6 +2683,12 @@
return result;
}
+#if INCLUDE_CDS
+ if (UseSharedSpaces && patch_mod_javabase) {
+ no_shared_spaces("CDS is disabled when " JAVA_BASE_NAME " module is patched.");
+ }
+#endif
+
return JNI_OK;
}
@@ -4408,7 +4417,6 @@
}
jint Arguments::apply_ergo() {
-
// Set flags based on ergonomics.
set_ergonomics_flags();
diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp
index 12c2891..ac5919a 100644
--- a/hotspot/src/share/vm/runtime/os.hpp
+++ b/hotspot/src/share/vm/runtime/os.hpp
@@ -436,7 +436,7 @@
vm_thread,
cgc_thread, // Concurrent GC thread
pgc_thread, // Parallel GC thread
- java_thread,
+ java_thread, // Java, CodeCacheSweeper, JVMTIAgent and Service threads.
compiler_thread,
watcher_thread,
os_thread
diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp
index c9ac7e9..46824eb 100644
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp
@@ -288,7 +288,8 @@
nonstatic_field(Klass, _access_flags, AccessFlags) \
nonstatic_field(Klass, _prototype_header, markOop) \
nonstatic_field(Klass, _next_sibling, Klass*) \
- nonstatic_field(Klass, _vtable_len, int) \
+ nonstatic_field(Klass, _next_link, Klass*) \
+ nonstatic_field(Klass, _vtable_len, int) \
nonstatic_field(vtableEntry, _method, Method*) \
nonstatic_field(MethodData, _size, int) \
nonstatic_field(MethodData, _method, Method*) \
@@ -712,6 +713,8 @@
\
nonstatic_field(ClassLoaderData, _class_loader, oop) \
nonstatic_field(ClassLoaderData, _next, ClassLoaderData*) \
+ volatile_nonstatic_field(ClassLoaderData, _klasses, Klass*) \
+ nonstatic_field(ClassLoaderData, _is_anonymous, bool) \
\
static_field(ClassLoaderDataGraph, _head, ClassLoaderData*) \
\
diff --git a/hotspot/test/ProblemList.txt b/hotspot/test/ProblemList.txt
index 6088cb3..907597b 100644
--- a/hotspot/test/ProblemList.txt
+++ b/hotspot/test/ProblemList.txt
@@ -71,7 +71,6 @@
# :hotspot_serviceability
-serviceability/dcmd/jvmti/LoadAgentDcmdTest.java 8150318 generic-all
serviceability/jdwp/AllModulesCommandTest.java 8168478 generic-all
serviceability/sa/sadebugd/SADebugDTest.java 8163805 generic-all
diff --git a/hotspot/test/compiler/c2/Test7005594.java b/hotspot/test/compiler/c2/Test7005594.java
new file mode 100644
index 0000000..1b2d6d7
--- /dev/null
+++ b/hotspot/test/compiler/c2/Test7005594.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 7005594
+ * @summary Array overflow not handled correctly with loop optimzations
+ *
+ * @run main/othervm -Xcomp
+ -XX:CompileOnly=compiler.c2.Test7005594::test
+ compiler.c2.Test7005594
+ */
+
+package compiler.c2;
+
+public class Test7005594 {
+ static int test(byte a[]){
+ int result = 0;
+ for (int i = 1; i < a.length; i += Integer.MAX_VALUE) {
+ result += a[i];
+ }
+ return result;
+ }
+
+ public static void main(String [] args){
+ try {
+ int result = test(new byte[2]);
+ throw new AssertionError("Expected ArrayIndexOutOfBoundsException was not thrown");
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println("Expected " + e + " was thrown");
+ }
+ }
+}
diff --git a/hotspot/test/compiler/c2/cr7005594/Test7005594.java b/hotspot/test/compiler/c2/cr7005594/Test7005594.java
deleted file mode 100644
index d7e6a89..0000000
--- a/hotspot/test/compiler/c2/cr7005594/Test7005594.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @bug 7005594
- * @summary Array overflow not handled correctly with loop optimzations
- *
- * @run shell Test7005594.sh
- */
-
-package compiler.c2.cr7005594;
-
-public class Test7005594 {
-
- static int test(byte a[]){
- int result=0;
- for( int i=0; i<a.length; i+=((0x7fffffff>>1)+1) ){
- result += a[i];
- }
- return result;
- }
-
- public static void main(String [] args){
- byte a[]=new byte[(0x7fffffff>>1)+2];
- int result = 0;
- try {
- result = test(a);
- } catch (ArrayIndexOutOfBoundsException e) {
- e.printStackTrace(System.out);
- System.out.println("Passed");
- System.exit(95);
- }
- System.out.println(result);
- System.out.println("FAILED");
- System.exit(97);
- }
-
-}
-
diff --git a/hotspot/test/compiler/c2/cr7005594/Test7005594.sh b/hotspot/test/compiler/c2/cr7005594/Test7005594.sh
deleted file mode 100644
index 503d0aa..0000000
--- a/hotspot/test/compiler/c2/cr7005594/Test7005594.sh
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-#
-## some tests require path to find test source dir
-if [ "${TESTSRC}" = "" ]
-then
- TESTSRC=${PWD}
- echo "TESTSRC not set. Using "${TESTSRC}" as default"
-fi
-echo "TESTSRC=${TESTSRC}"
-## Adding common setup Variables for running shell tests.
-. ${TESTSRC}/../../../test_env.sh
-
-# Amount of physical memory in megabytes
-MEM=0
-if [ -f "/proc/meminfo" ]; then
- # Linux, Windows/Cygwin
- MEM=`cat /proc/meminfo |grep ^MemTotal: | awk '{print $2}'`
- MEM="$(($MEM / 1024))"
-elif [ -x "/usr/sbin/prtconf" ]; then
- # Solaris
- MEM=`/usr/sbin/prtconf | grep "^Memory size" | awk '{print $3}'`
-elif [ -x "/usr/sbin/system_profiler" ]; then
- # MacOS
- MEMo=`/usr/sbin/system_profiler SPHardwareDataType | grep Memory:`
- MEM=`echo "$MEMo" | awk '{print $2}'`
- MEMu=`echo "$MEMo" | awk '{print $3}'`
- case $MEMu in
- GB)
- MEM="$(($MEM * 1024))"
- ;;
- MB)
- ;;
- *)
- echo "Unknown memory unit in system_profile output: $MEMu"
- ;;
- esac
-elif [ -n "$ROOTDIR" -a -x "$ROOTDIR/mksnt/sysinf" ]; then
- # Windows/MKS
- MEM=`"$ROOTDIR/mksnt/sysinf" memory -v | grep "Total Physical Memory: " | sed 's/Total Physical Memory: *//g'`
- MEM="$(($machine_memory / 1024))"
-else
- echo "Unable to determine amount of physical memory on the machine"
-fi
-
-if [ $MEM -lt 2000 ]; then
- echo "Test skipped due to low (or unknown) memory on the system: $MEM Mb"
- exit 0
-fi
-
-echo "MEMORY=$MEM Mb"
-
-set -x
-
-cp ${TESTSRC}/Test7005594.java .
-cp ${TESTSRC}/Test7005594.sh .
-
-${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} -d . Test7005594.java
-
-${TESTJAVA}/bin/java ${TESTOPTS} -Xmx1600m -Xms1600m -XX:+IgnoreUnrecognizedVMOptions \
- -XX:-ZapUnusedHeapArea -Xcomp -XX:CompileCommand=quiet \
- -XX:CompileOnly=compiler.c2.cr7005594.Test7005594::test \
- compiler.c2.cr7005594.Test7005594 > test.out 2>&1
-
-result=$?
-
-cat test.out
-
-if [ $result -eq 95 ]
-then
- echo "Passed"
- exit 0
-fi
-
-if [ $result -eq 97 ]
-then
- echo "Failed"
- exit 1
-fi
-
-# The test should pass when no enough space for object heap
-grep "Could not reserve enough space for .*object heap" test.out
-if [ $? = 0 ]
-then
- echo "Passed"
- exit 0
-else
- echo "Failed"
- exit 1
-fi
diff --git a/hotspot/test/compiler/ciReplay/CiReplayBase.java b/hotspot/test/compiler/ciReplay/CiReplayBase.java
index 15972eb..6b39a97 100644
--- a/hotspot/test/compiler/ciReplay/CiReplayBase.java
+++ b/hotspot/test/compiler/ciReplay/CiReplayBase.java
@@ -215,7 +215,7 @@
try(BufferedReader br = new BufferedReader(new FileReader(REPLAY_FILE_NAME))) {
return br.lines()
.filter(s -> s.startsWith("compile "))
- .map(s -> s.substring(s.lastIndexOf(' ') + 1))
+ .map(s -> s.split("\\s+")[5])
.map(Integer::parseInt)
.findAny()
.get();
diff --git a/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java b/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java
new file mode 100644
index 0000000..4bb62bc
--- /dev/null
+++ b/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2016, Red Hat, Inc. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8171092
+ * @summary C1's Math.fma() intrinsic doesn't correctly marks its inputs
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestFMABrokenC1RegAlloc
+ *
+ */
+
+public class TestFMABrokenC1RegAlloc {
+
+ double dummy0;
+ double dummy1;
+ double dummy2;
+ double dummy3;
+ double dummy4;
+ double dummy5;
+ double dummy6;
+ double dummy7;
+ double dummy8;
+ double dummy9;
+ double dummy10;
+ double dummy11;
+ double dummy12;
+ double dummy13;
+ double dummy14;
+ double dummy15;
+ double dummy16;
+ double dummy17;
+ double dummy18;
+ double dummy19;
+ double dummy20;
+ double dummy21;
+ double dummy22;
+ double dummy23;
+ double dummy24;
+ double dummy25;
+ double dummy26;
+ double dummy27;
+ double dummy28;
+ double dummy29;
+ double dummy30;
+ double dummy31;
+ double dummy32;
+ double dummy33;
+ double dummy34;
+ double dummy35;
+ double dummy36;
+ double dummy37;
+ double dummy38;
+ double dummy39;
+
+ double test(double a, double b, double c) {
+ double dummy0 = this.dummy0;
+ double dummy1 = this.dummy1;
+ double dummy2 = this.dummy2;
+ double dummy3 = this.dummy3;
+ double dummy4 = this.dummy4;
+ double dummy5 = this.dummy5;
+ double dummy6 = this.dummy6;
+ double dummy7 = this.dummy7;
+ double dummy8 = this.dummy8;
+ double dummy9 = this.dummy9;
+ double dummy10 = this.dummy10;
+ double dummy11 = this.dummy11;
+ double dummy12 = this.dummy12;
+ double dummy13 = this.dummy13;
+ double dummy14 = this.dummy14;
+ double dummy15 = this.dummy15;
+ double dummy16 = this.dummy16;
+ double dummy17 = this.dummy17;
+ double dummy18 = this.dummy18;
+ double dummy19 = this.dummy19;
+ double dummy20 = this.dummy20;
+ double dummy21 = this.dummy21;
+ double dummy22 = this.dummy22;
+ double dummy23 = this.dummy23;
+ double dummy24 = this.dummy24;
+ double dummy25 = this.dummy25;
+ double dummy26 = this.dummy26;
+ double dummy27 = this.dummy27;
+ double dummy28 = this.dummy28;
+ double dummy29 = this.dummy29;
+ double dummy30 = this.dummy30;
+ double dummy31 = this.dummy31;
+ double dummy32 = this.dummy32;
+ double dummy33 = this.dummy33;
+ double dummy34 = this.dummy34;
+ double dummy35 = this.dummy35;
+ double dummy36 = this.dummy36;
+ double dummy37 = this.dummy37;
+ double dummy38 = this.dummy38;
+ double dummy39 = this.dummy39;
+ return Math.fma(a, b, c) +
+ dummy0 +
+ dummy1 +
+ dummy2 +
+ dummy3 +
+ dummy4 +
+ dummy5 +
+ dummy6 +
+ dummy7 +
+ dummy8 +
+ dummy9 +
+ dummy10 +
+ dummy11 +
+ dummy12 +
+ dummy13 +
+ dummy14 +
+ dummy15 +
+ dummy16 +
+ dummy17 +
+ dummy18 +
+ dummy19 +
+ dummy20 +
+ dummy21 +
+ dummy22 +
+ dummy23 +
+ dummy24 +
+ dummy25 +
+ dummy26 +
+ dummy27 +
+ dummy28 +
+ dummy29 +
+ dummy30 +
+ dummy31 +
+ dummy32 +
+ dummy33 +
+ dummy34 +
+ dummy35 +
+ dummy36 +
+ dummy37 +
+ dummy38 +
+ dummy39;
+ }
+
+ static public void main(String[] args) {
+ TestFMABrokenC1RegAlloc t = new TestFMABrokenC1RegAlloc();
+ for (int i = 0; i < 5000; i++) {
+ if (t.test(5.0, 10.0, 7.0) != 57.0) {
+ throw new RuntimeException("Failed");
+ }
+ }
+ }
+}
diff --git a/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java b/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java
index 494f121..4036900 100644
--- a/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java
+++ b/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java
@@ -241,7 +241,7 @@
CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
"-Xbootclasspath/a:.", "-XX:+WhiteBoxAPI",
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED");
+ "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED");
if (test != null) {
for (String method : test.getMethodsToCompileNames()) {
diff --git a/hotspot/test/native/logging/logTestUtils.inline.hpp b/hotspot/test/native/logging/logTestUtils.inline.hpp
index 03209ae..b5e26b8 100644
--- a/hotspot/test/native/logging/logTestUtils.inline.hpp
+++ b/hotspot/test/native/logging/logTestUtils.inline.hpp
@@ -59,6 +59,20 @@
assert(!failed, "failed to create directory %s", name);
}
+static inline void delete_empty_directory(const char* name) {
+#ifdef _WINDOWS
+ if (!file_exists(name)) {
+ return;
+ }
+ bool failed;
+ failed = !RemoveDirectory(name);
+ EXPECT_FALSE(failed) << "failed to remove directory '" << name
+ << "': LastError = " << GetLastError();
+#else
+ delete_file(name);
+#endif
+}
+
static inline void init_log_file(const char* filename, const char* options = "") {
LogStreamHandle(Error, logging) stream;
bool success = LogConfiguration::parse_log_arguments(filename, "logging=trace", "", options, &stream);
diff --git a/hotspot/test/native/logging/test_logFileOutput.cpp b/hotspot/test/native/logging/test_logFileOutput.cpp
index f3e8937..95fd883 100644
--- a/hotspot/test/native/logging/test_logFileOutput.cpp
+++ b/hotspot/test/native/logging/test_logFileOutput.cpp
@@ -103,7 +103,7 @@
EXPECT_FALSE(fo.initialize(buf, &ss)) << "Accepted filesize that overflows";
}
-TEST(LogFileOutput, startup_rotation) {
+TEST_VM(LogFileOutput, startup_rotation) {
const size_t rotations = 5;
const char* filename = "start-rotate-test";
char* rotated_file[rotations];
@@ -140,7 +140,7 @@
}
}
-TEST(LogFileOutput, startup_truncation) {
+TEST_VM(LogFileOutput, startup_truncation) {
const char* filename = "start-truncate-test";
const char* archived_filename = "start-truncate-test.0";
@@ -168,7 +168,7 @@
delete_file(archived_filename);
}
-TEST(LogFileOutput, invalid_file) {
+TEST_VM(LogFileOutput, invalid_file) {
ResourceMark rm;
stringStream ss;
@@ -179,5 +179,5 @@
<< "file was initialized when there was an existing directory with the same name";
EXPECT_TRUE(string_contains_substring(ss.as_string(), "tmplogdir is not a regular file"))
<< "missing expected error message, received msg: %s" << ss.as_string();
- remove("tmplogdir");
+ delete_empty_directory("tmplogdir");
}
diff --git a/hotspot/test/native/logging/test_logMessageTest.cpp b/hotspot/test/native/logging/test_logMessageTest.cpp
index cf7c4ce..f23ba94 100644
--- a/hotspot/test/native/logging/test_logMessageTest.cpp
+++ b/hotspot/test/native/logging/test_logMessageTest.cpp
@@ -10,7 +10,7 @@
* 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
- * ac_heapanied this code).
+ * 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,
@@ -19,8 +19,8 @@
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
- *
*/
+
#include "precompiled.hpp"
#include "logTestFixture.hpp"
#include "logTestUtils.inline.hpp"
diff --git a/hotspot/test/native/logging/test_logStream.cpp b/hotspot/test/native/logging/test_logStream.cpp
index b02839c..22b52efb 100644
--- a/hotspot/test/native/logging/test_logStream.cpp
+++ b/hotspot/test/native/logging/test_logStream.cpp
@@ -41,41 +41,41 @@
EXPECT_TRUE(file_contains_substring(TestLogFileName, "3 workers\n"));
}
-TEST_F(LogStreamTest, from_log) {
+TEST_VM_F(LogStreamTest, from_log) {
Log(gc) log;
LogStream stream(log.debug());
verify_stream(&stream);
}
-TEST_F(LogStreamTest, from_logtarget) {
+TEST_VM_F(LogStreamTest, from_logtarget) {
LogTarget(Debug, gc) log;
LogStream stream(log);
verify_stream(&stream);
}
-TEST_F(LogStreamTest, handle) {
+TEST_VM_F(LogStreamTest, handle) {
LogStreamHandle(Debug, gc) stream;
verify_stream(&stream);
}
-TEST_F(LogStreamTest, no_rm) {
+TEST_VM_F(LogStreamTest, no_rm) {
ResourceMark rm;
outputStream* stream = LogTarget(Debug, gc)::stream();
verify_stream(stream);
}
-TEST_F(LogStreamTest, c_heap_stream) {
+TEST_VM_F(LogStreamTest, c_heap_stream) {
Log(gc) log;
LogStreamCHeap stream(log.debug());
verify_stream(&stream);
}
-TEST_F(LogStreamTest, c_heap_stream_target) {
+TEST_VM_F(LogStreamTest, c_heap_stream_target) {
LogTarget(Debug, gc) log;
LogStreamCHeap stream(log);
diff --git a/hotspot/test/native/utilities/test_linkedlist.cpp b/hotspot/test/native/utilities/test_linkedlist.cpp
index 34aa774..471c442 100644
--- a/hotspot/test/native/utilities/test_linkedlist.cpp
+++ b/hotspot/test/native/utilities/test_linkedlist.cpp
@@ -74,7 +74,7 @@
ASSERT_EQ(six.value(), i->value()) << "Should be 6";
i = ll.find(three);
- ASSERT_EQ(NULL, i) << "Not in the list";
+ ASSERT_TRUE(i == NULL) << "Not in the list";
LinkedListNode<Integer>* node = ll.find_node(six);
ASSERT_TRUE(node != NULL) << "6 is in the list";
diff --git a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java
index 352a04f..e374853 100644
--- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java
+++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java
@@ -72,6 +72,6 @@
testOption("--add-reads", "xyzz=yyzd", "jdk.module.addreads.0", "WARNING: Unknown module: xyzz");
testOption("--add-exports", "java.base/xyzz=yyzd", "jdk.module.addexports.0",
"WARNING: package xyzz not in java.base");
- testOption("--patch-module", "=d", "jdk.module.patch.0", "Missing module name");
+ testOption("--patch-module", "=d", "jdk.module.patch.0", "Unable to parse --patch-module");
}
}
diff --git a/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java
index 82d5c38..cd9a66e 100644
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java
@@ -52,7 +52,7 @@
new OutputAnalyzer(pb.start())
.shouldContain("ro space:"); // Make sure archive got created.
- // Case 2: Test that only jar file in --patch-module is supported for CDS dumping
+ // Case 2: Test that directory in --patch-module is supported for CDS dumping
// Create a class file in the module java.base.
String source = "package javax.naming.spi; " +
"public class NamingManager { " +
@@ -73,7 +73,7 @@
"-Xlog:class+path=info",
"-version");
new OutputAnalyzer(pb.start())
- .shouldContain("--patch-module requires a regular file during dumping");
+ .shouldContain("ro space:"); // Make sure archive got created.
// Case 3a: Test CDS dumping with jar file in --patch-module
BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager");
diff --git a/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java
index 089e8df..373edf0 100644
--- a/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java
+++ b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java
@@ -136,11 +136,7 @@
if (Platform.isWindows()) {
return "bin";
}
- if (Platform.isOSX()) {
- return "lib";
- }
-
- return "lib/" + Platform.getOsArch();
+ return "lib";
}
/**
diff --git a/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c
index 351dfc4..e028ee5 100644
--- a/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c
+++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c
@@ -82,14 +82,18 @@
}
static
-jint throw_exc(JNIEnv *env, char *msg) {
+void throw_exc(JNIEnv *env, char *msg) {
jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+ jint rt = JNI_OK;
if (exc_class == NULL) {
printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
- return -1;
+ return;
}
- return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ if (rt == JNI_ERR) {
+ printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg);
+ }
}
static
diff --git a/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c
index 8d33914..4863a4a 100644
--- a/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c
+++ b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c
@@ -81,14 +81,18 @@
}
static
-jint throw_exc(JNIEnv *env, char *msg) {
+void throw_exc(JNIEnv *env, char *msg) {
jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+ jint rt = JNI_OK;
if (exc_class == NULL) {
printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
- return -1;
+ return;
}
- return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ if (rt == JNI_ERR) {
+ printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg);
+ }
}
static
diff --git a/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c
index 0d993f6..5ce1bf4 100644
--- a/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c
+++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c
@@ -82,14 +82,18 @@
}
static
-jint throw_exc(JNIEnv *env, char *msg) {
+void throw_exc(JNIEnv *env, char *msg) {
jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+ jint rt = JNI_OK;
if (exc_class == NULL) {
printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
- return -1;
+ return;
}
- return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ if (rt == JNI_ERR) {
+ printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg);
+ }
}
static
diff --git a/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java b/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java
deleted file mode 100644
index 2c823d3..0000000
--- a/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-/*
- * @test
- * @bug 8134434
- * @summary JVM_DoPrivileged() fires assert(_exception_caught == false) failed: _exception_caught is out of phase
- * @run main/othervm -agentlib:jdwp=transport=dt_socket,address=9000,server=y,suspend=n -Xbatch ExceptionCaughtOutOfPhaseTest
- */
-
-public class ExceptionCaughtOutOfPhaseTest {
- public static void main(String[] args) {
- PrivilegedAction action = new HotThrowingAction();
- System.out.println("### Warm-up");
- for(int i=0; i<11000; i++) {
- try {
- action.run(); // call run() to get it compiled
- } catch(Throwable t) {
- // ignored
- }
- }
-
- System.out.println("### Warm-up done");
- System.out.println("### Executing privileged action");
-
- try {
- AccessController.doPrivileged(action);
- } catch (Error e) {
- // ignored
- }
- }
-
- public static class HotThrowingAction implements PrivilegedAction {
- public Object run() {
- throw new Error();
- }
- }
-}
diff --git a/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java b/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java
new file mode 100644
index 0000000..a2d83a1
--- /dev/null
+++ b/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+import java.io.File;
+import java.nio.file.Files;
+import java.io.IOException;
+import java.io.BufferedInputStream;
+import java.util.stream.Collectors;
+import java.io.FileInputStream;
+
+import sun.jvm.hotspot.HotSpotAgent;
+import sun.jvm.hotspot.debugger.*;
+
+import jdk.test.lib.apps.LingeredApp;
+import jdk.test.lib.JDKToolLauncher;
+import jdk.test.lib.JDKToolFinder;
+import jdk.test.lib.Platform;
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.Utils;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.hprof.HprofParser;
+import jdk.test.lib.hprof.parser.HprofReader;
+import jdk.test.lib.hprof.parser.PositionDataInputStream;
+import jdk.test.lib.hprof.model.Snapshot;
+
+/*
+ * @test
+ * @library /test/lib
+ * @requires os.family != "mac"
+ * @modules java.base/jdk.internal.misc
+ * jdk.hotspot.agent/sun.jvm.hotspot
+ * jdk.hotspot.agent/sun.jvm.hotspot.utilities
+ * jdk.hotspot.agent/sun.jvm.hotspot.oops
+ * jdk.hotspot.agent/sun.jvm.hotspot.debugger
+ * @run main/othervm TestHeapDumpForInvokeDynamic
+ */
+
+public class TestHeapDumpForInvokeDynamic {
+
+ private static LingeredAppWithInvokeDynamic theApp = null;
+
+ private static void verifyHeapDump(String heapFile) {
+
+ File heapDumpFile = new File(heapFile);
+ Asserts.assertTrue(heapDumpFile.exists() && heapDumpFile.isFile(),
+ "Could not create dump file " + heapDumpFile.getAbsolutePath());
+ try (PositionDataInputStream in = new PositionDataInputStream(
+ new BufferedInputStream(new FileInputStream(heapFile)))) {
+ int i = in.readInt();
+ if (HprofReader.verifyMagicNumber(i)) {
+ Snapshot sshot;
+ HprofReader r = new HprofReader(heapFile, in, 0,
+ false, 0);
+ sshot = r.read();
+ } else {
+ throw new IOException("Unrecognized magic number: " + i);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ Asserts.fail("Could not read dump file " + heapFile);
+ } finally {
+ heapDumpFile.delete();
+ }
+ }
+
+ private static void attachDumpAndVerify(String heapDumpFileName,
+ long lingeredAppPid) throws Exception {
+
+ JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
+ launcher.addToolArg("jmap");
+ launcher.addToolArg("--binaryheap");
+ launcher.addToolArg("--dumpfile");
+ launcher.addToolArg(heapDumpFileName);
+ launcher.addToolArg("--pid");
+ launcher.addToolArg(Long.toString(lingeredAppPid));
+
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.command(launcher.getCommand());
+ System.out.println(
+ processBuilder.command().stream().collect(Collectors.joining(" ")));
+
+ OutputAnalyzer SAOutput = ProcessTools.executeProcess(processBuilder);
+ SAOutput.shouldHaveExitValue(0);
+ SAOutput.shouldContain("heap written to");
+ SAOutput.shouldContain(heapDumpFileName);
+ System.out.println(SAOutput.getOutput());
+
+ verifyHeapDump(heapDumpFileName);
+ }
+
+ public static void main (String... args) throws Exception {
+
+ String heapDumpFileName = "lambdaHeapDump.bin";
+
+ if (!Platform.shouldSAAttach()) {
+ System.out.println(
+ "SA attach not expected to work - test skipped.");
+ return;
+ }
+
+ File heapDumpFile = new File(heapDumpFileName);
+ if (heapDumpFile.exists()) {
+ heapDumpFile.delete();
+ }
+
+ try {
+ List<String> vmArgs = new ArrayList<String>();
+ vmArgs.add("-XX:+UsePerfData");
+ vmArgs.addAll(Utils.getVmOptions());
+
+ theApp = new LingeredAppWithInvokeDynamic();
+ LingeredApp.startApp(vmArgs, theApp);
+ attachDumpAndVerify(heapDumpFileName, theApp.getPid());
+ } finally {
+ LingeredApp.stopApp(theApp);
+ }
+ }
+}
diff --git a/make/Bundles.gmk b/make/Bundles.gmk
index 04e6857..8b1a704 100644
--- a/make/Bundles.gmk
+++ b/make/Bundles.gmk
@@ -103,7 +103,7 @@
$(CD) $$($1_BASE_DIRS) \
&& ( $(TAR) cf - $(TAR_CREATE_EXTRA_PARAM) \
-$(TAR_INCLUDE_PARAM) $$($1_$$($1_BASE_DIRS)_LIST_FILE) \
- $$(if $$($1_SUBDIR), --transform 's|^|$$($1_SUBDIR)/|') \
+ $$(if $$($1_SUBDIR), --transform 's|^|$$($1_SUBDIR)/|S') \
$(TAR_IGNORE_EXIT_VALUE) ) \
| $(GZIP) > $$@
else
diff --git a/make/CompileJavaModules.gmk b/make/CompileJavaModules.gmk
index b9c7c76..678618e 100644
--- a/make/CompileJavaModules.gmk
+++ b/make/CompileJavaModules.gmk
@@ -363,6 +363,10 @@
################################################################################
+jdk.jshell_COPY := .jsh .properties
+
+################################################################################
+
jdk.internal.le_COPY := .properties
################################################################################
diff --git a/make/Javadoc.gmk b/make/Javadoc.gmk
index c8e0a44..362352d 100644
--- a/make/Javadoc.gmk
+++ b/make/Javadoc.gmk
@@ -148,10 +148,10 @@
# arg 2: copyright url (optional)
# arg 3: free-form text snippet (optional)
define GenerateBottom
- <font size="-1">$(if $(strip $3), $(strip $3))<br> $(if \
+ <span style="font-size:smaller">$(if $(strip $3), $(strip $3))<br> $(if \
$(strip $2),<a href="$(strip $2)">Copyright</a>,Copyright) \
© $(strip $1), $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \
- $(COMPANY_ADDRESS). All rights reserved.</font>
+ $(COMPANY_ADDRESS). All rights reserved.</span>
endef
# Speed up finding by filling cache
diff --git a/make/SourceRevision.gmk b/make/SourceRevision.gmk
index cdd77d7..a14b3ef 100644
--- a/make/SourceRevision.gmk
+++ b/make/SourceRevision.gmk
@@ -105,7 +105,7 @@
# We have a stored source revision (.src-rev)
store-source-revision:
- $(call LogWarn, Warning: No mercurial configuration present, not updating .src-rev)
+ $(call LogInfo, No mercurial configuration present$(COMMA) not updating .src-rev)
$(SOURCE_REVISION_TRACKER): $(STORED_SOURCE_REVISION)
$(install-file)
@@ -115,7 +115,7 @@
# We don't have a stored source revision. Can't do anything, really.
store-source-revision:
- $(call LogWarn, Error: No mercurial configuration present, cannot create .src-rev)
+ $(call LogWarn, Error: No mercurial configuration present$(COMMA) cannot create .src-rev)
exit 2
create-source-revision-tracker:
diff --git a/make/common/NativeCompilation.gmk b/make/common/NativeCompilation.gmk
index 3a9cf47..2d5a39a 100644
--- a/make/common/NativeCompilation.gmk
+++ b/make/common/NativeCompilation.gmk
@@ -371,7 +371,8 @@
# when compiling C code
# DISABLED_WARNINGS_CXX_<toolchain> Disable the given warnings for the specified
# toolchain when compiling C++ code
-# STRIP_SYMBOLS Set to true to strip the final binary if the toolchain allows for it
+# STRIP_SYMBOLS Set to false to override global strip policy and always leave
+# symbols in the binary, if the toolchain allows for it
# DEBUG_SYMBOLS Set to false to disable generation of debug symbols
# COPY_DEBUG_SYMBOLS Set to false to override global setting of debug symbol copying
# ZIP_EXTERNAL_DEBUG_SYMBOLS Set to false to override global setting of debug symbol
@@ -886,6 +887,10 @@
endif # $1_DEBUG_SYMBOLS != false
endif # COPY_DEBUG_SYMBOLS
+ # Unless specifically set, stripping should only happen if symbols are also
+ # being copied.
+ $$(call SetIfEmpty, $1_STRIP_SYMBOLS, $$($1_COPY_DEBUG_SYMBOLS))
+
ifneq ($$($1_STRIP_SYMBOLS), false)
ifneq ($$($1_STRIP), )
# Default to using the global STRIPFLAGS. Allow for overriding with an empty value
diff --git a/make/jprt.properties b/make/jprt.properties
index 3c21c98..173a445 100644
--- a/make/jprt.properties
+++ b/make/jprt.properties
@@ -45,6 +45,7 @@
jprt.build.use.jib=true
jprt.test.use.jib=true
jprt.jib.launcher=common/bin/jib.sh
+jprt.build.use.jib.publish=true
# Clear out all the build needs as JIB handles this
jprt.jdk9.build.needs=
@@ -124,7 +125,7 @@
jprt.linux_i586.fastdebugZero.build.jib.profile=linux-x86-zero-debug
jprt.linux_x64.fastdebugZero.build.jib.profile=linux-x64-zero-debug
-jprt.test.jib.profile=run-test
+jprt.test.jib.profile=run-test-jprt
# Set make target to use for different build flavors
jprt.build.flavor.fastdebugOpen.target=jprt_bundle
@@ -189,7 +190,7 @@
jprt.build.configure.args= \
--with-output-sync=recurse \
--with-jobs=$ALT_PARALLEL_COMPILE_JOBS \
- --with-version-opt=$JPRT_JOB_ID \
+ --with-version-opt=$JPRT_JOB_ID \
${my.additional.build.configure.args.${jprt.test.set}} \
${my.custom.build.configure.args}
diff --git a/test/lib/jdk/test/lib/hprof/parser/HprofReader.java b/test/lib/jdk/test/lib/hprof/parser/HprofReader.java
index 693bec6..cdc505d 100644
--- a/test/lib/jdk/test/lib/hprof/parser/HprofReader.java
+++ b/test/lib/jdk/test/lib/hprof/parser/HprofReader.java
@@ -151,6 +151,10 @@
private Snapshot snapshot;
+ public static boolean verifyMagicNumber(int numberRead) {
+ return (numberRead == MAGIC_NUMBER);
+ }
+
public HprofReader(String fileName, PositionDataInputStream in,
int dumpNumber, boolean callStack, int debugLevel)
throws IOException {
@@ -737,6 +741,12 @@
long id = readID();
StackTrace stackTrace = getStackTraceFromSerial(in.readInt());
long classID = readID();
+ JavaClass searchedClass = snapshot.findClass(
+ "0x" + Long.toHexString(classID));
+ if (searchedClass == null) {
+ throw new IOException(
+ "Class Record for 0x" + Long.toHexString(classID) + " not found");
+ }
int bytesFollowing = in.readInt();
int bytesRead = (2 * identifierSize) + 8 + bytesFollowing;
JavaObject jobj = new JavaObject(classID, start);