8168790: CDS: assert(max_delta <= (0x7FFFFFFF)) failed: range check.
Summary: Change the assert to check the current delta is less than 0x7FFFFFFF.
Reviewed-by: iklam, ddmitriev
--- a/hotspot/src/share/vm/classfile/compactHashtable.cpp Fri Nov 11 16:52:44 2016 +0100
+++ b/hotspot/src/share/vm/classfile/compactHashtable.cpp Mon Nov 14 18:03:44 2016 -0500
@@ -171,11 +171,11 @@
void CompactSymbolTableWriter::add(unsigned int hash, Symbol *symbol) {
address base_address = address(MetaspaceShared::shared_rs()->base());
- uintx max_delta = uintx(MetaspaceShared::shared_rs()->size());
- assert(max_delta <= MAX_SHARED_DELTA, "range check");
uintx deltax = address(symbol) - base_address;
- assert(deltax < max_delta, "range check");
+ // The symbols are in RO space, which is smaler than MAX_SHARED_DELTA.
+ // The assert below is just to be extra cautious.
+ assert(deltax <= MAX_SHARED_DELTA, "the delta is too large to encode");
u4 delta = u4(deltax);
CompactHashtableWriter::add(hash, delta);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/LargeSharedSpace.java Mon Nov 14 18:03:44 2016 -0500
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test LargeSharedSpace
+ * @bug 8168790
+ * @summary Test CDS dumping with specific space size.
+ * The space size used in the test might not be suitable on windows and 32-bit platforms.
+ * @requires (sun.arch.data.model != "32") & (os.family != "windows")
+ * @library /test/lib
+ * @modules java.base/jdk.internal.misc
+ * java.management
+ * @run main LargeSharedSpace
+ */
+
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class LargeSharedSpace {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:SharedMiscCodeSize=1066924031", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./LargeSharedSpace.jsa", "-Xshare:dump");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Loading classes to share");
+ output.shouldHaveExitValue(0);
+ }
+}