Date: Thu, 4 Jul 2019 07:25:47 +0800
Subject: [PATCH 11/40] 8226963: More clarification on possible sequencing
error in GSSContext::unwrap
Reviewed-by: mullan
---
.../classes/org/ietf/jgss/GSSContext.java | 47 ++++++++++++++-----
1 file changed, 34 insertions(+), 13 deletions(-)
diff --git a/src/java.security.jgss/share/classes/org/ietf/jgss/GSSContext.java b/src/java.security.jgss/share/classes/org/ietf/jgss/GSSContext.java
index 2fee1d98527..1492033c49c 100644
--- a/src/java.security.jgss/share/classes/org/ietf/jgss/GSSContext.java
+++ b/src/java.security.jgss/share/classes/org/ietf/jgss/GSSContext.java
@@ -128,8 +128,8 @@ import java.io.OutputStream;
*
* // Create a context using default credentials
* // and the implementation specific default mechanism
- * GSSManager manager ...
- * GSSName targetName ...
+ * GSSManager manager = ...
+ * GSSName targetName = ...
* GSSContext context = manager.createContext(targetName, null, null,
* GSSContext.INDEFINITE_LIFETIME);
*
@@ -141,21 +141,23 @@ import java.io.OutputStream;
*
* // establish a context between peers
*
- * byte []inToken = new byte[0];
+ * byte[] inToken = new byte[0];
+ * byte[] outToken;
*
* // Loop while there still is a token to be processed
*
* while (!context.isEstablished()) {
*
- * byte[] outToken
- * = context.initSecContext(inToken, 0, inToken.length);
+ * outToken = context.initSecContext(inToken, 0, inToken.length);
*
* // send the output token if generated
- * if (outToken != null)
+ * if (outToken != null) {
* sendToken(outToken);
+ * }
*
* if (!context.isEstablished()) {
* inToken = readToken();
+ * }
* }
*
* // display context information
@@ -165,21 +167,40 @@ import java.io.OutputStream;
* System.out.println("Initiator = " + context.getSrcName());
* System.out.println("Acceptor = " + context.getTargName());
*
- * if (context.getConfState())
- * System.out.println("Confidentiality (i.e., privacy) is available");
+ * if (context.getConfState()) {
+ * System.out.println("Confidentiality (i.e., privacy) is available");
+ * }
*
- * if (context.getIntegState())
- * System.out.println("Integrity is available");
+ * if (context.getIntegState()) {
+ * System.out.println("Integrity is available");
+ * }
*
* // perform wrap on an application supplied message, appMsg,
* // using QOP = 0, and requesting privacy service
- * byte [] appMsg ...
+ * byte[] appMsg = ...
*
* MessageProp mProp = new MessageProp(0, true);
*
- * byte []tok = context.wrap(appMsg, 0, appMsg.length, mProp);
+ * outToken = context.wrap(appMsg, 0, appMsg.length, mProp);
*
- * sendToken(tok);
+ * sendToken(outToken);
+ *
+ * // perform unwrap on an incoming application message, and check
+ * // its privacy state and supplementary information
+ * inToken = readToken();
+ *
+ * mProp = new MessageProp(0, true);
+ *
+ * appMsg = context.unwrap(inToken, 0, inToken.length, mProp);
+ *
+ * System.out.println("Was it encrypted? " + mProp.getPrivacy());
+ * System.out.println("Duplicate Token? " + mProp.isDuplicateToken());
+ * System.out.println("Old Token? " + mProp.isOldToken());
+ * System.out.println("Unsequenced Token? " + mProp.isUnseqToken());
+ * System.out.println("Gap Token? " + mProp.isGapToken());
+ *
+ * // the application determines if the privacy state and supplementary
+ * // information are acceptable
*
* // release the local-end of the context
* context.dispose();
From 67906954eac01e92138d2edc1a122abaa0757b8f Mon Sep 17 00:00:00 2001
From: David Holmes
Date: Wed, 3 Jul 2019 23:34:20 +0000
Subject: [PATCH 12/40] 8227055: Minor edits to launcher help text
Reviewed-by: mchung
---
.../sun/launcher/resources/launcher.properties | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher.properties b/src/java.base/share/classes/sun/launcher/resources/launcher.properties
index 4f8a98bb194..a6c443fa2bd 100644
--- a/src/java.base/share/classes/sun/launcher/resources/launcher.properties
+++ b/src/java.base/share/classes/sun/launcher/resources/launcher.properties
@@ -75,7 +75,7 @@ java.launcher.opt.footer = \
\ -D=\n\
\ set a system property\n\
\ -verbose:[class|module|gc|jni]\n\
-\ enable verbose output\n\
+\ enable verbose output for the given subsystem\n\
\ -version print product version to the error stream and exit\n\
\ --version print product version to the output stream and exit\n\
\ -showversion print product version to the error stream and continue\n\
@@ -129,9 +129,9 @@ java.launcher.X.usage=\n\
\ append to end of bootstrap class path\n\
\ -Xcheck:jni perform additional checks for JNI functions\n\
\ -Xcomp forces compilation of methods on first invocation\n\
-\ -Xdebug provided for backward compatibility\n\
+\ -Xdebug does nothing. Provided for backward compatibility.\n\
\ -Xdiag show additional diagnostic messages\n\
-\ -Xfuture enable strictest checks, anticipating future default\n\
+\ -Xfuture enable strictest checks, anticipating future default.\n\
\ This option is deprecated and may be removed in a\n\
\ future release.\n\
\ -Xint interpreted mode execution only\n\
@@ -141,7 +141,9 @@ java.launcher.X.usage=\n\
\ -Xlog: Configure or enable logging with the Java Virtual\n\
\ Machine (JVM) unified logging framework. Use -Xlog:help\n\
\ for details.\n\
-\ -Xloggc: log GC status to a file with time stamps\n\
+\ -Xloggc: log GC status to a file with time stamps.\n\
+\ This option is deprecated and may be removed in a\n\
+\ future release. It is replaced by -Xlog:gc:.\n\
\ -Xmixed mixed mode execution (default)\n\
\ -Xmn sets the initial and maximum size (in bytes) of the heap\n\
\ for the young generation (nursery)\n\
@@ -152,6 +154,8 @@ java.launcher.X.usage=\n\
\ -Xshare:auto use shared class data if possible (default)\n\
\ -Xshare:off do not attempt to use shared class data\n\
\ -Xshare:on require using shared class data, otherwise fail.\n\
+\ This is a testing option and may lead to intermittent\n\
+\ failures. It should not be used in production environments.\n\
\ -XshowSettings show all settings and continue\n\
\ -XshowSettings:all\n\
\ show all settings and continue\n\
@@ -191,7 +195,6 @@ java.launcher.X.usage=\n\
\ --patch-module =({0})*\n\
\ override or augment a module with classes and resources\n\
\ in JAR files or directories.\n\
-\ --disable-@files disable further argument file expansion\n\
\ --source \n\
\ set the version of the source in source-file mode.\n\n\
These extra options are subject to change without notice.\n
@@ -199,7 +202,7 @@ These extra options are subject to change without notice.\n
# Translators please note do not translate the options themselves
java.launcher.X.macosx.usage=\
\n\
-The following options are Mac OS X specific:\n\
+The following options are macOS specific:\n\
\ -XstartOnFirstThread\n\
\ run the main() method on the first (AppKit) thread\n\
\ -Xdock:name=\n\
From 1e9f16c4480afe3ac93f6156763e5a1222133460 Mon Sep 17 00:00:00 2001
From: Stefan Karlsson
Date: Tue, 2 Jul 2019 12:10:18 +0200
Subject: [PATCH 13/40] 8225770: ZGC: C2: Generates on_weak instead of
on_strong barriers
Reviewed-by: neliasso, eosterlund
---
src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp | 15 ++++++++++-----
src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp | 7 -------
2 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
index 32d4c8d7d81..0de2fdff7c6 100644
--- a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
+++ b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
@@ -128,14 +128,19 @@ void ZBarrierSetC2::enqueue_useful_gc_barrier(PhaseIterGVN* igvn, Node* node) co
}
}
-static bool load_require_barrier(LoadNode* load) { return ((load->barrier_data() & RequireBarrier) != 0); }
-static bool load_has_weak_barrier(LoadNode* load) { return ((load->barrier_data() & WeakBarrier) != 0); }
-static bool load_has_expanded_barrier(LoadNode* load) { return ((load->barrier_data() & ExpandedBarrier) != 0); }
+const uint NoBarrier = 0;
+const uint RequireBarrier = 1;
+const uint WeakBarrier = 2;
+const uint ExpandedBarrier = 4;
+
+static bool load_require_barrier(LoadNode* load) { return (load->barrier_data() & RequireBarrier) == RequireBarrier; }
+static bool load_has_weak_barrier(LoadNode* load) { return (load->barrier_data() & WeakBarrier) == WeakBarrier; }
+static bool load_has_expanded_barrier(LoadNode* load) { return (load->barrier_data() & ExpandedBarrier) == ExpandedBarrier; }
static void load_set_expanded_barrier(LoadNode* load) { return load->set_barrier_data(ExpandedBarrier); }
-static void load_set_barrier(LoadNode* load, bool weak) {
+static void load_set_barrier(LoadNode* load, bool weak) {
if (weak) {
- load->set_barrier_data(WeakBarrier);
+ load->set_barrier_data(RequireBarrier | WeakBarrier);
} else {
load->set_barrier_data(RequireBarrier);
}
diff --git a/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp b/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
index 251b8df9f68..4c956730709 100644
--- a/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
+++ b/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
@@ -149,13 +149,6 @@ public:
LoadBarrierNode* load_barrier_node(int idx) const;
};
-enum BarrierInfo {
- NoBarrier = 0,
- RequireBarrier = 1,
- WeakBarrier = 3, // Inclusive with RequireBarrier
- ExpandedBarrier = 4
-};
-
class ZBarrierSetC2 : public BarrierSetC2 {
private:
ZBarrierSetC2State* state() const;
From 24f58a0ac0888d4710b9d1090066f85decb76c86 Mon Sep 17 00:00:00 2001
From: Stefan Karlsson
Date: Tue, 2 Jul 2019 12:24:26 +0200
Subject: [PATCH 14/40] 8227083: ZGC: C2: Generates on_weak barrier for
WeakCompareAndSwap
Reviewed-by: neliasso, eosterlund
---
src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
index 0de2fdff7c6..c21255ba76c 100644
--- a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
+++ b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
@@ -1233,7 +1233,6 @@ static void insert_barrier_before_unsafe(PhaseIdealLoop* phase, LoadStoreNode* o
Compile *C = phase->C;
PhaseIterGVN &igvn = phase->igvn();
LoadStoreNode* zclone = NULL;
- bool is_weak = false;
Node *in_ctrl = old_node->in(MemNode::Control);
Node *in_mem = old_node->in(MemNode::Memory);
@@ -1253,7 +1252,6 @@ static void insert_barrier_before_unsafe(PhaseIdealLoop* phase, LoadStoreNode* o
if (can_simplify_cas(old_node)) {
break;
}
- is_weak = true;
zclone = new ZWeakCompareAndSwapPNode(in_ctrl, in_mem, in_adr, in_val, old_node->in(LoadStoreConditionalNode::ExpectedIn),
((CompareAndSwapNode*)old_node)->order());
adr_type = TypePtr::BOTTOM;
@@ -1284,7 +1282,7 @@ static void insert_barrier_before_unsafe(PhaseIdealLoop* phase, LoadStoreNode* o
igvn.register_new_node_with_optimizer(load);
igvn.replace_node(old_node, zclone);
- Node *barrier = new LoadBarrierNode(C, NULL, in_mem, load, in_adr, is_weak);
+ Node *barrier = new LoadBarrierNode(C, NULL, in_mem, load, in_adr, false /* weak */);
Node *barrier_val = new ProjNode(barrier, LoadBarrierNode::Oop);
Node *barrier_ctrl = new ProjNode(barrier, LoadBarrierNode::Control);
From 02a31bf56183dadd4793525943cff9acd29a956f Mon Sep 17 00:00:00 2001
From: Stefan Karlsson
Date: Mon, 10 Jun 2019 13:04:12 +0200
Subject: [PATCH 15/40] 8227175: ZGC: ZHeapIterator visits potentially dead
objects
Reviewed-by: zgu, eosterlund
---
.../share/classfile/classLoaderData.cpp | 13 ++
.../share/classfile/classLoaderData.hpp | 13 +-
.../share/classfile/classLoaderDataGraph.cpp | 7 +-
.../share/classfile/classLoaderDataGraph.hpp | 1 +
src/hotspot/share/gc/z/zArguments.cpp | 5 +
src/hotspot/share/gc/z/zCollectedHeap.cpp | 4 +-
src/hotspot/share/gc/z/zDriver.cpp | 10 +
src/hotspot/share/gc/z/zHeap.cpp | 39 +---
src/hotspot/share/gc/z/zHeap.hpp | 2 +-
src/hotspot/share/gc/z/zHeapIterator.cpp | 34 ++--
src/hotspot/share/gc/z/zHeapIterator.hpp | 2 +-
src/hotspot/share/gc/z/zMark.cpp | 14 +-
src/hotspot/share/gc/z/zOopClosures.cpp | 60 ------
src/hotspot/share/gc/z/zOopClosures.hpp | 29 +--
.../share/gc/z/zOopClosures.inline.hpp | 21 +-
src/hotspot/share/gc/z/zRootsIterator.cpp | 21 +-
src/hotspot/share/gc/z/zRootsIterator.hpp | 7 +-
src/hotspot/share/gc/z/zVerify.cpp | 187 ++++++++++++++++++
src/hotspot/share/gc/z/zVerify.hpp | 74 +++++++
src/hotspot/share/gc/z/z_globals.hpp | 6 +
src/hotspot/share/memory/iterator.hpp | 20 +-
src/hotspot/share/memory/iterator.inline.hpp | 12 +-
src/hotspot/share/runtime/vmOperations.hpp | 1 +
23 files changed, 395 insertions(+), 187 deletions(-)
delete mode 100644 src/hotspot/share/gc/z/zOopClosures.cpp
create mode 100644 src/hotspot/share/gc/z/zVerify.cpp
create mode 100644 src/hotspot/share/gc/z/zVerify.hpp
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index eef43b5fdac..6fbef47b525 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -266,6 +266,19 @@ bool ClassLoaderData::ChunkedHandleList::owner_of(oop* oop_handle) {
}
#endif // PRODUCT
+void ClassLoaderData::clear_claim(int claim) {
+ for (;;) {
+ int old_claim = Atomic::load(&_claim);
+ if ((old_claim & claim) == 0) {
+ return;
+ }
+ int new_claim = old_claim & ~claim;
+ if (Atomic::cmpxchg(new_claim, &_claim, old_claim) == old_claim) {
+ return;
+ }
+ }
+}
+
bool ClassLoaderData::try_claim(int claim) {
for (;;) {
int old_claim = Atomic::load(&_claim);
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
index 13d0be226fa..0738070bdf7 100644
--- a/src/hotspot/share/classfile/classLoaderData.hpp
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
@@ -206,16 +206,17 @@ class ClassLoaderData : public CHeapObj {
// The "claim" is typically used to check if oops_do needs to be applied on
// the CLD or not. Most GCs only perform strong marking during the marking phase.
- enum {
- _claim_none = 0,
- _claim_finalizable = 2,
- _claim_strong = 3
+ enum Claim {
+ _claim_none = 0,
+ _claim_finalizable = 2,
+ _claim_strong = 3,
+ _claim_other = 4
};
void clear_claim() { _claim = 0; }
+ void clear_claim(int claim);
bool claimed() const { return _claim != 0; }
+ bool claimed(int claim) const { return (_claim & claim) == claim; }
bool try_claim(int claim);
- int get_claim() const { return _claim; }
- void set_claim(int claim) { _claim = claim; }
// Computes if the CLD is alive or not. This is safe to call in concurrent
// contexts.
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
index c2b916d082e..f95ad0e565d 100644
--- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp
@@ -64,6 +64,11 @@ void ClassLoaderDataGraph::clear_claimed_marks() {
}
}
+void ClassLoaderDataGraph::clear_claimed_marks(int claim) {
+ for (ClassLoaderData* cld = OrderAccess::load_acquire(&_head); cld != NULL; cld = cld->next()) {
+ cld->clear_claim(claim);
+ }
+}
// Class iterator used by the compiler. It gets some number of classes at
// a safepoint to decay invocation counters on the methods.
class ClassLoaderDataGraphKlassIteratorStatic {
@@ -471,7 +476,7 @@ GrowableArray* ClassLoaderDataGraph::new_clds() {
// The CLDs in [_head, _saved_head] were all added during last call to remember_new_clds(true);
ClassLoaderData* curr = _head;
while (curr != _saved_head) {
- if (!curr->claimed()) {
+ if (!curr->claimed(ClassLoaderData::_claim_strong)) {
array->push(curr);
LogTarget(Debug, class, loader, data) lt;
if (lt.is_enabled()) {
diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.hpp b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
index 4a320cb5aa8..d9544458579 100644
--- a/src/hotspot/share/classfile/classLoaderDataGraph.hpp
+++ b/src/hotspot/share/classfile/classLoaderDataGraph.hpp
@@ -68,6 +68,7 @@ class ClassLoaderDataGraph : public AllStatic {
static void clean_module_and_package_info();
static void purge();
static void clear_claimed_marks();
+ static void clear_claimed_marks(int claim);
// Iteration through CLDG inside a safepoint; GC support
static void cld_do(CLDClosure* cl);
static void cld_unloading_do(CLDClosure* cl);
diff --git a/src/hotspot/share/gc/z/zArguments.cpp b/src/hotspot/share/gc/z/zArguments.cpp
index 0d26cc49d88..6f7940fb382 100644
--- a/src/hotspot/share/gc/z/zArguments.cpp
+++ b/src/hotspot/share/gc/z/zArguments.cpp
@@ -92,6 +92,11 @@ void ZArguments::initialize() {
// same reason we need fixup_partial_loads
FLAG_SET_DEFAULT(VerifyBeforeIteration, false);
+ if (VerifyBeforeGC || VerifyDuringGC || VerifyAfterGC) {
+ FLAG_SET_DEFAULT(ZVerifyRoots, true);
+ FLAG_SET_DEFAULT(ZVerifyObjects, true);
+ }
+
// Verification of stacks not (yet) supported, for the same reason
// we need fixup_partial_loads
DEBUG_ONLY(FLAG_SET_DEFAULT(VerifyStack, false));
diff --git a/src/hotspot/share/gc/z/zCollectedHeap.cpp b/src/hotspot/share/gc/z/zCollectedHeap.cpp
index c44f976bd38..b6cfdb6ccdb 100644
--- a/src/hotspot/share/gc/z/zCollectedHeap.cpp
+++ b/src/hotspot/share/gc/z/zCollectedHeap.cpp
@@ -232,11 +232,11 @@ GrowableArray ZCollectedHeap::memory_pools() {
}
void ZCollectedHeap::object_iterate(ObjectClosure* cl) {
- _heap.object_iterate(cl, true /* visit_referents */);
+ _heap.object_iterate(cl, true /* visit_weaks */);
}
void ZCollectedHeap::safe_object_iterate(ObjectClosure* cl) {
- _heap.object_iterate(cl, true /* visit_referents */);
+ _heap.object_iterate(cl, true /* visit_weaks */);
}
HeapWord* ZCollectedHeap::block_start(const void* addr) const {
diff --git a/src/hotspot/share/gc/z/zDriver.cpp b/src/hotspot/share/gc/z/zDriver.cpp
index 899164fd095..b2861731805 100644
--- a/src/hotspot/share/gc/z/zDriver.cpp
+++ b/src/hotspot/share/gc/z/zDriver.cpp
@@ -31,6 +31,7 @@
#include "gc/z/zMessagePort.inline.hpp"
#include "gc/z/zServiceability.hpp"
#include "gc/z/zStat.hpp"
+#include "gc/z/zVerify.hpp"
#include "logging/log.hpp"
#include "memory/universe.hpp"
#include "runtime/vmOperations.hpp"
@@ -86,6 +87,9 @@ public:
GCIdMark gc_id_mark(_gc_id);
IsGCActiveMark gc_active_mark;
+ // Verify roots
+ ZVerify::roots_strong();
+
// Execute operation
_success = do_operation();
@@ -301,8 +305,14 @@ void ZDriver::concurrent_reset_relocation_set() {
void ZDriver::pause_verify() {
if (VerifyBeforeGC || VerifyDuringGC || VerifyAfterGC) {
+ // Full verification
VM_Verify op;
VMThread::execute(&op);
+
+ } else if (ZVerifyRoots || ZVerifyObjects) {
+ // Limited verification
+ VM_ZVerifyOperation op;
+ VMThread::execute(&op);
}
}
diff --git a/src/hotspot/share/gc/z/zHeap.cpp b/src/hotspot/share/gc/z/zHeap.cpp
index cb585e0ffa8..e2df08852cd 100644
--- a/src/hotspot/share/gc/z/zHeap.cpp
+++ b/src/hotspot/share/gc/z/zHeap.cpp
@@ -41,6 +41,7 @@
#include "gc/z/zTask.hpp"
#include "gc/z/zThread.hpp"
#include "gc/z/zTracer.inline.hpp"
+#include "gc/z/zVerify.hpp"
#include "gc/z/zVirtualMemory.inline.hpp"
#include "gc/z/zWorkers.inline.hpp"
#include "logging/log.hpp"
@@ -340,6 +341,9 @@ bool ZHeap::mark_end() {
// Enter mark completed phase
ZGlobalPhase = ZPhaseMarkCompleted;
+ // Verify after mark
+ ZVerify::after_mark();
+
// Update statistics
ZStatSample(ZSamplerHeapUsedAfterMark, used());
ZStatHeap::set_at_mark_end(capacity(), allocated(), used());
@@ -468,11 +472,11 @@ void ZHeap::relocate() {
used(), used_high(), used_low());
}
-void ZHeap::object_iterate(ObjectClosure* cl, bool visit_referents) {
+void ZHeap::object_iterate(ObjectClosure* cl, bool visit_weaks) {
assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
ZHeapIterator iter;
- iter.objects_do(cl, visit_referents);
+ iter.objects_do(cl, visit_weaks);
}
void ZHeap::serviceability_initialize() {
@@ -518,40 +522,11 @@ void ZHeap::print_extended_on(outputStream* st) const {
st->cr();
}
-class ZVerifyRootsTask : public ZTask {
-private:
- ZStatTimerDisable _disable;
- ZRootsIterator _strong_roots;
- ZWeakRootsIterator _weak_roots;
-
-public:
- ZVerifyRootsTask() :
- ZTask("ZVerifyRootsTask"),
- _disable(),
- _strong_roots(),
- _weak_roots() {}
-
- virtual void work() {
- ZStatTimerDisable disable;
- ZVerifyOopClosure cl;
- _strong_roots.oops_do(&cl);
- _weak_roots.oops_do(&cl);
- }
-};
-
void ZHeap::verify() {
// Heap verification can only be done between mark end and
// relocate start. This is the only window where all oop are
// good and the whole heap is in a consistent state.
guarantee(ZGlobalPhase == ZPhaseMarkCompleted, "Invalid phase");
- {
- ZVerifyRootsTask task;
- _workers.run_parallel(&task);
- }
-
- {
- ZVerifyObjectClosure cl;
- object_iterate(&cl, false /* visit_referents */);
- }
+ ZVerify::after_weak_processing();
}
diff --git a/src/hotspot/share/gc/z/zHeap.hpp b/src/hotspot/share/gc/z/zHeap.hpp
index 823d836fe52..3f86402eff3 100644
--- a/src/hotspot/share/gc/z/zHeap.hpp
+++ b/src/hotspot/share/gc/z/zHeap.hpp
@@ -161,7 +161,7 @@ public:
void relocate();
// Iteration
- void object_iterate(ObjectClosure* cl, bool visit_referents);
+ void object_iterate(ObjectClosure* cl, bool visit_weaks);
// Serviceability
void serviceability_initialize();
diff --git a/src/hotspot/share/gc/z/zHeapIterator.cpp b/src/hotspot/share/gc/z/zHeapIterator.cpp
index 13d57837729..471db7ef703 100644
--- a/src/hotspot/share/gc/z/zHeapIterator.cpp
+++ b/src/hotspot/share/gc/z/zHeapIterator.cpp
@@ -22,6 +22,8 @@
*/
#include "precompiled.hpp"
+#include "classfile/classLoaderData.hpp"
+#include "classfile/classLoaderDataGraph.hpp"
#include "gc/z/zBarrier.inline.hpp"
#include "gc/z/zGlobals.hpp"
#include "gc/z/zGranuleMap.inline.hpp"
@@ -83,7 +85,7 @@ public:
};
template
-class ZHeapIteratorOopClosure : public BasicOopIterateClosure {
+class ZHeapIteratorOopClosure : public ClaimMetadataVisitingOopIterateClosure {
private:
ZHeapIterator* const _iter;
const oop _base;
@@ -98,6 +100,7 @@ private:
public:
ZHeapIteratorOopClosure(ZHeapIterator* iter, oop base) :
+ ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_other),
_iter(iter),
_base(base) {}
@@ -130,6 +133,7 @@ ZHeapIterator::~ZHeapIterator() {
for (ZHeapIteratorBitMap* map; iter.next(&map);) {
delete map;
}
+ ClassLoaderDataGraph::clear_claimed_marks(ClassLoaderData::_claim_other);
}
static size_t object_index_max() {
@@ -184,15 +188,23 @@ void ZHeapIterator::push_fields(oop obj) {
obj->oop_iterate(&cl);
}
-template
+class ZHeapIterateConcurrentRootsIterator : public ZConcurrentRootsIterator {
+public:
+ ZHeapIterateConcurrentRootsIterator() :
+ ZConcurrentRootsIterator(ClassLoaderData::_claim_other) {}
+};
+
+template
void ZHeapIterator::objects_do(ObjectClosure* cl) {
ZStatTimerDisable disable;
// Push roots to visit
- push_roots();
- push_roots();
- push_roots();
- push_roots();
+ push_roots();
+ push_roots();
+ if (VisitWeaks) {
+ push_roots();
+ push_roots();
+ }
// Drain stack
while (!_visit_stack.is_empty()) {
@@ -202,14 +214,14 @@ void ZHeapIterator::objects_do(ObjectClosure* cl) {
cl->do_object(obj);
// Push fields to visit
- push_fields(obj);
+ push_fields(obj);
}
}
-void ZHeapIterator::objects_do(ObjectClosure* cl, bool visit_referents) {
- if (visit_referents) {
- objects_do(cl);
+void ZHeapIterator::objects_do(ObjectClosure* cl, bool visit_weaks) {
+ if (visit_weaks) {
+ objects_do(cl);
} else {
- objects_do(cl);
+ objects_do(cl);
}
}
diff --git a/src/hotspot/share/gc/z/zHeapIterator.hpp b/src/hotspot/share/gc/z/zHeapIterator.hpp
index c32fad4f9ab..e6ab68fdc44 100644
--- a/src/hotspot/share/gc/z/zHeapIterator.hpp
+++ b/src/hotspot/share/gc/z/zHeapIterator.hpp
@@ -54,7 +54,7 @@ public:
ZHeapIterator();
~ZHeapIterator();
- void objects_do(ObjectClosure* cl, bool visit_referents);
+ void objects_do(ObjectClosure* cl, bool visit_weaks);
};
#endif // SHARE_GC_Z_ZHEAPITERATOR_HPP
diff --git a/src/hotspot/share/gc/z/zMark.cpp b/src/hotspot/share/gc/z/zMark.cpp
index 97362968208..b8a7454b484 100644
--- a/src/hotspot/share/gc/z/zMark.cpp
+++ b/src/hotspot/share/gc/z/zMark.cpp
@@ -22,6 +22,7 @@
*/
#include "precompiled.hpp"
+#include "classfile/classLoaderDataGraph.hpp"
#include "gc/z/zBarrier.inline.hpp"
#include "gc/z/zMark.inline.hpp"
#include "gc/z/zMarkCache.inline.hpp"
@@ -632,14 +633,23 @@ public:
class ZMarkConcurrentRootsTask : public ZTask {
private:
+ SuspendibleThreadSetJoiner _sts_joiner;
ZConcurrentRootsIterator _roots;
ZMarkConcurrentRootsIteratorClosure _cl;
public:
ZMarkConcurrentRootsTask(ZMark* mark) :
ZTask("ZMarkConcurrentRootsTask"),
- _roots(true /* marking */),
- _cl() {}
+ _sts_joiner(true /* active */),
+ _roots(ClassLoaderData::_claim_strong),
+ _cl() {
+ ClassLoaderDataGraph_lock->lock();
+ ClassLoaderDataGraph::clear_claimed_marks();
+ }
+
+ ~ZMarkConcurrentRootsTask() {
+ ClassLoaderDataGraph_lock->unlock();
+ }
virtual void work() {
_roots.oops_do(&_cl);
diff --git a/src/hotspot/share/gc/z/zOopClosures.cpp b/src/hotspot/share/gc/z/zOopClosures.cpp
deleted file mode 100644
index ae09192bb28..00000000000
--- a/src/hotspot/share/gc/z/zOopClosures.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "precompiled.hpp"
-#include "gc/z/zHeap.hpp"
-#include "gc/z/zOopClosures.inline.hpp"
-#include "gc/z/zOop.inline.hpp"
-#include "memory/iterator.inline.hpp"
-#include "oops/access.inline.hpp"
-#include "oops/oop.inline.hpp"
-#include "runtime/safepoint.hpp"
-#include "utilities/debug.hpp"
-#include "utilities/globalDefinitions.hpp"
-
-void ZVerifyOopClosure::do_oop(oop* p) {
- guarantee(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
- guarantee(ZGlobalPhase == ZPhaseMarkCompleted, "Invalid phase");
- guarantee(!ZResurrection::is_blocked(), "Invalid phase");
-
- const oop o = RawAccess<>::oop_load(p);
- if (o != NULL) {
- const uintptr_t addr = ZOop::to_address(o);
- const uintptr_t good_addr = ZAddress::good(addr);
- guarantee(ZAddress::is_good(addr) || ZAddress::is_finalizable_good(addr),
- "Bad oop " PTR_FORMAT " found at " PTR_FORMAT ", expected " PTR_FORMAT,
- addr, p2i(p), good_addr);
- guarantee(oopDesc::is_oop(ZOop::from_address(good_addr)),
- "Bad object " PTR_FORMAT " found at " PTR_FORMAT,
- addr, p2i(p));
- }
-}
-
-void ZVerifyOopClosure::do_oop(narrowOop* p) {
- ShouldNotReachHere();
-}
-
-void ZVerifyObjectClosure::do_object(oop o) {
- ZVerifyOopClosure cl;
- o->oop_iterate(&cl);
-}
diff --git a/src/hotspot/share/gc/z/zOopClosures.hpp b/src/hotspot/share/gc/z/zOopClosures.hpp
index f24f21a64d7..2823f92f263 100644
--- a/src/hotspot/share/gc/z/zOopClosures.hpp
+++ b/src/hotspot/share/gc/z/zOopClosures.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2019, 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
@@ -46,16 +46,13 @@ public:
};
template
-class ZMarkBarrierOopClosure : public MetadataVisitingOopIterateClosure {
+class ZMarkBarrierOopClosure : public ClaimMetadataVisitingOopIterateClosure {
public:
ZMarkBarrierOopClosure();
virtual void do_oop(oop* p);
virtual void do_oop(narrowOop* p);
- virtual void do_klass(Klass* k);
- virtual void do_cld(ClassLoaderData* cld);
-
#ifdef ASSERT
virtual bool should_verify_oops() {
return false;
@@ -80,26 +77,4 @@ public:
virtual void do_oop(narrowOop* p);
};
-class ZVerifyOopClosure : public ZRootsIteratorClosure, public BasicOopIterateClosure {
-public:
- virtual void do_oop(oop* p);
- virtual void do_oop(narrowOop* p);
-
- virtual ReferenceIterationMode reference_iteration_mode() {
- return DO_FIELDS;
- }
-
-#ifdef ASSERT
- // Verification handled by the closure itself
- virtual bool should_verify_oops() {
- return false;
- }
-#endif
-};
-
-class ZVerifyObjectClosure : public ObjectClosure {
-public:
- virtual void do_object(oop o);
-};
-
#endif // SHARE_GC_Z_ZOOPCLOSURES_HPP
diff --git a/src/hotspot/share/gc/z/zOopClosures.inline.hpp b/src/hotspot/share/gc/z/zOopClosures.inline.hpp
index 8eef2ea1f4a..3ff1b7a6a45 100644
--- a/src/hotspot/share/gc/z/zOopClosures.inline.hpp
+++ b/src/hotspot/share/gc/z/zOopClosures.inline.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2019, 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
@@ -55,7 +55,12 @@ inline void ZNMethodOopClosure::do_oop(narrowOop* p) {
template
inline ZMarkBarrierOopClosure::ZMarkBarrierOopClosure() :
- MetadataVisitingOopIterateClosure(finalizable ? NULL : ZHeap::heap()->reference_discoverer()) {}
+ ClaimMetadataVisitingOopIterateClosure(finalizable
+ ? ClassLoaderData::_claim_finalizable
+ : ClassLoaderData::_claim_strong,
+ finalizable
+ ? NULL
+ : ZHeap::heap()->reference_discoverer()) {}
template
inline void ZMarkBarrierOopClosure::do_oop(oop* p) {
@@ -67,18 +72,6 @@ inline void ZMarkBarrierOopClosure::do_oop(narrowOop* p) {
ShouldNotReachHere();
}
-template
-inline void ZMarkBarrierOopClosure::do_klass(Klass* k) {
- ClassLoaderData* const cld = k->class_loader_data();
- ZMarkBarrierOopClosure::do_cld(cld);
-}
-
-template
-inline void ZMarkBarrierOopClosure::do_cld(ClassLoaderData* cld) {
- const int claim = finalizable ? ClassLoaderData::_claim_finalizable : ClassLoaderData::_claim_strong;
- cld->oops_do(this, claim);
-}
-
inline bool ZPhantomIsAliveObjectClosure::do_object_b(oop o) {
return ZBarrier::is_alive_barrier_on_phantom_oop(o);
}
diff --git a/src/hotspot/share/gc/z/zRootsIterator.cpp b/src/hotspot/share/gc/z/zRootsIterator.cpp
index 11a5982d930..bb8ce6bf510 100644
--- a/src/hotspot/share/gc/z/zRootsIterator.cpp
+++ b/src/hotspot/share/gc/z/zRootsIterator.cpp
@@ -263,24 +263,16 @@ void ZRootsIterator::oops_do(ZRootsIteratorClosure* cl, bool visit_jvmti_weak_ex
}
}
-ZConcurrentRootsIterator::ZConcurrentRootsIterator(bool marking) :
- _marking(marking),
- _sts_joiner(marking /* active */),
+ZConcurrentRootsIterator::ZConcurrentRootsIterator(int cld_claim) :
_jni_handles_iter(JNIHandles::global_handles()),
+ _cld_claim(cld_claim),
_jni_handles(this),
_class_loader_data_graph(this) {
ZStatTimer timer(ZSubPhaseConcurrentRootsSetup);
- if (_marking) {
- ClassLoaderDataGraph_lock->lock();
- ClassLoaderDataGraph::clear_claimed_marks();
- }
}
ZConcurrentRootsIterator::~ZConcurrentRootsIterator() {
ZStatTimer timer(ZSubPhaseConcurrentRootsTeardown);
- if (_marking) {
- ClassLoaderDataGraph_lock->unlock();
- }
}
void ZConcurrentRootsIterator::do_jni_handles(ZRootsIteratorClosure* cl) {
@@ -290,13 +282,8 @@ void ZConcurrentRootsIterator::do_jni_handles(ZRootsIteratorClosure* cl) {
void ZConcurrentRootsIterator::do_class_loader_data_graph(ZRootsIteratorClosure* cl) {
ZStatTimer timer(ZSubPhaseConcurrentRootsClassLoaderDataGraph);
- if (_marking) {
- CLDToOopClosure cld_cl(cl, ClassLoaderData::_claim_strong);
- ClassLoaderDataGraph::always_strong_cld_do(&cld_cl);
- } else {
- CLDToOopClosure cld_cl(cl, ClassLoaderData::_claim_none);
- ClassLoaderDataGraph::cld_do(&cld_cl);
- }
+ CLDToOopClosure cld_cl(cl, _cld_claim);
+ ClassLoaderDataGraph::always_strong_cld_do(&cld_cl);
}
void ZConcurrentRootsIterator::oops_do(ZRootsIteratorClosure* cl) {
diff --git a/src/hotspot/share/gc/z/zRootsIterator.hpp b/src/hotspot/share/gc/z/zRootsIterator.hpp
index 099fb086952..3d0cbd7876f 100644
--- a/src/hotspot/share/gc/z/zRootsIterator.hpp
+++ b/src/hotspot/share/gc/z/zRootsIterator.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2019, 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
@@ -111,9 +111,8 @@ public:
class ZConcurrentRootsIterator {
private:
- const bool _marking;
- SuspendibleThreadSetJoiner _sts_joiner;
ZOopStorageIterator _jni_handles_iter;
+ int _cld_claim;
void do_jni_handles(ZRootsIteratorClosure* cl);
void do_class_loader_data_graph(ZRootsIteratorClosure* cl);
@@ -122,7 +121,7 @@ private:
ZParallelOopsDo _class_loader_data_graph;
public:
- ZConcurrentRootsIterator(bool marking = false);
+ ZConcurrentRootsIterator(int cld_claim);
~ZConcurrentRootsIterator();
void oops_do(ZRootsIteratorClosure* cl);
diff --git a/src/hotspot/share/gc/z/zVerify.cpp b/src/hotspot/share/gc/z/zVerify.cpp
new file mode 100644
index 00000000000..fd6977a778d
--- /dev/null
+++ b/src/hotspot/share/gc/z/zVerify.cpp
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "precompiled.hpp"
+#include "classfile/classLoaderData.hpp"
+#include "classfile/classLoaderDataGraph.hpp"
+#include "gc/z/zAddress.hpp"
+#include "gc/z/zHeap.inline.hpp"
+#include "gc/z/zOop.hpp"
+#include "gc/z/zResurrection.hpp"
+#include "gc/z/zRootsIterator.hpp"
+#include "gc/z/zStat.hpp"
+#include "gc/z/zVerify.hpp"
+#include "memory/allocation.hpp"
+#include "memory/iterator.inline.hpp"
+#include "oops/oop.inline.hpp"
+
+#define BAD_OOP_REPORT(addr) \
+ "Bad oop " PTR_FORMAT " found at " PTR_FORMAT ", expected " PTR_FORMAT, \
+ addr, p2i(p), ZAddress::good(addr)
+
+class ZVerifyRootsClosure : public ZRootsIteratorClosure {
+public:
+ virtual void do_oop(oop* p) {
+ uintptr_t value = ZOop::to_address(*p);
+
+ if (value == 0) {
+ return;
+ }
+
+ guarantee(!ZAddress::is_finalizable(value), BAD_OOP_REPORT(value));
+ guarantee(ZAddress::is_good(value), BAD_OOP_REPORT(value));
+ guarantee(oopDesc::is_oop(ZOop::from_address(value)), BAD_OOP_REPORT(value));
+ }
+ virtual void do_oop(narrowOop*) { ShouldNotReachHere(); }
+};
+
+template
+class ZVerifyOopClosure : public ClaimMetadataVisitingOopIterateClosure, public ZRootsIteratorClosure {
+public:
+ ZVerifyOopClosure() :
+ ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_other) {}
+
+ virtual void do_oop(oop* p);
+ virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
+
+ virtual ReferenceIterationMode reference_iteration_mode() {
+ return VisitReferents ? DO_FIELDS : DO_FIELDS_EXCEPT_REFERENT;
+ }
+
+#ifdef ASSERT
+ // Verification handled by the closure itself
+ virtual bool should_verify_oops() {
+ return false;
+ }
+#endif
+};
+
+class ZVerifyObjectClosure : public ObjectClosure {
+private:
+ bool _visit_referents;
+
+public:
+ ZVerifyObjectClosure(bool visit_referents) : _visit_referents(visit_referents) {}
+ virtual void do_object(oop o);
+};
+
+template
+void ZVerify::roots_impl() {
+ if (ZVerifyRoots) {
+ ZVerifyRootsClosure cl;
+ RootsIterator iter;
+ iter.oops_do(&cl);
+ }
+}
+
+void ZVerify::roots_strong() {
+ roots_impl();
+}
+
+class ZVerifyConcurrentRootsIterator : public ZConcurrentRootsIterator {
+public:
+ ZVerifyConcurrentRootsIterator()
+ : ZConcurrentRootsIterator(ClassLoaderData::_claim_none) {}
+};
+
+void ZVerify::roots_concurrent() {
+ roots_impl();
+}
+
+void ZVerify::roots_weak() {
+ assert(!ZResurrection::is_blocked(), "Invalid phase");
+
+ roots_impl();
+}
+
+void ZVerify::roots(bool verify_weaks) {
+ roots_strong();
+ roots_concurrent();
+ if (verify_weaks) {
+ roots_weak();
+ roots_concurrent_weak();
+ }
+}
+
+void ZVerify::objects(bool verify_weaks) {
+ if (ZVerifyObjects) {
+ ZVerifyObjectClosure cl(verify_weaks);
+ ZHeap::heap()->object_iterate(&cl, verify_weaks);
+ }
+}
+
+void ZVerify::roots_concurrent_weak() {
+ assert(!ZResurrection::is_blocked(), "Invalid phase");
+
+ roots_impl();
+}
+
+void ZVerify::roots_and_objects(bool verify_weaks) {
+ ZStatTimerDisable _disable;
+
+ roots(verify_weaks);
+ objects(verify_weaks);
+}
+
+void ZVerify::after_mark() {
+ // Only verify strong roots and references.
+ roots_and_objects(false /* verify_weaks */);
+}
+
+void ZVerify::after_weak_processing() {
+ // Also verify weaks - all should have been processed at this point.
+ roots_and_objects(true /* verify_weaks */);
+}
+
+template
+void ZVerifyOopClosure::do_oop(oop* p) {
+ guarantee(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint");
+ guarantee(ZGlobalPhase == ZPhaseMarkCompleted, "Invalid phase");
+ guarantee(!ZResurrection::is_blocked(), "Invalid phase");
+
+ const oop o = RawAccess<>::oop_load(p);
+ if (o == NULL) {
+ return;
+ }
+
+ const uintptr_t addr = ZOop::to_address(o);
+ if (VisitReferents) {
+ guarantee(ZAddress::is_good(addr) || ZAddress::is_finalizable_good(addr), BAD_OOP_REPORT(addr));
+ } else {
+ // Should not encounter finalizable oops through strong-only paths. Assumes only strong roots are visited.
+ guarantee(ZAddress::is_good(addr), BAD_OOP_REPORT(addr));
+ }
+
+ const uintptr_t good_addr = ZAddress::good(addr);
+ guarantee(oopDesc::is_oop(ZOop::from_address(good_addr)), BAD_OOP_REPORT(addr));
+}
+
+void ZVerifyObjectClosure::do_object(oop o) {
+ if (_visit_referents) {
+ ZVerifyOopClosure cl;
+ o->oop_iterate((OopIterateClosure*)&cl);
+ } else {
+ ZVerifyOopClosure cl;
+ o->oop_iterate(&cl);
+ }
+}
diff --git a/src/hotspot/share/gc/z/zVerify.hpp b/src/hotspot/share/gc/z/zVerify.hpp
new file mode 100644
index 00000000000..6b8439fb367
--- /dev/null
+++ b/src/hotspot/share/gc/z/zVerify.hpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef SHARE_GC_Z_ZVERIFY_HPP
+#define SHARE_GC_Z_ZVERIFY_HPP
+
+#include "memory/allocation.hpp"
+
+class ZVerify : public AllStatic {
+private:
+ template
+ static void roots_impl();
+ static void roots(bool verify_weaks);
+
+ static void roots_weak();
+ static void roots_concurrent();
+ static void roots_concurrent_weak();
+
+ static void objects(bool verify_weaks);
+
+ static void roots_and_objects(bool visit_weaks);
+
+public:
+ // Verify strong (non-concurrent) roots. Should always be good.
+ static void roots_strong();
+
+ // Verify all strong roots and references after marking.
+ static void after_mark();
+
+ // Verify strong and weak roots and references.
+ static void after_weak_processing();
+};
+
+class VM_ZVerifyOperation : public VM_Operation {
+public:
+ virtual bool needs_inactive_gc_locker() const {
+ // An inactive GC locker is needed in operations where we change the bad
+ // mask or move objects. Changing the bad mask will invalidate all oops,
+ // which makes it conceptually the same thing as moving all objects.
+ return false;
+ }
+
+ virtual void doit() {
+ ZVerify::after_weak_processing();
+ }
+
+ bool success() const {
+ return true;
+ }
+
+ virtual VMOp_Type type() const { return VMOp_ZVerify; }
+};
+
+#endif // SHARE_GC_Z_ZVERIFY_HPP
diff --git a/src/hotspot/share/gc/z/z_globals.hpp b/src/hotspot/share/gc/z/z_globals.hpp
index 104581f10cd..fc1125b450e 100644
--- a/src/hotspot/share/gc/z/z_globals.hpp
+++ b/src/hotspot/share/gc/z/z_globals.hpp
@@ -76,6 +76,12 @@
diagnostic(bool, ZVerifyViews, false, \
"Verify heap view accesses") \
\
+ diagnostic(bool, ZVerifyRoots, trueInDebug, \
+ "Verify roots") \
+ \
+ diagnostic(bool, ZVerifyObjects, false, \
+ "Verify objects") \
+ \
diagnostic(bool, ZVerifyMarking, false, \
"Verify marking stacks") \
\
diff --git a/src/hotspot/share/memory/iterator.hpp b/src/hotspot/share/memory/iterator.hpp
index a27f6bdf0f4..db986638727 100644
--- a/src/hotspot/share/memory/iterator.hpp
+++ b/src/hotspot/share/memory/iterator.hpp
@@ -144,18 +144,28 @@ class CLDToOopClosure : public CLDClosure {
void do_cld(ClassLoaderData* cld);
};
-// The base class for all concurrent marking closures,
-// that participates in class unloading.
-// It's used to proxy through the metadata to the oops defined in them.
-class MetadataVisitingOopIterateClosure: public OopIterateClosure {
+class ClaimMetadataVisitingOopIterateClosure : public OopIterateClosure {
+ protected:
+ const int _claim;
+
public:
- MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd = NULL) : OopIterateClosure(rd) { }
+ ClaimMetadataVisitingOopIterateClosure(int claim, ReferenceDiscoverer* rd = NULL) :
+ OopIterateClosure(rd),
+ _claim(claim) { }
virtual bool do_metadata() { return true; }
virtual void do_klass(Klass* k);
virtual void do_cld(ClassLoaderData* cld);
};
+// The base class for all concurrent marking closures,
+// that participates in class unloading.
+// It's used to proxy through the metadata to the oops defined in them.
+class MetadataVisitingOopIterateClosure: public ClaimMetadataVisitingOopIterateClosure {
+ public:
+ MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd = NULL);
+};
+
// ObjectClosure is used for iterating through an object space
class ObjectClosure : public Closure {
diff --git a/src/hotspot/share/memory/iterator.inline.hpp b/src/hotspot/share/memory/iterator.inline.hpp
index 011598c6b3c..5d0300b6d3f 100644
--- a/src/hotspot/share/memory/iterator.inline.hpp
+++ b/src/hotspot/share/memory/iterator.inline.hpp
@@ -39,13 +39,17 @@
#include "oops/typeArrayKlass.inline.hpp"
#include "utilities/debug.hpp"
-inline void MetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
- cld->oops_do(this, ClassLoaderData::_claim_strong);
+// Defaults to strong claiming.
+inline MetadataVisitingOopIterateClosure::MetadataVisitingOopIterateClosure(ReferenceDiscoverer* rd) :
+ ClaimMetadataVisitingOopIterateClosure(ClassLoaderData::_claim_strong, rd) {}
+
+inline void ClaimMetadataVisitingOopIterateClosure::do_cld(ClassLoaderData* cld) {
+ cld->oops_do(this, _claim);
}
-inline void MetadataVisitingOopIterateClosure::do_klass(Klass* k) {
+inline void ClaimMetadataVisitingOopIterateClosure::do_klass(Klass* k) {
ClassLoaderData* cld = k->class_loader_data();
- MetadataVisitingOopIterateClosure::do_cld(cld);
+ ClaimMetadataVisitingOopIterateClosure::do_cld(cld);
}
#ifdef ASSERT
diff --git a/src/hotspot/share/runtime/vmOperations.hpp b/src/hotspot/share/runtime/vmOperations.hpp
index 1914e3793cf..dc8e4dea381 100644
--- a/src/hotspot/share/runtime/vmOperations.hpp
+++ b/src/hotspot/share/runtime/vmOperations.hpp
@@ -72,6 +72,7 @@
template(ZMarkStart) \
template(ZMarkEnd) \
template(ZRelocateStart) \
+ template(ZVerify) \
template(HandshakeOneThread) \
template(HandshakeAllThreads) \
template(HandshakeFallback) \
From 259a0b4a7bba43bbd05deb809849612c1aa952af Mon Sep 17 00:00:00 2001
From: Jamsheed Mohammed C M
Date: Fri, 5 Jul 2019 00:24:54 -0700
Subject: [PATCH 16/40] 8226627: assert(t->singleton()) failed: must be a
constant
Implemented constant folding for MaxFD, MinFD.
Reviewed-by: thartmann, bsrbnd, pli
---
src/hotspot/share/opto/addnode.cpp | 88 +++++++++++++++++++++++++
src/hotspot/share/opto/addnode.hpp | 8 +--
src/hotspot/share/opto/library_call.cpp | 3 -
src/hotspot/share/opto/type.cpp | 22 ++-----
4 files changed, 98 insertions(+), 23 deletions(-)
diff --git a/src/hotspot/share/opto/addnode.cpp b/src/hotspot/share/opto/addnode.cpp
index 0983bcd8263..b2dfc422583 100644
--- a/src/hotspot/share/opto/addnode.cpp
+++ b/src/hotspot/share/opto/addnode.cpp
@@ -929,3 +929,91 @@ const Type *MinINode::add_ring( const Type *t0, const Type *t1 ) const {
// Otherwise just MIN them bits.
return TypeInt::make( MIN2(r0->_lo,r1->_lo), MIN2(r0->_hi,r1->_hi), MAX2(r0->_widen,r1->_widen) );
}
+
+//------------------------------add_ring---------------------------------------
+const Type *MinFNode::add_ring( const Type *t0, const Type *t1 ) const {
+ const TypeF *r0 = t0->is_float_constant();
+ const TypeF *r1 = t1->is_float_constant();
+
+ if (r0->is_nan()) {
+ return r0;
+ }
+ if (r1->is_nan()) {
+ return r1;
+ }
+
+ float f0 = r0->getf();
+ float f1 = r1->getf();
+ if (f0 != 0.0f || f1 != 0.0f) {
+ return f0 < f1 ? r0 : r1;
+ }
+
+ // handle min of 0.0, -0.0 case.
+ return (jint_cast(f0) < jint_cast(f1)) ? r0 : r1;
+}
+
+//------------------------------add_ring---------------------------------------
+const Type *MinDNode::add_ring( const Type *t0, const Type *t1 ) const {
+ const TypeD *r0 = t0->is_double_constant();
+ const TypeD *r1 = t1->is_double_constant();
+
+ if (r0->is_nan()) {
+ return r0;
+ }
+ if (r1->is_nan()) {
+ return r1;
+ }
+
+ double d0 = r0->getd();
+ double d1 = r1->getd();
+ if (d0 != 0.0 || d1 != 0.0) {
+ return d0 < d1 ? r0 : r1;
+ }
+
+ // handle min of 0.0, -0.0 case.
+ return (jlong_cast(d0) < jlong_cast(d1)) ? r0 : r1;
+}
+
+//------------------------------add_ring---------------------------------------
+const Type *MaxFNode::add_ring( const Type *t0, const Type *t1 ) const {
+ const TypeF *r0 = t0->is_float_constant();
+ const TypeF *r1 = t1->is_float_constant();
+
+ if (r0->is_nan()) {
+ return r0;
+ }
+ if (r1->is_nan()) {
+ return r1;
+ }
+
+ float f0 = r0->getf();
+ float f1 = r1->getf();
+ if (f0 != 0.0f || f1 != 0.0f) {
+ return f0 > f1 ? r0 : r1;
+ }
+
+ // handle max of 0.0,-0.0 case.
+ return (jint_cast(f0) > jint_cast(f1)) ? r0 : r1;
+}
+
+//------------------------------add_ring---------------------------------------
+const Type *MaxDNode::add_ring( const Type *t0, const Type *t1 ) const {
+ const TypeD *r0 = t0->is_double_constant();
+ const TypeD *r1 = t1->is_double_constant();
+
+ if (r0->is_nan()) {
+ return r0;
+ }
+ if (r1->is_nan()) {
+ return r1;
+ }
+
+ double d0 = r0->getd();
+ double d1 = r1->getd();
+ if (d0 != 0.0 || d1 != 0.0) {
+ return d0 > d1 ? r0 : r1;
+ }
+
+ // handle max of 0.0, -0.0 case.
+ return (jlong_cast(d0) > jlong_cast(d1)) ? r0 : r1;
+}
diff --git a/src/hotspot/share/opto/addnode.hpp b/src/hotspot/share/opto/addnode.hpp
index d7803022c9d..ab5d9e72f44 100644
--- a/src/hotspot/share/opto/addnode.hpp
+++ b/src/hotspot/share/opto/addnode.hpp
@@ -255,7 +255,7 @@ class MaxFNode : public MaxNode {
public:
MaxFNode(Node *in1, Node *in2) : MaxNode(in1, in2) {}
virtual int Opcode() const;
- virtual const Type *add_ring(const Type*, const Type*) const { return Type::FLOAT; }
+ virtual const Type *add_ring(const Type*, const Type*) const;
virtual const Type *add_id() const { return TypeF::NEG_INF; }
virtual const Type *bottom_type() const { return Type::FLOAT; }
virtual uint ideal_reg() const { return Op_RegF; }
@@ -267,7 +267,7 @@ class MinFNode : public MaxNode {
public:
MinFNode(Node *in1, Node *in2) : MaxNode(in1, in2) {}
virtual int Opcode() const;
- virtual const Type *add_ring(const Type*, const Type*) const { return Type::FLOAT; }
+ virtual const Type *add_ring(const Type*, const Type*) const;
virtual const Type *add_id() const { return TypeF::POS_INF; }
virtual const Type *bottom_type() const { return Type::FLOAT; }
virtual uint ideal_reg() const { return Op_RegF; }
@@ -279,7 +279,7 @@ class MaxDNode : public MaxNode {
public:
MaxDNode(Node *in1, Node *in2) : MaxNode(in1, in2) {}
virtual int Opcode() const;
- virtual const Type *add_ring(const Type*, const Type*) const { return Type::DOUBLE; }
+ virtual const Type *add_ring(const Type*, const Type*) const;
virtual const Type *add_id() const { return TypeD::NEG_INF; }
virtual const Type *bottom_type() const { return Type::DOUBLE; }
virtual uint ideal_reg() const { return Op_RegD; }
@@ -291,7 +291,7 @@ class MinDNode : public MaxNode {
public:
MinDNode(Node *in1, Node *in2) : MaxNode(in1, in2) {}
virtual int Opcode() const;
- virtual const Type *add_ring(const Type*, const Type*) const { return Type::DOUBLE; }
+ virtual const Type *add_ring(const Type*, const Type*) const;
virtual const Type *add_id() const { return TypeD::POS_INF; }
virtual const Type *bottom_type() const { return Type::DOUBLE; }
virtual uint ideal_reg() const { return Op_RegD; }
diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp
index 07a938ba3ac..5f783999194 100644
--- a/src/hotspot/share/opto/library_call.cpp
+++ b/src/hotspot/share/opto/library_call.cpp
@@ -6696,9 +6696,6 @@ bool LibraryCallKit::inline_fp_min_max(vmIntrinsics::ID id) {
fatal_unexpected_iid(id);
break;
}
- if (a->is_Con() || b->is_Con()) {
- return false;
- }
switch (id) {
case vmIntrinsics::_maxF: n = new MaxFNode(a, b); break;
case vmIntrinsics::_minF: n = new MinFNode(a, b); break;
diff --git a/src/hotspot/share/opto/type.cpp b/src/hotspot/share/opto/type.cpp
index f4371e75768..a0b60c31608 100644
--- a/src/hotspot/share/opto/type.cpp
+++ b/src/hotspot/share/opto/type.cpp
@@ -411,18 +411,8 @@ int Type::uhash( const Type *const t ) {
}
#define SMALLINT ((juint)3) // a value too insignificant to consider widening
-
-static double pos_dinf() {
- union { int64_t i; double d; } v;
- v.i = CONST64(0x7ff0000000000000);
- return v.d;
-}
-
-static float pos_finf() {
- union { int32_t i; float f; } v;
- v.i = 0x7f800000;
- return v.f;
-}
+#define POSITIVE_INFINITE_F 0x7f800000 // hex representation for IEEE 754 single precision positive infinite
+#define POSITIVE_INFINITE_D 0x7ff0000000000000 // hex representation for IEEE 754 double precision positive infinite
//--------------------------Initialize_shared----------------------------------
void Type::Initialize_shared(Compile* current) {
@@ -453,13 +443,13 @@ void Type::Initialize_shared(Compile* current) {
TypeF::ZERO = TypeF::make(0.0); // Float 0 (positive zero)
TypeF::ONE = TypeF::make(1.0); // Float 1
- TypeF::POS_INF = TypeF::make(pos_finf());
- TypeF::NEG_INF = TypeF::make(-pos_finf());
+ TypeF::POS_INF = TypeF::make(jfloat_cast(POSITIVE_INFINITE_F));
+ TypeF::NEG_INF = TypeF::make(-jfloat_cast(POSITIVE_INFINITE_F));
TypeD::ZERO = TypeD::make(0.0); // Double 0 (positive zero)
TypeD::ONE = TypeD::make(1.0); // Double 1
- TypeD::POS_INF = TypeD::make(pos_dinf());
- TypeD::NEG_INF = TypeD::make(-pos_dinf());
+ TypeD::POS_INF = TypeD::make(jdouble_cast(POSITIVE_INFINITE_D));
+ TypeD::NEG_INF = TypeD::make(-jdouble_cast(POSITIVE_INFINITE_D));
TypeInt::MINUS_1 = TypeInt::make(-1); // -1
TypeInt::ZERO = TypeInt::make( 0); // 0
From 17bc4c4bcfa7ddd9aadb0ece8a5aef7cf151c5ad Mon Sep 17 00:00:00 2001
From: Weijun Wang
Date: Sat, 6 Jul 2019 08:11:19 +0800
Subject: [PATCH 17/40] 8227305: Krb5Util::getTicketFromSubjectAndTgs is
useless
Reviewed-by: xuelei
---
.../sun/security/jgss/krb5/Krb5Util.java | 78 +------------------
1 file changed, 1 insertion(+), 77 deletions(-)
diff --git a/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Util.java b/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Util.java
index 02320b028d4..cbe3fc1a7fb 100644
--- a/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Util.java
+++ b/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Util.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2019, 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
@@ -57,82 +57,6 @@ public class Krb5Util {
private Krb5Util() { // Cannot create one of these
}
- /**
- * Retrieve the service ticket for serverPrincipal from caller's Subject
- * or from Subject obtained by logging in, or if not found, via the
- * Ticket Granting Service using the TGT obtained from the Subject.
- *
- * Caller must have permission to:
- * - access and update Subject's private credentials
- * - create LoginContext
- * - read the auth.login.defaultCallbackHandler security property
- *
- * NOTE: This method is used by JSSE Kerberos Cipher Suites
- */
- public static KerberosTicket getTicketFromSubjectAndTgs(GSSCaller caller,
- String clientPrincipal, String serverPrincipal, String tgsPrincipal,
- AccessControlContext acc)
- throws LoginException, KrbException, IOException {
-
- // 1. Try to find service ticket in acc subject
- Subject accSubj = Subject.getSubject(acc);
- KerberosTicket ticket = SubjectComber.find(accSubj,
- serverPrincipal, clientPrincipal, KerberosTicket.class);
-
- if (ticket != null) {
- return ticket; // found it
- }
-
- Subject loginSubj = null;
- if (!GSSUtil.useSubjectCredsOnly(caller)) {
- // 2. Try to get ticket from login
- try {
- loginSubj = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID);
- ticket = SubjectComber.find(loginSubj,
- serverPrincipal, clientPrincipal, KerberosTicket.class);
- if (ticket != null) {
- return ticket; // found it
- }
- } catch (LoginException e) {
- // No login entry to use
- // ignore and continue
- }
- }
-
- // Service ticket not found in subject or login
- // Try to get TGT to acquire service ticket
-
- // 3. Try to get TGT from acc subject
- KerberosTicket tgt = SubjectComber.find(accSubj,
- tgsPrincipal, clientPrincipal, KerberosTicket.class);
-
- boolean fromAcc;
- if (tgt == null && loginSubj != null) {
- // 4. Try to get TGT from login subject
- tgt = SubjectComber.find(loginSubj,
- tgsPrincipal, clientPrincipal, KerberosTicket.class);
- fromAcc = false;
- } else {
- fromAcc = true;
- }
-
- // 5. Try to get service ticket using TGT
- if (tgt != null) {
- Credentials tgtCreds = ticketToCreds(tgt);
- Credentials serviceCreds = Credentials.acquireServiceCreds(
- serverPrincipal, tgtCreds);
- if (serviceCreds != null) {
- ticket = credsToTicket(serviceCreds);
-
- // Store service ticket in acc's Subject
- if (fromAcc && accSubj != null && !accSubj.isReadOnly()) {
- accSubj.getPrivateCredentials().add(ticket);
- }
- }
- }
- return ticket;
- }
-
/**
* Retrieves the ticket corresponding to the client/server principal
* pair from the Subject in the specified AccessControlContext.
From a4905bae9b2b95616452cca05bda4f6ccc54134e Mon Sep 17 00:00:00 2001
From: Alexey Ushakov
Date: Sun, 7 Jul 2019 10:52:30 -0700
Subject: [PATCH 18/40] 8226654: Some swing gtk regression tests fail with
"java.lang.InternalError: Unable to load native GTK librarie
Reviewed-by: prr, psadhukhan
---
.../unix/native/libawt_xawt/awt/gtk3_interface.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c b/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c
index 62da2a7edf2..53f6cd9fc8a 100644
--- a/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c
+++ b/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c
@@ -324,8 +324,6 @@ GtkApi* gtk3_load(JNIEnv *env, const char* lib_name)
/* GDK */
fp_gdk_get_default_root_window =
dl_symbol("gdk_get_default_root_window");
- fp_gdk_window_get_scale_factor =
- dl_symbol("gdk_window_get_scale_factor");
/* Pixbuf */
fp_gdk_pixbuf_new = dl_symbol("gdk_pixbuf_new");
@@ -400,6 +398,8 @@ GtkApi* gtk3_load(JNIEnv *env, const char* lib_name)
} else {
fp_gdk_window_create_similar_image_surface =
dl_symbol("gdk_window_create_similar_image_surface");
+ fp_gdk_window_get_scale_factor =
+ dl_symbol("gdk_window_get_scale_factor");
}
gtk3_version_3_14 = !fp_gtk_check_version(3, 14, 0);
@@ -2890,9 +2890,13 @@ static gboolean gtk3_get_drawable_data(JNIEnv *env, jintArray pixelArray,
jint *ary;
GdkWindow *root = (*fp_gdk_get_default_root_window)();
- int win_scale = (*fp_gdk_window_get_scale_factor)(root);
- pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(
- root, x, y, (int)(width / (float)win_scale + 0.5), (int)(height / (float)win_scale + 0.5));
+ if (gtk3_version_3_10) {
+ int win_scale = (*fp_gdk_window_get_scale_factor)(root);
+ pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(
+ root, x, y, (int) (width / (float) win_scale + 0.5), (int) (height / (float) win_scale + 0.5));
+ } else {
+ pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(root, x, y, width, height);
+ }
if (pixbuf && scale != 1) {
GdkPixbuf *scaledPixbuf;
From 4124d403c0a01bfe8e8399c202d62b2221cc8b8d Mon Sep 17 00:00:00 2001
From: Vladimir Kozlov
Date: Sun, 7 Jul 2019 18:10:18 -0700
Subject: [PATCH 19/40] 8225064: [Graal] Application SEGV in
G1ParScanThreadState::copy_to_survivor_space(G1HeapRegionAttr, oopDesc*,
markOopDesc*)+0x48
Switch off ReduceInitialCardMarks optimization in Graal in JDK 13 (full fix is in JDK 14)
Reviewed-by: thartmann, never
---
.../src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java
index 9ee6ddad85f..7adac437cae 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/GraalHotSpotVMConfig.java
@@ -179,7 +179,8 @@ public class GraalHotSpotVMConfig extends GraalHotSpotVMConfigBase {
return universeCollectedHeap + collectedHeapTotalCollectionsOffset;
}
- public final boolean useDeferredInitBarriers = getFlag("ReduceInitialCardMarks", Boolean.class);
+ // Disable support for ReduceInitialCardMarks due to JDK-8225064.
+ public final boolean useDeferredInitBarriers = false;
// Compressed Oops related values.
public final boolean useCompressedOops = getFlag("UseCompressedOops", Boolean.class);
From 173e014b80f7c8408f8f5586a31cf6f273aff273 Mon Sep 17 00:00:00 2001
From: Yudi Zheng
Date: Sun, 7 Jul 2019 18:17:46 -0700
Subject: [PATCH 20/40] 8224254: compiler/graalunit/HotspotJdk9Test.java is
timing out intermittently
Reviewed-by: kvn, thartmann
---
.../compiler/hotspot/jdk9/test/MathDoubleFMATest.java | 5 +++++
.../graalvm/compiler/hotspot/jdk9/test/MathFloatFMATest.java | 5 +++++
test/hotspot/jtreg/ProblemList-graal.txt | 1 -
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathDoubleFMATest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathDoubleFMATest.java
index 8d0221ed1c0..4bddb874773 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathDoubleFMATest.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathDoubleFMATest.java
@@ -30,7 +30,10 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import org.graalvm.compiler.api.test.Graal;
import org.graalvm.compiler.core.test.GraalCompilerTest;
+import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
+import org.graalvm.compiler.runtime.RuntimeProvider;
import org.graalvm.compiler.test.AddExports;
import org.junit.Before;
import org.junit.Test;
@@ -48,6 +51,8 @@ public final class MathDoubleFMATest extends GraalCompilerTest {
@Before
public void checkAMD64() {
assumeTrue("skipping AMD64 specific test", getTarget().arch instanceof AMD64);
+ HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class);
+ assumeTrue("skipping FMA specific test", rt.getVMConfig().useFMAIntrinsics);
}
@Parameters(name = "{0}, {1}, {2}")
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathFloatFMATest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathFloatFMATest.java
index dcb69e3ca12..fd459d4d73a 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathFloatFMATest.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.jdk9.test/src/org/graalvm/compiler/hotspot/jdk9/test/MathFloatFMATest.java
@@ -30,7 +30,10 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import org.graalvm.compiler.api.test.Graal;
import org.graalvm.compiler.core.test.GraalCompilerTest;
+import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
+import org.graalvm.compiler.runtime.RuntimeProvider;
import org.graalvm.compiler.test.AddExports;
import org.junit.Before;
import org.junit.Test;
@@ -48,6 +51,8 @@ public final class MathFloatFMATest extends GraalCompilerTest {
@Before
public void checkAMD64() {
assumeTrue("skipping AMD64 specific test", getTarget().arch instanceof AMD64);
+ HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class);
+ assumeTrue("skipping FMA specific tests", rt.getVMConfig().useFMAIntrinsics);
}
@Parameters(name = "{0}, {1}, {2}")
diff --git a/test/hotspot/jtreg/ProblemList-graal.txt b/test/hotspot/jtreg/ProblemList-graal.txt
index a744362144d..c55d466989c 100644
--- a/test/hotspot/jtreg/ProblemList-graal.txt
+++ b/test/hotspot/jtreg/ProblemList-graal.txt
@@ -38,7 +38,6 @@ compiler/compilercontrol/jcmd/AddLogTest.java 8181753 generi
compiler/compilercontrol/mixed/RandomValidCommandsTest.java 8181753 generic-all
compiler/compilercontrol/mixed/RandomCommandsTest.java 8181753 generic-all
-compiler/graalunit/HotspotJdk9Test.java 8223807 generic-all
compiler/jsr292/InvokerSignatureMismatch.java 8223807 generic-all
compiler/graalunit/JttThreadsTest.java 8207757 generic-all
From 291dfa4da5e3d4f2ae6355f4b75cbb9351c403fb Mon Sep 17 00:00:00 2001
From: Tom Rodriguez
Date: Sun, 7 Jul 2019 18:27:38 -0700
Subject: [PATCH 21/40] 8221514: [Graal] java/lang/String/CompactString/ tests
fail with "GraalError: failed guarantee: no FrameState at DeoptimizingNode"
in Graal -Xcomp mode
Put FrameState directly on final StateSplit in intrinsics.
Reviewed-by: thartmann, kvn, dnsimon, gdub
---
.../graalvm/compiler/java/BytecodeParser.java | 77 ++++++++++++++-----
1 file changed, 57 insertions(+), 20 deletions(-)
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java
index a2e88218bdc..4bae1270380 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java
@@ -355,6 +355,7 @@ import org.graalvm.compiler.nodes.StateSplit;
import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.nodes.UnwindNode;
import org.graalvm.compiler.nodes.ValueNode;
+import org.graalvm.compiler.nodes.ValuePhiNode;
import org.graalvm.compiler.nodes.calc.AddNode;
import org.graalvm.compiler.nodes.calc.AndNode;
import org.graalvm.compiler.nodes.calc.CompareNode;
@@ -627,7 +628,8 @@ public class BytecodeParser implements GraphBuilderContext {
}
static class IntrinsicScope extends InliningScope {
- boolean sawInvalidFrameState;
+ StateSplit returnStateSplit;
+ ArrayList invalidStateUsers;
IntrinsicScope(BytecodeParser parser) {
super(parser);
@@ -650,30 +652,64 @@ public class BytecodeParser implements GraphBuilderContext {
isRootCompilation = false;
}
processPlaceholderFrameStates(isRootCompilation);
- if (sawInvalidFrameState) {
+ if (invalidStateUsers != null) {
JavaKind returnKind = parser.getInvokeReturnType().getJavaKind();
- FrameStateBuilder frameStateBuilder = parser.frameState;
- ValueNode returnValue = frameStateBuilder.pop(returnKind);
- StructuredGraph graph = parser.lastInstr.graph();
- StateSplitProxyNode proxy = graph.add(new StateSplitProxyNode(returnValue));
- parser.lastInstr.setNext(proxy);
- frameStateBuilder.push(returnKind, proxy);
- proxy.setStateAfter(parser.createFrameState(parser.stream.nextBCI(), proxy));
- parser.lastInstr = proxy;
+ ValueNode returnValue = parser.frameState.pop(returnKind);
+ if (invalidStateUsers.size() == 1 && invalidStateUsers.get(0) == parser.lastInstr) {
+ updateSplitFrameState(invalidStateUsers.get(0), returnKind, returnValue);
+ } else if (parser.lastInstr instanceof MergeNode) {
+ ValuePhiNode returnValues = null;
+ MergeNode merge = (MergeNode) parser.lastInstr;
+
+ if (returnValue instanceof ValuePhiNode && ((ValuePhiNode) returnValue).merge() == parser.lastInstr) {
+ returnValues = (ValuePhiNode) returnValue;
+ }
+ if (invalidStateUsers.remove(merge)) {
+ updateSplitFrameState(merge, returnKind, returnValue);
+ }
+ for (EndNode pred : merge.cfgPredecessors()) {
+ Node lastPred = pred.predecessor();
+ if (invalidStateUsers.remove(lastPred)) {
+ ValueNode predReturnValue = returnValue;
+ if (returnValues != null) {
+ int index = merge.phiPredecessorIndex(pred);
+ predReturnValue = ((ValuePhiNode) returnValue).valueAt(index);
+ }
+ updateSplitFrameState((StateSplit) lastPred, returnKind, predReturnValue);
+ }
+ }
+ if (invalidStateUsers.size() != 0) {
+ throw new GraalError("unexpected StateSplit above merge %s", invalidStateUsers);
+ }
+ } else {
+ throw new GraalError("unexpected node between return StateSplit and last instruction %s", parser.lastInstr);
+ }
+ // Restore the original return value
+ parser.frameState.push(returnKind, returnValue);
+ }
+ }
+
+ private void updateSplitFrameState(StateSplit split, JavaKind returnKind, ValueNode returnValue) {
+ parser.frameState.push(returnKind, returnValue);
+ FrameState oldState = split.stateAfter();
+ split.setStateAfter(parser.createFrameState(parser.stream.nextBCI(), split));
+ parser.frameState.pop(returnKind);
+ if (oldState.hasNoUsages()) {
+ oldState.safeDelete();
}
}
@Override
protected void handleReturnMismatch(StructuredGraph g, FrameState fs) {
- // If the intrinsic returns a non-void value, then any frame
- // state with an empty stack is invalid as it cannot
- // be used to deoptimize to just after the call returns.
- // These invalid frame states are expected to be removed
- // by later compilation stages.
- FrameState newFrameState = g.add(new FrameState(BytecodeFrame.INVALID_FRAMESTATE_BCI));
- newFrameState.setNodeSourcePosition(fs.getNodeSourcePosition());
- fs.replaceAndDelete(newFrameState);
- sawInvalidFrameState = true;
+ if (invalidStateUsers == null) {
+ invalidStateUsers = new ArrayList<>();
+ }
+ for (Node use : fs.usages()) {
+ if (!(use instanceof StateSplit)) {
+ throw new GraalError("Expected StateSplit for return mismatch");
+ }
+ invalidStateUsers.add((StateSplit) use);
+ }
}
}
@@ -2642,7 +2678,6 @@ public class BytecodeParser implements GraphBuilderContext {
List calleeReturnDataList = parser.returnDataList;
- processCalleeReturn(targetMethod, s, calleeReturnDataList);
/*
* Propagate any side effects into the caller when parsing intrinsics.
*/
@@ -2652,6 +2687,8 @@ public class BytecodeParser implements GraphBuilderContext {
}
}
+ processCalleeReturn(targetMethod, s, calleeReturnDataList);
+
calleeBeforeUnwindNode = parser.getBeforeUnwindNode();
if (calleeBeforeUnwindNode != null) {
calleeUnwindValue = parser.getUnwindValue();
From 516578513cdc8c05c8357894aaebf34a76569c8e Mon Sep 17 00:00:00 2001
From: Martin Doerr
Date: Mon, 8 Jul 2019 10:56:05 +0200
Subject: [PATCH 22/40] 8226302: Test failures on IBM platforms (power and
s/390) after JDK-8223837
Adjust heap size values for 32M heap aligment (page size 64k)
Reviewed-by: goetz, rschmelter, tschatzl
---
test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java | 3 ++-
test/hotspot/jtreg/gc/arguments/TestSoftMaxHeapSizeFlag.java | 5 +++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java b/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java
index fd63d8b8ffc..87f64b3dd91 100644
--- a/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java
+++ b/test/hotspot/jtreg/gc/arguments/TestMaxHeapSizeTools.java
@@ -135,7 +135,8 @@ class TestMaxHeapSizeTools {
expectError(new String[] { gcflag, "-XX:InitialHeapSize=1023K", "-version" });
expectError(new String[] { gcflag, "-Xms64M", "-XX:InitialHeapSize=32M", "-version" });
expectError(new String[] { gcflag, "-XX:MinHeapSize=1023K", "-version" });
- expectError(new String[] { gcflag, "-Xms4M", "-XX:MinHeapSize=8M", "-version" });
+ // Note: MinHeapSize values get aligned up by HeapAlignment which is 32M with 64k pages.
+ expectError(new String[] { gcflag, "-Xms4M", "-XX:MinHeapSize=64M", "-version" });
expectError(new String[] { gcflag, "-XX:MinHeapSize=8M -XX:InitialHeapSize=4m" });
}
diff --git a/test/hotspot/jtreg/gc/arguments/TestSoftMaxHeapSizeFlag.java b/test/hotspot/jtreg/gc/arguments/TestSoftMaxHeapSizeFlag.java
index 80faff384cc..853d96b9f4d 100644
--- a/test/hotspot/jtreg/gc/arguments/TestSoftMaxHeapSizeFlag.java
+++ b/test/hotspot/jtreg/gc/arguments/TestSoftMaxHeapSizeFlag.java
@@ -35,8 +35,9 @@ package gc.arguments;
import jdk.test.lib.process.ProcessTools;
public class TestSoftMaxHeapSizeFlag {
- private static final long Xms = 200 * 1024 * 1024;
- private static final long Xmx = 300 * 1024 * 1024;
+ // Note: Xms and Xmx values get aligned up by HeapAlignment which is 32M with 64k pages.
+ private static final long Xms = 224 * 1024 * 1024;
+ private static final long Xmx = 320 * 1024 * 1024;
private static final long greaterThanXmx = Xmx + 1;
private static final long betweenXmsAndXmx = (Xms + Xmx) / 2;
From 7fbf691c0109c2bd59ee6cb7909c0322d222fd77 Mon Sep 17 00:00:00 2001
From: Jamsheed Mohammed C M
Date: Mon, 8 Jul 2019 04:01:54 -0700
Subject: [PATCH 23/40] 8221577: [Graal] Implement basic type consistency
checks for Low level MH intrinsics
Reviewed-by: kvn
---
.../test/CustomizedBytecodePatternTest.java | 30 +++
.../compiler/java/FrameStateBuilder.java | 6 +-
.../test/InvokerSignatureMismatchTest.java | 184 ++++++++++++++++++
.../replacements/nodes/MethodHandleNode.java | 90 ++++++++-
test/hotspot/jtreg/ProblemList-graal.txt | 1 -
5 files changed, 302 insertions(+), 9 deletions(-)
create mode 100644 src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokerSignatureMismatchTest.java
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CustomizedBytecodePatternTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CustomizedBytecodePatternTest.java
index 68bafa44a58..34f5bdf8cac 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CustomizedBytecodePatternTest.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/CustomizedBytecodePatternTest.java
@@ -24,14 +24,44 @@
package org.graalvm.compiler.core.test;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Method;
+import java.security.ProtectionDomain;
+
import org.objectweb.asm.Opcodes;
+import sun.misc.Unsafe;
+
public abstract class CustomizedBytecodePatternTest extends GraalCompilerTest implements Opcodes {
protected Class> getClass(String className) throws ClassNotFoundException {
return new CachedLoader(CustomizedBytecodePatternTest.class.getClassLoader(), className).findClass(className);
}
+ /**
+ * @param className
+ * @param lookUp lookup object with boot class load capability (required for jdk 9 and above)
+ * @return loaded class
+ * @throws ClassNotFoundException
+ */
+ protected Class> getClassBL(String className, MethodHandles.Lookup lookUp) throws ClassNotFoundException {
+ byte[] gen = generateClass(className.replace('.', '/'));
+ Method defineClass = null;
+ Class> loadedClass = null;
+ try {
+ if (Java8OrEarlier) {
+ defineClass = Unsafe.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class, ClassLoader.class, ProtectionDomain.class);
+ loadedClass = (Class>) defineClass.invoke(UNSAFE, className, gen, 0, gen.length, null, null);
+ } else {
+ defineClass = MethodHandles.lookup().getClass().getDeclaredMethod("defineClass", byte[].class);
+ loadedClass = (Class>) defineClass.invoke(lookUp, gen);
+ }
+ } catch (Exception e) {
+ throw new ClassNotFoundException();
+ }
+ return loadedClass;
+ }
+
private class CachedLoader extends ClassLoader {
final String className;
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java
index 5b446ec04b4..fe164d3915a 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/FrameStateBuilder.java
@@ -275,8 +275,6 @@ public final class FrameStateBuilder implements SideEffectsState {
clearNonLiveLocals = other.clearNonLiveLocals;
monitorIds = other.monitorIds.length == 0 ? other.monitorIds : other.monitorIds.clone();
- assert locals.length == code.getMaxLocals();
- assert stack.length == Math.max(1, code.getMaxStackSize());
assert lockedObjects.length == monitorIds.length;
}
@@ -791,7 +789,7 @@ public final class FrameStateBuilder implements SideEffectsState {
public ValueNode pop(JavaKind slotKind) {
if (slotKind.needsTwoSlots()) {
ValueNode s = xpop();
- assert s == TWO_SLOT_MARKER;
+ assert s == TWO_SLOT_MARKER : s;
}
ValueNode x = xpop();
assert verifyKind(slotKind, x);
@@ -835,7 +833,7 @@ public final class FrameStateBuilder implements SideEffectsState {
/* Ignore second slot of two-slot value. */
x = xpop();
}
- assert x != null && x != TWO_SLOT_MARKER;
+ assert x != null && x != TWO_SLOT_MARKER : x;
result[i] = x;
}
return result;
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokerSignatureMismatchTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokerSignatureMismatchTest.java
new file mode 100644
index 00000000000..7c713155bfc
--- /dev/null
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/InvokerSignatureMismatchTest.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2019, 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 org.graalvm.compiler.replacements.test;
+
+import static org.graalvm.compiler.test.SubprocessUtil.getVMCommandLine;
+import static org.graalvm.compiler.test.SubprocessUtil.withoutDebuggerArguments;
+
+import org.junit.Test;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+
+import java.io.File;
+import java.lang.invoke.MethodHandles;
+import java.util.List;
+
+import org.graalvm.compiler.core.test.CustomizedBytecodePatternTest;
+import org.graalvm.compiler.test.SubprocessUtil;
+import org.graalvm.compiler.test.SubprocessUtil.Subprocess;
+
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+
+public class InvokerSignatureMismatchTest {
+
+ @Test
+ public void test() throws Throwable {
+ List args = withoutDebuggerArguments(getVMCommandLine());
+ String classPath = System.getProperty("java.class.path");
+ classPath = classPath + File.pathSeparator + TestISMBL.class.getProtectionDomain().getCodeSource().getLocation().getPath();
+ args.add("-Xbootclasspath/a:" + classPath);
+ args.add("-XX:-TieredCompilation");
+ args.add("-XX:+EnableJVMCI");
+ args.add("-XX:+UseJVMCICompiler");
+
+ args.add(TestISMBL.class.getName());
+ Subprocess proc = SubprocessUtil.java(args);
+ if (proc.exitCode != 0) {
+ System.out.println(proc);
+ }
+ }
+}
+
+class TestISMBL extends CustomizedBytecodePatternTest {
+
+ public static void main(String[] args) {
+ try {
+ new TestISMBL().test();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ System.exit(0);
+ }
+
+ private void test() throws Throwable {
+ getClass("java/lang/invoke/MHHelper");
+ Class> testClass = getClass("ISMTest");
+
+ ResolvedJavaMethod mL = getResolvedJavaMethod(testClass, "mainLink");
+ ResolvedJavaMethod mI = getResolvedJavaMethod(testClass, "mainInvoke");
+ executeActual(mL, null, 100);
+ executeActual(mI, null, 100);
+ }
+
+ @Override
+ protected Class> getClass(String className) throws ClassNotFoundException {
+ if (className.equals("java/lang/invoke/MHHelper")) {
+ return super.getClassBL(className, MethodHandles.lookup());
+ } else {
+ return super.getClass(className);
+ }
+ }
+
+ @Override
+ protected byte[] generateClass(String className) {
+ String[] exceptions = new String[]{"java/lang/Throwable"};
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+ cw.visit(52, ACC_SUPER | ACC_PUBLIC, className, null, "java/lang/Object", null);
+
+ if (className.equals("java/lang/invoke/MHHelper")) {
+ MethodVisitor internalMemberName = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "internalMemberName", "(Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;", null, exceptions);
+ internalMemberName.visitCode();
+ internalMemberName.visitVarInsn(ALOAD, 0);
+ internalMemberName.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "internalMemberName", "()Ljava/lang/invoke/MemberName;", false);
+ internalMemberName.visitInsn(ARETURN);
+ internalMemberName.visitMaxs(1, 1);
+ internalMemberName.visitEnd();
+
+ MethodVisitor linkToStatic = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "linkToStatic", "(FLjava/lang/Object;)I", null, exceptions);
+ linkToStatic.visitCode();
+ linkToStatic.visitVarInsn(FLOAD, 0);
+ linkToStatic.visitVarInsn(ALOAD, 1);
+ linkToStatic.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandle", "linkToStatic", "(FLjava/lang/Object;)I", false);
+ linkToStatic.visitInsn(IRETURN);
+ linkToStatic.visitMaxs(1, 1);
+ linkToStatic.visitEnd();
+
+ MethodVisitor invokeBasicI = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "invokeBasicI", "(Ljava/lang/invoke/MethodHandle;F)I", null, exceptions);
+ invokeBasicI.visitCode();
+ invokeBasicI.visitVarInsn(ALOAD, 0);
+ invokeBasicI.visitVarInsn(FLOAD, 1);
+ invokeBasicI.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeBasic", "(F)I", false);
+ invokeBasicI.visitInsn(IRETURN);
+ invokeBasicI.visitMaxs(1, 1);
+ invokeBasicI.visitEnd();
+
+ } else {
+ assert className.equals("ISMTest") : className;
+ cw.visitField(ACC_FINAL | ACC_STATIC, "INT_MH", "Ljava/lang/invoke/MethodHandle;", null, null).visitAnnotation("Ljava/lang/invoke/Stable.class;", true).visitEnd();
+ MethodVisitor clinit = cw.visitMethod(ACC_STATIC, "", "()V", null, exceptions);
+ clinit.visitCode();
+ clinit.visitInsn(ACONST_NULL);
+ clinit.visitVarInsn(ASTORE, 0);
+ clinit.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", false);
+ clinit.visitLdcInsn(Type.getObjectType(className));
+ clinit.visitLdcInsn("bodyI");
+ clinit.visitFieldInsn(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
+ clinit.visitFieldInsn(GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
+ clinit.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodType", "methodType", "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType;", false);
+ clinit.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findStatic",
+ "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", false);
+ clinit.visitFieldInsn(PUTSTATIC, className, "INT_MH", "Ljava/lang/invoke/MethodHandle;");
+ clinit.visitInsn(RETURN);
+ clinit.visitMaxs(1, 1);
+ clinit.visitEnd();
+
+ MethodVisitor mainLink = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "mainLink", "(I)I", null, exceptions);
+ mainLink.visitCode();
+ mainLink.visitFieldInsn(GETSTATIC, className, "INT_MH", "Ljava/lang/invoke/MethodHandle;");
+ mainLink.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MHHelper", "internalMemberName", "(Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;", false);
+ mainLink.visitVarInsn(ASTORE, 1);
+ mainLink.visitVarInsn(ILOAD, 0);
+ mainLink.visitInsn(I2F);
+ mainLink.visitVarInsn(ALOAD, 1);
+ mainLink.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MHHelper", "linkToStatic", "(FLjava/lang/Object;)I", false);
+ mainLink.visitInsn(IRETURN);
+ mainLink.visitMaxs(1, 1);
+ mainLink.visitEnd();
+
+ MethodVisitor mainInvoke = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "mainInvoke", "(I)I", null, exceptions);
+ mainInvoke.visitCode();
+ mainInvoke.visitFieldInsn(GETSTATIC, className, "INT_MH", "Ljava/lang/invoke/MethodHandle;");
+ mainInvoke.visitVarInsn(ILOAD, 0);
+ mainInvoke.visitInsn(I2F);
+ mainInvoke.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MHHelper", "invokeBasicI", "(Ljava/lang/invoke/MethodHandle;F)I", false);
+ mainInvoke.visitInsn(IRETURN);
+ mainInvoke.visitMaxs(1, 1);
+ mainInvoke.visitEnd();
+
+ MethodVisitor bodyI = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "bodyI", "(I)I", null, null);
+ bodyI.visitCode();
+ bodyI.visitVarInsn(ILOAD, 0);
+ bodyI.visitIntInsn(SIPUSH, 1023);
+ bodyI.visitInsn(IAND);
+ bodyI.visitInsn(IRETURN);
+ bodyI.visitMaxs(1, 1);
+ bodyI.visitEnd();
+ }
+ cw.visitEnd();
+ return cw.toByteArray();
+ }
+}
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java
index 1b3122d169b..7fc6289b522 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/MethodHandleNode.java
@@ -206,7 +206,8 @@ public final class MethodHandleNode extends MacroStateSplitNode implements Simpl
StampPair returnStamp, ValueNode[] arguments) {
ValueNode methodHandleNode = getReceiver(arguments);
if (methodHandleNode.isConstant()) {
- return getTargetInvokeNode(adder, intrinsicMethod, bci, returnStamp, arguments, methodHandleAccess.resolveInvokeBasicTarget(methodHandleNode.asJavaConstant(), true), original);
+ return getTargetInvokeNode(adder, intrinsicMethod, methodHandleAccess, bci, returnStamp, arguments, methodHandleAccess.resolveInvokeBasicTarget(methodHandleNode.asJavaConstant(), true),
+ original);
}
return null;
}
@@ -227,7 +228,7 @@ public final class MethodHandleNode extends MacroStateSplitNode implements Simpl
StampPair returnStamp, ValueNode[] arguments) {
ValueNode memberNameNode = getMemberName(arguments);
if (memberNameNode.isConstant()) {
- return getTargetInvokeNode(adder, intrinsicMethod, bci, returnStamp, arguments, methodHandleAccess.resolveLinkToTarget(memberNameNode.asJavaConstant()), original);
+ return getTargetInvokeNode(adder, intrinsicMethod, methodHandleAccess, bci, returnStamp, arguments, methodHandleAccess.resolveLinkToTarget(memberNameNode.asJavaConstant()), original);
}
return null;
}
@@ -241,9 +242,10 @@ public final class MethodHandleNode extends MacroStateSplitNode implements Simpl
*
* @return invoke node for the member name target
*/
- private static InvokeNode getTargetInvokeNode(GraphAdder adder, IntrinsicMethod intrinsicMethod, int bci, StampPair returnStamp, ValueNode[] originalArguments, ResolvedJavaMethod target,
+ private static InvokeNode getTargetInvokeNode(GraphAdder adder, IntrinsicMethod intrinsicMethod, MethodHandleAccessProvider methodHandleAccess, int bci, StampPair returnStamp,
+ ValueNode[] originalArguments, ResolvedJavaMethod target,
ResolvedJavaMethod original) {
- if (target == null) {
+ if (target == null || !isConsistentInfo(methodHandleAccess, original, target)) {
return null;
}
@@ -390,4 +392,84 @@ public final class MethodHandleNode extends MacroStateSplitNode implements Simpl
return new InvokeNode(callTarget, bci);
}
}
+
+ /**
+ * Checks basic type consistency of low level method handle intrinsics.
+ *
+ * @param original declared method
+ * @param target resolved method
+ * @return true if original is type consistent with target
+ */
+ private static boolean isConsistentInfo(MethodHandleAccessProvider methodHandleAccess, ResolvedJavaMethod original, ResolvedJavaMethod target) {
+ IntrinsicMethod originalIntrinsicMethod = methodHandleAccess.lookupMethodHandleIntrinsic(original);
+ assert originalIntrinsicMethod == IntrinsicMethod.INVOKE_BASIC ||
+ originalIntrinsicMethod == IntrinsicMethod.LINK_TO_STATIC ||
+ originalIntrinsicMethod == IntrinsicMethod.LINK_TO_SPECIAL ||
+ originalIntrinsicMethod == IntrinsicMethod.LINK_TO_VIRTUAL ||
+ originalIntrinsicMethod == IntrinsicMethod.LINK_TO_INTERFACE;
+ IntrinsicMethod targetIntrinsicMethod = methodHandleAccess.lookupMethodHandleIntrinsic(target);
+ Signature originalSignature = original.getSignature();
+ Signature targetSignature = target.getSignature();
+
+ boolean invokeThroughMHIntrinsic = originalIntrinsicMethod != null && targetIntrinsicMethod == null;
+ if (!invokeThroughMHIntrinsic) {
+ return (original.getName().equals(target.getName())) && (originalSignature.equals(targetSignature));
+ }
+
+ // Linkers have appendix argument which is not passed to callee.
+ int hasAppendix = (originalIntrinsicMethod == IntrinsicMethod.LINK_TO_STATIC ||
+ originalIntrinsicMethod == IntrinsicMethod.LINK_TO_SPECIAL ||
+ originalIntrinsicMethod == IntrinsicMethod.LINK_TO_VIRTUAL ||
+ originalIntrinsicMethod == IntrinsicMethod.LINK_TO_INTERFACE) ? 1 : 0;
+ if (originalSignature.getParameterCount(original.hasReceiver()) != (targetSignature.getParameterCount(target.hasReceiver()) + hasAppendix)) {
+ return false; // parameter count mismatch
+ }
+ int senderBase = 0;
+ int receiverBase = 0;
+ switch (originalIntrinsicMethod) {
+ case LINK_TO_VIRTUAL:
+ case LINK_TO_INTERFACE:
+ case LINK_TO_SPECIAL: {
+ if (target.isStatic()) {
+ return false;
+ }
+ if (originalSignature.getParameterKind(0).isPrimitive()) {
+ return false; // receiver should be an oop
+ }
+ senderBase = 1; // skip receiver
+ break;
+ }
+ case LINK_TO_STATIC: {
+ if (target.hasReceiver()) {
+ return false;
+ }
+ break;
+ }
+ case INVOKE_BASIC: {
+ if (target.isStatic()) {
+ if (targetSignature.getParameterKind(0).isPrimitive()) {
+ return false; // receiver should be an oop
+ }
+ receiverBase = 1; // skip receiver
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ assert (targetSignature.getParameterCount(false) - receiverBase) == (originalSignature.getParameterCount(false) - senderBase - hasAppendix) : "argument count mismatch";
+ int argCount = targetSignature.getParameterCount(false) - receiverBase;
+ for (int i = 0; i < argCount; i++) {
+ if (originalSignature.getParameterKind(senderBase + i).getStackKind() != targetSignature.getParameterKind(receiverBase + i).getStackKind()) {
+ return false;
+ }
+ }
+ // Only check the return type if the symbolic info has non-void return type.
+ // I.e. the return value of the resolved method can be dropped.
+ if (originalSignature.getReturnKind() != JavaKind.Void &&
+ originalSignature.getReturnKind().getStackKind() != targetSignature.getReturnKind().getStackKind()) {
+ return false;
+ }
+ return true; // no mismatch found
+ }
}
diff --git a/test/hotspot/jtreg/ProblemList-graal.txt b/test/hotspot/jtreg/ProblemList-graal.txt
index c55d466989c..7fbf1e48af0 100644
--- a/test/hotspot/jtreg/ProblemList-graal.txt
+++ b/test/hotspot/jtreg/ProblemList-graal.txt
@@ -38,7 +38,6 @@ compiler/compilercontrol/jcmd/AddLogTest.java 8181753 generi
compiler/compilercontrol/mixed/RandomValidCommandsTest.java 8181753 generic-all
compiler/compilercontrol/mixed/RandomCommandsTest.java 8181753 generic-all
-compiler/jsr292/InvokerSignatureMismatch.java 8223807 generic-all
compiler/graalunit/JttThreadsTest.java 8207757 generic-all
From 37b39bc6422cc1686ffd00c6b79a1bb94c1cd119 Mon Sep 17 00:00:00 2001
From: "Daniel D. Daugherty"
Date: Mon, 8 Jul 2019 11:38:49 -0400
Subject: [PATCH 24/40] 8227117: normal interpreter table is not restored after
single stepping with TLH
Reviewed-by: sspitsyn, eosterlund, dholmes, coleenp
---
.../share/interpreter/templateInterpreter.cpp | 14 ++++++++++++-
.../share/prims/jvmtiEventController.cpp | 20 ++++++++++---------
2 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/src/hotspot/share/interpreter/templateInterpreter.cpp b/src/hotspot/share/interpreter/templateInterpreter.cpp
index 4c7cba1226a..0c35250b3ea 100644
--- a/src/hotspot/share/interpreter/templateInterpreter.cpp
+++ b/src/hotspot/share/interpreter/templateInterpreter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2019, 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
@@ -29,6 +29,7 @@
#include "interpreter/templateInterpreter.hpp"
#include "interpreter/templateInterpreterGenerator.hpp"
#include "interpreter/templateTable.hpp"
+#include "logging/log.hpp"
#include "memory/resourceArea.hpp"
#include "runtime/timerTrace.hpp"
@@ -283,9 +284,13 @@ static inline void copy_table(address* from, address* to, int size) {
void TemplateInterpreter::notice_safepoints() {
if (!_notice_safepoints) {
+ log_debug(interpreter, safepoint)("switching active_table to safept_table.");
// switch to safepoint dispatch table
_notice_safepoints = true;
copy_table((address*)&_safept_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
+ } else {
+ log_debug(interpreter, safepoint)("active_table is already safept_table; "
+ "notice_safepoints() call is no-op.");
}
}
@@ -297,10 +302,17 @@ void TemplateInterpreter::notice_safepoints() {
void TemplateInterpreter::ignore_safepoints() {
if (_notice_safepoints) {
if (!JvmtiExport::should_post_single_step()) {
+ log_debug(interpreter, safepoint)("switching active_table to normal_table.");
// switch to normal dispatch table
_notice_safepoints = false;
copy_table((address*)&_normal_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
+ } else {
+ log_debug(interpreter, safepoint)("single stepping is still active; "
+ "ignoring ignore_safepoints() call.");
}
+ } else {
+ log_debug(interpreter, safepoint)("active_table is already normal_table; "
+ "ignore_safepoints() call is no-op.");
}
}
diff --git a/src/hotspot/share/prims/jvmtiEventController.cpp b/src/hotspot/share/prims/jvmtiEventController.cpp
index 2fb22effc7b..af01749c47a 100644
--- a/src/hotspot/share/prims/jvmtiEventController.cpp
+++ b/src/hotspot/share/prims/jvmtiEventController.cpp
@@ -264,7 +264,7 @@ public:
VM_ChangeSingleStep::VM_ChangeSingleStep(bool on)
- : _on(on != 0)
+ : _on(on)
{
}
@@ -331,18 +331,20 @@ void JvmtiEventControllerPrivate::set_should_post_single_step(bool on) {
}
-// This change must always be occur when at a safepoint.
-// Being at a safepoint causes the interpreter to use the
-// safepoint dispatch table which we overload to find single
-// step points. Just to be sure that it has been set, we
-// call notice_safepoints when turning on single stepping.
-// When we leave our current safepoint, should_post_single_step
-// will be checked by the interpreter, and the table kept
-// or changed accordingly.
+// When _on == true, we use the safepoint interpreter dispatch table
+// to allow us to find the single step points. Otherwise, we switch
+// back to the regular interpreter dispatch table.
+// Note: We call Interpreter::notice_safepoints() and ignore_safepoints()
+// in a VM_Operation to safely make the dispatch table switch. We
+// no longer rely on the safepoint mechanism to do any of this work
+// for us.
void VM_ChangeSingleStep::doit() {
+ log_debug(interpreter, safepoint)("changing single step to '%s'", _on ? "on" : "off");
JvmtiEventControllerPrivate::set_should_post_single_step(_on);
if (_on) {
Interpreter::notice_safepoints();
+ } else {
+ Interpreter::ignore_safepoints();
}
}
From 0f1ad3658417cd8ed733091ef2147eea7b46155c Mon Sep 17 00:00:00 2001
From: Naoto Sato
Date: Tue, 9 Jul 2019 08:05:38 -0700
Subject: [PATCH 25/40] 8227127: Era designator not displayed correctly using
the COMPAT provider
Reviewed-by: rriggs
---
.../sun/text/resources/ext/FormatData_ja.java | 12 ++++++------
.../sun/text/resources/ext/FormatData_zh.java | 14 +++++++-------
.../sun/text/resources/ext/FormatData_zh_TW.java | 14 +++++++-------
test/jdk/sun/text/resources/LocaleData | 10 +++++++++-
test/jdk/sun/text/resources/LocaleDataTest.java | 2 +-
5 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ja.java b/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ja.java
index 93d35187c51..61df7263f69 100644
--- a/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ja.java
+++ b/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_ja.java
@@ -97,6 +97,10 @@ public class FormatData_ja extends ParallelListResourceBundle {
"\u6c11\u56fd\u524d",
"\u6c11\u56fd",
};
+ final String[] gregoryEras = {
+ "\u7d00\u5143\u524d",
+ "\u897f\u66a6",
+ };
return new Object[][] {
{ "MonthNames",
new String[] {
@@ -171,12 +175,8 @@ public class FormatData_ja extends ParallelListResourceBundle {
"\u5348\u5f8c" // pm marker
}
},
- { "Eras",
- new String[] { // era strings for GregorianCalendar
- "\u7d00\u5143\u524d",
- "\u897f\u66a6"
- }
- },
+ { "Eras", gregoryEras },
+ { "short.Eras", gregoryEras },
{ "buddhist.Eras",
new String[] { // era strings for Thai Buddhist calendar
"\u7d00\u5143\u524d", // Kigenzen
diff --git a/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh.java b/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh.java
index 7b05db6e955..e902bfcbd26 100644
--- a/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh.java
+++ b/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2019, 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
@@ -88,6 +88,10 @@ public class FormatData_zh extends ParallelListResourceBundle {
"\u6c11\u56fd\u524d",
"\u6c11\u56fd",
};
+ final String[] gregoryEras = {
+ "\u516c\u5143\u524d",
+ "\u516c\u5143",
+ };
return new Object[][] {
{ "MonthNames",
new String[] {
@@ -263,12 +267,8 @@ public class FormatData_zh extends ParallelListResourceBundle {
"\u4e0b\u5348" // pm marker
}
},
- { "Eras",
- new String[] { // era strings
- "\u516c\u5143\u524d",
- "\u516c\u5143"
- }
- },
+ { "Eras", gregoryEras },
+ { "short.Eras", gregoryEras },
{ "buddhist.Eras",
new String[] {
"BC",
diff --git a/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh_TW.java b/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh_TW.java
index 69003106237..fd4b8872b80 100644
--- a/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh_TW.java
+++ b/src/jdk.localedata/share/classes/sun/text/resources/ext/FormatData_zh_TW.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2019, 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
@@ -88,13 +88,13 @@ public class FormatData_zh_TW extends ParallelListResourceBundle {
"\u6c11\u570b\u524d",
"\u6c11\u570b",
};
+ final String[] gregoryEras = {
+ "\u897f\u5143\u524d",
+ "\u897f\u5143",
+ };
return new Object[][] {
- { "Eras",
- new String[] { // era strings
- "\u897f\u5143\u524d",
- "\u897f\u5143"
- }
- },
+ { "Eras", gregoryEras },
+ { "short.Eras", gregoryEras },
{ "standalone.MonthAbbreviations",
new String[] {
"1\u6708",
diff --git a/test/jdk/sun/text/resources/LocaleData b/test/jdk/sun/text/resources/LocaleData
index b71bc3ac9ef..123928c0803 100644
--- a/test/jdk/sun/text/resources/LocaleData
+++ b/test/jdk/sun/text/resources/LocaleData
@@ -8322,7 +8322,15 @@ CurrencyNames//mru=Mauritanian Ouguiya
# bug #8208746
CurrencyNames//ves=Venezuelan Bol\u00edvar Soberano
-# bug# 8206879
+# bug #8206879
# For Peru decimal separator is changed to dot(.) and grouping separator is changed to comma(,)
FormatData/es_PE/NumberElements/0=.
FormatData/es_PE/NumberElements/1=,
+
+# bug #8227127
+FormatData/ja/short.Eras/0=\u7d00\u5143\u524d
+FormatData/ja/short.Eras/1=\u897f\u66a6
+FormatData/zh/short.Eras/0=\u516c\u5143\u524d
+FormatData/zh/short.Eras/1=\u516c\u5143
+FormatData/zh_TW/short.Eras/0=\u897f\u5143\u524d
+FormatData/zh_TW/short.Eras/1=\u897f\u5143
diff --git a/test/jdk/sun/text/resources/LocaleDataTest.java b/test/jdk/sun/text/resources/LocaleDataTest.java
index b93378f5fd6..9e6955337fe 100644
--- a/test/jdk/sun/text/resources/LocaleDataTest.java
+++ b/test/jdk/sun/text/resources/LocaleDataTest.java
@@ -39,7 +39,7 @@
* 8017142 8037343 8055222 8042126 8074791 8075173 8080774 8129361 8134916
* 8145136 8145952 8164784 8037111 8081643 7037368 8178872 8185841 8190918
* 8187946 8195478 8181157 8179071 8193552 8202026 8204269 8202537 8208746
- * 8209775 8221432
+ * 8209775 8221432 8227127
* @summary Verify locale data
* @modules java.base/sun.util.resources
* @modules jdk.localedata
From a577b1a972d0f97ee7ff3a72e4f8bfb81f20a40f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Erik=20=C3=96sterlund?=
Date: Tue, 9 Jul 2019 16:39:37 +0200
Subject: [PATCH 26/40] 8227277: HeapInspection::find_instances_at_safepoint
walks dead objects
Reviewed-by: dholmes, kbarrett, tschatzl, coleenp
---
src/hotspot/share/memory/heapInspection.cpp | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/src/hotspot/share/memory/heapInspection.cpp b/src/hotspot/share/memory/heapInspection.cpp
index d916775c036..e4808274048 100644
--- a/src/hotspot/share/memory/heapInspection.cpp
+++ b/src/hotspot/share/memory/heapInspection.cpp
@@ -792,8 +792,5 @@ void HeapInspection::find_instances_at_safepoint(Klass* k, GrowableArray* r
// Iterate over objects in the heap
FindInstanceClosure fic(k, result);
- // If this operation encounters a bad object when using CMS,
- // consider using safe_object_iterate() which avoids metadata
- // objects that may contain bad references.
- Universe::heap()->object_iterate(&fic);
+ Universe::heap()->safe_object_iterate(&fic);
}
From f111dd0cbbf6efa413914d99e756b2732d16e2ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Erik=20=C3=96sterlund?=
Date: Tue, 9 Jul 2019 16:39:41 +0200
Subject: [PATCH 27/40] 8224531: SEGV while collecting Klass statistics
Reviewed-by: coleenp, kbarrett, tschatzl
---
src/hotspot/share/memory/heapInspection.cpp | 4 ++--
src/hotspot/share/oops/klass.cpp | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/hotspot/share/memory/heapInspection.cpp b/src/hotspot/share/memory/heapInspection.cpp
index e4808274048..ab05eee3f00 100644
--- a/src/hotspot/share/memory/heapInspection.cpp
+++ b/src/hotspot/share/memory/heapInspection.cpp
@@ -123,7 +123,7 @@ void KlassInfoEntry::print_on(outputStream* st) const {
KlassInfoEntry* KlassInfoBucket::lookup(Klass* const k) {
// Can happen if k is an archived class that we haven't loaded yet.
- if (k->java_mirror() == NULL) {
+ if (k->java_mirror_no_keepalive() == NULL) {
return NULL;
}
@@ -719,7 +719,7 @@ size_t HeapInspection::populate_table(KlassInfoTable* cit, BoolObjectClosure *fi
ResourceMark rm;
RecordInstanceClosure ric(cit, filter);
- Universe::heap()->object_iterate(&ric);
+ Universe::heap()->safe_object_iterate(&ric);
return ric.missed_count();
}
diff --git a/src/hotspot/share/oops/klass.cpp b/src/hotspot/share/oops/klass.cpp
index 7361b9f7189..639ee0f2515 100644
--- a/src/hotspot/share/oops/klass.cpp
+++ b/src/hotspot/share/oops/klass.cpp
@@ -767,7 +767,7 @@ void Klass::oop_print_value_on(oop obj, outputStream* st) {
// Size Statistics
void Klass::collect_statistics(KlassSizeStats *sz) const {
sz->_klass_bytes = sz->count(this);
- sz->_mirror_bytes = sz->count(java_mirror());
+ sz->_mirror_bytes = sz->count(java_mirror_no_keepalive());
sz->_secondary_supers_bytes = sz->count_array(secondary_supers());
sz->_ro_bytes += sz->_secondary_supers_bytes;
From d307ec4dba997b421b64e8e4f3f37a4cdf977f21 Mon Sep 17 00:00:00 2001
From: Dean Long
Date: Tue, 9 Jul 2019 13:46:39 -0400
Subject: [PATCH 28/40] 8227237: [Graal]
org.graalvm.compiler.api.directives.test.ProbabilityDirectiveTest fails with
-Xcomp
Reviewed-by: kvn
---
.../directives/test/ProbabilityDirectiveTest.java | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java
index 7474ad31172..6eab7551504 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.api.directives.test/src/org/graalvm/compiler/api/directives/test/ProbabilityDirectiveTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2019, 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
@@ -24,6 +24,8 @@
package org.graalvm.compiler.api.directives.test;
+import jdk.vm.ci.meta.ResolvedJavaMethod;
+
import org.graalvm.compiler.api.directives.GraalDirectives;
import org.graalvm.compiler.core.test.GraalCompilerTest;
import org.graalvm.compiler.graph.iterators.NodeIterable;
@@ -37,6 +39,15 @@ import org.junit.Test;
public class ProbabilityDirectiveTest extends GraalCompilerTest {
+ /**
+ * Called before a test is compiled.
+ */
+ @Override
+ protected void before(ResolvedJavaMethod method) {
+ // don't let -Xcomp pollute profile
+ method.reprofile();
+ }
+
public static int branchProbabilitySnippet(int arg) {
if (GraalDirectives.injectBranchProbability(0.125, arg > 0)) {
GraalDirectives.controlFlowAnchor(); // prevent removal of the if
From 75d87ff2543ba407ca9d338b13e09cbdc382fb83 Mon Sep 17 00:00:00 2001
From: Tom Rodriguez
Date: Tue, 9 Jul 2019 14:59:12 -0700
Subject: [PATCH 29/40] 8227034: Graal crash with gcbasher
Adjust Graal's registers declaration for String intrinisics.
Reviewed-by: dlong, dnsimon, kvn
---
.../lir/amd64/AMD64StringLatin1InflateOp.java | 19 +++++++++++--------
.../lir/amd64/AMD64StringUTF16CompressOp.java | 19 +++++++++++--------
2 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java
index c079f989478..c86bd84c9c7 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringLatin1InflateOp.java
@@ -29,11 +29,9 @@ import static jdk.vm.ci.amd64.AMD64.k2;
import static jdk.vm.ci.amd64.AMD64.rdi;
import static jdk.vm.ci.amd64.AMD64.rdx;
import static jdk.vm.ci.amd64.AMD64.rsi;
-
import static jdk.vm.ci.code.ValueUtil.asRegister;
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
-import jdk.vm.ci.amd64.AMD64;
import org.graalvm.compiler.asm.Label;
import org.graalvm.compiler.asm.amd64.AMD64Address;
import org.graalvm.compiler.asm.amd64.AMD64Assembler;
@@ -44,6 +42,7 @@ import org.graalvm.compiler.lir.Opcode;
import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
+import jdk.vm.ci.amd64.AMD64;
import jdk.vm.ci.amd64.AMD64Kind;
import jdk.vm.ci.code.Register;
import jdk.vm.ci.meta.Value;
@@ -52,9 +51,13 @@ import jdk.vm.ci.meta.Value;
public final class AMD64StringLatin1InflateOp extends AMD64LIRInstruction {
public static final LIRInstructionClass TYPE = LIRInstructionClass.create(AMD64StringLatin1InflateOp.class);
- @Alive({REG}) private Value rsrc;
- @Alive({REG}) private Value rdst;
- @Alive({REG}) private Value rlen;
+ @Use({REG}) private Value rsrc;
+ @Use({REG}) private Value rdst;
+ @Use({REG}) private Value rlen;
+
+ @Temp({REG}) private Value rsrcTemp;
+ @Temp({REG}) private Value rdstTemp;
+ @Temp({REG}) private Value rlenTemp;
@Temp({REG}) private Value vtmp1;
@Temp({REG}) private Value rtmp2;
@@ -66,9 +69,9 @@ public final class AMD64StringLatin1InflateOp extends AMD64LIRInstruction {
assert asRegister(dst).equals(rdi);
assert asRegister(len).equals(rdx);
- rsrc = src;
- rdst = dst;
- rlen = len;
+ rsrcTemp = rsrc = src;
+ rdstTemp = rdst = dst;
+ rlenTemp = rlen = len;
vtmp1 = tool.newVariable(LIRKind.value(AMD64Kind.V512_BYTE));
rtmp2 = tool.newVariable(LIRKind.value(AMD64Kind.DWORD));
diff --git a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringUTF16CompressOp.java b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringUTF16CompressOp.java
index 9e795179a29..79382abc7bb 100644
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringUTF16CompressOp.java
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir.amd64/src/org/graalvm/compiler/lir/amd64/AMD64StringUTF16CompressOp.java
@@ -31,12 +31,10 @@ import static jdk.vm.ci.amd64.AMD64.rax;
import static jdk.vm.ci.amd64.AMD64.rdi;
import static jdk.vm.ci.amd64.AMD64.rdx;
import static jdk.vm.ci.amd64.AMD64.rsi;
-
import static jdk.vm.ci.amd64.AMD64.rsp;
import static jdk.vm.ci.code.ValueUtil.asRegister;
import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG;
-import jdk.vm.ci.amd64.AMD64;
import org.graalvm.compiler.asm.Label;
import org.graalvm.compiler.asm.amd64.AMD64Address;
import org.graalvm.compiler.asm.amd64.AMD64Assembler;
@@ -47,6 +45,7 @@ import org.graalvm.compiler.lir.Opcode;
import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
+import jdk.vm.ci.amd64.AMD64;
import jdk.vm.ci.amd64.AMD64Kind;
import jdk.vm.ci.code.Register;
import jdk.vm.ci.meta.Value;
@@ -56,9 +55,13 @@ public final class AMD64StringUTF16CompressOp extends AMD64LIRInstruction {
public static final LIRInstructionClass TYPE = LIRInstructionClass.create(AMD64StringUTF16CompressOp.class);
@Def({REG}) private Value rres;
- @Alive({REG}) private Value rsrc;
- @Alive({REG}) private Value rdst;
- @Alive({REG}) private Value rlen;
+ @Use({REG}) private Value rsrc;
+ @Use({REG}) private Value rdst;
+ @Use({REG}) private Value rlen;
+
+ @Temp({REG}) private Value rsrcTemp;
+ @Temp({REG}) private Value rdstTemp;
+ @Temp({REG}) private Value rlenTemp;
@Temp({REG}) private Value vtmp1;
@Temp({REG}) private Value vtmp2;
@@ -75,9 +78,9 @@ public final class AMD64StringUTF16CompressOp extends AMD64LIRInstruction {
assert asRegister(res).equals(rax);
rres = res;
- rsrc = src;
- rdst = dst;
- rlen = len;
+ rsrcTemp = rsrc = src;
+ rdstTemp = rdst = dst;
+ rlenTemp = rlen = len;
LIRKind vkind = LIRKind.value(AMD64Kind.V512_BYTE);
From 3fe67141c703755557b352f9335b8b1a7662f6b4 Mon Sep 17 00:00:00 2001
From: Jatin Bhateja
Date: Tue, 9 Jul 2019 15:42:44 -0700
Subject: [PATCH 30/40] 8227222:
vmTestbase/jit/FloatingPoint/gen_math/Loops04/Loops04.java failed XMM
register should be 0-15
Reviewed-by: thartmann, vlivanov, ctornqvi, bsrbnd
---
src/hotspot/cpu/x86/x86_64.ad | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad
index 92e1fe3152c..b0858e2ca8c 100644
--- a/src/hotspot/cpu/x86/x86_64.ad
+++ b/src/hotspot/cpu/x86/x86_64.ad
@@ -5543,7 +5543,7 @@ instruct maxF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF atmp,
ins_pipe( pipe_slow );
%}
-instruct maxF_reduction_reg(regF dst, regF a, regF b, regF xmmt, rRegI tmp, rFlagsReg cr) %{
+instruct maxF_reduction_reg(legRegF dst, legRegF a, legRegF b, legRegF xmmt, rRegI tmp, rFlagsReg cr) %{
predicate(UseAVX > 0 && n->is_reduction());
match(Set dst (MaxF a b));
effect(USE a, USE b, TEMP xmmt, TEMP tmp, KILL cr);
@@ -5579,7 +5579,7 @@ instruct maxD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD atmp,
ins_pipe( pipe_slow );
%}
-instruct maxD_reduction_reg(regD dst, regD a, regD b, regD xmmt, rRegL tmp, rFlagsReg cr) %{
+instruct maxD_reduction_reg(legRegD dst, legRegD a, legRegD b, legRegD xmmt, rRegL tmp, rFlagsReg cr) %{
predicate(UseAVX > 0 && n->is_reduction());
match(Set dst (MaxD a b));
effect(USE a, USE b, TEMP xmmt, TEMP tmp, KILL cr);
@@ -5615,7 +5615,7 @@ instruct minF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF atmp,
ins_pipe( pipe_slow );
%}
-instruct minF_reduction_reg(regF dst, regF a, regF b, regF xmmt, rRegI tmp, rFlagsReg cr) %{
+instruct minF_reduction_reg(legRegF dst, legRegF a, legRegF b, legRegF xmmt, rRegI tmp, rFlagsReg cr) %{
predicate(UseAVX > 0 && n->is_reduction());
match(Set dst (MinF a b));
effect(USE a, USE b, TEMP xmmt, TEMP tmp, KILL cr);
@@ -5651,7 +5651,7 @@ instruct minD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD atmp,
ins_pipe( pipe_slow );
%}
-instruct minD_reduction_reg(regD dst, regD a, regD b, regD xmmt, rRegL tmp, rFlagsReg cr) %{
+instruct minD_reduction_reg(legRegD dst, legRegD a, legRegD b, legRegD xmmt, rRegL tmp, rFlagsReg cr) %{
predicate(UseAVX > 0 && n->is_reduction());
match(Set dst (MinD a b));
effect(USE a, USE b, TEMP xmmt, TEMP tmp, KILL cr);
From e03c2a270b291e7b1edcf4df491d6d386a882a87 Mon Sep 17 00:00:00 2001
From: Weijun Wang
Date: Wed, 10 Jul 2019 09:43:34 +0800
Subject: [PATCH 31/40] 8225687: Newly added sspi.cpp in JDK-6722928 still
contains some small errors
Reviewed-by: xuelei
---
.../share/native/libj2gss/NativeFunc.h | 36 ++---
.../share/native/libj2gss/gssapi.h | 48 +++----
.../windows/native/libsspi_bridge/sspi.cpp | 127 ++++++++++++------
3 files changed, 126 insertions(+), 85 deletions(-)
diff --git a/src/java.security.jgss/share/native/libj2gss/NativeFunc.h b/src/java.security.jgss/share/native/libj2gss/NativeFunc.h
index 1cf5dcd96de..82914387c25 100644
--- a/src/java.security.jgss/share/native/libj2gss/NativeFunc.h
+++ b/src/java.security.jgss/share/native/libj2gss/NativeFunc.h
@@ -57,8 +57,8 @@ typedef OM_uint32 (*RELEASE_NAME_FN_PTR)
typedef OM_uint32 (*IMPORT_NAME_FN_PTR)
(OM_uint32 *minor_status,
- const gss_buffer_t input_name_buffer,
- const gss_OID input_name_type,
+ gss_const_buffer_t input_name_buffer,
+ gss_const_OID input_name_type,
gss_name_t *output_name);
typedef OM_uint32 (*COMPARE_NAME_FN_PTR)
@@ -70,7 +70,7 @@ typedef OM_uint32 (*COMPARE_NAME_FN_PTR)
typedef OM_uint32 (*CANONICALIZE_NAME_FN_PTR)
(OM_uint32 *minor_status,
gss_const_name_t input_name,
- const gss_OID mech_type,
+ gss_const_OID mech_type,
gss_name_t *output_name);
typedef OM_uint32 (*EXPORT_NAME_FN_PTR)
@@ -88,7 +88,7 @@ typedef OM_uint32 (*ACQUIRE_CRED_FN_PTR)
(OM_uint32 *minor_status,
gss_const_name_t desired_name,
OM_uint32 time_req,
- const gss_OID_set desired_mech,
+ gss_const_OID_set desired_mech,
gss_cred_usage_t cred_usage,
gss_cred_id_t *output_cred_handle,
gss_OID_set *actual_mechs,
@@ -108,7 +108,7 @@ typedef OM_uint32 (*INQUIRE_CRED_FN_PTR)
typedef OM_uint32 (*IMPORT_SEC_CONTEXT_FN_PTR)
(OM_uint32 *minor_status,
- const gss_buffer_t interprocess_token,
+ gss_const_buffer_t interprocess_token,
gss_ctx_id_t *context_handle);
typedef OM_uint32 (*INIT_SEC_CONTEXT_FN_PTR)
@@ -116,11 +116,11 @@ typedef OM_uint32 (*INIT_SEC_CONTEXT_FN_PTR)
gss_const_cred_id_t initiator_cred_handle,
gss_ctx_id_t *context_handle,
gss_const_name_t target_name,
- const gss_OID mech_type,
+ gss_const_OID mech_type,
OM_uint32 req_flags,
OM_uint32 time_req,
- const gss_channel_bindings_t input_chan_bindings,
- const gss_buffer_t input_token,
+ gss_const_channel_bindings_t input_chan_bindings,
+ gss_const_buffer_t input_token,
gss_OID *actual_mech_type,
gss_buffer_t output_token,
OM_uint32 *ret_flags,
@@ -130,8 +130,8 @@ typedef OM_uint32 (*ACCEPT_SEC_CONTEXT_FN_PTR)
(OM_uint32 *minor_status,
gss_ctx_id_t *context_handle,
gss_const_cred_id_t acceptor_cred_handle,
- const gss_buffer_t input_token,
- const gss_channel_bindings_t input_chan_bindings,
+ gss_const_buffer_t input_token,
+ gss_const_channel_bindings_t input_chan_bindings,
gss_name_t *src_name,
gss_OID *mech_type,
gss_buffer_t output_token,
@@ -177,14 +177,14 @@ typedef OM_uint32 (*GET_MIC_FN_PTR)
(OM_uint32 *minor_status,
gss_const_ctx_id_t context_handle,
gss_qop_t qop_req,
- const gss_buffer_t message_buffer,
+ gss_const_buffer_t message_buffer,
gss_buffer_t msg_token);
typedef OM_uint32 (*VERIFY_MIC_FN_PTR)
(OM_uint32 *minor_status,
gss_const_ctx_id_t context_handle,
- const gss_buffer_t message_buffer,
- const gss_buffer_t token_buffer,
+ gss_const_buffer_t message_buffer,
+ gss_const_buffer_t token_buffer,
gss_qop_t *qop_state);
typedef OM_uint32 (*WRAP_FN_PTR)
@@ -192,14 +192,14 @@ typedef OM_uint32 (*WRAP_FN_PTR)
gss_const_ctx_id_t context_handle,
int conf_req_flag,
gss_qop_t qop_req,
- const gss_buffer_t input_message_buffer,
+ gss_const_buffer_t input_message_buffer,
int *conf_state,
gss_buffer_t output_message_buffer);
typedef OM_uint32 (*UNWRAP_FN_PTR)
(OM_uint32 *minor_status,
gss_const_ctx_id_t context_handle,
- const gss_buffer_t input_message_buffer,
+ gss_const_buffer_t input_message_buffer,
gss_buffer_t output_message_buffer,
int *conf_state,
gss_qop_t *qop_state);
@@ -210,19 +210,19 @@ typedef OM_uint32 (*INDICATE_MECHS_FN_PTR)
typedef OM_uint32 (*INQUIRE_NAMES_FOR_MECH_FN_PTR)
(OM_uint32 *minor_status,
- const gss_OID mechanism,
+ gss_const_OID mechanism,
gss_OID_set *name_types);
typedef OM_uint32 (*ADD_OID_SET_MEMBER_FN_PTR)
(OM_uint32 *minor_status,
- const gss_OID member_oid,
+ gss_const_OID member_oid,
gss_OID_set *oid_set);
typedef OM_uint32 (*DISPLAY_STATUS_FN_PTR)
(OM_uint32 *minor_status,
OM_uint32 status_value,
int status_type,
- const gss_OID mech_type,
+ gss_const_OID mech_type,
OM_uint32 *message_context,
gss_buffer_t status_string);
diff --git a/src/java.security.jgss/share/native/libj2gss/gssapi.h b/src/java.security.jgss/share/native/libj2gss/gssapi.h
index 9c6002c4633..932742ca9f5 100644
--- a/src/java.security.jgss/share/native/libj2gss/gssapi.h
+++ b/src/java.security.jgss/share/native/libj2gss/gssapi.h
@@ -404,7 +404,7 @@ GSS_DLLIMP OM_uint32 gss_acquire_cred(
OM_uint32 *, /* minor_status */
gss_const_name_t, /* desired_name */
OM_uint32, /* time_req */
- const gss_OID_set, /* desired_mechs */
+ gss_const_OID_set, /* desired_mechs */
gss_cred_usage_t, /* cred_usage */
gss_cred_id_t *, /* output_cred_handle */
gss_OID_set *, /* actual_mechs */
@@ -421,11 +421,11 @@ GSS_DLLIMP OM_uint32 gss_init_sec_context(
gss_const_cred_id_t, /* claimant_cred_handle */
gss_ctx_id_t *, /* context_handle */
gss_const_name_t, /* target_name */
- const gss_OID, /* mech_type */
+ gss_const_OID, /* mech_type */
OM_uint32, /* req_flags */
OM_uint32, /* time_req */
- const gss_channel_bindings_t, /* input_chan_bindings */
- const gss_buffer_t, /* input_token */
+ gss_const_channel_bindings_t, /* input_chan_bindings */
+ gss_const_buffer_t, /* input_token */
gss_OID *, /* actual_mech_type */
gss_buffer_t, /* output_token */
OM_uint32 *, /* ret_flags */
@@ -436,8 +436,8 @@ GSS_DLLIMP OM_uint32 gss_accept_sec_context(
OM_uint32 *, /* minor_status */
gss_ctx_id_t *, /* context_handle */
gss_const_cred_id_t, /* acceptor_cred_handle */
- const gss_buffer_t, /* input_token_buffer */
- const gss_channel_bindings_t, /* input_chan_bindings */
+ gss_const_buffer_t, /* input_token_buffer */
+ gss_const_channel_bindings_t, /* input_chan_bindings */
gss_name_t *, /* src_name */
gss_OID *, /* mech_type */
gss_buffer_t, /* output_token */
@@ -449,7 +449,7 @@ GSS_DLLIMP OM_uint32 gss_accept_sec_context(
GSS_DLLIMP OM_uint32 gss_process_context_token(
OM_uint32 *, /* minor_status */
gss_const_ctx_id_t, /* context_handle */
- const gss_buffer_t /* token_buffer */
+ gss_const_buffer_t /* token_buffer */
);
GSS_DLLIMP OM_uint32 gss_delete_sec_context(
@@ -469,7 +469,7 @@ GSS_DLLIMP OM_uint32 gss_get_mic(
OM_uint32 *, /* minor_status */
gss_const_ctx_id_t, /* context_handle */
gss_qop_t, /* qop_req */
- const gss_buffer_t, /* message_buffer */
+ gss_const_buffer_t, /* message_buffer */
gss_buffer_t /* message_token */
);
@@ -477,8 +477,8 @@ GSS_DLLIMP OM_uint32 gss_get_mic(
GSS_DLLIMP OM_uint32 gss_verify_mic(
OM_uint32 *, /* minor_status */
gss_const_ctx_id_t, /* context_handle */
- const gss_buffer_t, /* message_buffer */
- const gss_buffer_t, /* message_token */
+ gss_const_buffer_t, /* message_buffer */
+ gss_const_buffer_t, /* message_token */
gss_qop_t * /* qop_state */
);
@@ -488,7 +488,7 @@ GSS_DLLIMP OM_uint32 gss_wrap(
gss_const_ctx_id_t, /* context_handle */
int, /* conf_req_flag */
gss_qop_t, /* qop_req */
- const gss_buffer_t, /* input_message_buffer */
+ gss_const_buffer_t, /* input_message_buffer */
int *, /* conf_state */
gss_buffer_t /* output_message_buffer */
);
@@ -497,7 +497,7 @@ GSS_DLLIMP OM_uint32 gss_wrap(
GSS_DLLIMP OM_uint32 gss_unwrap(
OM_uint32 *, /* minor_status */
gss_const_ctx_id_t, /* context_handle */
- const gss_buffer_t, /* input_message_buffer */
+ gss_const_buffer_t, /* input_message_buffer */
gss_buffer_t, /* output_message_buffer */
int *, /* conf_state */
gss_qop_t * /* qop_state */
@@ -507,7 +507,7 @@ GSS_DLLIMP OM_uint32 gss_display_status(
OM_uint32 *, /* minor_status */
OM_uint32, /* status_value */
int, /* status_type */
- const gss_OID, /* mech_type (used to be const) */
+ gss_const_OID, /* mech_type (used to be const) */
OM_uint32 *, /* message_context */
gss_buffer_t /* status_string */
);
@@ -533,8 +533,8 @@ GSS_DLLIMP OM_uint32 gss_display_name(
GSS_DLLIMP OM_uint32 gss_import_name(
OM_uint32 *, /* minor_status */
- const gss_buffer_t, /* input_name_buffer */
- const gss_OID, /* input_name_type(used to be const) */
+ gss_const_buffer_t, /* input_name_buffer */
+ gss_const_OID, /* input_name_type(used to be const) */
gss_name_t * /* output_name */
);
@@ -590,7 +590,7 @@ GSS_DLLIMP OM_uint32 gss_add_cred(
OM_uint32 *, /* minor_status */
gss_const_cred_id_t, /* input_cred_handle */
gss_const_name_t, /* desired_name */
- const gss_OID, /* desired_mech */
+ gss_const_OID, /* desired_mech */
gss_cred_usage_t, /* cred_usage */
OM_uint32, /* initiator_time_req */
OM_uint32, /* acceptor_time_req */
@@ -604,7 +604,7 @@ GSS_DLLIMP OM_uint32 gss_add_cred(
GSS_DLLIMP OM_uint32 gss_inquire_cred_by_mech(
OM_uint32 *, /* minor_status */
gss_const_cred_id_t, /* cred_handle */
- const gss_OID, /* mech_type */
+ gss_const_OID, /* mech_type */
gss_name_t *, /* name */
OM_uint32 *, /* initiator_lifetime */
OM_uint32 *, /* acceptor_lifetime */
@@ -621,7 +621,7 @@ GSS_DLLIMP OM_uint32 gss_export_sec_context(
/* New for V2 */
GSS_DLLIMP OM_uint32 gss_import_sec_context(
OM_uint32 *, /* minor_status */
- const gss_buffer_t, /* interprocess_token */
+ gss_const_buffer_t, /* interprocess_token */
gss_ctx_id_t * /* context_handle */
);
@@ -640,22 +640,22 @@ GSS_DLLIMP OM_uint32 gss_create_empty_oid_set(
/* New for V2 */
GSS_DLLIMP OM_uint32 gss_add_oid_set_member(
OM_uint32 *, /* minor_status */
- const gss_OID, /* member_oid */
+ gss_const_OID, /* member_oid */
gss_OID_set * /* oid_set */
);
/* New for V2 */
GSS_DLLIMP OM_uint32 gss_test_oid_set_member(
OM_uint32 *, /* minor_status */
- const gss_OID, /* member */
- const gss_OID_set, /* set */
+ gss_const_OID, /* member */
+ gss_const_OID_set, /* set */
int * /* present */
);
/* New for V2 */
GSS_DLLIMP OM_uint32 gss_str_to_oid(
OM_uint32 *, /* minor_status */
- const gss_buffer_t, /* oid_str */
+ gss_const_buffer_t, /* oid_str */
gss_OID * /* oid */
);
@@ -669,7 +669,7 @@ GSS_DLLIMP OM_uint32 gss_oid_to_str(
/* New for V2 */
GSS_DLLIMP OM_uint32 gss_inquire_names_for_mech(
OM_uint32 *, /* minor_status */
- const gss_OID, /* mechanism */
+ gss_const_OID, /* mechanism */
gss_OID_set * /* name_types */
);
@@ -691,7 +691,7 @@ GSS_DLLIMP OM_uint32 gss_duplicate_name(
GSS_DLLIMP OM_uint32 gss_canonicalize_name(
OM_uint32 *, /* minor_status */
gss_const_name_t, /* input_name */
- const gss_OID, /* mech_type */
+ gss_const_OID, /* mech_type */
gss_name_t * /* output_name */
);
diff --git a/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp b/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp
index b6827198a71..b1de9934a00 100644
--- a/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp
+++ b/src/java.security.jgss/windows/native/libsspi_bridge/sspi.cpp
@@ -209,14 +209,14 @@ flag_gss_to_sspi(int fin)
}
static BOOLEAN
-is_same_oid(gss_OID o2, gss_OID o1)
+is_same_oid(gss_const_OID o2, gss_const_OID o1)
{
return o1 && o2 && o1->length == o2->length
&& !memcmp(o1->elements, o2->elements, o2->length);
}
static BOOLEAN
-has_oid(gss_OID_set set, gss_OID oid)
+has_oid(gss_const_OID_set set, gss_const_OID oid)
{
for (int i = 0; i < set->count; i++) {
if (is_same_oid(&set->elements[i], oid)) {
@@ -227,7 +227,7 @@ has_oid(gss_OID_set set, gss_OID oid)
}
static void
-get_oid_desc(gss_OID mech)
+show_oid(gss_const_OID mech)
{
if (trace) {
if (is_same_oid(mech, &KRB5_OID)) {
@@ -249,7 +249,7 @@ get_oid_desc(gss_OID mech)
}
static void
-get_oid_set_desc(gss_OID_set mechs)
+show_oid_set(gss_const_OID_set mechs)
{
if (trace) {
if (mechs == NULL) {
@@ -258,7 +258,7 @@ get_oid_set_desc(gss_OID_set mechs)
}
PP("gss_OID_set.count is %d", (int)mechs->count);
for (int i = 0; i < mechs->count; i++) {
- get_oid_desc(&mechs->elements[i]);
+ show_oid(&mechs->elements[i]);
}
}
}
@@ -332,8 +332,8 @@ gss_release_name(OM_uint32 *minor_status,
__declspec(dllexport) OM_uint32
gss_import_name(OM_uint32 *minor_status,
- const gss_buffer_t input_name_buffer,
- const gss_OID input_name_type,
+ gss_const_buffer_t input_name_buffer,
+ gss_const_OID input_name_type,
gss_name_t *output_name)
{
PP(">>>> Calling gss_import_name...");
@@ -344,6 +344,9 @@ gss_import_name(OM_uint32 *minor_status,
LPSTR input = (LPSTR)input_name_buffer->value;
if (input_name_type != NULL
&& is_same_oid(input_name_type, &EXPORT_NAME_OID)) {
+ if (len < 4 || input[0] != 4 || input[1] != 1 || input[2] != 0) {
+ return GSS_S_FAILURE;
+ }
int mechLen = (int)input[3]; /* including 06 len */
len -= mechLen + 8; /* 4 header bytes, and an int32 length after OID */
if (len <= 0) {
@@ -429,15 +432,50 @@ gss_compare_name(OM_uint32 *minor_status,
SEC_WCHAR* n1 = name1->name;
SEC_WCHAR* n2 = name2->name;
PP("Comparing %ls and %ls", n1, n2);
+
int l1 = lstrlen(n1);
int l2 = lstrlen(n2);
- if (l1 < l2 && n2[l1] != L'@'
- || l2 < l1 && n1[l2] != L'@') {
+ int r1 = l1; // position of @ or the end if none
+ int r2 = l2;
+ int i;
+
+ for (i = 0; i < l1; i++) {
+ if (n1[i] == L'\\') {
+ i++;
+ continue;
+ }
+ if (n1[i] == L'@') {
+ r1 = i;
+ break;
+ }
+ }
+
+ for (i = 0; i < l2; i++) {
+ if (n2[i] == L'\\') {
+ i++;
+ continue;
+ }
+ if (n2[i] == L'@') {
+ r2 = i;
+ break;
+ }
+ }
+
+ if (l1 < l2 && l1 != r2
+ || l2 < l1 && l2 != l1) {
return GSS_S_COMPLETE; // different
}
+
if (l1 > l2) {
l1 = l2; // choose the smaller one. longer=smaller @ ...
}
+
+ // Two names are equal if they are the same or one has no realm and
+ // one has realm but they have the same name. If both have realm but
+ // different, they are treated different even if the names are the same.
+ // Note: the default name concept is not used here.
+ // Principal names on Windows are case-insensitive, both user name
+ // and service principal name.
if (CompareStringEx(LOCALE_NAME_SYSTEM_DEFAULT, NORM_IGNORECASE,
n1, l1, n2, l1, NULL, NULL, 0) == CSTR_EQUAL) {
*name_equal = 1;
@@ -448,7 +486,7 @@ gss_compare_name(OM_uint32 *minor_status,
__declspec(dllexport) OM_uint32
gss_canonicalize_name(OM_uint32 *minor_status,
gss_const_name_t input_name,
- const gss_OID mech_type,
+ gss_const_OID mech_type,
gss_name_t *output_name)
{
PP(">>>> Calling gss_canonicalize_name...");
@@ -456,6 +494,10 @@ gss_canonicalize_name(OM_uint32 *minor_status,
CHECK_OID(mech_type)
CHECK_OUTPUT(output_name)
+ if (!is_same_oid(mech_type, &KRB5_OID)) {
+ PP("Cannot canonicalize to non-krb5 OID");
+ return GSS_S_BAD_MECH;
+ }
gss_name_t names2 = new gss_name_struct;
if (names2 == NULL) {
return GSS_S_FAILURE;
@@ -558,7 +600,7 @@ __declspec(dllexport) OM_uint32
gss_acquire_cred(OM_uint32 *minor_status,
gss_const_name_t desired_name,
OM_uint32 time_req,
- const gss_OID_set desired_mechs,
+ gss_const_OID_set desired_mechs,
gss_cred_usage_t cred_usage,
gss_cred_id_t *output_cred_handle,
gss_OID_set *actual_mechs,
@@ -572,7 +614,7 @@ gss_acquire_cred(OM_uint32 *minor_status,
ts.QuadPart = 0;
cred_usage = 0;
PP("AcquireCredentialsHandle with %d %p", cred_usage, desired_mechs);
- get_oid_set_desc(desired_mechs);
+ show_oid_set(desired_mechs);
BOOLEAN reqKerberos, reqSPNEGO;
@@ -787,7 +829,7 @@ gss_inquire_cred(OM_uint32 *minor_status,
__declspec(dllexport) OM_uint32
gss_import_sec_context(OM_uint32 *minor_status,
- const gss_buffer_t interprocess_token,
+ gss_const_buffer_t interprocess_token,
gss_ctx_id_t *context_handle)
{
// Not transferable, return FAILURE
@@ -801,11 +843,11 @@ gss_init_sec_context(OM_uint32 *minor_status,
gss_const_cred_id_t initiator_cred_handle,
gss_ctx_id_t *context_handle,
gss_const_name_t target_name,
- const gss_OID mech_type,
+ gss_const_OID mech_type,
OM_uint32 req_flags,
OM_uint32 time_req,
- const gss_channel_bindings_t input_chan_bindings,
- const gss_buffer_t input_token,
+ gss_const_channel_bindings_t input_chan_bindings,
+ gss_const_buffer_t input_token,
gss_OID *actual_mech_type,
gss_buffer_t output_token,
OM_uint32 *ret_flags,
@@ -927,7 +969,6 @@ gss_init_sec_context(OM_uint32 *minor_status,
&lifeTime);
if (!SEC_SUCCESS(ss)) {
- // TODO: seems NativeGSSContext has not failed here.
PP("InitializeSecurityContext failed");
goto err;
}
@@ -983,8 +1024,8 @@ __declspec(dllexport) OM_uint32
gss_accept_sec_context(OM_uint32 *minor_status,
gss_ctx_id_t *context_handle,
gss_const_cred_id_t acceptor_cred_handle,
- const gss_buffer_t input_token,
- const gss_channel_bindings_t input_chan_bindings,
+ gss_const_buffer_t input_token,
+ gss_const_channel_bindings_t input_chan_bindings,
gss_name_t *src_name,
gss_OID *mech_type,
gss_buffer_t output_token,
@@ -1168,13 +1209,13 @@ __declspec(dllexport) OM_uint32
gss_get_mic(OM_uint32 *minor_status,
gss_const_ctx_id_t context_handle,
gss_qop_t qop_req,
- const gss_buffer_t message_buffer,
+ gss_const_buffer_t message_buffer,
gss_buffer_t msg_token)
{
PP(">>>> Calling gss_get_mic...");
- CHECK_CONTEXT(context_handle);
- CHECK_BUFFER(message_buffer);
- CHECK_OUTPUT(msg_token);
+ CHECK_CONTEXT(context_handle)
+ CHECK_BUFFER(message_buffer)
+ CHECK_OUTPUT(msg_token)
SECURITY_STATUS ss;
SecBufferDesc buffDesc;
@@ -1208,14 +1249,14 @@ gss_get_mic(OM_uint32 *minor_status,
__declspec(dllexport) OM_uint32
gss_verify_mic(OM_uint32 *minor_status,
gss_const_ctx_id_t context_handle,
- const gss_buffer_t message_buffer,
- const gss_buffer_t token_buffer,
+ gss_const_buffer_t message_buffer,
+ gss_const_buffer_t token_buffer,
gss_qop_t *qop_state)
{
PP(">>>> Calling gss_verify_mic...");
- CHECK_CONTEXT(context_handle);
- CHECK_BUFFER(message_buffer);
- CHECK_BUFFER(token_buffer);
+ CHECK_CONTEXT(context_handle)
+ CHECK_BUFFER(message_buffer)
+ CHECK_BUFFER(token_buffer)
SECURITY_STATUS ss;
SecBufferDesc buffDesc;
@@ -1253,14 +1294,14 @@ gss_wrap(OM_uint32 *minor_status,
gss_const_ctx_id_t context_handle,
int conf_req_flag,
gss_qop_t qop_req,
- const gss_buffer_t input_message_buffer,
+ gss_const_buffer_t input_message_buffer,
int *conf_state,
gss_buffer_t output_message_buffer)
{
PP(">>>> Calling gss_wrap...");
- CHECK_CONTEXT(context_handle);
- CHECK_BUFFER(input_message_buffer);
- CHECK_OUTPUT(output_message_buffer);
+ CHECK_CONTEXT(context_handle)
+ CHECK_BUFFER(input_message_buffer)
+ CHECK_OUTPUT(output_message_buffer)
SECURITY_STATUS ss;
SecBufferDesc buffDesc;
@@ -1323,15 +1364,15 @@ gss_wrap(OM_uint32 *minor_status,
__declspec(dllexport) OM_uint32
gss_unwrap(OM_uint32 *minor_status,
gss_const_ctx_id_t context_handle,
- const gss_buffer_t input_message_buffer,
+ gss_const_buffer_t input_message_buffer,
gss_buffer_t output_message_buffer,
int *conf_state,
gss_qop_t *qop_state)
{
PP(">>>> Calling gss_unwrap...");
- CHECK_CONTEXT(context_handle);
- CHECK_BUFFER(input_message_buffer);
- CHECK_OUTPUT(output_message_buffer);
+ CHECK_CONTEXT(context_handle)
+ CHECK_BUFFER(input_message_buffer)
+ CHECK_OUTPUT(output_message_buffer)
SECURITY_STATUS ss;
SecBufferDesc buffDesc;
@@ -1417,11 +1458,11 @@ done:
__declspec(dllexport) OM_uint32
gss_inquire_names_for_mech(OM_uint32 *minor_status,
- const gss_OID mechanism,
+ gss_const_OID mechanism,
gss_OID_set *name_types)
{
PP(">>>> Calling gss_inquire_names_for_mech...");
- CHECK_OID(mechanism);
+ CHECK_OID(mechanism)
if (gss_create_empty_oid_set(minor_status, name_types)) {
return GSS_S_FAILURE;
@@ -1445,12 +1486,12 @@ err:
__declspec(dllexport) OM_uint32
gss_add_oid_set_member(OM_uint32 *minor_status,
- const gss_OID member_oid,
+ gss_const_OID member_oid,
gss_OID_set *oid_set)
{
PP(">>>> Calling gss_add_oid_set_member...");
- CHECK_OID(member_oid);
- CHECK_OUTPUT(oid_set);
+ CHECK_OID(member_oid)
+ CHECK_OUTPUT(oid_set)
int count = (int)(*oid_set)->count;
@@ -1490,7 +1531,7 @@ __declspec(dllexport) OM_uint32
gss_display_status(OM_uint32 *minor_status,
OM_uint32 status_value,
int status_type,
- const gss_OID mech_type,
+ gss_const_OID mech_type,
OM_uint32 *message_context,
gss_buffer_t status_string)
{
@@ -1526,7 +1567,7 @@ gss_create_empty_oid_set(OM_uint32 *minor_status,
gss_OID_set *oid_set)
{
PP(">>>> Calling gss_create_empty_oid_set...");
- CHECK_OUTPUT(oid_set);
+ CHECK_OUTPUT(oid_set)
if (*oid_set = new gss_OID_set_desc) {
memset(*oid_set, 0, sizeof(gss_OID_set_desc));
From e133dbf7bd065e9599317a516f37baddb0aa1215 Mon Sep 17 00:00:00 2001
From: Weijun Wang
Date: Wed, 10 Jul 2019 09:43:34 +0800
Subject: [PATCH 32/40] 8227381: GSS login fails with PREAUTH_FAILED
Reviewed-by: xuelei
---
.../share/classes/sun/security/krb5/KrbAsReqBuilder.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java b/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java
index 5c434b54efa..2ddfbe1d64b 100644
--- a/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java
+++ b/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java
@@ -367,6 +367,8 @@ public final class KrbAsReqBuilder {
paList = kerr.getPA(); // Update current paList
} else {
if (referralsState.handleError(ke)) {
+ pakey = null;
+ preAuthFailedOnce = false;
continue;
}
throw ke;
From 32d0bae08d9de0b2d9b61dd897647f46f66f2c12 Mon Sep 17 00:00:00 2001
From: Weijun Wang
Date: Wed, 10 Jul 2019 09:43:35 +0800
Subject: [PATCH 33/40] 8227059:
sun/security/tools/keytool/DefaultSignatureAlgorithm.java timed out
Reviewed-by: xuelei
---
.../keytool/DefaultSignatureAlgorithm.java | 81 --------
.../fakegen/DefaultSignatureAlgorithm.java | 100 ++++++++++
.../tools/keytool/{pss => fakegen}/PSS.java | 0
.../provider/DSAKeyPairGenerator.java | 156 +++++++++++++++
.../sun/security/rsa/RSAKeyPairGenerator.java | 180 +++++++++++++++++-
.../sun/security/ec/ECKeyPairGenerator.java | 105 ++++++++++
6 files changed, 539 insertions(+), 83 deletions(-)
delete mode 100644 test/jdk/sun/security/tools/keytool/DefaultSignatureAlgorithm.java
create mode 100644 test/jdk/sun/security/tools/keytool/fakegen/DefaultSignatureAlgorithm.java
rename test/jdk/sun/security/tools/keytool/{pss => fakegen}/PSS.java (100%)
create mode 100644 test/jdk/sun/security/tools/keytool/fakegen/java.base/sun/security/provider/DSAKeyPairGenerator.java
rename test/jdk/sun/security/tools/keytool/{pss => fakegen}/java.base/sun/security/rsa/RSAKeyPairGenerator.java (53%)
create mode 100644 test/jdk/sun/security/tools/keytool/fakegen/jdk.crypto.ec/sun/security/ec/ECKeyPairGenerator.java
diff --git a/test/jdk/sun/security/tools/keytool/DefaultSignatureAlgorithm.java b/test/jdk/sun/security/tools/keytool/DefaultSignatureAlgorithm.java
deleted file mode 100644
index 89d86e9989c..00000000000
--- a/test/jdk/sun/security/tools/keytool/DefaultSignatureAlgorithm.java
+++ /dev/null
@@ -1,81 +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.
- */
-
-/*
- * @test
- * @bug 8138766
- * @key intermittent
- * @summary New default -sigalg for keytool
- * @modules java.base/sun.security.tools.keytool
- * @modules jdk.crypto.ec
- * @run main/othervm DefaultSignatureAlgorithm RSA 1024 SHA256withRSA
- * @run main/othervm DefaultSignatureAlgorithm RSA 3072 SHA256withRSA
- * @run main/othervm DefaultSignatureAlgorithm RSA 3073 SHA384withRSA
- * @run main/othervm DefaultSignatureAlgorithm DSA 1024 SHA256withDSA
- * @run main/othervm/timeout=700 DefaultSignatureAlgorithm DSA 3072
- * SHA256withDSA
- * @run main/othervm DefaultSignatureAlgorithm EC 192 SHA256withECDSA
- * @run main/othervm DefaultSignatureAlgorithm EC 384 SHA384withECDSA
- * @run main/othervm DefaultSignatureAlgorithm EC 571 SHA512withECDSA
- * @run main/othervm DefaultSignatureAlgorithm EC 571 SHA256withECDSA
- * SHA256withECDSA
- */
-
-import sun.security.tools.keytool.Main;
-
-import java.io.File;
-import java.security.KeyStore;
-import java.security.cert.X509Certificate;
-
-public class DefaultSignatureAlgorithm {
-
- public static void main(String[] args) throws Exception {
- if(args == null || args.length < 3) {
- throw new RuntimeException("Invalid arguments provided.");
- }
- String sigAlg = (args.length == 4) ? args[3] : null;
- run(args[0], Integer.valueOf(args[1]), args[2], sigAlg);
- }
-
- private static void run(String keyAlg, int keySize,
- String expectedSigAlg, String sigAlg) throws Exception {
- String alias = keyAlg + keySize + System.currentTimeMillis();
- String cmd = "-keystore ks -storepass changeit" +
- " -keypass changeit -alias " + alias +
- " -keyalg " + keyAlg + " -keysize " + keySize +
- " -genkeypair -dname CN=" + alias + " -debug";
- if (sigAlg != null) {
- cmd += " -sigalg " + sigAlg;
- }
- Main.main(cmd.split(" "));
-
- KeyStore ks = KeyStore.getInstance(
- new File("ks"), "changeit".toCharArray());
- X509Certificate cert = (X509Certificate)ks.getCertificate(alias);
- String actualSigAlg = cert.getSigAlgName();
- if (!actualSigAlg.equals(expectedSigAlg)) {
- throw new Exception("Failure at " + alias + ": expected "
- + expectedSigAlg + ", actually " + actualSigAlg);
- }
- }
-}
diff --git a/test/jdk/sun/security/tools/keytool/fakegen/DefaultSignatureAlgorithm.java b/test/jdk/sun/security/tools/keytool/fakegen/DefaultSignatureAlgorithm.java
new file mode 100644
index 00000000000..b935eb37c3f
--- /dev/null
+++ b/test/jdk/sun/security/tools/keytool/fakegen/DefaultSignatureAlgorithm.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2019, 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 8138766 8227059
+ * @summary New default -sigalg for keytool
+ * @library /test/lib
+ * @build java.base/sun.security.rsa.RSAKeyPairGenerator
+ * java.base/sun.security.provider.DSAKeyPairGenerator
+ * jdk.crypto.ec/sun.security.ec.ECKeyPairGenerator
+ * @run main DefaultSignatureAlgorithm
+ * @modules jdk.crypto.ec
+ */
+
+import jdk.test.lib.Asserts;
+import jdk.test.lib.SecurityTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+import java.io.File;
+import java.security.KeyStore;
+import java.security.cert.X509Certificate;
+
+public class DefaultSignatureAlgorithm {
+
+ static int pos = 0;
+
+ public static void main(String[] args) throws Exception {
+ check("RSA", 1024, null, "SHA256withRSA");
+ check("RSA", 3072, null, "SHA256withRSA");
+ check("RSA", 3073, null, "SHA384withRSA");
+ check("RSA", 7680, null, "SHA384withRSA");
+ check("RSA", 7681, null, "SHA512withRSA");
+
+ check("DSA", 1024, null, "SHA256withDSA");
+ check("DSA", 3072, null, "SHA256withDSA");
+
+ check("EC", 192, null, "SHA256withECDSA");
+ check("EC", 384, null, "SHA384withECDSA");
+ check("EC", 571, null, "SHA512withECDSA");
+
+ check("EC", 571, "SHA256withECDSA", "SHA256withECDSA");
+ }
+
+ private static void check(String keyAlg, int keySize,
+ String requestedSigAlg, String expectedSigAlg)
+ throws Exception {
+ String alias = keyAlg + keySize + "-" + pos++;
+ String sigAlgParam = requestedSigAlg == null
+ ? ""
+ : (" -sigalg " + requestedSigAlg);
+ genkeypair(alias,
+ "-keyalg " + keyAlg + " -keysize " + keySize + sigAlgParam)
+ .shouldHaveExitValue(0);
+
+ KeyStore ks = KeyStore.getInstance(
+ new File("ks"), "changeit".toCharArray());
+ X509Certificate cert = (X509Certificate)ks.getCertificate(alias);
+ Asserts.assertEQ(cert.getPublicKey().getAlgorithm(), keyAlg);
+ Asserts.assertEQ(cert.getSigAlgName(), expectedSigAlg);
+ }
+
+ static OutputAnalyzer genkeypair(String alias, String options)
+ throws Exception {
+ String patchArg = "-J--patch-module=java.base="
+ + System.getProperty("test.classes")
+ + File.separator + "patches" + File.separator + "java.base"
+ + " -J--patch-module=jdk.crypto.ec="
+ + System.getProperty("test.classes")
+ + File.separator + "patches" + File.separator + "jdk.crypto.ec";;
+ return kt(patchArg + " -genkeypair -alias " + alias
+ + " -dname CN=" + alias + " " + options);
+ }
+
+ static OutputAnalyzer kt(String cmd)
+ throws Exception {
+ return SecurityTools.keytool("-storepass changeit -keypass changeit "
+ + "-keystore ks " + cmd);
+ }
+}
diff --git a/test/jdk/sun/security/tools/keytool/pss/PSS.java b/test/jdk/sun/security/tools/keytool/fakegen/PSS.java
similarity index 100%
rename from test/jdk/sun/security/tools/keytool/pss/PSS.java
rename to test/jdk/sun/security/tools/keytool/fakegen/PSS.java
diff --git a/test/jdk/sun/security/tools/keytool/fakegen/java.base/sun/security/provider/DSAKeyPairGenerator.java b/test/jdk/sun/security/tools/keytool/fakegen/java.base/sun/security/provider/DSAKeyPairGenerator.java
new file mode 100644
index 00000000000..db3935edc32
--- /dev/null
+++ b/test/jdk/sun/security/tools/keytool/fakegen/java.base/sun/security/provider/DSAKeyPairGenerator.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2019, 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.security.provider;
+
+import java.math.BigInteger;
+
+import java.security.*;
+import java.security.SecureRandom;
+import java.security.spec.AlgorithmParameterSpec;
+
+/**
+ * A fake DSA key pair generator
+ */
+class DSAKeyPairGenerator extends KeyPairGenerator {
+
+ private int plen;
+
+ DSAKeyPairGenerator(int defaultKeySize) {
+ super("DSA");
+ this.plen = defaultKeySize;
+ }
+
+ public void initialize(int modlen, SecureRandom random) {
+ this.plen = modlen;
+ }
+
+ public void initialize(AlgorithmParameterSpec params, SecureRandom random) {
+ throw new UnsupportedOperationException();
+ }
+
+ public KeyPair generateKeyPair() {
+ BigInteger p, q, g, x, y;
+ switch (plen) {
+ case 1024:
+ p = new BigInteger("178011905478542266528237562450159990145232"
+ + "156369120674273274450314442865788737020770612695252"
+ + "123463079567156784778466449970650770920727857050009"
+ + "668388144034129745221171818506047231150039301079959"
+ + "358067395348717066319802262019714966524135060945913"
+ + "707594956514672855690606794135837542707371727429551"
+ + "343320695239");
+ q = new BigInteger("864205495604807476120572616017955259175325"
+ + "408501");
+ g = new BigInteger("174068207532402095185811980123523436538604"
+ + "490794561350978495831040599953488455823147851597408"
+ + "940950725307797094915759492368300574252438761037084"
+ + "473467180148876118103083043754985190983472601550494"
+ + "691329488083395492313850000361646482644608492304078"
+ + "721818959999056496097769368017749273708962006689187"
+ + "956744210730");
+ x = new BigInteger("442684721233431748836258763370873041965448"
+ + "305045");
+ y = new BigInteger("123777377875361061959303516913138943002334"
+ + "907914087825062123737715425120688699041350157178201"
+ + "400875613890444051801751930684745642628053940339973"
+ + "838660880918443284038995141330502246221730915504106"
+ + "313025753680709037893119973285385498869618080832350"
+ + "844717549458284541384384444940685082987448444197127"
+ + "109727215326");
+ break;
+ case 3072:
+ p = new BigInteger("532424770282957507167558442446475365039221"
+ + "865310725601984444684810811113744209961033785957055"
+ + "545569814329215072178264469737927701168579964248618"
+ + "212671015750272795670312875451455848633455356647610"
+ + "802537682630581977793580392148938495801039643027210"
+ + "168055234243089546290868853109011307872303192870862"
+ + "928522910714047973751079687063489704904165319118754"
+ + "414656318529199596549052269402875554159175957058778"
+ + "440558421673575502884909440510567191072050738584727"
+ + "120524174557883883057055053123583287619621138916493"
+ + "103747092870334536468061850120264153241617645557971"
+ + "369719361654590867807897284715299844320510777830158"
+ + "726099043158186232574541934847234927190558272654504"
+ + "899757279197741136733127726856995584055651857157703"
+ + "730144527174175430693903863066052387871964460507889"
+ + "647358151911550149297202134918108185581732063173116"
+ + "923323722454275514471399056679497166381315291238166"
+ + "678637058042047687405023560967657729197010282296512"
+ + "1019243318222397");
+ q = new BigInteger("890750162030504407723769200757822201430799"
+ + "34855896740921457815099167207156753");
+ g = new BigInteger("151817606774376623890824510431247991418389"
+ + "715779225250508738780526725946562383344295250350988"
+ + "771843988677909140611473778208677098146023000408394"
+ + "159085130929460916510001933636711147155614261913281"
+ + "024881629605746742555704817858764668833915862917006"
+ + "598838541275997577579609978297421111961935816027196"
+ + "483840098753346970227821715342000582711792748060856"
+ + "726896896804543780217869880654497603605897208724113"
+ + "159746510357451233393865294043543249227656881945445"
+ + "911394836487973565655780621125471620102365417701222"
+ + "942700788591992318925980959657031578942777920589286"
+ + "616050851348109471636081284309144953091734152913609"
+ + "446411782660994503265873790796828974300693496175976"
+ + "687169380996928285288177682058646187108156643041984"
+ + "849723272840833108573298006600021948389582796433112"
+ + "947515654733901137745000270350091408182905439114222"
+ + "789179830877253611946986888461931792357280552721443"
+ + "254779196196933589018709692301251250169609249601817"
+ + "4795480503442737");
+ x = new BigInteger("837184725379267020693579006510066460977336"
+ + "11851797067505263114214549968402803");
+ y = new BigInteger("395340495486576955293430186860596538887519"
+ + "532234445217156133155957480616804094258448364164620"
+ + "019669119585215430588435624960233328621409901309332"
+ + "192899527076171337665680476899693664056285881110265"
+ + "747619109873269836751712303602309960796986216520795"
+ + "801714761851172570535758859846766099312622783018124"
+ + "479033035974495130498276693342256396509951099944860"
+ + "886247767918456849069941054372775951688384599525157"
+ + "707186634084399395289878437457318095050730531728857"
+ + "772445883395712924633196197942869159234956079072812"
+ + "033713932103618702222793066673087288841096282175640"
+ + "243353943285718935517693389945339235110435667386410"
+ + "827568246083609394541667076709869892137539964277111"
+ + "881671381034966060604088870102183420000265271778711"
+ + "380501229707440889595235145225482336904915838699846"
+ + "941323450568220944649213026904670943083185766542427"
+ + "196471392765688014947830444837953042683779059773143"
+ + "877079141940001705246446188097009313372159366032655"
+ + "5436444354063312");
+ break;
+ default:
+ throw new AssertionError("Unknown keySize " + plen);
+ }
+
+ try {
+ return new KeyPair(new DSAPublicKeyImpl(y, p, q, g),
+ new DSAPrivateKey(x, p, q, g));
+ } catch (InvalidKeyException e) {
+ throw new ProviderException(e);
+ }
+ }
+}
diff --git a/test/jdk/sun/security/tools/keytool/pss/java.base/sun/security/rsa/RSAKeyPairGenerator.java b/test/jdk/sun/security/tools/keytool/fakegen/java.base/sun/security/rsa/RSAKeyPairGenerator.java
similarity index 53%
rename from test/jdk/sun/security/tools/keytool/pss/java.base/sun/security/rsa/RSAKeyPairGenerator.java
rename to test/jdk/sun/security/tools/keytool/fakegen/java.base/sun/security/rsa/RSAKeyPairGenerator.java
index d73308f8727..9f0d826549c 100644
--- a/test/jdk/sun/security/tools/keytool/pss/java.base/sun/security/rsa/RSAKeyPairGenerator.java
+++ b/test/jdk/sun/security/tools/keytool/fakegen/java.base/sun/security/rsa/RSAKeyPairGenerator.java
@@ -29,12 +29,11 @@ import java.security.*;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.RSAKeyGenParameterSpec;
-import sun.security.jca.JCAUtil;
import sun.security.x509.AlgorithmId;
import static sun.security.rsa.RSAUtil.KeyType;
/**
- * Fake RSA keypair generation.
+ * A fake RSA keypair generation.
*/
public abstract class RSAKeyPairGenerator extends KeyPairGeneratorSpi {
@@ -121,6 +120,17 @@ public abstract class RSAKeyPairGenerator extends KeyPairGeneratorSpi {
// Pre-calculated p and q for e == RSAKeyGenParameterSpec.F4
switch (keySize) {
+ case 1024:
+ p = new BigInteger("1220491537800192366196661816910427"
+ + "2375185130493819649338056226264568132442590"
+ + "2306195110391300298681932797393339089272174"
+ + "24490645345596103420476757417659909");
+
+ q = new BigInteger("8480533592205316739308384508307319"
+ + "3310632635895778398980504245932789486455154"
+ + "4265220956952343855842030266079089174423047"
+ + "7382175514060777025691485728713063");
+ break;
case 2048:
p = new BigInteger("1600840041787354447543653385760927"
+ "2642568308955833364523274045522752644800599"
@@ -139,6 +149,56 @@ public abstract class RSAKeyPairGenerator extends KeyPairGeneratorSpi {
+ "6155574020606891195960345238780709194499010"
+ "43652862954645301");
break;
+ case 3072:
+ p = new BigInteger("2403380417344527161525447148950543"
+ + "9379802436047502603774623852967909282895900"
+ + "7474251859703715384817150107392592636129366"
+ + "5680725148417789414447073716354703692160825"
+ + "9910929198523923851672957013786423746474670"
+ + "5285365870313877239114930859096040034848729"
+ + "0251735848703378313724697081522892607625120"
+ + "0765531003751468146539682665307123591367928"
+ + "1883284784295069877414057796300484015307336"
+ + "5167008365209621810307777651197826810474895"
+ + "858836606799546054179898997210174885200767");
+ q = new BigInteger("2046511893459993309772203642844931"
+ + "1853027469856467052942666265372903000702193"
+ + "7794121141028918655144044411085405243565188"
+ + "8318027937964509940322691121105328104450287"
+ + "0400405975394764523022670537180050051646095"
+ + "3320242109876620452477757629185501504625999"
+ + "8487187901577781067325277853462587849063313"
+ + "5364789330253471096755661110557598411108366"
+ + "1566266965711522070909440716658568303529454"
+ + "8075296935907088988560548322049196321207173"
+ + "136436923455192617031129191723631954025427");
+ break;
+ case 3073:
+ p = new BigInteger("358024230418365680745725628188289"
+ + "996969857993064124357766607077169315932503"
+ + "907030633492082868150575329278637502167157"
+ + "345572819552678004302525872656665704012432"
+ + "644868036964802792468216554458209893873320"
+ + "297608885231998895441396822219845215463819"
+ + "216163684222596923153702349718019538798623"
+ + "793830598445085650304217449539016339429747"
+ + "385490484982419227549804698120223647408926"
+ + "021549912791440569127641517442362359166673"
+ + "430151753277549861070074076802118983202554"
+ + "7683523973");
+ q = new BigInteger("169752169194244078720180277210205"
+ + "255207796420396114596943944148158798629671"
+ + "789863988428383183103705641694331073747120"
+ + "522505020908219489265190380712941311249155"
+ + "156834674079165492105570443486536740756291"
+ + "314279877766807786397193023304245520017295"
+ + "969248707516367324340822062886043618371887"
+ + "320492710434958863952407959935025922006108"
+ + "282752473898685457767312430894004833959025"
+ + "415996648289919841900071076314309778495245"
+ + "505026665971431792707247787031811654193145"
+ + "1044952887");
+ break;
case 4096:
p = new BigInteger("2985635754414679487171962796211911"
+ "1563710734938215274736352092606404045130913"
@@ -171,6 +231,122 @@ public abstract class RSAKeyPairGenerator extends KeyPairGeneratorSpi {
+ "5341584429803583589276956979963609078497238"
+ "760757619468018224491053");
break;
+ case 7680:
+ p = new BigInteger("7034022146817764608206409206476311"
+ + "1371065855827199565170055133179419153145313"
+ + "9446295819321510144417300286482767498463255"
+ + "3370362723164324606829434617977090251035572"
+ + "4237546099249090966627372485629853471350368"
+ + "1497807044971675189990783927066958945388379"
+ + "4004871857862380913954692362042250112646330"
+ + "0515873693830575810241740671573357342073942"
+ + "4924331206670599086552994426505996651481869"
+ + "2750320309695596383830444337180596058381417"
+ + "7804256675894755482917598033151085120879826"
+ + "5373459707672000040090469058320463160804122"
+ + "8041026671361647347262771363754358441620179"
+ + "3861076191970047581401830740749715862725492"
+ + "5750077182986169592435996668282677192000592"
+ + "8019204141383012670399208092972174321639234"
+ + "6398779487064860458178135981700487728919191"
+ + "2418625085287791733119321378648688730352488"
+ + "6446800847442687530322927871063574241918202"
+ + "1883228799435533794167861499482410970370569"
+ + "6964781912514810444018313637829915454156777"
+ + "4591735979781496237582756842195362757823524"
+ + "2054367976655738752756266147542536910268553"
+ + "7448833810249238249431673425245843356607647"
+ + "4372260685985882252621076435844355190011754"
+ + "0656637395317040751098009821385816878380790"
+ + "9017022563392158510700243843871343995665725"
+ + "9447");
+ q = new BigInteger("7006097449483280289139842436346899"
+ + "9530483972793167261845287040200424598484519"
+ + "0516644904497480849788319004016685820778949"
+ + "8514891188272714344395538114013074460410497"
+ + "8359325044727263936454825245761418873141623"
+ + "2797767712619624879346520836103128457266811"
+ + "0175147598232556414901292143389437071453369"
+ + "4867355570712858957689566849950544938172174"
+ + "9136345403774445991224311311204082279382451"
+ + "1977673518543939329498617563049052032259503"
+ + "1057378839061411322975567618416093845144604"
+ + "4563500271329350225709899627798126176885843"
+ + "9953695524756659384424971651654225913916902"
+ + "7087953078966988666226779422822854729725410"
+ + "1118666318953891716194309185187152294057704"
+ + "2509582485250984938518224243061447485603856"
+ + "0197517312286511585545481984194518805766300"
+ + "7351141154720653351520788558277866920369211"
+ + "9269193267018615410395030712426882576851775"
+ + "9240726416572698143674385203349496226355950"
+ + "0327319442530888807531774734409411628435155"
+ + "6449625936156829175453919098709371623972260"
+ + "4090598351878256110255744263233419699486705"
+ + "3658219936031243191809689036438631617494147"
+ + "8183898954195399872571907981872765548994005"
+ + "0754996819683869837696561316479950526914796"
+ + "3613549619563212818369365543951734053135086"
+ + "8593");
+ break;
+ case 7681:
+ p = new BigInteger("1051422012172516922972337796421710"
+ + "1479918158427421377774284533124281583092508"
+ + "4961153980854679659383249048667658521370629"
+ + "6404078819943386006431233653506112030196761"
+ + "7596078830067404622117784094070983115834842"
+ + "0487926993058767148294211654032287322495894"
+ + "1733666341539644761909820700670130074920230"
+ + "0423405253327351685101039824822997870642295"
+ + "8176417666723292317903368285439828460328413"
+ + "9578515412811253729224087502906626189200448"
+ + "4062549581079444644685394008569377879899377"
+ + "0578136407363616816108795867392262638913436"
+ + "2041457188733948013731661456602199370852579"
+ + "2394583215214266552642082043674873685065171"
+ + "9053703728689139119006448644148961706358756"
+ + "0498696516029596534138345596800696824976461"
+ + "8461070371773003241093580622731426623849732"
+ + "8737707046931934781383331589291927520571138"
+ + "2759511573966362005294438252298268405782746"
+ + "9642105075721912120520774388679358659061825"
+ + "8867415333830751976884165265610029632416351"
+ + "6666642762305875140340531095190000199307531"
+ + "2186952558457690950270489966695323839026041"
+ + "0797018634946454573060304991245539422899112"
+ + "9312288231966690989900334936215870198735213"
+ + "6745631923445509394027128331099748294658904"
+ + "6303809606943116678969915369410846798143779"
+ + "89187");
+ q = new BigInteger("8160183444544784072886152354850963"
+ + "2507221530634202707531181684048014518183560"
+ + "4586261698204521358487995639975786964316103"
+ + "5861955444259138806900123878887948650444640"
+ + "7062365744302695074634248387572850855758081"
+ + "9074631976865727985289995811413472254074432"
+ + "4751574514329862821405069035713821908598155"
+ + "5436571566703295992717666421591959121774983"
+ + "5913798632992394695663301960139778059658979"
+ + "4944466598070019481108421780314115410201334"
+ + "2925668957166258484312039121420100795544341"
+ + "5372918969907063685116069321551182817324799"
+ + "3347159610063964281388144113123539915925090"
+ + "2692309096312451442405059120315891913678403"
+ + "4977738880336169371406947347468157606390086"
+ + "3381587148478097717352225924672548657441771"
+ + "3887371520215341151934095945869956390140929"
+ + "3098286281540595154062683214111934217839063"
+ + "3309526631019699109621050440794920159910038"
+ + "3248965999877529393614116991972153758910967"
+ + "1712258745878268303349611893651932564447696"
+ + "9601760120187828039923387985032881949408596"
+ + "0689784023540256749586591441103043888423326"
+ + "3078541569639917739590630101701573133092711"
+ + "6157430583592378472242178997833136144409256"
+ + "3558220277370179546822023437190315852529873"
+ + "0831890147323301322699740037060134979740963"
+ + "4289");
+ break;
case 8192:
p = new BigInteger("9821669838446774374944535804569858"
+ "0553278885576950130485823829973470553571905"
diff --git a/test/jdk/sun/security/tools/keytool/fakegen/jdk.crypto.ec/sun/security/ec/ECKeyPairGenerator.java b/test/jdk/sun/security/tools/keytool/fakegen/jdk.crypto.ec/sun/security/ec/ECKeyPairGenerator.java
new file mode 100644
index 00000000000..68da125087f
--- /dev/null
+++ b/test/jdk/sun/security/tools/keytool/fakegen/jdk.crypto.ec/sun/security/ec/ECKeyPairGenerator.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2019, 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.security.ec;
+
+import java.math.BigInteger;
+import java.security.*;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECParameterSpec;
+import java.security.spec.ECPoint;
+
+import sun.security.util.ECUtil;
+import static sun.security.util.SecurityProviderConstants.DEF_EC_KEY_SIZE;
+
+/**
+ * A fake EC keypair generator.
+ */
+public final class ECKeyPairGenerator extends KeyPairGeneratorSpi {
+
+ private int keySize;
+
+ public ECKeyPairGenerator() {
+ initialize(DEF_EC_KEY_SIZE, null);
+ }
+
+ @Override
+ public void initialize(int keySize, SecureRandom random) {
+ this.keySize = keySize;
+ }
+
+ @Override
+ public void initialize(AlgorithmParameterSpec params, SecureRandom random)
+ throws InvalidAlgorithmParameterException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public KeyPair generateKeyPair() {
+ BigInteger s, x, y;
+ switch (keySize) {
+ case 192:
+ s = new BigInteger("144089953963995451666433763881605261867377"
+ + "0287449914970417");
+ x = new BigInteger("527580219290493448707803038403444129676461"
+ + "560927008883862");
+ y = new BigInteger("171489247081620145247240656640887886126295"
+ + "376102134763235");
+ break;
+ case 384:
+ s = new BigInteger("230878276322370828604837367594276033697165"
+ + "328633328282930557390817326627704675451851870430805"
+ + "90262886393892128915463");
+ x = new BigInteger("207573127814711182089888821916296502977037"
+ + "557291394001491584185306092085745595207966563387890"
+ + "64848861531410731137896");
+ y = new BigInteger("272903686539605964684771543637437742229808"
+ + "792287657810480793861620950159864617021540168828129"
+ + "97920015041145259782242");
+ break;
+ case 571:
+ s = new BigInteger("102950007413729156017516513076331886543538"
+ + "947044937190140406420556321983301533699021909556189"
+ + "150601557539520495361099574425100081169640300555562"
+ + "4280643194744140660275077121");
+ x = new BigInteger("640598847385582251482893323029655037929442"
+ + "593800810090252942944624854811134311418807076811195"
+ + "132373308708007447666896675761104237802118413642543"
+ + "8277858107132017492037336593");
+ y = new BigInteger("254271270803422773271985083014247202480077"
+ + "131823713050110789460550383275777195766342550786766"
+ + "080401402424961690914429074822281551140068729472439"
+ + "477216613432839953714415981");
+ break;
+ default:
+ throw new AssertionError("Unsupported keysize " + keySize);
+ }
+ ECParameterSpec ecParams = ECUtil.getECParameterSpec(null, keySize);
+ try {
+ return new KeyPair(new ECPublicKeyImpl(new ECPoint(x, y), ecParams),
+ new ECPrivateKeyImpl(s, ecParams));
+ } catch (Exception ex) {
+ throw new ProviderException(ex);
+ }
+ }
+}
From 32a7e50bee7d08aa2d8cf6510ce75d06aa8b7345 Mon Sep 17 00:00:00 2001
From: Jan Lahoda
Date: Wed, 10 Jul 2019 09:04:42 +0200
Subject: [PATCH 34/40] 8220041: NullPointerException at
jdk.compiler/com.sun.tools.javac.jvm.Code.emitop0
LambdaToMethod must correctly capture local variables inside switch expressions inside local variable initializers.
Reviewed-by: mcimadamore, vromero
---
.../sun/tools/javac/comp/LambdaToMethod.java | 5 +-
.../tools/javac/switchexpr/LambdaCapture.java | 108 ++++++++++++++++++
2 files changed, 111 insertions(+), 2 deletions(-)
create mode 100644 test/langtools/tools/javac/switchexpr/LambdaCapture.java
diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
index 055920183a7..0955b5de5f9 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
@@ -1709,8 +1709,9 @@ public class LambdaToMethod extends TreeTranslator {
}
break;
case VARDEF:
- if (((JCVariableDecl)block.tree).sym == sym &&
- sym.owner.kind == MTH) { //only locals are captured
+ if ((((JCVariableDecl)block.tree).sym == sym &&
+ sym.owner.kind == MTH) || //only locals are captured
+ (block.locals != null && block.locals.contains(sym))) {
return currentDepth > depth ? null : block.tree;
}
break;
diff --git a/test/langtools/tools/javac/switchexpr/LambdaCapture.java b/test/langtools/tools/javac/switchexpr/LambdaCapture.java
new file mode 100644
index 00000000000..155715b388a
--- /dev/null
+++ b/test/langtools/tools/javac/switchexpr/LambdaCapture.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2019, 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 8220041
+ * @summary Verify variable capture works inside switch expressions which are
+ * inside variable declarations
+ * @compile --enable-preview -source ${jdk.version} LambdaCapture.java
+ */
+
+import java.util.Objects;
+
+public class LambdaCapture {
+ public static void main(String... args) {
+ new LambdaCapture().run();
+ }
+
+ void run() {
+ assertEquals("00", lambdaCapture1(0).t());
+ assertEquals("12", lambdaCapture1(1).t());
+ assertEquals("D", lambdaCapture1(2).t());
+ assertEquals("D", lambdaCapture1(3).t());
+ assertEquals("00", lambdaCapture2(0).t());
+ assertEquals("12", lambdaCapture2(1).t());
+ assertEquals("D", lambdaCapture2(2).t());
+ assertEquals("D", lambdaCapture2(3).t());
+ }
+
+ I lambdaCapture1(int i) {
+ int j = i + 1;
+ I r = switch (i) {
+ case 0 -> () -> "0" + i; //capture parameter
+ case 1 -> () -> "1" + j; //capture local variable
+ default -> {
+ String k = "D";
+ yield () -> k; //capture local from the switch expr.
+ }
+ };
+
+ return r;
+ }
+
+ I lambdaCapture2(int i) {
+ int j = i + 1;
+
+ return switch (i) {
+ case 0 -> () -> "0" + i; //capture parameter
+ case 1 -> () -> "1" + j; //capture local variable
+ default -> {
+ String k = "D";
+ yield () -> k; //capture local from the switch expr.
+ }
+ };
+ }
+
+ {
+ int j1 = 1;
+ I r1 = switch (j1) {
+ case 1 -> () -> "1" + j1; //capture local variable
+ default -> {
+ String k = "D";
+ yield () -> k; //capture local from the switch expr.
+ }
+ };
+ assertEquals("11", r1.t());
+
+ int j2 = 2;
+ I r2 = switch (j2) {
+ case 1 -> () -> "1" + j2; //capture local variable
+ default -> {
+ String k = "D";
+ yield () -> k; //capture local from the switch expr.
+ }
+ };
+ assertEquals("D", r2.t());
+ }
+
+ private void assertEquals(Object expected, Object actual) {
+ if (!Objects.equals(expected, actual)) {
+ throw new AssertionError("Unexpected value: " + actual);
+ }
+ }
+
+ interface I {
+ public T t();
+ }
+}
From 8c3e30202b6b744ef70c712f9c71a05c0381699f Mon Sep 17 00:00:00 2001
From: Leo Jiang
Date: Wed, 10 Jul 2019 01:19:18 -0700
Subject: [PATCH 35/40] 8227009: JDK 13 L10n resource files update - msgdrop 10
Reviewed-by: naoto
---
.../launcher/resources/launcher_ja.properties | 9 +-
.../resources/launcher_zh_CN.properties | 8 +-
.../security/tools/keytool/Resources_ja.java | 15 +--
.../tools/keytool/Resources_zh_CN.java | 15 +--
.../impl/msg/XMLSchemaMessages_ja.properties | 13 +--
.../msg/XMLSchemaMessages_zh_CN.properties | 13 +--
.../doclint/resources/doclint_ja.properties | 7 +-
.../resources/doclint_zh_CN.properties | 7 +-
.../javac/resources/compiler_ja.properties | 108 +++++++++++-------
.../javac/resources/compiler_zh_CN.properties | 108 +++++++++++-------
.../tools/javac/resources/javac_ja.properties | 14 ++-
.../javac/resources/javac_zh_CN.properties | 14 ++-
.../html/resources/standard_ja.properties | 15 +--
.../html/resources/standard_zh_CN.properties | 15 +--
.../toolkit/resources/doclets_ja.properties | 17 +--
.../resources/doclets_zh_CN.properties | 17 +--
.../tool/resources/javadoc_ja.properties | 3 +-
.../tool/resources/javadoc_zh_CN.properties | 3 +-
.../tools/javap/resources/javap_ja.properties | 4 +-
.../javap/resources/javap_zh_CN.properties | 4 +-
.../example/debug/tty/TTYResources_ja.java | 23 +++-
.../example/debug/tty/TTYResources_zh_CN.java | 23 +++-
.../sun/rmi/rmic/resources/rmic_ja.properties | 4 +-
.../rmi/rmic/resources/rmic_zh_CN.properties | 4 +-
.../tools/javac/resources/javac_ja.properties | 3 +-
.../javac/resources/javac_zh_CN.properties | 3 +-
26 files changed, 261 insertions(+), 208 deletions(-)
diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties
index 92f4e5e060c..1755872385d 100644
--- a/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties
+++ b/src/java.base/share/classes/sun/launcher/resources/launcher_ja.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2019, 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
@@ -35,8 +35,9 @@ java.launcher.opt.footer = \ -cp <\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304A\
\u6307\u5B9A\u3055\u308C\u305F\u6700\u3082\u9069\u5207\u306A\u30B9\u30B1\u30FC\u30EA\u30F3\u30B0\u6E08\u30A4\u30E1\u30FC\u30B8\u304C\u9078\u629E\u3055\u308C\u307E\u3059\n (\u81EA\u52D5\u7684)\u3002\n \u8A73\u7D30\u306F\u3001SplashScreen API\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\n @argument\u30D5\u30A1\u30A4\u30EB\n \u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u542B\u30801\u3064\u4EE5\u4E0A\u306E\u5F15\u6570\u30D5\u30A1\u30A4\u30EB\n -disable-@files\n \u3055\u3089\u306A\u308B\u5F15\u6570\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\n --enable-preview\n \u30AF\u30E9\u30B9\u3092\u3053\u306E\u30EA\u30EA\u30FC\u30B9\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u6A5F\u80FD\u306B\u4F9D\u5B58\u3055\u305B\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\n\u9577\u3044\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5F15\u6570\u3092\u6307\u5B9A\u3059\u308B\u5834\u5408\u3001--=\u307E\u305F\u306F\n-- \u3092\u4F7F\u7528\u3067\u304D\u307E\u3059\u3002\n
# Translators please note do not translate the options themselves
-java.launcher.X.usage=\n -Xbatch \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3092\u7121\u52B9\u306B\u3059\u308B\n -Xbootclasspath/a:<{0}\u3067\u533A\u5207\u3089\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304A\u3088\u3073zip/jar\u30D5\u30A1\u30A4\u30EB>\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u6700\u5F8C\u306B\u8FFD\u52A0\u3059\u308B\n -Xcheck:jni JNI\u95A2\u6570\u306B\u5BFE\u3059\u308B\u8FFD\u52A0\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u5B9F\u884C\u3059\u308B\n -Xcomp \u521D\u56DE\u547C\u51FA\u3057\u6642\u306B\u30E1\u30BD\u30C3\u30C9\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3092\u5F37\u5236\u3059\u308B\n -Xdebug \u4E0B\u4F4D\u4E92\u63DB\u6027\u306E\u305F\u3081\u306B\u63D0\u4F9B\n -Xdiag \u8FFD\u52A0\u306E\u8A3A\u65AD\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3059\u308B\n -Xfuture \u5C06\u6765\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u898B\u8D8A\u3057\u3066\u3001\u6700\u3082\u53B3\u5BC6\u306A\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u306B\u3059\u308B\n -Xint \u30A4\u30F3\u30BF\u30D7\u30EA\u30BF\u30FB\u30E2\u30FC\u30C9\u306E\u5B9F\u884C\u306E\u307F\n -Xinternalversion\n -version\u30AA\u30D7\u30B7\u30E7\u30F3\u3088\u308A\u8A73\u7D30\u306AJVM\u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831\u3092\n \u8868\u793A\u3059\u308B\n -Xloggc: \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u4ED8\u3044\u305F\u30D5\u30A1\u30A4\u30EB\u306BGC\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30ED\u30B0\u3092\u8A18\u9332\u3059\u308B\n -Xmixed \u6DF7\u5408\u30E2\u30FC\u30C9\u306E\u5B9F\u884C(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xmn \u82E5\u3044\u4E16\u4EE3(\u30CA\u30FC\u30B5\u30EA)\u306E\u30D2\u30FC\u30D7\u306E\u521D\u671F\u304A\u3088\u3073\u6700\u5927\u30B5\u30A4\u30BA(\u30D0\u30A4\u30C8\u5358\u4F4D)\n \u3092\u8A2D\u5B9A\u3059\u308B\n -Xms Java\u306E\u521D\u671F\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xmx Java\u306E\u6700\u5927\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xnoclassgc \u30AF\u30E9\u30B9\u306E\u30AC\u30D9\u30FC\u30B8\u30FB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3059\u308B\n -Xrs Java/VM\u306B\u3088\u308BOS\u30B7\u30B0\u30CA\u30EB\u306E\u4F7F\u7528\u3092\u524A\u6E1B\u3059\u308B(\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167)\n -Xshare:auto \u53EF\u80FD\u3067\u3042\u308C\u3070\u5171\u6709\u30AF\u30E9\u30B9\u306E\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xshare:off \u5171\u6709\u30AF\u30E9\u30B9\u306E\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u306A\u3044\n -Xshare:on \u5171\u6709\u30AF\u30E9\u30B9\u30FB\u30C7\u30FC\u30BF\u306E\u4F7F\u7528\u3092\u5FC5\u9808\u306B\u3057\u3001\u3067\u304D\u306A\u3051\u308C\u3070\u5931\u6557\u3059\u308B\u3002\n -XshowSettings \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:all\n \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:locale\n \u3059\u3079\u3066\u306E\u30ED\u30B1\u30FC\u30EB\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:properties\n \u3059\u3079\u3066\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:vm\n \u3059\u3079\u3066\u306EVM\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:system\n (Linux\u306E\u307F) \
-\u30DB\u30B9\u30C8\u30FB\u30B7\u30B9\u30C6\u30E0\u307E\u305F\u306F\u30B3\u30F3\u30C6\u30CA\u306E\n \u69CB\u6210\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -Xss Java\u306E\u30B9\u30EC\u30C3\u30C9\u30FB\u30B9\u30BF\u30C3\u30AF\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xverify \u30D0\u30A4\u30C8\u30B3\u30FC\u30C9\u691C\u8A3C\u6A5F\u80FD\u306E\u30E2\u30FC\u30C9\u3092\u8A2D\u5B9A\u3059\u308B\n --add-reads =(,)*\n \u30E2\u30B8\u30E5\u30FC\u30EB\u5BA3\u8A00\u306B\u95A2\u4FC2\u306A\u304F\u3001\u3092\u66F4\u65B0\u3057\u3066\n \u3092\u8AAD\u307F\u53D6\u308B\u3002 \n \u3092ALL-UNNAMED\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u3059\u3079\u3066\u306E\u540D\u524D\u306E\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\n \u8AAD\u307F\u53D6\u308C\u307E\u3059\u3002\n --add-exports /=(,)*\n \u30E2\u30B8\u30E5\u30FC\u30EB\u5BA3\u8A00\u306B\u95A2\u4FC2\u306A\u304F\u3001\u3092\u66F4\u65B0\u3057\u3066\u3092\u306B\n \u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3059\u308B\u3002\n \u3092ALL-UNNAMED\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u3059\u3079\u3066\u306E\u540D\u524D\u306E\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u306B\n \u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u307E\u3059\u3002\n --add-opens /=(,)*\n \u30E2\u30B8\u30E5\u30FC\u30EB\u5BA3\u8A00\u306B\u95A2\u4FC2\u306A\u304F\u3001\u3092\u66F4\u65B0\u3057\u3066\n \u3092\u306B\u958B\u304F\u3002\n --illegal-access=\n \u540D\u524D\u306E\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u5185\u306E\u30B3\u30FC\u30C9\u306B\u3088\u308B\u3001\u540D\u524D\u306E\u3042\u308B\u30E2\u30B8\u30E5\u30FC\u30EB\u5185\u306E\n \u30BF\u30A4\u30D7\u306E\u30E1\u30F3\u30D0\u30FC\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8A31\u53EF\u307E\u305F\u306F\u62D2\u5426\u3059\u308B\u3002\n \u306F"deny"\u3001"permit"\u3001"warn"\u3001"debug"\u306E\u3044\u305A\u308C\u304B\u3067\u3059\n \u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u5C06\u6765\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u524A\u9664\u3055\u308C\u307E\u3059\u3002\n --limit-modules [,...]\n \u53C2\u7167\u53EF\u80FD\u306A\u30E2\u30B8\u30E5\u30FC\u30EB\u306E\u9818\u57DF\u3092\u5236\u9650\u3059\u308B\n --patch-module =({0})*\n JAR\u30D5\u30A1\u30A4\u30EB\u307E\u305F\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30EA\u30BD\u30FC\u30B9\u3067\n \u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u307E\u305F\u306F\u62E1\u5F35\u3059\u308B\u3002\n --disable-@files \u3055\u3089\u306A\u308B\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u3092\u7121\u52B9\u306B\u3059\u308B\n --source \n \u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u30FB\u30E2\u30FC\u30C9\u3067\u30BD\u30FC\u30B9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u8A2D\u5B9A\u3059\u308B\u3002\n\n\u3053\u308C\u3089\u306F\u8FFD\u52A0\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3042\u308A\u4E88\u544A\u306A\u3057\u306B\u5909\u66F4\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002\n
+java.launcher.X.usage=\n -Xbatch \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u30FB\u30B3\u30F3\u30D1\u30A4\u30EB\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\n -Xbootclasspath/a:\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u6700\u5F8C\u306B\u8FFD\u52A0\u3057\u307E\u3059\n -Xcheck:jni JNI\u95A2\u6570\u306B\u5BFE\u3059\u308B\u8FFD\u52A0\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u5B9F\u884C\u3057\u307E\u3059\n -Xcomp \u521D\u56DE\u547C\u51FA\u3057\u6642\u306B\u30E1\u30BD\u30C3\u30C9\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3092\u5F37\u5236\u3057\u307E\u3059\n -Xdebug \u4E0B\u4F4D\u4E92\u63DB\u6027\u306E\u305F\u3081\u306B\u7528\u610F\u3055\u308C\u3066\u3044\u307E\u3059\n -Xdiag \u8FFD\u52A0\u306E\u8A3A\u65AD\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u307E\u3059\n -Xfuture \u5C06\u6765\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u898B\u8D8A\u3057\u3066\u3001\u6700\u3082\u53B3\u5BC6\u306A\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\n \u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u975E\u63A8\u5968\u3067\u3042\u308A\u3001\u5C06\u6765\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u524A\u9664\u3055\u308C\u308B\n \u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\n -Xint \u30A4\u30F3\u30BF\u30D7\u30EA\u30BF\u30FB\u30E2\u30FC\u30C9\u306E\u5B9F\u884C\u306E\u307F\n -Xinternalversion\n -version\u30AA\u30D7\u30B7\u30E7\u30F3\u3088\u308A\u8A73\u7D30\u306AJVM\u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831\u3092\n \u8868\u793A\u3057\u307E\u3059\n -Xlog: Java Virtual Machine (JVM)\u7D71\u5408\u30ED\u30AE\u30F3\u30B0\u30FB\u30D5\u30EC\u30FC\u30E0\u30EF\u30FC\u30AF\u3067\u306E\n \u30ED\u30AE\u30F3\u30B0\u3092\u69CB\u6210\u307E\u305F\u306F\u6709\u52B9\u5316\u3057\u307E\u3059\u3002\u8A73\u7D30\u306F\u3001-Xlog:help\u3092\n \u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n -Xloggc: \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u4ED8\u3044\u305F\u30D5\u30A1\u30A4\u30EB\u306BGC\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30ED\u30B0\u3092\u8A18\u9332\u3057\u307E\u3059\n -Xmixed \u6DF7\u5408\u30E2\u30FC\u30C9\u306E\u5B9F\u884C(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xmn \u82E5\u3044\u4E16\u4EE3(\u30CA\u30FC\u30B5\u30EA)\u306E\u30D2\u30FC\u30D7\u306E\u521D\u671F\u30B5\u30A4\u30BA\u304A\u3088\u3073\u6700\u5927\u30B5\u30A4\u30BA\n (\u30D0\u30A4\u30C8\u5358\u4F4D)\u3092\u8A2D\u5B9A\u3057\u307E\u3059\n -Xms Java\u306E\u521D\u671F\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3057\u307E\u3059\n -Xmx Java\u306E\u6700\u5927\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3057\u307E\u3059\n -Xnoclassgc \u30AF\u30E9\u30B9\u306E\u30AC\u30D9\u30FC\u30B8\u30FB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\n -Xrs Java/VM\u306B\u3088\u308BOS\u30B7\u30B0\u30CA\u30EB\u306E\u4F7F\u7528\u3092\u524A\u6E1B\u3057\u307E\u3059(\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167)\n -Xshare:auto \u53EF\u80FD\u3067\u3042\u308C\u3070\u5171\u6709\u30AF\u30E9\u30B9\u30FB\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3057\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xshare:off \u5171\u6709\u30AF\u30E9\u30B9\u30FB\u30C7\u30FC\u30BF\u306E\u4F7F\u7528\u3092\u8A66\u307F\u307E\u305B\u3093\n -Xshare:on \u5171\u6709\u30AF\u30E9\u30B9\u30FB\u30C7\u30FC\u30BF\u306E\u4F7F\u7528\u3092\u5FC5\u9808\u306B\u3057\u3001\u3067\u304D\u306A\u3051\u308C\u3070\u5931\u6557\u3057\u307E\u3059\u3002\n -XshowSettings \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3057\u307E\u3059\n -XshowSettings:all\n \
+ \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3057\u307E\u3059\n -XshowSettings:locale\n \u3059\u3079\u3066\u306E\u30ED\u30B1\u30FC\u30EB\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3057\u307E\u3059\n -XshowSettings:properties\n \u3059\u3079\u3066\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3057\u307E\u3059\n -XshowSettings:vm\n \u3059\u3079\u3066\u306EVM\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3057\u307E\u3059\n -XshowSettings:system\n (Linux\u306E\u307F)\u30DB\u30B9\u30C8\u30FB\u30B7\u30B9\u30C6\u30E0\u307E\u305F\u306F\u30B3\u30F3\u30C6\u30CA\u3092\u8868\u793A\u3057\u307E\u3059\n \u69CB\u6210\u3057\u3066\u7D9A\u884C\u3057\u307E\u3059\n -Xss java\u30B9\u30EC\u30C3\u30C9\u306E\u30B9\u30BF\u30C3\u30AF\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3057\u307E\u3059\n -Xverify \u30D0\u30A4\u30C8\u30B3\u30FC\u30C9\u30FB\u30D9\u30EA\u30D5\u30A1\u30A4\u30A2\u306E\u30E2\u30FC\u30C9\u3092\u8A2D\u5B9A\u3057\u307E\u3059\n \u30AA\u30D7\u30B7\u30E7\u30F3-Xverify:none\u306F\u975E\u63A8\u5968\u306B\u306A\u308A\u3001\n \u5C06\u6765\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u524A\u9664\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\n --add-reads =(,)*\n \u30E2\u30B8\u30E5\u30FC\u30EB\u5BA3\u8A00\u306B\u95A2\u4FC2\u306A\u304F\u3001\u3092\u66F4\u65B0\u3057\u3066\u3092\n \u8AAD\u307F\u53D6\u308A\u307E\u3059\u3002 \n \u3092ALL-UNNAMED\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u3059\u3079\u3066\u306E\u540D\u524D\u306E\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\n \u8AAD\u307F\u53D6\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\n --add-exports /=(,)*\n \u30E2\u30B8\u30E5\u30FC\u30EB\u5BA3\u8A00\u306B\u95A2\u4FC2\u306A\u304F\u3001\u3092\u66F4\u65B0\u3057\u3066\u3092\u306B\n \u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3059\u3002\n \u3092ALL-UNNAMED\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u3059\u3079\u3066\u306E\u540D\u524D\u306E\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u306B\n \u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u307E\u3059\u3002\n --add-opens /=(,)*\n \u30E2\u30B8\u30E5\u30FC\u30EB\u5BA3\u8A00\u306B\u95A2\u4FC2\u306A\u304F\u3001\u3092\u66F4\u65B0\u3057\u3066\u3092\n \u306B\u958B\u304D\u307E\u3059\u3002\n --illegal-access=\n \u540D\u524D\u306E\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u5185\u306E\u30B3\u30FC\u30C9\u306B\u3088\u308B\u3001\u540D\u524D\u306E\u3042\u308B\u30E2\u30B8\u30E5\u30FC\u30EB\u5185\u306E\u30BF\u30A4\u30D7\u306E\u30E1\u30F3\u30D0\u30FC\u3078\u306E\u4E0D\u6B63\u30A2\u30AF\u30BB\u30B9\u3092\n \u8A31\u53EF\u307E\u305F\u306F\u62D2\u5426\u3057\u307E\u3059\u3002\n \u306F"deny"\u3001"permit"\u3001"warn"\u307E\u305F\u306F"debug"\u306E\u3044\u305A\u308C\u304B\u3067\u3059\n \u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u3001\u5C06\u6765\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u524A\u9664\u3055\u308C\u308B\u4E88\u5B9A\u3067\u3059\u3002\n --limit-modules [,...]\n \u53C2\u7167\u53EF\u80FD\u306A\u30E2\u30B8\u30E5\u30FC\u30EB\u306E\u9818\u57DF\u3092\u5236\u9650\u3057\u307E\u3059\n --patch-module =({0})*\n \
+JAR\u30D5\u30A1\u30A4\u30EB\u307E\u305F\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30EA\u30BD\u30FC\u30B9\u3067\n \u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u307E\u305F\u306F\u62E1\u5F35\u3057\u307E\u3059\u3002\n --disable-@files\u306F\u3001\u3055\u3089\u306A\u308B\u5F15\u6570\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\n --source \n \u30BD\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u30FB\u30E2\u30FC\u30C9\u3067\u30BD\u30FC\u30B9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\n\n\u3053\u306E\u8FFD\u52A0\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u4E88\u544A\u306A\u3057\u306B\u5909\u66F4\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002\n
# Translators please note do not translate the options themselves
java.launcher.X.macosx.usage=\n\u6B21\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306FMac OS X\u56FA\u6709\u3067\u3059:\n -XstartOnFirstThread\n main()\u30E1\u30BD\u30C3\u30C9\u3092\u6700\u521D(AppKit)\u306E\u30B9\u30EC\u30C3\u30C9\u3067\u5B9F\u884C\u3059\u308B\n -Xdock:name=\n Dock\u306B\u8868\u793A\u3055\u308C\u308B\u30C7\u30D5\u30A9\u30EB\u30C8\u30FB\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u540D\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -Xdock:icon=\n Dock\u306B\u8868\u793A\u3055\u308C\u308B\u30C7\u30D5\u30A9\u30EB\u30C8\u30FB\u30A2\u30A4\u30B3\u30F3\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n\n
@@ -58,4 +59,4 @@ java.launcher.module.error1=\u30E2\u30B8\u30E5\u30FC\u30EB{0}\u306BModuleMainCla
java.launcher.module.error2=\u30A8\u30E9\u30FC: \u30E2\u30B8\u30E5\u30FC\u30EB{1}\u306B\u30E1\u30A4\u30F3\u30FB\u30AF\u30E9\u30B9{0}\u304C\u898B\u3064\u304B\u3089\u306A\u304B\u3063\u305F\u304B\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F
java.launcher.module.error3=\u30A8\u30E9\u30FC: \u30E2\u30B8\u30E5\u30FC\u30EB{1}\u306E\u30E1\u30A4\u30F3\u30FB\u30AF\u30E9\u30B9{0}\u3092\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093\n\t{2}
java.launcher.module.error4={0}\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
-java.launcher.module.error5=\u30A8\u30E9\u30FC: \u30E2\u30B8\u30E5\u30FC\u30EB{1}\u306E\u30E1\u30A4\u30F3\u30FB\u30AF\u30E9\u30B9{0}\u3092\u521D\u671F\u5316\u3067\u304D\u307E\u305B\u3093\n\u539F\u56E0: {1}: {2}
+java.launcher.module.error5=\u30A8\u30E9\u30FC: \u30E2\u30B8\u30E5\u30FC\u30EB{1}\u306E\u30E1\u30A4\u30F3\u30FB\u30AF\u30E9\u30B9{0}\u3092\u521D\u671F\u5316\u3067\u304D\u307E\u305B\u3093\n\u539F\u56E0: {2}: {3}
diff --git a/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties b/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties
index 1b8ec93683d..04dafbbb109 100644
--- a/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties
+++ b/src/java.base/share/classes/sun/launcher/resources/launcher_zh_CN.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2019, 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
@@ -34,8 +34,8 @@ java.launcher.opt.footer = \ -cp <\u76EE\u5F55\u548C zip/jar \u6587\u4EF6\u76
| -enablesystemassertions\n \u542F\u7528\u7CFB\u7EDF\u65AD\u8A00\n -dsa | -disablesystemassertions\n \u7981\u7528\u7CFB\u7EDF\u65AD\u8A00\n -agentlib:<\u5E93\u540D>[=<\u9009\u9879>]\n \u52A0\u8F7D\u672C\u673A\u4EE3\u7406\u5E93 <\u5E93\u540D>, \u4F8B\u5982 -agentlib:jdwp\n \u53E6\u8BF7\u53C2\u9605 -agentlib:jdwp=help\n -agentpath:<\u8DEF\u5F84\u540D>[=<\u9009\u9879>]\n \u6309\u5B8C\u6574\u8DEF\u5F84\u540D\u52A0\u8F7D\u672C\u673A\u4EE3\u7406\u5E93\n -javaagent:[=<\u9009\u9879>]\n \u52A0\u8F7D Java \u7F16\u7A0B\u8BED\u8A00\u4EE3\u7406, \u8BF7\u53C2\u9605 java.lang.instrument\n -splash:<\u56FE\u50CF\u8DEF\u5F84>\n \u4F7F\u7528\u6307\u5B9A\u7684\u56FE\u50CF\u663E\u793A\u542F\u52A8\u5C4F\u5E55\n \u81EA\u52A8\u652F\u6301\u548C\u4F7F\u7528 HiDPI \u7F29\u653E\u56FE\u50CF\n (\u5982\u679C\u53EF\u7528)\u3002\u5E94\u59CB\u7EC8\u5C06\u672A\u7F29\u653E\u7684\u56FE\u50CF\u6587\u4EF6\u540D (\u4F8B\u5982, image.ext)\n \u4F5C\u4E3A\u53C2\u6570\u4F20\u9012\u7ED9 -splash \u9009\u9879\u3002\n \u5C06\u81EA\u52A8\u9009\u53D6\u63D0\u4F9B\u7684\u6700\u5408\u9002\u7684\u7F29\u653E\n \u56FE\u50CF\u3002\n \u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u53C2\u9605 SplashScreen API \u6587\u6863\n @argument \u6587\u4EF6\n \u4E00\u4E2A\u6216\u591A\u4E2A\u5305\u542B\u9009\u9879\u7684\u53C2\u6570\u6587\u4EF6\n -disable-@files\n \u963B\u6B62\u8FDB\u4E00\u6B65\u6269\u5C55\u53C2\u6570\u6587\u4EF6\n --enable-preview\n \u5141\u8BB8\u7C7B\u4F9D\u8D56\u4E8E\u6B64\u53D1\u884C\u7248\u7684\u9884\u89C8\u529F\u80FD\n\u8981\u4E3A\u957F\u9009\u9879\u6307\u5B9A\u53C2\u6570, \u53EF\u4EE5\u4F7F\u7528 --<\u540D\u79F0>=<\u503C> \u6216\n--<\u540D\u79F0> <\u503C>\u3002\n
# Translators please note do not translate the options themselves
-java.launcher.X.usage=\n -Xbatch \u7981\u7528\u540E\u53F0\u7F16\u8BD1\n -Xbootclasspath/a:<\u4EE5 {0} \u5206\u9694\u7684\u76EE\u5F55\u548C zip/jar \u6587\u4EF6>\n \u9644\u52A0\u5728\u5F15\u5BFC\u7C7B\u8DEF\u5F84\u672B\u5C3E\n -Xcheck:jni \u5BF9 JNI \u51FD\u6570\u6267\u884C\u5176\u4ED6\u68C0\u67E5\n -Xcomp \u5728\u9996\u6B21\u8C03\u7528\u65F6\u5F3A\u5236\u7F16\u8BD1\u65B9\u6CD5\n -Xdebug \u4E3A\u5B9E\u73B0\u5411\u540E\u517C\u5BB9\u800C\u63D0\u4F9B\n -Xdiag \u663E\u793A\u9644\u52A0\u8BCA\u65AD\u6D88\u606F\n -Xfuture \u542F\u7528\u6700\u4E25\u683C\u7684\u68C0\u67E5\uFF0C\u9884\u671F\u5C06\u6765\u7684\u9ED8\u8BA4\u503C\n -Xint \u4EC5\u89E3\u91CA\u6A21\u5F0F\u6267\u884C\n -Xinternalversion\n \u663E\u793A\u6BD4 -version \u9009\u9879\u66F4\u8BE6\u7EC6\u7684 JVM\n \u7248\u672C\u4FE1\u606F\n -Xloggc:<\u6587\u4EF6> \u5C06 GC \u72B6\u6001\u8BB0\u5F55\u5728\u6587\u4EF6\u4E2D\uFF08\u5E26\u65F6\u95F4\u6233\uFF09\n -Xmixed \u6DF7\u5408\u6A21\u5F0F\u6267\u884C\uFF08\u9ED8\u8BA4\u503C\uFF09\n -Xmn<\u5927\u5C0F> \u4E3A\u5E74\u8F7B\u4EE3\uFF08\u65B0\u751F\u4EE3\uFF09\u8BBE\u7F6E\u521D\u59CB\u548C\u6700\u5927\u5806\u5927\u5C0F\n \uFF08\u4EE5\u5B57\u8282\u4E3A\u5355\u4F4D\uFF09\n -Xms<\u5927\u5C0F> \u8BBE\u7F6E\u521D\u59CB Java \u5806\u5927\u5C0F\n -Xmx<\u5927\u5C0F> \u8BBE\u7F6E\u6700\u5927 Java \u5806\u5927\u5C0F\n -Xnoclassgc \u7981\u7528\u7C7B\u5783\u573E\u6536\u96C6\n -Xrs \u51CF\u5C11 Java/VM \u5BF9\u64CD\u4F5C\u7CFB\u7EDF\u4FE1\u53F7\u7684\u4F7F\u7528\uFF08\u8BF7\u53C2\u89C1\u6587\u6863\uFF09\n -Xshare:auto \u5728\u53EF\u80FD\u7684\u60C5\u51B5\u4E0B\u4F7F\u7528\u5171\u4EAB\u7C7B\u6570\u636E\uFF08\u9ED8\u8BA4\u503C\uFF09\n -Xshare:off \u4E0D\u5C1D\u8BD5\u4F7F\u7528\u5171\u4EAB\u7C7B\u6570\u636E\n -Xshare:on \u8981\u6C42\u4F7F\u7528\u5171\u4EAB\u7C7B\u6570\u636E\uFF0C\u5426\u5219\u5C06\u5931\u8D25\u3002\n -XshowSettings \u663E\u793A\u6240\u6709\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:all\n \u663E\u793A\u6240\u6709\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:locale\n \u663E\u793A\u6240\u6709\u4E0E\u533A\u57DF\u8BBE\u7F6E\u76F8\u5173\u7684\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:properties\n \u663E\u793A\u6240\u6709\u5C5E\u6027\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:vm\n \u663E\u793A\u6240\u6709\u4E0E vm \u76F8\u5173\u7684\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:system\n \uFF08\u4EC5 Linux\uFF09\u663E\u793A\u4E3B\u673A\u7CFB\u7EDF\u6216\u5BB9\u5668\n \u914D\u7F6E\u5E76\u7EE7\u7EED\n -Xss<\u5927\u5C0F> \u8BBE\u7F6E Java \u7EBF\u7A0B\u5806\u6808\u5927\u5C0F\n -Xverify \u8BBE\u7F6E\u5B57\u8282\u7801\u9A8C\u8BC1\u5668\u7684\u6A21\u5F0F\n --add-reads <\u6A21\u5757>=<\u76EE\u6807\u6A21\u5757>(,<\u76EE\u6807\u6A21\u5757>)*\n \u66F4\u65B0 <\u6A21\u5757> \u4EE5\u8BFB\u53D6 <\u76EE\u6807\u6A21\u5757>\uFF0C\u800C\u65E0\u8BBA\n \u6A21\u5757\u58F0\u660E\u5982\u4F55\u3002\n <\u76EE\u6807\u6A21\u5757> \u53EF\u4EE5\u662F ALL-UNNAMED \u4EE5\u8BFB\u53D6\u6240\u6709\u672A\u547D\u540D\n \u6A21\u5757\u3002\n --add-exports <\u6A21\u5757>/<\u7A0B\u5E8F\u5305>=<\u76EE\u6807\u6A21\u5757>(,<\u76EE\u6807\u6A21\u5757>)*\n \u66F4\u65B0 <\u6A21\u5757> \u4EE5\u5C06 <\u7A0B\u5E8F\u5305> \u5BFC\u51FA\u5230 <\u76EE\u6807\u6A21\u5757>\uFF0C\n \u800C\u65E0\u8BBA\u6A21\u5757\u58F0\u660E\u5982\u4F55\u3002\n <\u76EE\u6807\u6A21\u5757> \u53EF\u4EE5\u662F ALL-UNNAMED \u4EE5\u5BFC\u51FA\u5230\u6240\u6709\n \
-\u672A\u547D\u540D\u6A21\u5757\u3002\n --add-opens <\u6A21\u5757>/<\u7A0B\u5E8F\u5305>=<\u76EE\u6807\u6A21\u5757>(,<\u76EE\u6807\u6A21\u5757>)*\n \u66F4\u65B0 <\u6A21\u5757> \u4EE5\u5728 <\u76EE\u6807\u6A21\u5757> \u4E2D\u6253\u5F00\n <\u7A0B\u5E8F\u5305>\uFF0C\u800C\u65E0\u8BBA\u6A21\u5757\u58F0\u660E\u5982\u4F55\u3002\n --illegal-access=<\u503C>\n \u5141\u8BB8\u6216\u62D2\u7EDD\u901A\u8FC7\u672A\u547D\u540D\u6A21\u5757\u4E2D\u7684\u4EE3\u7801\u5BF9\u547D\u540D\u6A21\u5757\u4E2D\u7684\n \u7C7B\u578B\u6210\u5458\u8FDB\u884C\u8BBF\u95EE\u3002\n <\u503C> \u4E3A "deny"\u3001"permit"\u3001"warn" \u6216 "debug" \u4E4B\u4E00\n \u6B64\u9009\u9879\u5C06\u5728\u672A\u6765\u53D1\u884C\u7248\u4E2D\u5220\u9664\u3002\n --limit-modules <\u6A21\u5757\u540D>[,<\u6A21\u5757\u540D>...]\n \u9650\u5236\u53EF\u89C2\u5BDF\u6A21\u5757\u7684\u9886\u57DF\n --patch-module <\u6A21\u5757>=<\u6587\u4EF6>({0}<\u6587\u4EF6>)*\n \u4F7F\u7528 JAR \u6587\u4EF6\u6216\u76EE\u5F55\u4E2D\u7684\u7C7B\u548C\u8D44\u6E90\n \u8986\u76D6\u6216\u589E\u5F3A\u6A21\u5757\u3002\n --disable-@files \u7981\u6B62\u8FDB\u4E00\u6B65\u6269\u5C55\u53C2\u6570\u6587\u4EF6\n --source <\u7248\u672C>\n \u8BBE\u7F6E\u6E90\u6587\u4EF6\u6A21\u5F0F\u4E2D\u6E90\u7684\u7248\u672C\u3002\n\n\u8FD9\u4E9B\u989D\u5916\u9009\u9879\u5982\u6709\u66F4\u6539\uFF0C\u6055\u4E0D\u53E6\u884C\u901A\u77E5\u3002\n
+java.launcher.X.usage=\n -Xbatch \u7981\u7528\u540E\u53F0\u7F16\u8BD1\n -Xbootclasspath/a:<\u4EE5 {0} \u5206\u9694\u7684\u76EE\u5F55\u548C zip/jar \u6587\u4EF6>\n \u9644\u52A0\u5728\u5F15\u5BFC\u7C7B\u8DEF\u5F84\u672B\u5C3E\n -Xcheck:jni \u5BF9 JNI \u51FD\u6570\u6267\u884C\u5176\u4ED6\u68C0\u67E5\n -Xcomp \u5F3A\u5236\u5728\u9996\u6B21\u8C03\u7528\u65F6\u7F16\u8BD1\u65B9\u6CD5\n -Xdebug \u4E3A\u5B9E\u73B0\u5411\u540E\u517C\u5BB9\u800C\u63D0\u4F9B\n -Xdiag \u663E\u793A\u9644\u52A0\u8BCA\u65AD\u6D88\u606F\n -Xfuture \u542F\u7528\u6700\u4E25\u683C\u7684\u68C0\u67E5\uFF0C\u9884\u671F\u5C06\u6765\u7684\u9ED8\u8BA4\u503C\n \u6B64\u9009\u9879\u5DF2\u8FC7\u65F6\uFF0C\u53EF\u80FD\u4F1A\u5728\n \u672A\u6765\u53D1\u884C\u7248\u4E2D\u5220\u9664\u3002\n -Xint \u4EC5\u89E3\u91CA\u6A21\u5F0F\u6267\u884C\n -Xinternalversion\n \u663E\u793A\u6BD4 -version \u9009\u9879\u66F4\u8BE6\u7EC6\u7684\n JVM \u7248\u672C\u4FE1\u606F\n -Xlog: \u914D\u7F6E\u6216\u542F\u7528\u91C7\u7528 Java \u865A\u62DF\n \u673A (Java Virtual Machine, JVM) \u7EDF\u4E00\u8BB0\u5F55\u6846\u67B6\u8FDB\u884C\u4E8B\u4EF6\u8BB0\u5F55\u3002\u4F7F\u7528 -Xlog:help\n \u53EF\u4E86\u89E3\u8BE6\u7EC6\u4FE1\u606F\u3002\n -Xloggc: \u5C06 GC \u72B6\u6001\u8BB0\u5F55\u5728\u6587\u4EF6\u4E2D\uFF08\u5E26\u65F6\u95F4\u6233\uFF09\n -Xmixed \u6DF7\u5408\u6A21\u5F0F\u6267\u884C\uFF08\u9ED8\u8BA4\u503C\uFF09\n -Xmn \u4E3A\u5E74\u8F7B\u4EE3\uFF08\u65B0\u751F\u4EE3\uFF09\u8BBE\u7F6E\u521D\u59CB\u548C\u6700\u5927\u5806\u5927\u5C0F\n \uFF08\u4EE5\u5B57\u8282\u4E3A\u5355\u4F4D\uFF09\n -Xms \u8BBE\u7F6E\u521D\u59CB Java \u5806\u5927\u5C0F\n -Xmx \u8BBE\u7F6E\u6700\u5927 Java \u5806\u5927\u5C0F\n -Xnoclassgc \u7981\u7528\u7C7B\u5783\u573E\u6536\u96C6\n -Xrs \u51CF\u5C11 Java/VM \u5BF9\u64CD\u4F5C\u7CFB\u7EDF\u4FE1\u53F7\u7684\u4F7F\u7528\uFF08\u8BF7\u53C2\u89C1\u6587\u6863\uFF09\n -Xshare:auto \u5728\u53EF\u80FD\u7684\u60C5\u51B5\u4E0B\u4F7F\u7528\u5171\u4EAB\u7C7B\u6570\u636E\uFF08\u9ED8\u8BA4\u503C\uFF09\n -Xshare:off \u4E0D\u5C1D\u8BD5\u4F7F\u7528\u5171\u4EAB\u7C7B\u6570\u636E\n -Xshare:on \u8981\u6C42\u4F7F\u7528\u5171\u4EAB\u7C7B\u6570\u636E\uFF0C\u5426\u5219\u5C06\u5931\u8D25\u3002\n -XshowSettings \u663E\u793A\u6240\u6709\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:all\n \u663E\u793A\u6240\u6709\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:locale\n \u663E\u793A\u6240\u6709\u4E0E\u533A\u57DF\u8BBE\u7F6E\u76F8\u5173\u7684\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:properties\n \u663E\u793A\u6240\u6709\u5C5E\u6027\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:vm\n \u663E\u793A\u6240\u6709\u4E0E vm \u76F8\u5173\u7684\u8BBE\u7F6E\u5E76\u7EE7\u7EED\n -XshowSettings:system\n \uFF08\u4EC5 Linux\uFF09\u663E\u793A\u4E3B\u673A\u7CFB\u7EDF\u6216\u5BB9\u5668\n \u914D\u7F6E\u5E76\u7EE7\u7EED\n -Xss \u8BBE\u7F6E Java \u7EBF\u7A0B\u5806\u6808\u5927\u5C0F\n -Xverify \u8BBE\u7F6E\u5B57\u8282\u7801\u9A8C\u8BC1\u5668\u7684\u6A21\u5F0F\n \u8BF7\u6CE8\u610F\uFF0C\u9009\u9879 -Xverify:none \u5DF2\u8FC7\u65F6\uFF0C\n \u53EF\u80FD\u4F1A\u5728\u672A\u6765\u53D1\u884C\u7248\u4E2D\u5220\u9664\u3002\n --add-reads =(,)*\n \u66F4\u65B0 \u4EE5\u8BFB\u53D6 \uFF0C\u800C\u65E0\u8BBA\n \u6A21\u5757\u5982\u4F55\u58F0\u660E\u3002 \n \u53EF\u4EE5\u662F \
+ALL-UNNAMED\uFF0C\u5C06\u8BFB\u53D6\u6240\u6709\u672A\u547D\u540D\n \u6A21\u5757\u3002\n --add-exports /=(,)*\n \u66F4\u65B0 \u4EE5\u5C06 \u5BFC\u51FA\u5230 \uFF0C\n \u800C\u65E0\u8BBA\u6A21\u5757\u5982\u4F55\u58F0\u660E\u3002\n \u53EF\u4EE5\u662F ALL-UNNAMED\uFF0C\u5C06\u5BFC\u51FA\u5230\u6240\u6709\n \u672A\u547D\u540D\u6A21\u5757\u3002\n --add-opens /=(,)*\n \u66F4\u65B0 \u4EE5\u5728 \u4E2D\u6253\u5F00\n \uFF0C\u800C\u65E0\u8BBA\u6A21\u5757\u5982\u4F55\u58F0\u660E\u3002\n --illegal-access=\n \u5141\u8BB8\u6216\u62D2\u7EDD\u901A\u8FC7\u672A\u547D\u540D\u6A21\u5757\u4E2D\u7684\u4EE3\u7801\u5BF9\u547D\u540D\u6A21\u5757\u4E2D\u7684\n \u7C7B\u578B\u6210\u5458\u8FDB\u884C\u8BBF\u95EE\u3002\n \u4E3A "deny"\u3001"permit"\u3001"warn" \u6216 "debug" \u4E4B\u4E00\n \u6B64\u9009\u9879\u5C06\u5728\u672A\u6765\u53D1\u884C\u7248\u4E2D\u5220\u9664\u3002\n --limit-modules [,