changeset 12305:8589b00e7c92

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
author jiangli
date Mon, 14 Nov 2016 18:03:44 -0500
parents c667bae72ea8
children 9835a0bc4c4b
files src/share/vm/classfile/compactHashtable.cpp test/runtime/SharedArchiveFile/LargeSharedSpace.java
diffstat 2 files changed, 51 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/classfile/compactHashtable.cpp	Fri Nov 11 16:52:44 2016 +0100
+++ b/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/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);
+    }
+}