Compare commits

...

1 Commits
dcevm ... 1811

Author SHA1 Message Date
Vitaly Provodin
10be214c1f JBR-3937 Fix crashes in C1/C2 compilers
& JBR-3938 - fix race condition in anonymous class loading
2021-11-02 15:15:01 +07:00
33 changed files with 410 additions and 148 deletions

View File

@@ -1,7 +1,7 @@
From d00ac9fa0f9a90fe52d93a5cab88d17638a0fb01 Mon Sep 17 00:00:00 2001
From 7fd4796b1786511d28785bde7fe438ed27ee7d0d Mon Sep 17 00:00:00 2001
From: skybber <lada.dvorak7@gmail.com>
Date: Wed, 14 Nov 2018 21:09:39 +0100
Subject: [PATCH 01/31] Apply basic dcevm11 patch
Subject: [PATCH 01/33] Apply basic dcevm11 patch
---
src/hotspot/share/ci/ciObjectFactory.cpp | 25 +
@@ -72,7 +72,7 @@ Subject: [PATCH 01/31] Apply basic dcevm11 patch
create mode 100644 src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
diff --git a/src/hotspot/share/ci/ciObjectFactory.cpp b/src/hotspot/share/ci/ciObjectFactory.cpp
index a5dd94f4bb8..66bbe835e7b 100644
index e6391b5f2ba..c8a03aa9ee9 100644
--- a/src/hotspot/share/ci/ciObjectFactory.cpp
+++ b/src/hotspot/share/ci/ciObjectFactory.cpp
@@ -708,3 +708,28 @@ void ciObjectFactory::print() {
@@ -126,7 +126,7 @@ index 1063c9853e1..3e9d48c4cdc 100644
#endif // SHARE_VM_CI_CIOBJECTFACTORY_HPP
diff --git a/src/hotspot/share/classfile/classFileParser.cpp b/src/hotspot/share/classfile/classFileParser.cpp
index 154dab55e43..0c6c3a86965 100644
index 2ea6b7e2331..5eaa97698d2 100644
--- a/src/hotspot/share/classfile/classFileParser.cpp
+++ b/src/hotspot/share/classfile/classFileParser.cpp
@@ -954,6 +954,8 @@ void ClassFileParser::parse_interfaces(const ClassFileStream* const stream,
@@ -138,7 +138,7 @@ index 154dab55e43..0c6c3a86965 100644
if (!interf->is_interface()) {
THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(),
err_msg("class %s can not implement %s, because it is not an interface (%s)",
@@ -3826,7 +3828,7 @@ const InstanceKlass* ClassFileParser::parse_super_class(ConstantPool* const cp,
@@ -3833,7 +3835,7 @@ const InstanceKlass* ClassFileParser::parse_super_class(ConstantPool* const cp,
// However, make sure it is not an array type.
bool is_array = false;
if (cp->tag_at(super_class_index).is_klass()) {
@@ -147,7 +147,7 @@ index 154dab55e43..0c6c3a86965 100644
if (need_verify)
is_array = super_klass->is_array_klass();
} else if (need_verify) {
@@ -4494,7 +4496,10 @@ void ClassFileParser::set_precomputed_flags(InstanceKlass* ik) {
@@ -4501,7 +4503,10 @@ void ClassFileParser::set_precomputed_flags(InstanceKlass* ik) {
if (!_has_empty_finalizer) {
if (_has_finalizer ||
(super != NULL && super->has_finalizer())) {
@@ -159,7 +159,7 @@ index 154dab55e43..0c6c3a86965 100644
}
}
@@ -5872,6 +5877,7 @@ ClassFileParser::ClassFileParser(ClassFileStream* stream,
@@ -5879,6 +5884,7 @@ ClassFileParser::ClassFileParser(ClassFileStream* stream,
const InstanceKlass* host_klass,
GrowableArray<Handle>* cp_patches,
Publicity pub_level,
@@ -167,7 +167,7 @@ index 154dab55e43..0c6c3a86965 100644
TRAPS) :
_stream(stream),
_requested_name(name),
@@ -5930,7 +5936,8 @@ ClassFileParser::ClassFileParser(ClassFileStream* stream,
@@ -5937,7 +5943,8 @@ ClassFileParser::ClassFileParser(ClassFileStream* stream,
_has_finalizer(false),
_has_empty_finalizer(false),
_has_vanilla_constructor(false),
@@ -177,7 +177,7 @@ index 154dab55e43..0c6c3a86965 100644
_class_name = name != NULL ? name : vmSymbols::unknown_class_name();
@@ -6331,14 +6338,15 @@ void ClassFileParser::post_process_parsed_stream(const ClassFileStream* const st
@@ -6338,14 +6345,15 @@ void ClassFileParser::post_process_parsed_stream(const ClassFileStream* const st
CHECK);
}
Handle loader(THREAD, _loader_data->class_loader());
@@ -248,7 +248,7 @@ index e10d32ea7b7..079558bb244 100644
if (HAS_PENDING_EXCEPTION) {
if (DumpSharedSpaces) {
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index 5d9ac0009aa..e2754d5f5be 100644
index 37bd9d8eed5..bcbd2548ffc 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -1245,6 +1245,12 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*)) {
@@ -308,7 +308,7 @@ index 5d9ac0009aa..e2754d5f5be 100644
data = data->next();
loaders_processed++;
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
index 152cc26efdb..7e357929971 100644
index aa6b25c0bd1..b5a7cf21c85 100644
--- a/src/hotspot/share/classfile/classLoaderData.hpp
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
@@ -125,6 +125,11 @@ class ClassLoaderDataGraph : public AllStatic {
@@ -336,7 +336,7 @@ index f5157e07c76..e9e52f00e8a 100644
if (HAS_PENDING_EXCEPTION) {
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
index b949bac8de6..5bd048d8627 100644
index 1ed49636e5b..4b27e572593 100644
--- a/src/hotspot/share/classfile/dictionary.cpp
+++ b/src/hotspot/share/classfile/dictionary.cpp
@@ -245,6 +245,19 @@ void Dictionary::classes_do(void f(InstanceKlass*)) {
@@ -449,7 +449,7 @@ index d26f1f11fb4..fd4b134d7a7 100644
// An entry in the class loader data dictionaries, this describes a class as
diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp
index 559d90339be..b86f8320d70 100644
index 17ae8be1d02..a659cd23fc8 100644
--- a/src/hotspot/share/classfile/javaClasses.cpp
+++ b/src/hotspot/share/classfile/javaClasses.cpp
@@ -2428,6 +2428,8 @@ void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHand
@@ -732,7 +732,7 @@ index 8a7a1248e62..611e18aaf85 100644
bool add_entry(Symbol* name, InstanceKlass* klass1, Handle loader1,
InstanceKlass* klass2, Handle loader2);
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
index 4509025cf70..1ab9b99b435 100644
index f21fbaf2b3b..dc871ec569f 100644
--- a/src/hotspot/share/classfile/systemDictionary.cpp
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
@@ -201,6 +201,7 @@ Klass* SystemDictionary::resolve_or_fail(Symbol* class_name, Handle class_loader
@@ -952,7 +952,7 @@ index ad638e26579..32de261588a 100644
}
}
diff --git a/src/hotspot/share/classfile/verifier.cpp b/src/hotspot/share/classfile/verifier.cpp
index 9402f628b03..f55ececb086 100644
index 89f3b236ccb..c52e2531486 100644
--- a/src/hotspot/share/classfile/verifier.cpp
+++ b/src/hotspot/share/classfile/verifier.cpp
@@ -244,7 +244,7 @@ bool Verifier::is_eligible_for_verification(InstanceKlass* klass, bool should_ve
@@ -1696,7 +1696,7 @@ index 6cf7aec68f8..61a406377ee 100644
if (HAS_PENDING_EXCEPTION) {
log_pending_exception(PENDING_EXCEPTION);
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
index 4a1bd297b72..7ecb950b231 100644
index eab9576bcc6..c3b1d766db8 100644
--- a/src/hotspot/share/memory/universe.cpp
+++ b/src/hotspot/share/memory/universe.cpp
@@ -153,6 +153,7 @@ int Universe::_base_vtable_size = 0;
@@ -1919,7 +1919,7 @@ index 2a93500b794..2a9eb978b43 100644
// RedefineClasses support
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
index 645a63e71be..f059a05ebe7 100644
index 34aed3fbb3a..30b02a2ba0a 100644
--- a/src/hotspot/share/oops/instanceKlass.cpp
+++ b/src/hotspot/share/oops/instanceKlass.cpp
@@ -832,7 +832,8 @@ bool InstanceKlass::link_class_impl(bool throw_verifyerror, TRAPS) {
@@ -2013,7 +2013,7 @@ index 645a63e71be..f059a05ebe7 100644
}
#ifndef PRODUCT
@@ -3552,7 +3602,7 @@ void InstanceKlass::verify_on(outputStream* st) {
@@ -3564,7 +3614,7 @@ void InstanceKlass::verify_on(outputStream* st) {
}
guarantee(sib->is_klass(), "should be klass");
@@ -2248,10 +2248,10 @@ index da8468dead4..4ac3e6e80de 100644
Symbol* signature() const { return constants()->symbol_at(signature_index()); }
int signature_index() const { return constMethod()->signature_index(); }
diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp
index f5db74f4225..7f88297aa10 100644
index 9410a085ec4..a8a0492e4d1 100644
--- a/src/hotspot/share/prims/jni.cpp
+++ b/src/hotspot/share/prims/jni.cpp
@@ -353,6 +353,7 @@ JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderR
@@ -354,6 +354,7 @@ JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderR
class_loader,
Handle(),
&st,
@@ -2260,7 +2260,7 @@ index f5db74f4225..7f88297aa10 100644
if (log_is_enabled(Debug, class, resolve) && k != NULL) {
diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp
index 147beffc814..129b71bf0f5 100644
index e88c621912d..49b6776f60b 100644
--- a/src/hotspot/share/prims/jvm.cpp
+++ b/src/hotspot/share/prims/jvm.cpp
@@ -936,6 +936,7 @@ static jclass jvm_define_class_common(JNIEnv *env, const char *name,
@@ -4806,10 +4806,10 @@ index f54c9b713be..54617f05b5a 100644
VMThread::execute(&op);
return (op.check_error());
diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp
index a63b0f67423..9e70e3bc3f8 100644
index 555e0140e4f..1ffc2f9ea20 100644
--- a/src/hotspot/share/prims/jvmtiExport.cpp
+++ b/src/hotspot/share/prims/jvmtiExport.cpp
@@ -2783,7 +2783,7 @@ JvmtiDynamicCodeEventCollector::JvmtiDynamicCodeEventCollector() : _code_blobs(N
@@ -2803,7 +2803,7 @@ JvmtiDynamicCodeEventCollector::JvmtiDynamicCodeEventCollector() : _code_blobs(N
// iterate over any code blob descriptors collected and post a
// DYNAMIC_CODE_GENERATED event to the profiler.
JvmtiDynamicCodeEventCollector::~JvmtiDynamicCodeEventCollector() {
@@ -4819,7 +4819,7 @@ index a63b0f67423..9e70e3bc3f8 100644
if (_code_blobs != NULL) {
for (int i=0; i<_code_blobs->length(); i++) {
diff --git a/src/hotspot/share/prims/jvmtiExport.hpp b/src/hotspot/share/prims/jvmtiExport.hpp
index b8246554f74..be2c373aba7 100644
index d0433dfc145..da6131eb2e6 100644
--- a/src/hotspot/share/prims/jvmtiExport.hpp
+++ b/src/hotspot/share/prims/jvmtiExport.hpp
@@ -176,6 +176,7 @@ class JvmtiExport : public AllStatic {
@@ -4866,10 +4866,10 @@ index a0a6a6cbd18..39953a71244 100644
for (InstanceKlass* pv_node = ik->previous_versions();
pv_node != NULL;
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
index 5c1ed782b8f..5bca664c7c0 100644
index f68990f3af9..87be28e9eee 100644
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
@@ -202,6 +202,8 @@ void ResolvedMethodTable::print() {
@@ -204,6 +204,8 @@ void ResolvedMethodTable::print() {
void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
// For each entry in RMT, change to new method
@@ -4878,7 +4878,7 @@ index 5c1ed782b8f..5bca664c7c0 100644
for (int i = 0; i < _the_table->table_size(); ++i) {
for (ResolvedMethodEntry* entry = _the_table->bucket(i);
entry != NULL;
@@ -216,18 +218,30 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
@@ -218,18 +220,30 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
if (old_method->is_old()) {
@@ -4918,7 +4918,7 @@ index 5c1ed782b8f..5bca664c7c0 100644
ResourceMark rm;
if (!(*trace_name_printed)) {
@@ -236,9 +250,14 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
@@ -238,9 +252,14 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
}
log_debug(redefine, class, update, constantpool)
("ResolvedMethod method update: %s(%s)",
@@ -4935,7 +4935,7 @@ index 5c1ed782b8f..5bca664c7c0 100644
}
#endif // INCLUDE_JVMTI
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index 3e7d48ad5a3..a11dfe48dd6 100644
index cc9366dcc53..4e2a3ff1083 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -2033,6 +2033,36 @@ unsigned int addopens_count = 0;
@@ -5029,7 +5029,7 @@ index f39687a25bc..7b1aa3cc58e 100644
trans_and_fence(_thread_in_vm, _thread_in_native);
// Check for pending. async. exceptions or suspends.
diff --git a/src/hotspot/share/runtime/javaCalls.cpp b/src/hotspot/share/runtime/javaCalls.cpp
index 563ffdbd446..55f06eadcc2 100644
index dd55cff0ea3..36e8b2b9c05 100644
--- a/src/hotspot/share/runtime/javaCalls.cpp
+++ b/src/hotspot/share/runtime/javaCalls.cpp
@@ -57,7 +57,8 @@ JavaCallWrapper::JavaCallWrapper(const methodHandle& callee_method, Handle recei
@@ -5086,7 +5086,7 @@ index 0d263ca55ba..b41abcb82ae 100644
extern Mutex* OldSets_lock; // protects the old region sets
extern Monitor* RootRegionScan_lock; // used to notify that the CM threads have finished scanning the IM snapshot regions
diff --git a/src/hotspot/share/runtime/reflection.cpp b/src/hotspot/share/runtime/reflection.cpp
index a49b5108821..ed789b0bc2b 100644
index b8f736a7dbc..ac233f3b373 100644
--- a/src/hotspot/share/runtime/reflection.cpp
+++ b/src/hotspot/share/runtime/reflection.cpp
@@ -658,6 +658,12 @@ bool Reflection::verify_member_access(const Klass* current_class,

View File

@@ -1,7 +1,7 @@
From 4cbc3b3e13472d7690098240d6d954597c269c7a Mon Sep 17 00:00:00 2001
From c9a1d6faa3c4e7a623be010a3cc443d40465c23c Mon Sep 17 00:00:00 2001
From: skybber <lada.dvorak7@gmail.com>
Date: Wed, 14 Nov 2018 21:18:22 +0100
Subject: [PATCH 02/31] dcevm11 fixes
Subject: [PATCH 02/33] dcevm11 fixes
1. We need to set classRedefinitionCount on new class, not old class.
@@ -82,7 +82,7 @@ dmh
19 files changed, 324 insertions(+), 415 deletions(-)
diff --git a/src/hotspot/share/classfile/classFileParser.cpp b/src/hotspot/share/classfile/classFileParser.cpp
index 0c6c3a86965..b03272da179 100644
index 5eaa97698d2..34185d7ba32 100644
--- a/src/hotspot/share/classfile/classFileParser.cpp
+++ b/src/hotspot/share/classfile/classFileParser.cpp
@@ -954,6 +954,7 @@ void ClassFileParser::parse_interfaces(const ClassFileStream* const stream,
@@ -93,7 +93,7 @@ index 0c6c3a86965..b03272da179 100644
interf = (Klass *) maybe_newest(interf);
if (!interf->is_interface()) {
@@ -3828,6 +3829,7 @@ const InstanceKlass* ClassFileParser::parse_super_class(ConstantPool* const cp,
@@ -3835,6 +3836,7 @@ const InstanceKlass* ClassFileParser::parse_super_class(ConstantPool* const cp,
// However, make sure it is not an array type.
bool is_array = false;
if (cp->tag_at(super_class_index).is_klass()) {
@@ -101,7 +101,7 @@ index 0c6c3a86965..b03272da179 100644
super_klass = InstanceKlass::cast(maybe_newest(cp->resolved_klass_at(super_class_index)));
if (need_verify)
is_array = super_klass->is_array_klass();
@@ -4496,7 +4498,7 @@ void ClassFileParser::set_precomputed_flags(InstanceKlass* ik) {
@@ -4503,7 +4505,7 @@ void ClassFileParser::set_precomputed_flags(InstanceKlass* ik) {
if (!_has_empty_finalizer) {
if (_has_finalizer ||
(super != NULL && super->has_finalizer())) {
@@ -124,7 +124,7 @@ index d792ab4bb3f..de48092bde8 100644
public:
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index e2754d5f5be..1c0d5b0a8f2 100644
index bcbd2548ffc..3f75bffce8a 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -1245,6 +1245,7 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*)) {
@@ -182,7 +182,7 @@ index e2754d5f5be..1c0d5b0a8f2 100644
data = data->next();
loaders_processed++;
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
index 5bd048d8627..a97b48fe5bb 100644
index 4b27e572593..86dc1f26933 100644
--- a/src/hotspot/share/classfile/dictionary.cpp
+++ b/src/hotspot/share/classfile/dictionary.cpp
@@ -245,6 +245,8 @@ void Dictionary::classes_do(void f(InstanceKlass*)) {
@@ -244,7 +244,7 @@ index a26b9d1cb55..3d5a59a04ff 100644
for (int index = 0; index < table_size(); index++) {
LoaderConstraintEntry** p = bucket_addr(index);
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
index 1ab9b99b435..52b6ed22b5d 100644
index dc871ec569f..f69167ae53c 100644
--- a/src/hotspot/share/classfile/systemDictionary.cpp
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
@@ -876,7 +876,8 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name,
@@ -330,7 +330,7 @@ index b9ccdee8cca..0c24146ff00 100644
selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index));
}
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
index 7ecb950b231..d0a6d665aa0 100644
index c3b1d766db8..9a633280118 100644
--- a/src/hotspot/share/memory/universe.cpp
+++ b/src/hotspot/share/memory/universe.cpp
@@ -176,7 +176,7 @@ void Universe::basic_type_classes_do(void f(Klass*)) {
@@ -376,7 +376,7 @@ index 47040d51f0c..4318df227d1 100644
}
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
index f059a05ebe7..c28ed956ccf 100644
index 30b02a2ba0a..77708e25aae 100644
--- a/src/hotspot/share/oops/instanceKlass.cpp
+++ b/src/hotspot/share/oops/instanceKlass.cpp
@@ -178,6 +178,7 @@ bool InstanceKlass::has_nest_member(InstanceKlass* k, TRAPS) const {
@@ -442,7 +442,7 @@ index f059a05ebe7..c28ed956ccf 100644
// if (this->old_version() != NULL) {
// InstanceKlass::cast(this->old_version())->remove_dependent_nmethod(nm, true);
// return;
@@ -3602,6 +3613,7 @@ void InstanceKlass::verify_on(outputStream* st) {
@@ -3614,6 +3625,7 @@ void InstanceKlass::verify_on(outputStream* st) {
}
guarantee(sib->is_klass(), "should be klass");
@@ -1528,10 +1528,10 @@ index 39953a71244..b59d3046b88 100644
// search previous versions if they exist
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
index 5bca664c7c0..4498bdcd77e 100644
index 87be28e9eee..8098b80baa6 100644
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
@@ -198,8 +198,52 @@ void ResolvedMethodTable::print() {
@@ -200,8 +200,52 @@ void ResolvedMethodTable::print() {
#endif // PRODUCT
#if INCLUDE_JVMTI

View File

@@ -1,7 +1,7 @@
From fc483e0a98a0bb8042df60567fa238d00bf66263 Mon Sep 17 00:00:00 2001
From a23078dc957ec7b88de7b82fdea6438c9a046cf1 Mon Sep 17 00:00:00 2001
From: skybber <lada.dvorak7@gmail.com>
Date: Wed, 12 Dec 2018 19:38:28 +0100
Subject: [PATCH 03/31] Support for Concurrent Mark Sweep (CMS) collector
Subject: [PATCH 03/33] Support for Concurrent Mark Sweep (CMS) collector
---
.../share/gc/cms/compactibleFreeListSpace.cpp | 139 ++++++++++++------
@@ -462,7 +462,7 @@ index 43d761cdbb2..14af1aad21b 100644
} else {
obj->set_klass(obj->klass()->new_version());
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index a11dfe48dd6..013ba213c00 100644
index 4e2a3ff1083..e3cb44d8690 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -2045,14 +2045,14 @@ bool Arguments::check_gc_consistency() {

View File

@@ -1,7 +1,7 @@
From 61bd37c232d7a2f6ee607f39c29e6e231cb4f36d Mon Sep 17 00:00:00 2001
From 89334947f64b857d6ef052e51dc645a0baa9cc65 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@mailprofiler.com>
Date: Wed, 11 Mar 2020 14:19:34 +0100
Subject: [PATCH 04/31] Fix class cast exception on redefinition of class A,
Subject: [PATCH 04/33] Fix class cast exception on redefinition of class A,
that is superclass of B that has anonymous class C
---
@@ -9,7 +9,7 @@ Subject: [PATCH 04/31] Fix class cast exception on redefinition of class A,
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
index c28ed956ccf..7eb1b01c785 100644
index 77708e25aae..76791cdd905 100644
--- a/src/hotspot/share/oops/instanceKlass.cpp
+++ b/src/hotspot/share/oops/instanceKlass.cpp
@@ -788,7 +788,10 @@ bool InstanceKlass::link_class_impl(bool throw_verifyerror, TRAPS) {

View File

@@ -1,7 +1,7 @@
From da3762cb7687c58c89303092a7e8ed92d4c00cef Mon Sep 17 00:00:00 2001
From 9d8b4cee545f9895b77f5f05059cbd519c6c8094 Mon Sep 17 00:00:00 2001
From: skybber <lada.dvorak7@gmail.com>
Date: Thu, 15 Nov 2018 03:20:08 +0700
Subject: [PATCH 05/31] HotswapAgent integration
Subject: [PATCH 05/33] HotswapAgent integration
It include:
@@ -415,10 +415,10 @@ index 0c24146ff00..9dc184d02f5 100644
!fd.is_static() &&
!m->is_object_initializer());
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index 013ba213c00..2b5ba619f43 100644
index e3cb44d8690..36276741b5c 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -3962,6 +3962,8 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
@@ -3967,6 +3967,8 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
// Set object alignment values.
set_object_alignment();
@@ -427,7 +427,7 @@ index 013ba213c00..2b5ba619f43 100644
#if !INCLUDE_CDS
if (DumpSharedSpaces || RequireSharedSpaces) {
jio_fprintf(defaultStream::error_stream(),
@@ -4295,3 +4297,68 @@ bool Arguments::copy_expand_pid(const char* src, size_t srclen,
@@ -4300,3 +4302,68 @@ bool Arguments::copy_expand_pid(const char* src, size_t srclen,
*b = '\0';
return (p == src_end); // return false if not all of the source was copied
}

View File

@@ -1,7 +1,7 @@
From 124f27f271c87f37f342028412bc7387f2028cde Mon Sep 17 00:00:00 2001
From 4386e1b6a0429a39e390cca3bc66f920bf6dafe5 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sun, 4 Oct 2020 21:12:12 +0200
Subject: [PATCH 06/31] Support for Lambda class redefinition
Subject: [PATCH 06/33] Support for Lambda class redefinition
---
.../share/classfile/classLoaderData.cpp | 9 +++
@@ -15,7 +15,7 @@ Subject: [PATCH 06/31] Support for Lambda class redefinition
8 files changed, 85 insertions(+), 10 deletions(-)
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index 1c0d5b0a8f2..d5ee3c0338c 100644
index 3f75bffce8a..a901b4309b9 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -663,6 +663,15 @@ Dictionary* ClassLoaderData::create_dictionary() {
@@ -35,7 +35,7 @@ index 1c0d5b0a8f2..d5ee3c0338c 100644
oop ClassLoaderData::holder_phantom() const {
// A klass that was previously considered dead can be looked up in the
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
index 7e357929971..00a84610b43 100644
index b5a7cf21c85..c4f617ab800 100644
--- a/src/hotspot/share/classfile/classLoaderData.hpp
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
@@ -292,6 +292,7 @@ class ClassLoaderData : public CHeapObj<mtClass> {
@@ -47,7 +47,7 @@ index 7e357929971..00a84610b43 100644
void unload();
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
index 52b6ed22b5d..1dd53e0b7bc 100644
index f69167ae53c..42e0fee800f 100644
--- a/src/hotspot/share/classfile/systemDictionary.cpp
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
@@ -971,12 +971,16 @@ InstanceKlass* SystemDictionary::parse_stream(Symbol* class_name,
@@ -220,10 +220,10 @@ index a48e07e3a6a..3551b06ecde 100644
// Figure out which new methods match old methods in name and signature,
// which methods have been added, and which are no longer present
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
index 4498bdcd77e..8966ee8a00a 100644
index 8098b80baa6..5a5d5e98623 100644
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
@@ -201,7 +201,7 @@ void ResolvedMethodTable::print() {
@@ -203,7 +203,7 @@ void ResolvedMethodTable::print() {
void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
@@ -232,7 +232,7 @@ index 4498bdcd77e..8966ee8a00a 100644
for (int i = 0; i < _the_table->table_size(); ++i) {
for (ResolvedMethodEntry* entry = _the_table->bucket(i);
entry != NULL;
@@ -272,6 +272,8 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
@@ -274,6 +274,8 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
InstanceKlass* newer_klass = InstanceKlass::cast(old_method->method_holder()->new_version());
Method* newer_method = newer_klass->method_with_idnum(old_method->orig_method_idnum());
@@ -242,7 +242,7 @@ index 4498bdcd77e..8966ee8a00a 100644
assert(newer_method != NULL, "method_with_idnum() should not be NULL");
assert(old_method != newer_method, "sanity check");
diff --git a/src/hotspot/share/prims/unsafe.cpp b/src/hotspot/share/prims/unsafe.cpp
index 1983b4f45f0..5e7aca092eb 100644
index 5f9f93c6b4c..c35ef044e65 100644
--- a/src/hotspot/share/prims/unsafe.cpp
+++ b/src/hotspot/share/prims/unsafe.cpp
@@ -820,6 +820,7 @@ Unsafe_DefineAnonymousClass_impl(JNIEnv *env,

View File

@@ -1,7 +1,7 @@
From 6ea212ab2f71a8c874be649b2342053134dff9ea Mon Sep 17 00:00:00 2001
From 9e65f8342345df054cc1cb694fb4859e2557401d Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sat, 23 May 2020 10:02:15 +0200
Subject: [PATCH 07/31] Fix "no original bytecode found" error if method with
Subject: [PATCH 07/33] Fix "no original bytecode found" error if method with
bkp is missing
Sometimes IDE can deploy class with erroneous method, such method has
@@ -28,7 +28,7 @@ index e377e36b88c..262ecc021b2 100644
int Bytecodes::special_length_at(Bytecodes::Code code, address bcp, address end) {
diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp
index c25e13d83e8..2a66419908c 100644
index aeafba285f0..026fe9234fb 100644
--- a/src/hotspot/share/interpreter/interpreterRuntime.cpp
+++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp
@@ -819,7 +819,7 @@ IRT_END

View File

@@ -1,7 +1,7 @@
From dc73c2dc3268a8b17844b75b76e14b5d0e3c1259 Mon Sep 17 00:00:00 2001
From 08175b2107ccaabcd626ebaf6f154bdd2841a88e Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sun, 24 May 2020 12:07:42 +0200
Subject: [PATCH 08/31] Replace deleted method with
Subject: [PATCH 08/33] Replace deleted method with
Universe::throw_no_such_method_error
---
@@ -9,10 +9,10 @@ Subject: [PATCH 08/31] Replace deleted method with
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
index 8966ee8a00a..c3ed1d28fe5 100644
index 5a5d5e98623..c7996df51bc 100644
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
@@ -262,25 +262,25 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
@@ -264,25 +264,25 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
if (old_method->is_old()) {

View File

@@ -1,7 +1,7 @@
From 2a004a093c23ca8515954d180064a59cdcaba0f8 Mon Sep 17 00:00:00 2001
From f243b468b99115fcc4552644fea57cb695ab3ef8 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Fri, 12 Jun 2020 17:43:52 +0200
Subject: [PATCH 09/31] Support for G1 gc
Subject: [PATCH 09/33] Support for G1 gc
---
src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 20 +++
@@ -1024,7 +1024,7 @@ index 8c255d6d428..71ed3cfcda8 100644
oop(compaction_top)->init_mark_raw();
assert(oop(compaction_top)->klass() != NULL, "should have a class");
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
index d0a6d665aa0..3dc4cc1323c 100644
index 9a633280118..2e4f597cf1f 100644
--- a/src/hotspot/share/memory/universe.cpp
+++ b/src/hotspot/share/memory/universe.cpp
@@ -210,6 +210,11 @@ void Universe::root_oops_do(OopClosure *oopClosure) {
@@ -1269,7 +1269,7 @@ index 3551b06ecde..62a0fbf54d4 100644
static void fix_invoke_method(Method* method);
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index 2b5ba619f43..5053ad7ee61 100644
index 36276741b5c..0db55d00bd3 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -2045,9 +2045,9 @@ bool Arguments::check_gc_consistency() {
@@ -1285,10 +1285,10 @@ index 2b5ba619f43..5053ad7ee61 100644
}
}
diff --git a/src/hotspot/share/utilities/growableArray.hpp b/src/hotspot/share/utilities/growableArray.hpp
index f37d94a0529..738d475aea6 100644
index ea746e065fa..d13e64f3806 100644
--- a/src/hotspot/share/utilities/growableArray.hpp
+++ b/src/hotspot/share/utilities/growableArray.hpp
@@ -532,6 +532,10 @@ template<class E> class GrowableArrayIterator : public StackObj {
@@ -523,6 +523,10 @@ template<class E> class GrowableArrayIterator : public StackObj {
assert(_array == rhs._array, "iterator belongs to different array");
return _position != rhs._position;
}

View File

@@ -1,7 +1,7 @@
From b49d26f6e512f5bbdb89c360e8cb73e3bbd037e4 Mon Sep 17 00:00:00 2001
From c7bf974723c6822dca4abc878ee3e59df59d5330 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sat, 13 Jun 2020 18:50:59 +0200
Subject: [PATCH 10/31] Change log level in advanced redefinition
Subject: [PATCH 10/33] Change log level in advanced redefinition
- Change log level for "Comparing different class ver.." to debug
- Fix adjust_method_entries_dcevm logging levels and severity
@@ -24,10 +24,10 @@ index 8b6fad2128e..a8adfa5af47 100644
assert(new_class->old_version() != NULL, "must have old version");
InstanceKlass* the_class = InstanceKlass::cast(new_class->old_version());
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
index c3ed1d28fe5..650007b26ff 100644
index c7996df51bc..082d3d26c34 100644
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
@@ -271,7 +271,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
@@ -273,7 +273,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
} else {
newer_method = newer_klass->method_with_idnum(old_method->orig_method_idnum());
@@ -36,7 +36,7 @@ index c3ed1d28fe5..650007b26ff 100644
assert(newer_klass == newer_method->method_holder(), "call after swapping redefined guts");
assert(newer_method != NULL, "method_with_idnum() should not be NULL");
@@ -291,7 +291,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
@@ -293,7 +293,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
ResourceMark rm;
if (!(*trace_name_printed)) {

View File

@@ -1,7 +1,7 @@
From 993fa0c4dc645102204d8dcf716407bcc84e5e7f Mon Sep 17 00:00:00 2001
From 3645c65d712993ba5af60e10585dd01c18a7f81f Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Tue, 6 Oct 2020 22:15:31 +0200
Subject: [PATCH 11/31] AllowEnhancedClassRedefinition is false (disabled) by
Subject: [PATCH 11/33] AllowEnhancedClassRedefinition is false (disabled) by
default
---

View File

@@ -1,7 +1,7 @@
From 9604363bb215769dc397cedf1e7b7b89f1d518d8 Mon Sep 17 00:00:00 2001
From ee129595faa4dfc3f9c44329a4d6c7a53f5b294d Mon Sep 17 00:00:00 2001
From: Artem Khvastunov <artem.khvastunov@jetbrains.com>
Date: Tue, 14 Apr 2020 19:11:35 +0200
Subject: [PATCH 12/31] add jvmtiEnhancedRedefineClasses.* to CMakeLists.txt
Subject: [PATCH 12/33] add jvmtiEnhancedRedefineClasses.* to CMakeLists.txt
---
jb/project/hotspot-cmake/CMakeLists.txt | 2 ++

View File

@@ -1,14 +1,14 @@
From 00e668de1ec62caa31d8a0d8d64a8e143819b296 Mon Sep 17 00:00:00 2001
From faa30c1c0dc07670641a062b510363c57718e9bf Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Mon, 19 Oct 2020 20:00:04 +0200
Subject: [PATCH 13/31] Set HOTSPOT_VM_DISTRO=Dynamic Code Evolution
Subject: [PATCH 13/33] Set HOTSPOT_VM_DISTRO=Dynamic Code Evolution
---
make/autoconf/version-numbers | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/make/autoconf/version-numbers b/make/autoconf/version-numbers
index 12a95c59483..662ad155896 100644
index 0b3247633e3..e1592f4cd3b 100644
--- a/make/autoconf/version-numbers
+++ b/make/autoconf/version-numbers
@@ -44,7 +44,7 @@ PRODUCT_NAME=OpenJDK

View File

@@ -1,7 +1,7 @@
From c5e0cc85307942efce6b7946be166ea7ef7ada79 Mon Sep 17 00:00:00 2001
From 8f0ce0a1ae603cb32b2ab39a6bb7d3ad86092c46 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sun, 11 Oct 2020 10:43:28 +0200
Subject: [PATCH 14/31] Fix G1 nmethod registration
Subject: [PATCH 14/33] Fix G1 nmethod registration
---
.../prims/jvmtiEnhancedRedefineClasses.cpp | 19 ++++++++++++++++---

View File

@@ -1,7 +1,7 @@
From 24f735428a47eeaa0ac5e84f41a437d4964c35ba Mon Sep 17 00:00:00 2001
From 08f455c41f2db7b810c10fa208fc90f55a06fa87 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Thu, 22 Oct 2020 20:15:20 +0200
Subject: [PATCH 15/31] Initialize method's _new_version/_old_version to NULL
Subject: [PATCH 15/33] Initialize method's _new_version/_old_version to NULL
---
src/hotspot/share/oops/method.cpp | 3 ++-

View File

@@ -1,7 +1,7 @@
From 4ca5a545df83c41c0ee4465d5d598aa83f1b106c Mon Sep 17 00:00:00 2001
From 82bbf38d7385e26f28f47df65b58b1ab7f8c52c3 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Fri, 23 Oct 2020 10:20:26 +0200
Subject: [PATCH 16/31] Clear dcevm code separation
Subject: [PATCH 16/33] Clear dcevm code separation
---
src/hotspot/share/classfile/systemDictionary.cpp | 4 ++--
@@ -15,7 +15,7 @@ Subject: [PATCH 16/31] Clear dcevm code separation
8 files changed, 27 insertions(+), 17 deletions(-)
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
index 1dd53e0b7bc..fe537421e22 100644
index 42e0fee800f..be4d2010c0c 100644
--- a/src/hotspot/share/classfile/systemDictionary.cpp
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
@@ -1152,7 +1152,7 @@ InstanceKlass* SystemDictionary::resolve_from_stream(Symbol* class_name,
@@ -106,7 +106,7 @@ index 61a406377ee..da9df7a21a2 100644
if (HAS_PENDING_EXCEPTION) {
log_pending_exception(PENDING_EXCEPTION);
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
index 7eb1b01c785..710e0ddc930 100644
index 76791cdd905..cb448b1b762 100644
--- a/src/hotspot/share/oops/instanceKlass.cpp
+++ b/src/hotspot/share/oops/instanceKlass.cpp
@@ -178,7 +178,9 @@ bool InstanceKlass::has_nest_member(InstanceKlass* k, TRAPS) const {
@@ -138,7 +138,7 @@ index 7eb1b01c785..710e0ddc930 100644
wait = true;
ol.waitUninterruptibly(CHECK);
}
@@ -3617,7 +3619,7 @@ void InstanceKlass::verify_on(outputStream* st) {
@@ -3629,7 +3631,7 @@ void InstanceKlass::verify_on(outputStream* st) {
guarantee(sib->is_klass(), "should be klass");
// TODO: (DCEVM) explain
@@ -174,7 +174,7 @@ index 60604c645ff..325bffb7ad0 100644
}
}
diff --git a/src/hotspot/share/runtime/reflection.cpp b/src/hotspot/share/runtime/reflection.cpp
index ed789b0bc2b..06f60855655 100644
index ac233f3b373..ae0cb65969a 100644
--- a/src/hotspot/share/runtime/reflection.cpp
+++ b/src/hotspot/share/runtime/reflection.cpp
@@ -660,7 +660,7 @@ bool Reflection::verify_member_access(const Klass* current_class,

View File

@@ -1,7 +1,7 @@
From e029e021d4fbc24506571ad83555189175b9ebad Mon Sep 17 00:00:00 2001
From 19981a51c2ea2322f958216fa2c6e83604138d7e Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Fri, 23 Oct 2020 11:07:40 +0200
Subject: [PATCH 17/31] Fix metadataOnStack bug
Subject: [PATCH 17/33] Fix metadataOnStack bug
---
.../share/classfile/classLoaderData.cpp | 7 +-
@@ -11,7 +11,7 @@ Subject: [PATCH 17/31] Fix metadataOnStack bug
4 files changed, 41 insertions(+), 38 deletions(-)
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index d5ee3c0338c..0376777649b 100644
index a901b4309b9..7b88f6b44d9 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -1401,13 +1401,10 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {

View File

@@ -1,14 +1,14 @@
From fac0c15ae914e5b45fece5dc8d35d389098bdff7 Mon Sep 17 00:00:00 2001
From 163cf26017433389041f824c7d8342eb54f4cef8 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sun, 1 Nov 2020 21:19:00 +0100
Subject: [PATCH 18/31] Ignore MetadataOnStackMark if redefining_gc_run
Subject: [PATCH 18/33] Ignore MetadataOnStackMark if redefining_gc_run
---
src/hotspot/share/classfile/classLoaderData.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index 0376777649b..b649d6358ed 100644
index 7b88f6b44d9..2f6329f3e4d 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -1404,7 +1404,7 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {

View File

@@ -1,7 +1,7 @@
From 992ae7e64b6af91e1aab29577203ff2e9fce0dd4 Mon Sep 17 00:00:00 2001
From 1876c6a039a2b866dd9d2c3dbbcc52e8f7af4d2a Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Wed, 11 Nov 2020 18:45:15 +0100
Subject: [PATCH 19/31] Fix LoadedClassesClosure - fixes problems with remote
Subject: [PATCH 19/33] Fix LoadedClassesClosure - fixes problems with remote
debugging
---

View File

@@ -1,7 +1,7 @@
From e20336116249d0b7ddb6bfcc69c54627da31d122 Mon Sep 17 00:00:00 2001
From ad9db6fe3e625d0b366898c3bdb2589b678f6764 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Fri, 5 Feb 2021 23:30:49 +0100
Subject: [PATCH 20/31] Disable AllowEnhancedClassRedefinition in flight
Subject: [PATCH 20/33] Disable AllowEnhancedClassRedefinition in flight
recorder
---
@@ -9,10 +9,10 @@ Subject: [PATCH 20/31] Disable AllowEnhancedClassRedefinition in flight
1 file changed, 7 insertions(+)
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index 5053ad7ee61..c5635bb8537 100644
index 0db55d00bd3..65839b842e2 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -3962,6 +3962,13 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
@@ -3967,6 +3967,13 @@ jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
// Set object alignment values.
set_object_alignment();

View File

@@ -1,7 +1,7 @@
From 970ff0fd814d94573b929cbc222ff731d3e6e1c8 Mon Sep 17 00:00:00 2001
From 4bcccb549465675d13a1f5bb399ca99654465ca5 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Fri, 12 Feb 2021 12:33:11 +0100
Subject: [PATCH 21/31] JBR-3106 Check InstanceKlass::has_nestmate_access_to
Subject: [PATCH 21/33] JBR-3106 Check InstanceKlass::has_nestmate_access_to
with active classes
Dcevm can leave old host in nested class if nested class is not
@@ -11,7 +11,7 @@ redefined together with host class
1 file changed, 10 insertions(+)
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
index 710e0ddc930..24eb3ed68a6 100644
index cb448b1b762..234c3e86037 100644
--- a/src/hotspot/share/oops/instanceKlass.cpp
+++ b/src/hotspot/share/oops/instanceKlass.cpp
@@ -327,11 +327,21 @@ bool InstanceKlass::has_nestmate_access_to(InstanceKlass* k, TRAPS) {

View File

@@ -1,7 +1,7 @@
From fc955c851f24501927e14d8200ddc7f2c05faa3c Mon Sep 17 00:00:00 2001
From b45056c713cd7f8496bc9fb9528ff8a20c112c76 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sun, 7 Feb 2021 12:08:58 +0100
Subject: [PATCH 22/31] JBR-3110 Fix assert in MetadataOnStackMark
Subject: [PATCH 22/33] JBR-3110 Fix assert in MetadataOnStackMark
Fixed fastdebug tests crashes in redefine gc run
---

View File

@@ -1,7 +1,7 @@
From 66d88a8d5abfc1dbadf860930bb662cd9c9c690b Mon Sep 17 00:00:00 2001
From ae2b3fba2882b52ec7c5a9ac49d179616fc49e77 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Fri, 12 Feb 2021 11:27:39 +0100
Subject: [PATCH 23/31] Code cleanup
Subject: [PATCH 23/33] Code cleanup
- Rename confusing method name old_if_redefined to old_if_redefining
- Remove unused is_redefining_gc_run
@@ -12,7 +12,7 @@ Subject: [PATCH 23/31] Code cleanup
3 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
index a97b48fe5bb..781a929e7de 100644
index 86dc1f26933..d347f572350 100644
--- a/src/hotspot/share/classfile/dictionary.cpp
+++ b/src/hotspot/share/classfile/dictionary.cpp
@@ -381,7 +381,7 @@ InstanceKlass* Dictionary::find(unsigned int hash, Symbol* name,

View File

@@ -1,7 +1,7 @@
From 94482d0b6d49ee57870c8dcefc207cb1ec707065 Mon Sep 17 00:00:00 2001
From 3af6608b1808653ad706b447e6e96a039819d03f Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sat, 13 Feb 2021 20:47:52 +0100
Subject: [PATCH 24/31] JBR-3111 Update class in all dictionaries where it was
Subject: [PATCH 24/33] JBR-3111 Update class in all dictionaries where it was
already defined
This patch keeps compatibility with std redefinition, that does not
@@ -16,7 +16,7 @@ dictionaries containing this class.
5 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index b649d6358ed..a70d92c27fc 100644
index 2f6329f3e4d..68df33b6c40 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -1277,6 +1277,15 @@ void ClassLoaderDataGraph::rollback_redefinition() {
@@ -36,7 +36,7 @@ index b649d6358ed..a70d92c27fc 100644
void ClassLoaderDataGraph::dictionary_all_entries_do(void f(InstanceKlass*, ClassLoaderData*)) {
Thread* thread = Thread::current();
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
index 00a84610b43..16711dca237 100644
index c4f617ab800..92f57dac23e 100644
--- a/src/hotspot/share/classfile/classLoaderData.hpp
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
@@ -130,6 +130,9 @@ class ClassLoaderDataGraph : public AllStatic {
@@ -50,7 +50,7 @@ index 00a84610b43..16711dca237 100644
static void dictionary_all_entries_do(void f(InstanceKlass*, ClassLoaderData*));
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
index 781a929e7de..a1baaef86f5 100644
index d347f572350..fd9ef491ba1 100644
--- a/src/hotspot/share/classfile/dictionary.cpp
+++ b/src/hotspot/share/classfile/dictionary.cpp
@@ -345,7 +345,7 @@ DictionaryEntry* Dictionary::get_entry(int index, unsigned int hash,
@@ -76,7 +76,7 @@ index f6e08e7bfd5..2932cc9c320 100644
void rollback_redefinition();
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
index fe537421e22..f7452adcf02 100644
index be4d2010c0c..d0365162b81 100644
--- a/src/hotspot/share/classfile/systemDictionary.cpp
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
@@ -1608,7 +1608,9 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, InstanceKlass* ol

View File

@@ -1,7 +1,7 @@
From 7a7a6733faf1ef9fd4787fd67d99e846f480e922 Mon Sep 17 00:00:00 2001
From 7cbf2af248f33daa6fb5b55a7fb9316b1d2680e0 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Thu, 18 Jun 2020 18:40:11 +0200
Subject: [PATCH 25/31] JBR-3140 - support for modularized HotswapAgent
Subject: [PATCH 25/33] JBR-3140 - support for modularized HotswapAgent
Add -XX:HotswapAgent=[disabled,fatjar.core]
---
@@ -349,10 +349,10 @@ index bd39f8595b2..82311e69fd6 100644
CFLAGS := -DENABLE_ARG_FILES, \
))
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index c5635bb8537..d7fee6a8c95 100644
index 65839b842e2..dce89a044e9 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -4310,11 +4310,17 @@ void Arguments::setup_hotswap_agent() {
@@ -4315,11 +4315,17 @@ void Arguments::setup_hotswap_agent() {
if (DumpSharedSpaces)
return;
@@ -372,7 +372,7 @@ index c5635bb8537..d7fee6a8c95 100644
char ext_path_str[JVM_MAXPATHLEN];
@@ -4333,23 +4339,27 @@ void Arguments::setup_hotswap_agent() {
@@ -4338,23 +4344,27 @@ void Arguments::setup_hotswap_agent() {
}
}
if (ext_path_length < JVM_MAXPATHLEN - 10) {

View File

@@ -1,7 +1,7 @@
From cb2c85624c82ec9f9c30ba4a8122eb23e806999c Mon Sep 17 00:00:00 2001
From 8dd54d6e012458db96f199550d0f6016537c6d82 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Mon, 8 Mar 2021 02:22:54 +0700
Subject: [PATCH 26/31] Support for redefinition of Well Known classses
Subject: [PATCH 26/33] Support for redefinition of Well Known classses
(java.*,jdk.*, sun.*)
---
@@ -31,7 +31,7 @@ index 896f489453a..c610c365aba 100644
#endif // SHARE_VM_CI_CIKLASS_HPP
diff --git a/src/hotspot/share/ci/ciObjectFactory.cpp b/src/hotspot/share/ci/ciObjectFactory.cpp
index 66bbe835e7b..107c16fa5cf 100644
index c8a03aa9ee9..6b187909943 100644
--- a/src/hotspot/share/ci/ciObjectFactory.cpp
+++ b/src/hotspot/share/ci/ciObjectFactory.cpp
@@ -70,7 +70,10 @@ GrowableArray<ciMetadata*>* ciObjectFactory::_shared_ci_metadata = NULL;
@@ -122,7 +122,7 @@ index 3e9d48c4cdc..79059f6e2e8 100644
void remove_symbols();
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
index f7452adcf02..1d2c7d22ce0 100644
index d0365162b81..74f30524279 100644
--- a/src/hotspot/share/classfile/systemDictionary.cpp
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
@@ -1985,6 +1985,16 @@ bool SystemDictionary::is_well_known_klass(Symbol* class_name) {
@@ -169,7 +169,7 @@ index 0d0badeabd0..3477a408cb6 100644
template(threads_name, "threads") \
template(groups_name, "groups") \
diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp
index 0ed0ca52cb0..4f64beae978 100644
index 80a940980a5..5ec54baec96 100644
--- a/src/hotspot/share/compiler/compileBroker.cpp
+++ b/src/hotspot/share/compiler/compileBroker.cpp
@@ -1877,6 +1877,17 @@ void CompileBroker::compiler_thread_loop() {
@@ -191,7 +191,7 @@ index 0ed0ca52cb0..4f64beae978 100644
thread->start_idle_timer();
} else {
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
index 3dc4cc1323c..6b88271b5ef 100644
index 2e4f597cf1f..4b2c3e62941 100644
--- a/src/hotspot/share/memory/universe.cpp
+++ b/src/hotspot/share/memory/universe.cpp
@@ -1030,6 +1030,14 @@ void Universe::initialize_known_methods(TRAPS) {

View File

@@ -1,7 +1,7 @@
From 5325334e5f75c8c5fd711c021764901b8fa81a33 Mon Sep 17 00:00:00 2001
From 91cfd6de1aac67a2f096568fda3b5992c19bddfb Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Fri, 19 Mar 2021 19:13:38 +0100
Subject: [PATCH 27/31] JBR-3458: Skip dynamic proxy classes based on
Subject: [PATCH 27/33] JBR-3458: Skip dynamic proxy classes based on
com.sun.proxy
---

View File

@@ -1,7 +1,7 @@
From 6ec78dba58b2e05b373dda3ca6a7f6b5c837b331 Mon Sep 17 00:00:00 2001
From 33a280c972960380f3627fd178d170b14f0b7995 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
Date: Sat, 20 Mar 2021 20:51:08 +0100
Subject: [PATCH 28/31] JBR-3459: Fix race condition in
Subject: [PATCH 28/33] JBR-3459: Fix race condition in
ClassLoaderDataGraph::classes_do
InstanceKlass in ClassLoaderData can be uninitialized when
@@ -15,7 +15,7 @@ persisting with anonymous classes.
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
index a70d92c27fc..f6764ff37a0 100644
index 68df33b6c40..b12784954af 100644
--- a/src/hotspot/share/classfile/classLoaderData.cpp
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
@@ -1169,6 +1169,16 @@ void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
@@ -36,7 +36,7 @@ index a70d92c27fc..f6764ff37a0 100644
Thread* thread = Thread::current();
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
index 16711dca237..b10fafa01e5 100644
index 92f57dac23e..c4c17112a2d 100644
--- a/src/hotspot/share/classfile/classLoaderData.hpp
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
@@ -108,6 +108,10 @@ class ClassLoaderDataGraph : public AllStatic {

View File

@@ -1,7 +1,7 @@
From 0bfeca57132d21f8bc68079ee41dd42bead48f02 Mon Sep 17 00:00:00 2001
From daa0ca3b718e428ffde26e9633a07a37658beb61 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Sun, 10 Oct 2021 20:25:30 +0200
Subject: [PATCH 29/31] JBR-3867 - update keys of jvmti TAG map after
Subject: [PATCH 29/33] JBR-3867 - update keys of jvmti TAG map after
redefinition
jdwp keeps relation class_ptr->class_ref in jvmti tag. class_ptr is used

View File

@@ -1,7 +1,7 @@
From 16a09678b838d67b0a80340ba904b600013a494f Mon Sep 17 00:00:00 2001
From d7ea3b028367ca5ac2b622a2282bb4e468442e4b Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Mon, 11 Oct 2021 20:22:26 +0200
Subject: [PATCH 30/31] JBR-3867 - fix msvc compilation issue with non const
Subject: [PATCH 30/33] JBR-3867 - fix msvc compilation issue with non const
array on stack
---

View File

@@ -1,7 +1,7 @@
From 8d3ebd313983584f63e2d5b3e32f3e2c60191711 Mon Sep 17 00:00:00 2001
From 6dc05f05716854367e229d72d5fa03f8f7d0739d Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Tue, 19 Oct 2021 17:02:35 +0200
Subject: [PATCH 31/31] Attempt to fix JBR-3887
Subject: [PATCH 31/33] Attempt to fix JBR-3887
---
src/hotspot/share/prims/jvmtiExtensions.cpp | 8 +++++++-

View File

@@ -0,0 +1,141 @@
From 256af0b88776c1ba2afdae760d3220ef48a644aa Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Mon, 1 Nov 2021 19:00:41 +0100
Subject: [PATCH 32/33] JBR-3937 Fix crashes in C1/C2 compilers
There is a race condition in enhanced redefinition with C1/C2. Therefore
the patch stops C1/C2 compilation before redefinition and release after
redefinition finishing. There is no performance impact since dcevm
flushes all code cache.
---
src/hotspot/share/compiler/compileBroker.cpp | 39 +++++++++++++++++++-
src/hotspot/share/compiler/compileBroker.hpp | 6 +++
src/hotspot/share/prims/jvmtiEnv.cpp | 7 ++++
3 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp
index 5ec54baec96..a72560069e4 100644
--- a/src/hotspot/share/compiler/compileBroker.cpp
+++ b/src/hotspot/share/compiler/compileBroker.cpp
@@ -133,6 +133,8 @@ CompileLog** CompileBroker::_compiler2_logs = NULL;
// These counters are used to assign an unique ID to each compilation.
volatile jint CompileBroker::_compilation_id = 0;
volatile jint CompileBroker::_osr_compilation_id = 0;
+volatile bool CompileBroker::_compilation_stopped = false;
+volatile int CompileBroker::_active_compilations = 0;
// Debugging information
int CompileBroker::_last_compile_type = no_compile;
@@ -2203,7 +2205,22 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
locker.wait(Mutex::_no_safepoint_check_flag);
}
}
- comp->compile_method(&ci_env, target, osr_bci, directive);
+
+ if (AllowEnhancedClassRedefinition) {
+ {
+ MonitorLockerEx locker(Compilation_lock, Mutex::_no_safepoint_check_flag);
+ while (_compilation_stopped) {
+ locker.wait(Mutex::_no_safepoint_check_flag);
+ }
+ Atomic::add(1, &_active_compilations);
+ }
+
+ comp->compile_method(&ci_env, target, osr_bci, directive);
+ Atomic::sub(1, &_active_compilations);
+
+ } else {
+ comp->compile_method(&ci_env, target, osr_bci, directive);
+ }
}
if (!ci_env.failing() && task->code() == NULL) {
@@ -2865,3 +2882,23 @@ void CompileBroker::print_heapinfo(outputStream* out, const char* function, size
}
out->print_cr("\n__ CodeHeapStateAnalytics total duration %10.3f seconds _________\n", ts_total.seconds());
}
+
+void CompileBroker::stopCompilationBeforeEnhancedRedefinition() {
+ if (AllowEnhancedClassRedefinition) {
+ MonitorLockerEx locker(Compilation_lock, Mutex::_no_safepoint_check_flag);
+ _compilation_stopped = true;
+ while (_active_compilations > 0) {
+ VM_ThreadsSuspendJVMTI tsj;
+ VMThread::execute(&tsj);
+ locker.wait(Mutex::_no_safepoint_check_flag);
+ }
+ }
+}
+
+void CompileBroker::releaseCompilationAfterEnhancedRedefinition() {
+ if (AllowEnhancedClassRedefinition) {
+ MonitorLockerEx locker(Compilation_lock, Mutex::_no_safepoint_check_flag);
+ _compilation_stopped = false;
+ locker.notify_all();
+ }
+}
diff --git a/src/hotspot/share/compiler/compileBroker.hpp b/src/hotspot/share/compiler/compileBroker.hpp
index 53e496cd306..fa50e778d9e 100644
--- a/src/hotspot/share/compiler/compileBroker.hpp
+++ b/src/hotspot/share/compiler/compileBroker.hpp
@@ -173,6 +173,9 @@ class CompileBroker: AllStatic {
static volatile jint _compilation_id;
static volatile jint _osr_compilation_id;
+ static volatile bool _compilation_stopped;
+ static volatile int _active_compilations;
+
static int _last_compile_type;
static int _last_compile_level;
static char _last_method_compiled[name_buffer_length];
@@ -421,6 +424,9 @@ public:
// CodeHeap State Analytics.
static void print_info(outputStream *out);
static void print_heapinfo(outputStream *out, const char* function, size_t granularity);
+
+ static void stopCompilationBeforeEnhancedRedefinition();
+ static void releaseCompilationAfterEnhancedRedefinition();
};
#endif // SHARE_VM_COMPILER_COMPILEBROKER_HPP
diff --git a/src/hotspot/share/prims/jvmtiEnv.cpp b/src/hotspot/share/prims/jvmtiEnv.cpp
index 54617f05b5a..0ca9ec020a9 100644
--- a/src/hotspot/share/prims/jvmtiEnv.cpp
+++ b/src/hotspot/share/prims/jvmtiEnv.cpp
@@ -29,6 +29,7 @@
#include "classfile/modules.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
+#include "compiler/compileBroker.hpp"
#include "interpreter/bytecodeStream.hpp"
#include "interpreter/interpreter.hpp"
#include "jvmtifiles/jvmtiEnv.hpp"
@@ -453,9 +454,12 @@ JvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) {
class_definitions[index].klass = jcls;
}
if (AllowEnhancedClassRedefinition) {
+ // Stop compilation to avoid compilator race condition (crashes) with advanced redefinition
+ CompileBroker::stopCompilationBeforeEnhancedRedefinition();
MutexLocker sd_mutex(EnhancedRedefineClasses_lock);
VM_EnhancedRedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_retransform);
VMThread::execute(&op);
+ CompileBroker::releaseCompilationAfterEnhancedRedefinition();
return (op.check_error());
}
VM_RedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_retransform);
@@ -469,9 +473,12 @@ JvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) {
jvmtiError
JvmtiEnv::RedefineClasses(jint class_count, const jvmtiClassDefinition* class_definitions) {
if (AllowEnhancedClassRedefinition) {
+ // Stop compilation to avoid compilator race condition (crashes) with advanced redefinition
+ CompileBroker::stopCompilationBeforeEnhancedRedefinition();
MutexLocker sd_mutex(EnhancedRedefineClasses_lock);
VM_EnhancedRedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_redefine);
VMThread::execute(&op);
+ CompileBroker::releaseCompilationAfterEnhancedRedefinition();
return (op.check_error());
}
VM_RedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_redefine);
--
2.23.0

View File

@@ -0,0 +1,121 @@
From 81d93376d08058144aa5b2ecf6744d607c516e88 Mon Sep 17 00:00:00 2001
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
Date: Tue, 2 Nov 2021 01:20:13 +0700
Subject: [PATCH 33/33] JBR-3938 - fix race condition in anonymous class
loading
Anonymous class must be checked if it is fully initialized if it is used
in ClassLoaderDataGraph closure.
---
.../prims/jvmtiEnhancedRedefineClasses.cpp | 44 ++++++-------------
.../prims/jvmtiEnhancedRedefineClasses.hpp | 1 -
2 files changed, 14 insertions(+), 31 deletions(-)
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
index 745109902af..1e63561064a 100644
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
@@ -517,8 +517,6 @@ void VM_EnhancedRedefineClasses::doit() {
ClassLoaderDataGraph::classes_do(&clear_cpool_cache);
- // SystemDictionary::methods_do(fix_invoke_method);
-
// JSR-292 support
if (_any_class_has_resolved_methods) {
bool trace_name_printed = false;
@@ -647,10 +645,6 @@ void VM_EnhancedRedefineClasses::doit() {
// TODO: explain...
ciObjectFactory::resort_shared_ci_metadata();
- // FIXME - check if it was in JDK8. Copied from standard JDK9 hotswap.
- //MethodDataCleaner clean_weak_method_links;
- //ClassLoaderDataGraph::classes_do(&clean_weak_method_links);
-
// Disable any dependent concurrent compilations
SystemDictionary::notice_modification();
@@ -1568,29 +1562,6 @@ void VM_EnhancedRedefineClasses::MethodDataCleaner::do_klass(Klass* k) {
}
}
-void VM_EnhancedRedefineClasses::fix_invoke_method(Method* method) {
-
- constantPoolHandle other_cp = constantPoolHandle(method->constants());
-
- for (int i = 0; i < other_cp->length(); i++) {
- if (other_cp->tag_at(i).is_klass()) {
- Klass* klass = other_cp->resolved_klass_at(i);
- if (klass->new_version() != NULL) {
- // Constant pool entry points to redefined class -- update to the new version
- other_cp->klass_at_put(i, klass->newest_version());
- }
- assert(other_cp->resolved_klass_at(i)->new_version() == NULL, "Must be new klass!");
- }
- }
-
- ConstantPoolCache* cp_cache = other_cp->cache();
- if (cp_cache != NULL) {
- cp_cache->clear_entries();
- }
-
-}
-
-
void VM_EnhancedRedefineClasses::update_jmethod_ids() {
for (int j = 0; j < _matching_methods_length; ++j) {
@@ -2071,12 +2042,23 @@ void VM_EnhancedRedefineClasses::dump_methods() {
class AffectedKlassClosure : public KlassClosure {
private:
GrowableArray<Klass*>* _affected_klasses;
+ bool _is_anonymous;
public:
- AffectedKlassClosure(GrowableArray<Klass*>* affected_klasses) : _affected_klasses(affected_klasses) {}
+ AffectedKlassClosure(GrowableArray<Klass*>* affected_klasses) : _affected_klasses(affected_klasses), _is_anonymous(false) {}
+
+ bool is_anonymous() { return _is_anonymous; }
+ void set_anonymous(bool value) { _is_anonymous = value; }
void do_klass(Klass* klass) {
assert(!_affected_klasses->contains(klass), "must not occur more than once!");
+ if (_is_anonymous && klass->is_instance_klass()) {
+ InstanceKlass *ik = InstanceKlass::cast(klass);
+ if (ik->is_not_initialized()) {
+ return; // anonymous class does not need to be initialized
+ }
+ }
+
if (klass->new_version() != NULL) {
return;
}
@@ -2135,11 +2117,13 @@ jvmtiError VM_EnhancedRedefineClasses::find_sorted_affected_classes(TRAPS) {
// ClassLoaderDataGraph::classes_do(&closure);
// 1. Scan over dictionaries
+ closure.set_anonymous(false);
ClassLoaderDataGraph::dictionary_classes_do(&closure);
// 2. Anonymous class is not in dictionary, we have to iterate anonymous cld directly, but there is race cond...
// TODO: review ... anonymous class is added to cld before InstanceKlass initialization,
// find out how to check if the InstanceKlass is initialized
+ closure.set_anonymous(true);
ClassLoaderDataGraph::anonymous_classes_do(&closure);
log_trace(redefine, class, load)("%d classes affected", _affected_klasses->length());
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
index 8c47baa8a74..c69325ca4ab 100644
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
@@ -119,7 +119,6 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
static void unregister_nmethod_g1(nmethod* nm);
static void register_nmethod_g1(nmethod* nm);
static void unpatch_bytecode(Method* method);
- static void fix_invoke_method(Method* method);
// Figure out which new methods match old methods in name and signature,
// which methods have been added, and which are no longer present
--
2.23.0