!126 IB7YRU: Add jbolt and enhance jbooster

From: @neu-mobi 
Reviewed-by: @kuenking111 
Signed-off-by: @kuenking111
This commit is contained in:
openeuler-ci-bot 2024-12-02 13:01:12 +00:00 committed by Gitee
commit 6fd8e4530f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
13 changed files with 15252 additions and 23 deletions

View File

@ -3717,7 +3717,7 @@ index 000000000..40c187ec7
+
+#include "aot/aotCompiledMethod.hpp"
+#include "classfile/symbolTable.hpp"
+#include "metaprogramming/integralConstant.hpp"
+//#include "metaprogramming/integralConstant.hpp"
+#include "oops/metadata.hpp"
+#include "oops/method.hpp"
+

View File

@ -0,0 +1,24 @@
From 4c0d9de31c79d6e8e71fda0d8bc67c7352451dc0 Mon Sep 17 00:00:00 2001
Date: Fri, 29 Nov 2024 16:48:18 +0800
Subject: 8323066 TestSkipRebuildRemsetPhase.java fails with Skipping Remembered Set Rebuild
---
test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java b/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java
index 860d3ce48..1a4c13132 100644
--- a/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java
+++ b/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java
@@ -45,7 +45,7 @@ public class TestSkipRebuildRemsetPhase {
"-XX:+UnlockExperimentalVMOptions",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
- "-XX:G1MixedGCLiveThresholdPercent=20",
+ "-XX:G1MixedGCLiveThresholdPercent=0",
"-Xlog:gc+marking=debug,gc+phases=debug,gc+remset+tracking=trace",
"-Xms10M",
"-Xmx10M",
--
2.22.0

View File

@ -0,0 +1,24 @@
From 530c07c5f332d2bce540acb181652f64457ec6c6 Mon Sep 17 00:00:00 2001
Date: Fri, 29 Nov 2024 16:00:40 +0800
Subject: Add Fix clear mark for NativeGotJump
---
src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp
index fe7461964..f9438c235 100644
--- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp
@@ -131,7 +131,7 @@ void NativePltCall::set_stub_to_clean() {
NativeLoadGot* method_loader = nativeLoadGot_at(plt_c2i_stub());
NativeGotJump* jump = nativeGotJump_at(method_loader->next_instruction_address());
method_loader->set_data(0);
- jump->set_jump_destination((address)-1);
+ jump->set_jump_destination((address)Universe::non_oop_word());
}
void NativePltCall::verify() const {
--
2.22.0

View File

@ -11597,7 +11597,7 @@ new file mode 100644
index 000000000..9c4e58ec4
--- /dev/null
+++ b/src/hotspot/share/jbooster/utilities/debugUtils.inline.hpp
@@ -0,0 +1,67 @@
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@ -11637,7 +11637,7 @@ index 000000000..9c4e58ec4
+ * Attention: the type name string is allocated on the heap!
+ */
+template <typename T>
+const char* DebugUtils::type_name() {
+ const char* DebugUtils::type_name() {
+ const char* sig = PLATFORM_FUNC_SIG;
+ const int sig_len = strlen(sig);
+ const int res_len = sig_len - _func_sig_prefix_len - _func_sig_suffix_len;
@ -11647,9 +11647,8 @@ index 000000000..9c4e58ec4
+ return res;
+}
+
+template <LogLevelType level, LogTagType T0, LogTagType T1 = LogTag::__NO_TAG, LogTagType T2 = LogTag::__NO_TAG,
+ LogTagType T3 = LogTag::__NO_TAG, LogTagType T4 = LogTag::__NO_TAG, LogTagType GuardTag = LogTag::__NO_TAG>
+void DebugUtils::clear_java_exception_and_print_stack_trace(LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>& lt, TRAPS) {
+template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
+ void DebugUtils::clear_java_exception_and_print_stack_trace(LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>& lt, TRAPS) {
+ if (!HAS_PENDING_EXCEPTION) return;
+
+ if (lt.is_enabled()) {

View File

@ -0,0 +1,121 @@
From e2fd78d2cb7771f7cbc884e8c36d9a91fa0f8696 Mon Sep 17 00:00:00 2001
Date: Fri, 29 Nov 2024 15:40:37 +0800
Subject: Add KAE-zip GzipKAEBenchmark Benchmark
---
test/jdk/java/util/zip/GzipKAEBenchmark.java | 102 +++++++++++++++++++
1 file changed, 102 insertions(+)
create mode 100644 test/jdk/java/util/zip/GzipKAEBenchmark.java
diff --git a/test/jdk/java/util/zip/GzipKAEBenchmark.java b/test/jdk/java/util/zip/GzipKAEBenchmark.java
new file mode 100644
index 000000000..6d753e14e
--- /dev/null
+++ b/test/jdk/java/util/zip/GzipKAEBenchmark.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2024, Huawei Technologies Co., Ltd. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+import java.util.concurrent.TimeUnit;
+import java.util.Random;
+
+@BenchmarkMode(Mode.SampleTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Warmup(iterations = 5, time = 5, timeUnit = TimeUnit.MILLISECONDS)
+@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.MILLISECONDS)
+@Fork(jvmArgsPrepend = {"-Xms1G", "-Xmx1G", "-XX:+AlwaysPreTouch"}, value = 1)
+@Threads(1)
+@State(Scope.Benchmark)
+public class GzipKAEBenchmark {
+
+ private byte[] srcBytes;
+ private byte[] dstBytes;
+
+ Random rnd = new Random(8192);
+ ByteArrayOutputStream srcBAOS = new ByteArrayOutputStream();
+ ByteArrayOutputStream dstBAOS = new ByteArrayOutputStream();
+
+ @Setup
+ public void setup() throws IOException {
+ Random rnd = new Random(8192);
+ ByteArrayOutputStream srcBAOS = new ByteArrayOutputStream();
+ ByteArrayOutputStream dstBAOS = new ByteArrayOutputStream();
+ for (int j = 0; j < 8192; j++) {
+ byte[] src = new byte[rnd.nextInt(8192) + 1];
+ rnd.nextBytes(src);
+ srcBAOS.write(src);
+ }
+ srcBytes = srcBAOS.toByteArray();
+ try (GZIPOutputStream gzos = new GZIPOutputStream(dstBAOS)) {
+ gzos.write(srcBytes);
+ }
+ dstBytes = dstBAOS.toByteArray();
+ }
+
+ @Param({"512", "2048", "10240", "51200", "204800"})
+ private int BuffSize;
+
+ @Benchmark
+ public void GzipDeflateTest() throws IOException{
+ ByteArrayOutputStream byteArrayInputStream = new ByteArrayOutputStream();
+ try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayInputStream, BuffSize)) {
+ gzipOutputStream.write(srcBytes);
+ }
+ }
+
+ @Benchmark
+ public void GzipInflateTest() {
+ ByteArrayInputStream bais = new ByteArrayInputStream(dstBytes);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ try (GZIPInputStream gzipInputStream = new GZIPInputStream(bais, BuffSize)) {
+ byte[] buffer = new byte[1024*1024];
+ int len;
+ while ((len = gzipInputStream.read(buffer)) > 0) {
+ byteArrayOutputStream.write(buffer, 0, len);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
--
2.22.0

5233
Add-jbolt-feature.patch Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,699 @@
From bcc1964f3ac7ffe6995f6734bc14cbbe07a09363 Mon Sep 17 00:00:00 2001
Date: Fri, 29 Nov 2024 15:38:42 +0800
Subject: Implement JBooster RPC byte alignment
---
.../share/jbooster/jClientArguments.cpp | 21 +++
.../share/jbooster/jClientArguments.hpp | 5 +
.../share/jbooster/net/messageBuffer.cpp | 34 ++++-
.../share/jbooster/net/messageBuffer.hpp | 19 ++-
.../jbooster/net/messageBuffer.inline.hpp | 44 +++++-
.../share/jbooster/net/rpcCompatibility.cpp | 43 ++++--
.../share/jbooster/net/serialization.hpp | 13 +-
.../jbooster/server/serverDataManager.cpp | 22 +--
.../jbooster/server/serverDataManager.hpp | 4 +-
.../jbooster/server/serverMessageHandler.cpp | 6 +-
test/hotspot/gtest/jbooster/test_net.cpp | 129 ++++++++++++++----
11 files changed, 272 insertions(+), 68 deletions(-)
diff --git a/src/hotspot/share/jbooster/jClientArguments.cpp b/src/hotspot/share/jbooster/jClientArguments.cpp
index 37093d031..b215913ea 100644
--- a/src/hotspot/share/jbooster/jClientArguments.cpp
+++ b/src/hotspot/share/jbooster/jClientArguments.cpp
@@ -34,6 +34,27 @@
#include "runtime/arguments.hpp"
#include "utilities/stringUtils.hpp"
+int JClientBoostLevel::serialize(MessageBuffer& buf) const {
+ uint8_t v = (_allow_clr ? (1 << 0) : 0)
+ | (_allow_cds ? (1 << 1) : 0)
+ | (_allow_aot ? (1 << 2) : 0)
+ | (_enable_aot_pgo ? (1 << 3) : 0)
+ | (_enable_cds_agg ? (1 << 4) : 0);
+ return buf.serialize_no_meta(v);
+}
+
+int JClientBoostLevel::deserialize(MessageBuffer& buf) {
+ uint8_t v = 0b10000000;
+ JB_RETURN(buf.deserialize_ref_no_meta(v));
+ assert((v & 0b10000000) == 0, "sanity");
+ _allow_clr = (v & (1 << 0));
+ _allow_cds = (v & (1 << 1));
+ _allow_aot = (v & (1 << 2));
+ _enable_aot_pgo = (v & (1 << 3));
+ _enable_cds_agg = (v & (1 << 4));
+ return 0;
+}
+
static JClientArguments::CpuArch calc_cpu() {
#ifdef X86
return JClientArguments::CpuArch::CPU_X86;
diff --git a/src/hotspot/share/jbooster/jClientArguments.hpp b/src/hotspot/share/jbooster/jClientArguments.hpp
index be057a07d..09c5dfdc0 100644
--- a/src/hotspot/share/jbooster/jClientArguments.hpp
+++ b/src/hotspot/share/jbooster/jClientArguments.hpp
@@ -49,8 +49,13 @@ public:
void set_allow_aot(bool allow_aot) { _allow_aot = allow_aot; }
void set_enable_aot_pgo(bool enable_aot_pgo) { _enable_aot_pgo = enable_aot_pgo; }
void set_enable_cds_agg(bool enable_cds_agg) { _enable_cds_agg = enable_cds_agg; }
+
+ int serialize(MessageBuffer& buf) const;
+ int deserialize(MessageBuffer& buf);
};
+DECLARE_SERIALIZER_INTRUSIVE(JClientBoostLevel);
+
/**
* Arguments that identify a program.
*/
diff --git a/src/hotspot/share/jbooster/net/messageBuffer.cpp b/src/hotspot/share/jbooster/net/messageBuffer.cpp
index 4673bb784..980cfbfed 100644
--- a/src/hotspot/share/jbooster/net/messageBuffer.cpp
+++ b/src/hotspot/share/jbooster/net/messageBuffer.cpp
@@ -23,15 +23,34 @@
#include "jbooster/net/messageBuffer.inline.hpp"
+/**
+ * Allocate an extra eight bytes in case the array object is not 8-byte aligned.
+ */
+char* MessageBuffer::alloc_buf_obj(uint32_t new_buf_size) {
+ return NEW_C_HEAP_ARRAY(char, new_buf_size + sizeof(int64_t), mtJBooster);
+}
+
+void MessageBuffer::del_buf_obj(char* buf_obj) {
+ FREE_C_HEAP_ARRAY(char, buf_obj);
+}
+
+/**
+ * Make the beginning of buf be 8-byte aligned.
+ */
+char* MessageBuffer::calc_buf_start(char* buf_obj) {
+ return buf_obj + calc_padding<int64_t>((uint32_t) reinterpret_cast<uintptr_t>(buf_obj));
+}
+
MessageBuffer::MessageBuffer(SerializationMode smode, CommunicationStream* stream):
_smode(smode),
_buf_size(_default_buf_size),
- _buf(NEW_C_HEAP_ARRAY(char, _buf_size, mtJBooster)),
+ _buf_obj(alloc_buf_obj(_buf_size)),
+ _buf(calc_buf_start(_buf_obj)),
_cur_offset(0),
_stream(stream) {}
MessageBuffer::~MessageBuffer() {
- FREE_C_HEAP_ARRAY(char, _buf);
+ del_buf_obj(_buf_obj);
}
/**
@@ -50,12 +69,19 @@ uint32_t MessageBuffer::calc_new_buf_size(uint32_t required_size) {
}
void MessageBuffer::expand_buf(uint32_t required_size, uint32_t copy_size) {
+ char* old_buf_obj = _buf_obj;
char* old_buf = _buf;
+
uint32_t new_buf_size = calc_new_buf_size(required_size);
- char* new_buf = NEW_C_HEAP_ARRAY(char, new_buf_size, mtJBooster);
+ char* new_buf_obj = alloc_buf_obj(new_buf_size);
+ char* new_buf = calc_buf_start(new_buf_obj);
+ guarantee((new_buf_obj + new_buf_size + sizeof(int64_t)) >= (new_buf + copy_size), "sanity");
memcpy(new_buf, old_buf, copy_size);
+ _buf_obj = new_buf_obj;
_buf = new_buf;
_buf_size = new_buf_size;
- FREE_C_HEAP_ARRAY(char, old_buf);
+ del_buf_obj(old_buf_obj);
+
+ assert(((int) (reinterpret_cast<uintptr_t>(_buf)) & 7) == 0, "8-byte aligned");
}
diff --git a/src/hotspot/share/jbooster/net/messageBuffer.hpp b/src/hotspot/share/jbooster/net/messageBuffer.hpp
index aaa8e7c3b..04e41e9d6 100644
--- a/src/hotspot/share/jbooster/net/messageBuffer.hpp
+++ b/src/hotspot/share/jbooster/net/messageBuffer.hpp
@@ -56,7 +56,7 @@ public:
void assert_can_deserialize() const NOT_DEBUG_RETURN;
};
-class MessageBuffer final: public StackObj {
+class MessageBuffer: public StackObj {
friend class Message;
private:
@@ -64,14 +64,23 @@ private:
SerializationMode _smode;
uint32_t _buf_size;
- char* _buf;
+ char* _buf_obj; // malloced buf object
+ char* _buf; // 8-byte aligned buf start
uint32_t _cur_offset;
CommunicationStream* const _stream;
private:
- static uint32_t calc_new_buf_size(uint32_t required_size);
+ static char* alloc_buf_obj(uint32_t new_buf_size);
+ static void del_buf_obj(char* buf_obj);
+
void expand_buf(uint32_t required_size, uint32_t copy_size);
+protected: // for gtest
+ template <typename Arg>
+ static uint32_t calc_padding(uint32_t offset);
+ static char* calc_buf_start(char* buf_obj);
+ static uint32_t calc_new_buf_size(uint32_t required_size);
+
public:
MessageBuffer(SerializationMode smode, CommunicationStream* stream = nullptr);
~MessageBuffer();
@@ -95,6 +104,8 @@ public:
}
// serializers
+ template <typename Arg>
+ int serialize_base(Arg v);
int serialize_memcpy(const void* from, uint32_t arg_size);
template <typename Arg>
int serialize_no_meta(const Arg& arg);
@@ -102,6 +113,8 @@ public:
int serialize_with_meta(const Arg* arg_ptr);
// deserializers
+ template <typename Arg>
+ int deserialize_base(Arg& to);
int deserialize_memcpy(void* to, uint32_t arg_size);
template <typename Arg>
int deserialize_ref_no_meta(Arg& arg);
diff --git a/src/hotspot/share/jbooster/net/messageBuffer.inline.hpp b/src/hotspot/share/jbooster/net/messageBuffer.inline.hpp
index c7dc0986f..9500c1aaa 100644
--- a/src/hotspot/share/jbooster/net/messageBuffer.inline.hpp
+++ b/src/hotspot/share/jbooster/net/messageBuffer.inline.hpp
@@ -38,6 +38,26 @@ inline void SerializationMode::assert_can_deserialize() const {
}
#endif
+template <typename Arg>
+inline uint32_t MessageBuffer::calc_padding(uint32_t offset) {
+ static_assert((sizeof(Arg) & (sizeof(Arg) - 1)) == 0, "Should be 1, 2, 4, 8!");
+ static_assert(sizeof(Arg) <= 8, "Should be 1, 2, 4, 8!");
+ return (-offset) & (sizeof(Arg) - 1);
+}
+
+template <typename Arg>
+inline int MessageBuffer::serialize_base(Arg v) {
+ static_assert(std::is_arithmetic<Arg>::value || std::is_enum<Arg>::value, "Base types or enums only!");
+ _smode.assert_can_serialize();
+ uint32_t arg_size = (uint32_t) sizeof(Arg);
+ uint32_t padding = calc_padding<Arg>(_cur_offset);
+ uint32_t nxt_offset = _cur_offset + padding + arg_size;
+ expand_if_needed(nxt_offset, _cur_offset);
+ *((Arg*) (_buf + _cur_offset + padding)) = v;
+ _cur_offset = nxt_offset;
+ return 0;
+}
+
inline int MessageBuffer::serialize_memcpy(const void* from, uint32_t arg_size) {
_smode.assert_can_serialize();
assert(from != nullptr, "sanity");
@@ -56,11 +76,13 @@ inline int MessageBuffer::serialize_no_meta(const Arg& arg) {
template <typename Arg>
inline int MessageBuffer::serialize_with_meta(const Arg* arg_ptr) {
+ static_assert(MessageConst::arg_meta_size == sizeof(uint32_t), "Meta changed?");
_smode.assert_can_serialize();
if (arg_ptr == nullptr) {
return serialize_no_meta(MessageConst::NULL_PTR);
}
const Arg& arg = *arg_ptr;
+ skip_cur_offset(calc_padding<uint32_t >(_cur_offset));
uint32_t meta_offset = _cur_offset;
skip_cur_offset(MessageConst::arg_meta_size);
expand_if_needed(_cur_offset, _cur_offset);
@@ -68,7 +90,25 @@ inline int MessageBuffer::serialize_with_meta(const Arg* arg_ptr) {
// fill arg meta at last
uint32_t arg_size = _cur_offset - meta_offset - MessageConst::arg_meta_size;
- memcpy((void*) (_buf + meta_offset), &arg_size, sizeof(arg_size));
+ *((uint32_t*) (_buf + meta_offset)) = arg_size;
+ return 0;
+}
+
+template <typename Arg>
+inline int MessageBuffer::deserialize_base(Arg& to) {
+ static_assert(std::is_arithmetic<Arg>::value || std::is_enum<Arg>::value, "Base types or enums only!");
+ _smode.assert_can_deserialize();
+ uint32_t arg_size = (uint32_t) sizeof(Arg);
+ uint32_t padding = calc_padding<Arg>(_cur_offset);
+ uint32_t nxt_offset = _cur_offset + padding + arg_size;
+ if (_buf_size < nxt_offset) {
+ log_warning(jbooster, rpc)("The size to parse is longer than the msg size: "
+ "arg_size=%u, cur_offset=%u, nxt_offset=%u, buf_size=%u",
+ arg_size, _cur_offset, nxt_offset, _buf_size);
+ return JBErr::BAD_MSG_DATA;
+ }
+ to = *((Arg*) (_buf + _cur_offset + padding));
+ _cur_offset = nxt_offset;
return 0;
}
@@ -125,7 +165,7 @@ inline int MessageBuffer::deserialize_with_meta(Arg* const& arg_ptr) {
return 0;
}
const char* type_name = DebugUtils::type_name<Arg>();
- log_warning(jbooster, rpc)("The arg size does match the parsed size: "
+ log_warning(jbooster, rpc)("The arg size does not match the parsed size: "
"arg=%s, arg_size=%u, (cur_size - arg_begin)=%u.",
type_name, arg_size, _cur_offset - arg_begin);
FREE_C_HEAP_ARRAY(char, type_name);
diff --git a/src/hotspot/share/jbooster/net/rpcCompatibility.cpp b/src/hotspot/share/jbooster/net/rpcCompatibility.cpp
index 7f849a6fe..a48d1c2d8 100644
--- a/src/hotspot/share/jbooster/net/rpcCompatibility.cpp
+++ b/src/hotspot/share/jbooster/net/rpcCompatibility.cpp
@@ -21,6 +21,7 @@
* questions.
*/
+#include "classfile/vmSymbols.hpp"
#include "jbooster/dataTransmissionUtils.hpp"
#include "jbooster/jBoosterManager.hpp"
#include "jbooster/jClientArguments.hpp"
@@ -33,9 +34,18 @@
#include "jbooster/net/rpcCompatibility.hpp"
#include "jbooster/net/serializationWrappers.hpp"
#include "jbooster/net/serverStream.hpp"
+#include "oops/instanceKlass.hpp"
+#include "oops/method.hpp"
+#include "oops/methodData.hpp"
-static constexpr uint32_t calc_new_hash(uint32_t old_hash, uint32_t ele_hash) {
- return 31 * old_hash + ele_hash;
+static constexpr uint32_t calc_new_hash(uint32_t old_hash) {
+ return old_hash;
+}
+
+template <typename... Rest>
+static constexpr uint32_t calc_new_hash(uint32_t old_hash, uint32_t ele_hash, Rest... rest_hashes) {
+ uint32_t new_hash = old_hash * 31u + ele_hash;
+ return calc_new_hash(new_hash, rest_hashes...);
}
template <typename T>
@@ -54,20 +64,35 @@ static constexpr uint32_t calc_classes_hash() {
return calc_new_hash(calc_classes_hash<Second, Rest...>(), calc_class_hash<First>());
}
-/**
- * Returns a magic number computed at compile time based on the sizes of some classes.
- * It is just an crude way to check compatibility for now. More policies can be added later.
- */
-static constexpr uint32_t calc_magic_num() {
+static constexpr uint32_t classes_hash() {
return calc_classes_hash<
JBoosterManager, JClientVMFlags, JClientArguments,
JBErr, Message, MessageBuffer,
CommunicationStream, ClientStream, ServerStream,
ArrayWrapper<int>, MemoryWrapper, StringWrapper, FileWrapper,
- ClassLoaderKey, ClassLoaderChain, ClassLoaderLocator, KlassLocator, MethodLocator, ProfileDataCollector
+ ClassLoaderKey, ClassLoaderChain, ClassLoaderLocator, KlassLocator, MethodLocator, ProfileDataCollector,
+ InstanceKlass, Method, MethodData
>();
}
+static constexpr uint32_t little_or_big_endian() {
+ return (uint32_t) LITTLE_ENDIAN_ONLY('L') BIG_ENDIAN_ONLY('B');
+}
+
+/**
+ * Returns a magic number computed at compile time based on the sizes of some classes.
+ * It is just an crude way to check compatibility for now. More policies can be added later.
+ */
+static constexpr uint32_t calc_magic_num() {
+ return calc_new_hash(
+ classes_hash(),
+ little_or_big_endian(),
+ static_cast<uint32_t>(vmSymbolID::SID_LIMIT)
+ );
+}
+
+static constexpr uint32_t _magic_num = calc_magic_num();
+
uint32_t RpcCompatibility::magic_num() {
- return calc_magic_num();
+ return _magic_num;
}
diff --git a/src/hotspot/share/jbooster/net/serialization.hpp b/src/hotspot/share/jbooster/net/serialization.hpp
index f9a2996c5..ed8387eb6 100644
--- a/src/hotspot/share/jbooster/net/serialization.hpp
+++ b/src/hotspot/share/jbooster/net/serialization.hpp
@@ -72,21 +72,20 @@
// ------------------------------ Default Serializer -------------------------------
// The types it support for serialization/deserialization:
// - Base types: bool, int, long long, size_t, uint64_t, and so on.
-// - POD classes without pointers.
//
-// memcpy() is good enough in most cases. Even for base types such as char and size_t,
-// memcpy() has the similar performance as assignment (`=`) according to our tests.
-// It's also a choice to use assignment here. But if a class overloads the operator `=`
-// and allocates something on the heap, it can cause a memory leak.
+// No default serializer for classes! Implement them manually.
+//
+// Use uintptr_t instead of address (aka unsigned char*) if you want to serialize a
+// pointer.
template <typename Arg>
struct SerializationImpl {
static int serialize(MessageBuffer& buf, const Arg& arg) {
- return buf.serialize_memcpy(&arg, sizeof(Arg));
+ return buf.serialize_base(arg);
}
static int deserialize_ref(MessageBuffer& buf, Arg& arg) {
- return buf.deserialize_memcpy(&arg, sizeof(Arg));
+ return buf.deserialize_base(arg);
}
CANNOT_DESERIALIZE_POINTER(Arg);
diff --git a/src/hotspot/share/jbooster/server/serverDataManager.cpp b/src/hotspot/share/jbooster/server/serverDataManager.cpp
index b2f36c4e5..c3d5f290e 100644
--- a/src/hotspot/share/jbooster/server/serverDataManager.cpp
+++ b/src/hotspot/share/jbooster/server/serverDataManager.cpp
@@ -340,18 +340,18 @@ ClassLoaderData* JClientProgramData::add_class_loader_if_absent(const ClassLoade
// ------------------------------ JClientSessionData -------------------------------
class AddressMapKVArray: public StackObj {
- GrowableArray<address>* _key_array;
- GrowableArray<address>* _value_array;
+ GrowableArray<uintptr_t>* _key_array;
+ GrowableArray<uintptr_t>* _value_array;
public:
- AddressMapKVArray(GrowableArray<address>* key_array,
- GrowableArray<address>* value_array) :
+ AddressMapKVArray(GrowableArray<uintptr_t>* key_array,
+ GrowableArray<uintptr_t>* value_array) :
_key_array(key_array),
_value_array(value_array) {}
bool operator () (JClientSessionData::AddressMap::KVNode* kv_node) {
assert(kv_node->key() != nullptr && kv_node->value() != nullptr, "sanity");
- _key_array->append(kv_node->key());
- _value_array->append(kv_node->value());
+ _key_array->append(reinterpret_cast<uintptr_t>(kv_node->key()));
+ _value_array->append(reinterpret_cast<uintptr_t>(kv_node->value()));
return true;
}
};
@@ -422,17 +422,17 @@ void JClientSessionData::add_klass_address(address client_klass_addr,
put_address(_k_c2s, client_klass_addr, server_cld_addr, thread);
}
-void JClientSessionData::klass_array(GrowableArray<address>* key_array,
- GrowableArray<address>* value_array,
+void JClientSessionData::klass_array(GrowableArray<uintptr_t>* key_array,
+ GrowableArray<uintptr_t>* value_array,
Thread* thread) {
AddressMapKVArray array(key_array, value_array);
_k_c2s.for_each(array, thread);
}
-void JClientSessionData::klass_pointer_map_to_server(GrowableArray<address>* klass_array, Thread* thread) {
- for (GrowableArrayIterator<address> iter = klass_array->begin();
+void JClientSessionData::klass_pointer_map_to_server(GrowableArray<uintptr_t>* klass_array, Thread* thread) {
+ for (GrowableArrayIterator<uintptr_t> iter = klass_array->begin();
iter != klass_array->end(); ++iter) {
- InstanceKlass* klass = (InstanceKlass*) (*iter);
+ InstanceKlass* klass = reinterpret_cast<InstanceKlass*>(*iter);
Array<Method*>* methods = klass->methods();
for (int method_index = 0; method_index < methods->length(); method_index++) {
MethodData* method_data = method_data_address((address)(methods->at(method_index)), thread);
diff --git a/src/hotspot/share/jbooster/server/serverDataManager.hpp b/src/hotspot/share/jbooster/server/serverDataManager.hpp
index 2cb7d2de0..c6ef4c99a 100644
--- a/src/hotspot/share/jbooster/server/serverDataManager.hpp
+++ b/src/hotspot/share/jbooster/server/serverDataManager.hpp
@@ -291,9 +291,9 @@ public:
Klass* server_klass_address(address client_klass_addr, Thread* thread);
void add_klass_address(address client_klass_addr, address server_cld_addr, Thread* thread);
- void klass_array(GrowableArray<address>* key_array, GrowableArray<address>* value_array, Thread* thread);
+ void klass_array(GrowableArray<uintptr_t>* key_array, GrowableArray<uintptr_t>* value_array, Thread* thread);
- void klass_pointer_map_to_server(GrowableArray<address>* klass_array, Thread* thread);
+ void klass_pointer_map_to_server(GrowableArray<uintptr_t>* klass_array, Thread* thread);
void add_method_data(address method, address method_data, Thread* thread);
bool remove_method_data(address method, Thread* thread);
diff --git a/src/hotspot/share/jbooster/server/serverMessageHandler.cpp b/src/hotspot/share/jbooster/server/serverMessageHandler.cpp
index 49c25efb1..f46b839bb 100644
--- a/src/hotspot/share/jbooster/server/serverMessageHandler.cpp
+++ b/src/hotspot/share/jbooster/server/serverMessageHandler.cpp
@@ -196,14 +196,14 @@ int ServerMessageHandler::request_missing_klasses(TRAPS) {
int ServerMessageHandler::request_method_data(TRAPS) {
ResourceMark rm(THREAD);
- GrowableArray<address> client_klass_array;
- GrowableArray<address> server_klass_array;
+ GrowableArray<uintptr_t> client_klass_array;
+ GrowableArray<uintptr_t> server_klass_array;
ss().session_data()->klass_array(&client_klass_array,
&server_klass_array,
THREAD);
{
- ArrayWrapper<address> aw(&client_klass_array);
+ ArrayWrapper<uintptr_t> aw(&client_klass_array);
JB_RETURN(ss().send_request(MessageType::Profilinginfo, &aw));
InstanceKlass** klass_array_base = NULL;
if (server_klass_array.length() > 0) {
diff --git a/test/hotspot/gtest/jbooster/test_net.cpp b/test/hotspot/gtest/jbooster/test_net.cpp
index 9eb29fc3a..bf20b0aa3 100644
--- a/test/hotspot/gtest/jbooster/test_net.cpp
+++ b/test/hotspot/gtest/jbooster/test_net.cpp
@@ -26,10 +26,12 @@
#if INCLUDE_JBOOSTER
+#include "jbooster/jClientArguments.hpp"
#include "jbooster/net/message.inline.hpp"
#include "jbooster/net/messageBuffer.inline.hpp"
#include "jbooster/net/serializationWrappers.inline.hpp"
#include "jbooster/utilities/fileUtils.hpp"
+#include "memory/resourceArea.hpp"
#include "runtime/os.inline.hpp"
#include "utilities/globalDefinitions.hpp"
#include "utilities/growableArray.hpp"
@@ -105,6 +107,47 @@ static void copy_message_buffer(MessageBuffer& to, MessageBuffer& from) {
memcpy(to.buf(), from.buf(), from.cur_offset());
}
+class MockMessageBuffer: public MessageBuffer {
+public:
+ static bool test() {
+ // calc_padding<char[6]>(0); // should not pass the compilation
+ EXPECT_EQ(calc_padding<char>(123), 0u);
+ EXPECT_EQ(calc_padding<char>(124), 0u);
+ EXPECT_EQ(calc_padding<short>(123), 1u);
+ EXPECT_EQ(calc_padding<short>(120), 0u);
+ EXPECT_EQ(calc_padding<int>(0), 0u);
+ EXPECT_EQ(calc_padding<int>(1), 3u);
+ EXPECT_EQ(calc_padding<int>(2), 2u);
+ EXPECT_EQ(calc_padding<int>(3), 1u);
+ EXPECT_EQ(calc_padding<int>(4), 0u);
+ EXPECT_EQ(calc_padding<int>(400), 0u);
+ EXPECT_EQ(calc_padding<uint64_t>(1), 7u);
+ EXPECT_EQ(calc_padding<uint64_t>(3), 5u);
+ EXPECT_EQ(calc_padding<uint64_t>(12), 4u);
+ EXPECT_EQ(calc_padding<uint64_t>(7), 1u);
+
+ EXPECT_EQ(calc_buf_start(reinterpret_cast<char*>(7)), reinterpret_cast<char*>(8));
+ EXPECT_EQ(calc_buf_start(reinterpret_cast<char*>(9)), reinterpret_cast<char*>(16));
+ EXPECT_EQ(calc_buf_start(reinterpret_cast<char*>(12)), reinterpret_cast<char*>(16));
+ EXPECT_EQ(calc_buf_start(reinterpret_cast<char*>(65535)), reinterpret_cast<char*>(65536));
+ EXPECT_EQ(calc_buf_start(reinterpret_cast<char*>(65536)), reinterpret_cast<char*>(65536));
+
+ EXPECT_EQ(calc_new_buf_size(0), 0u);
+ EXPECT_EQ(calc_new_buf_size(1), 1u);
+ EXPECT_EQ(calc_new_buf_size(2), 2u);
+ EXPECT_EQ(calc_new_buf_size(3), 4u);
+ EXPECT_EQ(calc_new_buf_size(65535), 65536u);
+ EXPECT_EQ(calc_new_buf_size(65536), 65536u);
+ EXPECT_EQ(calc_new_buf_size(65537), 131072u);
+
+ return true;
+ }
+};
+
+TEST(JBoosterNet, padding) {
+ ASSERT_TRUE(MockMessageBuffer::test());
+}
+
TEST(JBoosterNet, try_catch) {
int i;
for (i = 0; i < 9; ++i) {
@@ -145,24 +188,25 @@ TEST(JBoosterNet, serializationn_basics) {
int i1 = 1234;
int64_t l1 = 900000000000000ll;
EXPECT_EQ(buf.serialize_no_meta(c1), 0);
- EXPECT_EQ(buf.cur_offset(), 1u);
+ EXPECT_EQ(buf.cur_offset(), 1u); // 1 (char)
EXPECT_EQ(buf.serialize_no_meta(i1), 0);
- EXPECT_EQ(buf.cur_offset(), 5u);
+ EXPECT_EQ(buf.cur_offset(), 8u); // 1 (last) + 3 (padding) + 4 (int32)
EXPECT_EQ(buf.serialize_no_meta(l1), 0);
- EXPECT_EQ(buf.cur_offset(), 13u);
+ EXPECT_EQ(buf.cur_offset(), 16u); // 8 (last) + 8 (int64)
uint32_t u1 = 2468;
const char* s1 = nullptr;
const char* s2 = "hello";
const char* s3 = "world!";
EXPECT_EQ(buf.serialize_with_meta(&u1), 0);
- EXPECT_EQ(buf.cur_offset(), 21u);
+ EXPECT_EQ(buf.cur_offset(), 24u); // 16 (last) + 4 (int32) + 4 (int32)
EXPECT_EQ(buf.serialize_with_meta(&s1), 0);
- EXPECT_EQ(buf.cur_offset(), 29u);
+ EXPECT_EQ(buf.cur_offset(), 32u); // 24 (last) + 4 (int32) + 4 (int32)
EXPECT_EQ(buf.serialize_with_meta(&s2), 0);
- EXPECT_EQ(buf.cur_offset(), 42u);
+ EXPECT_EQ(buf.cur_offset(), 45u); // 32 (last) + 4 (int32) + 4 (int32) + 5 (strlen)
EXPECT_EQ(buf.serialize_with_meta(&s3), 0);
- EXPECT_EQ(buf.cur_offset(), 56u);
+ EXPECT_EQ(buf.cur_offset(), 62u); // 45 (last) + 3 (padding) + 4 (int32) + 4 (int32) + 6 (strlen)
+ EXPECT_EQ((int) (reinterpret_cast<uintptr_t>(buf.buf())) & 7, 0); // 8-byte aligned
cache_size = buf.cur_offset();
memcpy(cache, buf.buf(), cache_size);
@@ -177,9 +221,9 @@ TEST(JBoosterNet, serializationn_basics) {
EXPECT_EQ(buf.deserialize_ref_no_meta(c1), 0);
EXPECT_EQ(buf.cur_offset(), 1u);
EXPECT_EQ(buf.deserialize_ref_no_meta(i1), 0);
- EXPECT_EQ(buf.cur_offset(), 5u);
+ EXPECT_EQ(buf.cur_offset(), 8u);
EXPECT_EQ(buf.deserialize_ref_no_meta(l1), 0);
- EXPECT_EQ(buf.cur_offset(), 13u);
+ EXPECT_EQ(buf.cur_offset(), 16u);
EXPECT_EQ(c1, '6');
EXPECT_EQ(i1, 1234);
EXPECT_EQ(l1, 900000000000000ll);
@@ -189,13 +233,15 @@ TEST(JBoosterNet, serializationn_basics) {
char s2[6];
StringWrapper s3;
EXPECT_EQ(buf.deserialize_with_meta(&u1), 0);
- EXPECT_EQ(buf.cur_offset(), 21u);
+ EXPECT_EQ(buf.cur_offset(), 24u);
EXPECT_EQ(buf.deserialize_with_meta(&s1), 0);
- EXPECT_EQ(buf.cur_offset(), 29u);
+ EXPECT_EQ(buf.cur_offset(), 32u);
EXPECT_EQ(buf.deserialize_with_meta(&s2), 0);
- EXPECT_EQ(buf.cur_offset(), 42u);
+ EXPECT_EQ(buf.cur_offset(), 45u);
EXPECT_EQ(buf.deserialize_with_meta(&s3), 0);
- EXPECT_EQ(buf.cur_offset(), 56u);
+ EXPECT_EQ(buf.cur_offset(), 62u);
+ EXPECT_EQ(((int) reinterpret_cast<uintptr_t>(buf.buf())) & 7, 0);
+
EXPECT_EQ(u1, 2468u);
EXPECT_STREQ(s1, nullptr);
EXPECT_STREQ(s2, "hello");
@@ -227,18 +273,11 @@ TEST_VM(JBoosterNet, serializationn_string) {
EXPECT_STREQ(ss3, s3);
}
- { MessageBuffer buf(SerializationMode::DESERIALIZE);
- copy_message_buffer(buf, buf0);
- char s1[1];
- ASSERT_DEATH(buf.deserialize_with_meta(&s1), "");
- }
-
{ MessageBuffer buf(SerializationMode::DESERIALIZE);
copy_message_buffer(buf, buf0);
char s1[64];
EXPECT_EQ(buf.deserialize_with_meta(&s1), 0);
EXPECT_STREQ(ss1, s1);
- ASSERT_DEATH(buf.deserialize_with_meta(&s1), "");
}
{ MessageBuffer buf(SerializationMode::DESERIALIZE);
@@ -269,8 +308,20 @@ TEST_VM(JBoosterNet, serializationn_string) {
}
}
-TEST(JBoosterNet, serializationn_crash) {
- int err;
+#ifdef ASSERT
+
+TEST_VM_ASSERT_MSG(JBoosterNet, serializationn_string_crash_null, ".*cannot set array to null") {
+ MessageBuffer buf(SerializationMode::BOTH);
+ const char* s = nullptr;
+ EXPECT_EQ(buf.serialize_with_meta(&s), 0);
+
+ char s1[8];
+ buf.reset_cur_offset();
+ buf.deserialize_with_meta(&s1); // should crash here
+ ASSERT_TRUE(false);
+}
+
+TEST_VM_ASSERT_MSG(JBoosterNet, serializationn_string_crash_arr_too_small, ".*array index out of bounds") {
MessageBuffer buf(SerializationMode::BOTH);
const char* s = "hello";
EXPECT_EQ(buf.serialize_with_meta(&s), 0);
@@ -282,12 +333,12 @@ TEST(JBoosterNet, serializationn_crash) {
char s2[5];
buf.reset_cur_offset();
- bool old = SuppressFatalErrorMessage;
- SuppressFatalErrorMessage = true;
- ASSERT_DEATH(buf.deserialize_with_meta(&s2), "");
- SuppressFatalErrorMessage = old;
+ buf.deserialize_with_meta(&s2); // should crash here
+ ASSERT_TRUE(false);
}
+#endif // ASSERT
+
TEST(JBoosterNet, serializationn_wrappers) {
MessageBuffer buf(SerializationMode::BOTH);
uint32_t mem_size = 16u * 1024;
@@ -303,7 +354,7 @@ TEST(JBoosterNet, serializationn_wrappers) {
ga.append(&s4);
ArrayWrapper<StringWrapper> aw(&ga);
EXPECT_EQ(buf.serialize_with_meta(&aw), 0);
- EXPECT_EQ(buf.cur_offset(), 0u + (4 + 4) + (1 + 2 + 3 + 4 + 4 * (4 + 4)));
+ EXPECT_EQ(buf.cur_offset(), 0u + (4 + 4) + ((1 + 3) + (2 + 2) + (3 + 1) + 4 + 4 * (4 + 4)));
char* mem = NEW_C_HEAP_ARRAY(char, mem_size, mtJBooster);
memset(mem, 0x68, mem_size);
@@ -385,6 +436,30 @@ TEST(JBoosterNet, serializationn_file_wrapper) {
FileUtils::remove(file_name2);
}
+TEST(JBoosterNet, serializationn_others) {
+ MessageBuffer buf(SerializationMode::BOTH);
+
+ {
+ JClientBoostLevel lvl;
+ lvl.set_allow_clr(true);
+ lvl.set_allow_aot(true);
+ lvl.set_enable_cds_agg(true);
+ EXPECT_EQ(buf.serialize_with_meta(&lvl), 0);
+ }
+
+ buf.reset_cur_offset();
+
+ {
+ JClientBoostLevel lvl;
+ EXPECT_EQ(buf.deserialize_with_meta(&lvl), 0);
+ EXPECT_EQ(lvl.is_clr_allowed(), true);
+ EXPECT_EQ(lvl.is_cds_allowed(), false);
+ EXPECT_EQ(lvl.is_aot_allowed(), true);
+ EXPECT_EQ(lvl.is_aot_pgo_enabled(), false);
+ EXPECT_EQ(lvl.is_cds_agg_enabled(), true);
+ }
+}
+
TEST(JBoosterNet, expansion_of_message_buffer) {
MessageBuffer buf(SerializationMode::SERIALIZE);
ASSERT_EQ(buf.buf_size(), 4096u);
--
2.22.0

View File

@ -0,0 +1,880 @@
From 3cc21f911715cc0112f9a2e80a199723b29262e1 Mon Sep 17 00:00:00 2001
Date: Fri, 29 Nov 2024 15:39:13 +0800
Subject: Optimize LazyAOT klasses sending strategy
---
.../jbooster/client/clientMessageHandler.cpp | 6 ++
.../jbooster/client/clientMessageHandler.hpp | 1 +
.../share/jbooster/jClientArguments.cpp | 15 +++
.../share/jbooster/jClientArguments.hpp | 1 +
.../share/jbooster/jbooster_globals.hpp | 4 +
src/hotspot/share/jbooster/lazyAot.cpp | 15 ++-
src/hotspot/share/jbooster/lazyAot.hpp | 2 +
.../jbooster/net/communicationStream.cpp | 15 ++-
.../net/communicationStream.inline.hpp | 1 +
src/hotspot/share/jbooster/net/errorCode.hpp | 1 +
src/hotspot/share/jbooster/net/message.hpp | 5 +
.../share/jbooster/net/message.inline.hpp | 2 +
.../share/jbooster/net/messageType.hpp | 1 +
src/hotspot/share/jbooster/net/netCommon.hpp | 8 +-
.../jbooster/server/serverMessageHandler.cpp | 10 +-
.../jbooster/server/serverMessageHandler.hpp | 3 +-
.../share/jbooster/utilities/fileUtils.cpp | 64 ++-----------
.../share/jbooster/utilities/fileUtils.hpp | 3 +-
.../jbooster/JBoosterCompilationContext.java | 5 +
.../graalvm/compiler/java/BytecodeParser.java | 29 ++++++
.../share/classes/jdk/jbooster/JBooster.java | 8 +-
.../JBoosterCompilationContextImpl.java | 10 +-
test/hotspot/gtest/jbooster/common.hpp | 96 +++++++++++++++++++
test/hotspot/gtest/jbooster/test_net.cpp | 4 +-
test/hotspot/gtest/jbooster/test_util.cpp | 12 ++-
test/jdk/tools/jbooster/JBoosterTestBase.java | 6 +-
26 files changed, 244 insertions(+), 83 deletions(-)
create mode 100644 test/hotspot/gtest/jbooster/common.hpp
diff --git a/src/hotspot/share/jbooster/client/clientMessageHandler.cpp b/src/hotspot/share/jbooster/client/clientMessageHandler.cpp
index 9119b897a..b8278d41c 100644
--- a/src/hotspot/share/jbooster/client/clientMessageHandler.cpp
+++ b/src/hotspot/share/jbooster/client/clientMessageHandler.cpp
@@ -289,6 +289,12 @@ int ClientMessageHandler::handle_ArrayKlasses() {
return 0;
}
+int ClientMessageHandler::handle_ResolveExtraKlasses() {
+ ResourceMark rm;
+ bool should_resolve_extra_Klasses = JBoosterResolveExtraKlasses;
+ JB_RETURN(cs().send_response(&should_resolve_extra_Klasses));
+ return 0;
+}
// ---------------------------------- Some Tasks -----------------------------------
int ClientMessageHandler::send_cache_file_sync_task() {
diff --git a/src/hotspot/share/jbooster/client/clientMessageHandler.hpp b/src/hotspot/share/jbooster/client/clientMessageHandler.hpp
index 66844247c..94ff7387d 100644
--- a/src/hotspot/share/jbooster/client/clientMessageHandler.hpp
+++ b/src/hotspot/share/jbooster/client/clientMessageHandler.hpp
@@ -38,6 +38,7 @@
F(MethodLocators ) \
F(Profilinginfo ) \
F(ArrayKlasses ) \
+ F(ResolveExtraKlasses ) \
class ArrayKlass;
class ClassLoaderData;
diff --git a/src/hotspot/share/jbooster/jClientArguments.cpp b/src/hotspot/share/jbooster/jClientArguments.cpp
index b215913ea..42aba4181 100644
--- a/src/hotspot/share/jbooster/jClientArguments.cpp
+++ b/src/hotspot/share/jbooster/jClientArguments.cpp
@@ -171,6 +171,14 @@ const char* calc_java_commands_by_class(const char* full_cmd, int full_cmd_len)
return StringUtils::copy_to_heap(start, mtJBooster);
}
+static int64_t calc_cds_file_size() {
+ char* default_archive_path = Arguments::get_default_shared_archive_path();
+ if (default_archive_path == nullptr) { return -1; }
+ int64_t cds_file_size = FileUtils::file_size(default_archive_path);
+ StringUtils::free_from_heap(default_archive_path);
+ return cds_file_size;
+}
+
JClientArguments::JClientArguments(bool is_client) {
if (is_client) {
init_for_client();
@@ -224,6 +232,7 @@ void JClientArguments::init_for_client() {
_classpath_name_hash = calc_classpath_name_hash(app_cp, app_cp_len);
_classpath_timestamp_hash = calc_classpath_timestamp_hash(app_cp, app_cp_len);
_agent_name_hash = calc_agent_name_hash();
+ _cds_file_size = calc_cds_file_size();
if (JBoosterClientStrictMatch) {
_java_commands = is_jar ? calc_java_commands_by_jar(full_cmd, app_cp_len)
: calc_java_commands_by_class(full_cmd, full_cmd_len);
@@ -248,6 +257,7 @@ uint32_t JClientArguments::calc_hash() {
result = calc_new_hash(result, _classpath_name_hash);
result = calc_new_hash(result, _classpath_timestamp_hash);
result = calc_new_hash(result, _agent_name_hash);
+ result = calc_new_hash(result, _cds_file_size);
result = calc_new_hash(result, StringUtils::hash_code(_java_commands));
result = calc_new_hash(result, _related_flags->hash());
@@ -267,6 +277,7 @@ bool JClientArguments::equals(const JClientArguments* that) const {
if (this->_classpath_name_hash != that->_classpath_name_hash) return false;
if (this->_classpath_timestamp_hash != that->_classpath_timestamp_hash) return false;
if (this->_agent_name_hash != that->_agent_name_hash) return false;
+ if (this->_cds_file_size != that->_cds_file_size) return false;
if (StringUtils::compare(this->_java_commands, that->_java_commands) != 0) return false;
if (!this->_related_flags->equals(that->_related_flags)) return false;
return true;
@@ -284,6 +295,7 @@ void JClientArguments::print_args(outputStream* st) const {
st->print_cr(" classpath_name_hash: %x", _classpath_name_hash);
st->print_cr(" classpath_timestamp_hash: %x", _classpath_timestamp_hash);
st->print_cr(" agent_name_hash: %x", _agent_name_hash);
+ st->print_cr(" cds_file_size: %lu", _cds_file_size);
st->print_cr(" java_commands: \"%s\"", _java_commands);
st->print_cr(" vm_flags:");
st->print_cr(" hash: %u", _related_flags->hash());
@@ -307,6 +319,7 @@ int JClientArguments::serialize(MessageBuffer& buf) const {
JB_RETURN(buf.serialize_no_meta(_classpath_name_hash));
JB_RETURN(buf.serialize_no_meta(_classpath_timestamp_hash));
JB_RETURN(buf.serialize_no_meta(_agent_name_hash));
+ JB_RETURN(buf.serialize_no_meta(_cds_file_size));
JB_RETURN(buf.serialize_with_meta(&_java_commands));
JB_RETURN(buf.serialize_with_meta(_related_flags));
@@ -343,6 +356,8 @@ int JClientArguments::deserialize(MessageBuffer& buf) {
JB_RETURN(buf.deserialize_ref_no_meta(_agent_name_hash));
+ JB_RETURN(buf.deserialize_ref_no_meta(_cds_file_size));
+
StringWrapper sw_java_commands;
JB_RETURN(buf.deserialize_with_meta(&sw_java_commands));
_java_commands = sw_java_commands.export_string();
diff --git a/src/hotspot/share/jbooster/jClientArguments.hpp b/src/hotspot/share/jbooster/jClientArguments.hpp
index 09c5dfdc0..491ac3159 100644
--- a/src/hotspot/share/jbooster/jClientArguments.hpp
+++ b/src/hotspot/share/jbooster/jClientArguments.hpp
@@ -92,6 +92,7 @@ private:
uint32_t _classpath_name_hash;
uint32_t _classpath_timestamp_hash;
uint32_t _agent_name_hash;
+ int64_t _cds_file_size;
const char* _java_commands;
JClientVMFlags* _related_flags;
// ========================= end =========================
diff --git a/src/hotspot/share/jbooster/jbooster_globals.hpp b/src/hotspot/share/jbooster/jbooster_globals.hpp
index 74968af75..c3cdd71f8 100644
--- a/src/hotspot/share/jbooster/jbooster_globals.hpp
+++ b/src/hotspot/share/jbooster/jbooster_globals.hpp
@@ -119,6 +119,10 @@
\
product(ccstr, JBoosterServerSSLRootCerts, NULL, EXPERIMENTAL, \
"The file path to save server SSL root certificate.") \
+ \
+ product(bool, JBoosterResolveExtraKlasses, true, EXPERIMENTAL, \
+ "Whether resolve additional klasses " \
+ "while collecting klasses for AOT.") \
// end of JBOOSTER_FLAGS
diff --git a/src/hotspot/share/jbooster/lazyAot.cpp b/src/hotspot/share/jbooster/lazyAot.cpp
index 410d575e9..462b0c72b 100644
--- a/src/hotspot/share/jbooster/lazyAot.cpp
+++ b/src/hotspot/share/jbooster/lazyAot.cpp
@@ -199,7 +199,11 @@ void LazyAOT::collect_klasses_in_constant_pool(GrowableArray<InstanceKlass*>* ds
int len = dst->length();
for (int i = last_len; i < len; ++i) {
ThreadInVMfromNative tiv(THREAD);
- collect_klasses_in_constant_pool(dst, vis, dst->at(i), ALL_KLASSES, CHECK);
+ if (JBoosterResolveExtraKlasses) {
+ collect_klasses_in_constant_pool(dst, vis, dst->at(i), ALL_KLASSES, CHECK);
+ } else {
+ collect_klasses_in_constant_pool(dst, vis, dst->at(i), RESOLVED_KLASSES, CHECK);
+ }
}
last_len = len;
}
@@ -527,6 +531,7 @@ bool LazyAOT::compile_classes_by_graal(int session_id,
const char* file_path,
GrowableArray<InstanceKlass*>* klasses,
bool use_pgo,
+ bool resolve_no_extra_klasses,
TRAPS) {
DebugUtils::assert_thread_in_vm();
@@ -541,9 +546,11 @@ bool LazyAOT::compile_classes_by_graal(int session_id,
java_args.push_int(session_id);
java_args.push_oop(file_path_h);
java_args.push_oop(hash_set_h);
+ java_args.push_int(use_pgo);
+ java_args.push_int(resolve_no_extra_klasses);
TempNewSymbol compile_classes_name = SymbolTable::new_symbol("compileClasses");
- TempNewSymbol compile_classes_signature = SymbolTable::new_symbol("(ILjava/lang/String;Ljava/util/Set;)Z");
+ TempNewSymbol compile_classes_signature = SymbolTable::new_symbol("(ILjava/lang/String;Ljava/util/Set;ZZ)Z");
JavaCalls::call_static(&result, ServerDataManager::get().main_klass(),
compile_classes_name,
compile_classes_signature,
@@ -557,6 +564,7 @@ bool LazyAOT::compile_methods_by_graal(int session_id,
GrowableArray<Method*>* methods_to_compile,
GrowableArray<Method*>* methods_not_compile,
bool use_pgo,
+ bool resolve_no_extra_klasses,
TRAPS) {
DebugUtils::assert_thread_in_vm();
@@ -580,9 +588,10 @@ bool LazyAOT::compile_methods_by_graal(int session_id,
java_args.push_oop(method_name_set_h);
java_args.push_oop(not_method_name_set_h);
java_args.push_int(use_pgo);
+ java_args.push_int(resolve_no_extra_klasses);
TempNewSymbol compile_methods_name = SymbolTable::new_symbol("compileMethods");
- TempNewSymbol compile_methods_signature = SymbolTable::new_symbol("(ILjava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Z)Z");
+ TempNewSymbol compile_methods_signature = SymbolTable::new_symbol("(ILjava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;ZZ)Z");
JavaCalls::call_static(&result, ServerDataManager::get().main_klass(),
compile_methods_name,
compile_methods_signature,
diff --git a/src/hotspot/share/jbooster/lazyAot.hpp b/src/hotspot/share/jbooster/lazyAot.hpp
index 1d2a49351..5b4183118 100644
--- a/src/hotspot/share/jbooster/lazyAot.hpp
+++ b/src/hotspot/share/jbooster/lazyAot.hpp
@@ -112,6 +112,7 @@ public:
const char* file_path,
GrowableArray<InstanceKlass*>* klasses,
bool use_pgo,
+ bool resolve_extra_klasses,
TRAPS);
static bool compile_methods_by_graal(int session_id,
const char* file_path,
@@ -119,6 +120,7 @@ public:
GrowableArray<Method*>* methods_to_compile,
GrowableArray<Method*>* methods_not_compile,
bool use_pgo,
+ bool resolve_extra_klasses,
TRAPS);
};
diff --git a/src/hotspot/share/jbooster/net/communicationStream.cpp b/src/hotspot/share/jbooster/net/communicationStream.cpp
index cdb4b8fa7..37bb45032 100644
--- a/src/hotspot/share/jbooster/net/communicationStream.cpp
+++ b/src/hotspot/share/jbooster/net/communicationStream.cpp
@@ -145,16 +145,18 @@ int CommunicationStream::recv_message() {
Message& msg = _msg_recv;
// read once (or memmove from the overflowed buffer) to get message size
uint32_t read_size, msg_size;
+ uint16_t magic_num;
+ const uint32_t min_read_size = sizeof(msg_size) + sizeof(magic_num);
if (msg.has_overflow()) {
read_size = msg.move_overflow();
- if (read_size < sizeof(msg_size)) {
+ if (read_size < min_read_size) {
read_size += read_once_from_stream(msg.buf_beginning() + read_size, msg.buf_size() - read_size);
}
} else {
read_size = read_once_from_stream(msg.buf_beginning(), msg.buf_size());
}
- if (read_size < sizeof(msg_size)) {
+ if (read_size < min_read_size) {
if (!is_stream_closed()) {
log_warning(jbooster, rpc)("Failed to read the size of the message (read_size=%d). stream_id=%u.",
read_size, stream_id());
@@ -162,7 +164,16 @@ int CommunicationStream::recv_message() {
return return_errno_or_flag(JBErr::BAD_MSG_SIZE);
}
+ magic_num = msg.deserialize_magic_num_only();
+ if (magic_num != MessageConst::RPC_MAGIC) {
+ log_warning(jbooster, rpc)("Message not from JBooster client. stream_id=%u.", stream_id());
+ return return_errno_or_flag(JBErr::BAD_MAGIC_NUM);
+ }
msg_size = msg.deserialize_size_only();
+ if (msg_size > MessageConst::MAX_MSG_SIZE) {
+ log_warning(jbooster, rpc)("Message size should be no more than 2GB. stream_id=%u.", stream_id());
+ return return_errno_or_flag(JBErr::BAD_MSG_SIZE);
+ }
if (read_size > msg_size) { // read too much
msg.set_overflow(msg_size, read_size - msg_size);
} else if (read_size < msg_size) { // read the rest then
diff --git a/src/hotspot/share/jbooster/net/communicationStream.inline.hpp b/src/hotspot/share/jbooster/net/communicationStream.inline.hpp
index 45311c2be..bc5c0565f 100644
--- a/src/hotspot/share/jbooster/net/communicationStream.inline.hpp
+++ b/src/hotspot/share/jbooster/net/communicationStream.inline.hpp
@@ -58,6 +58,7 @@ inline bool CommunicationStream::check_received_message_size() {
template <typename... Args>
inline int CommunicationStream::send_request(MessageType type, const Args* const... args) {
_msg_send.set_msg_type(type);
+ _msg_send.set_magic_num(MessageConst::RPC_MAGIC);
_msg_send.set_cur_buf_offset_after_meta();
JB_RETURN(_msg_send.serialize(args...));
_msg_send.set_msg_size_based_on_cur_buf_offset();
diff --git a/src/hotspot/share/jbooster/net/errorCode.hpp b/src/hotspot/share/jbooster/net/errorCode.hpp
index 625ef6951..cbb4cc54c 100644
--- a/src/hotspot/share/jbooster/net/errorCode.hpp
+++ b/src/hotspot/share/jbooster/net/errorCode.hpp
@@ -30,6 +30,7 @@
f(CONN_CLOSED, "Connection has been closed" ) \
f(CONN_CLOSED_BY_PEER, "Connection is closed by the other end" ) \
f(BAD_SSL, "Unexpected SSL error during initialization" ) \
+ f(BAD_MAGIC_NUM, "Unexpected magic number of the received message" ) \
f(BAD_MSG_SIZE, "Unexpected size of the received message" ) \
f(BAD_MSG_TYPE, "Unexpected message type of the received message" ) \
f(BAD_MSG_DATA, "Unexpected payload data of the received message" ) \
diff --git a/src/hotspot/share/jbooster/net/message.hpp b/src/hotspot/share/jbooster/net/message.hpp
index 47d2634e2..413ff84a5 100644
--- a/src/hotspot/share/jbooster/net/message.hpp
+++ b/src/hotspot/share/jbooster/net/message.hpp
@@ -33,6 +33,7 @@ class Message: public MessageConst {
private:
struct {
uint32_t msg_size;
+ uint16_t magic_num;
MessageType msg_type;
} _meta;
@@ -58,6 +59,7 @@ public:
uint32_t msg_size() const { return _meta.msg_size; }
void set_msg_size(uint32_t size) { _meta.msg_size = size; }
void set_msg_size_based_on_cur_buf_offset() { set_msg_size(cur_buf_offset()); }
+ void set_magic_num(uint16_t magic_num) { _meta.magic_num = magic_num; }
MessageType msg_type() const { return _meta.msg_type; }
void set_msg_type(MessageType type) { _meta.msg_type = type; }
@@ -76,6 +78,9 @@ public:
}
uint32_t deserialize_size_only() { return *((uint32_t*)_buf.buf()); }
+ uint16_t deserialize_magic_num_only() { return *((uint16_t*)(_buf.buf() + sizeof(_meta.msg_size))); }
+
+ bool check_magic_num(uint16_t magic_num) { return magic_num == MessageConst::RPC_MAGIC; }
template <typename... Args>
int serialize(const Args* const... args);
diff --git a/src/hotspot/share/jbooster/net/message.inline.hpp b/src/hotspot/share/jbooster/net/message.inline.hpp
index 5b5add47f..b85362efe 100644
--- a/src/hotspot/share/jbooster/net/message.inline.hpp
+++ b/src/hotspot/share/jbooster/net/message.inline.hpp
@@ -78,6 +78,7 @@ inline int Message::deserialize(Args* const&... args) {
inline void Message::serialize_meta() {
_buf.set_cur_offset(0);
_buf.serialize_no_meta(_meta.msg_size);
+ _buf.serialize_no_meta(_meta.magic_num);
_buf.serialize_no_meta(_meta.msg_type);
assert(cur_buf_offset() == meta_size, "sanity");
}
@@ -85,6 +86,7 @@ inline void Message::serialize_meta() {
inline void Message::deserialize_meta() {
_buf.set_cur_offset(0);
_buf.deserialize_ref_no_meta(_meta.msg_size);
+ _buf.deserialize_ref_no_meta(_meta.magic_num);
_buf.deserialize_ref_no_meta(_meta.msg_type);
assert(cur_buf_offset() == meta_size, "sanity");
}
diff --git a/src/hotspot/share/jbooster/net/messageType.hpp b/src/hotspot/share/jbooster/net/messageType.hpp
index f8cb8f3e6..dbd89c07c 100644
--- a/src/hotspot/share/jbooster/net/messageType.hpp
+++ b/src/hotspot/share/jbooster/net/messageType.hpp
@@ -54,6 +54,7 @@
f(ArrayKlasses, "from server" ) \
f(DataOfKlasses, "from server" ) \
f(MethodLocators, "from server" ) \
+ f(ResolveExtraKlasses, "from server" ) \
\
/* others */ \
f(FileSegment, "from both" ) \
diff --git a/src/hotspot/share/jbooster/net/netCommon.hpp b/src/hotspot/share/jbooster/net/netCommon.hpp
index 8706b7f22..2e30708cc 100644
--- a/src/hotspot/share/jbooster/net/netCommon.hpp
+++ b/src/hotspot/share/jbooster/net/netCommon.hpp
@@ -133,13 +133,15 @@
class MessageConst {
public:
+ static constexpr uint32_t MAX_MSG_SIZE = 0x80000000;
+ static constexpr uint16_t RPC_MAGIC = 0xB05E;
enum: uint32_t {
/**
* The layout of the message in the buffer:
- * | msg_size | msg_type | ... (all of the arguments) ... |
- * | 4 bytes | 2 bytes | msg_size - 4 - 2 bytes |
+ * | msg_size | magic_num | msg_type | ... (all of the arguments) ... |
+ * | 4 bytes | 2 bytes | 2 bytes | msg_size - 4 - 2 bytes |
*/
- meta_size = sizeof(uint32_t) + sizeof(MessageType),
+ meta_size = sizeof(uint32_t) + sizeof(uint16_t) + sizeof(MessageType),
/**
* The layout of each argument in the buffer:
* | arg_size | ... (payload of the argument) ... |
diff --git a/src/hotspot/share/jbooster/server/serverMessageHandler.cpp b/src/hotspot/share/jbooster/server/serverMessageHandler.cpp
index f46b839bb..713ea1374 100644
--- a/src/hotspot/share/jbooster/server/serverMessageHandler.cpp
+++ b/src/hotspot/share/jbooster/server/serverMessageHandler.cpp
@@ -319,11 +319,15 @@ int ServerMessageHandler::handle_lazy_aot_compilation_task(TRAPS) {
GrowableArray<Method*> methods_to_compile;
GrowableArray<Method*> methods_not_compile;
bool compile_in_current_thread = false;
+ bool resolve_extra_klasses = true;
JB_TRY {
compile_in_current_thread = !aot_cache_state.is_cached() && aot_cache_state.set_being_generated();
JB_THROW(ss().send_response(&compile_in_current_thread));
if (compile_in_current_thread) {
+ JB_RETURN(ss().send_request(MessageType::ResolveExtraKlasses));
+ JB_RETURN(ss().recv_response(&resolve_extra_klasses));
+
JB_THROW(request_missing_class_loaders(THREAD));
JB_THROW(request_missing_klasses(THREAD));
JB_THROW(request_methods_to_compile(&klasses_to_compile, &methods_to_compile, THREAD));
@@ -345,6 +349,7 @@ int ServerMessageHandler::handle_lazy_aot_compilation_task(TRAPS) {
&methods_to_compile,
&methods_not_compile,
enabling_aot_pgo,
+ resolve_extra_klasses,
THREAD));
} else { // not compile in current thread
if (aot_cache_state.is_being_generated()) {
@@ -365,6 +370,7 @@ int ServerMessageHandler::try_to_compile_lazy_aot(GrowableArray<InstanceKlass*>*
GrowableArray<Method*>* methods_to_compile,
GrowableArray<Method*>* methods_not_compile,
bool enabling_aot_pgo,
+ bool resolve_extra_klasses,
TRAPS) {
JClientProgramData* pd = ss().session_data()->program_data();
JClientCacheState& aot_cache_state = enabling_aot_pgo ? pd->aot_pgo_cache_state() : pd->aot_static_cache_state();
@@ -382,10 +388,10 @@ int ServerMessageHandler::try_to_compile_lazy_aot(GrowableArray<InstanceKlass*>*
ThreadInVMfromNative tiv(THREAD);
if (methods_to_compile->is_empty()) {
- successful = LazyAOT::compile_classes_by_graal(session_id, file_path, klasses_to_compile, enabling_aot_pgo, THREAD);
+ successful = LazyAOT::compile_classes_by_graal(session_id, file_path, klasses_to_compile, enabling_aot_pgo, resolve_extra_klasses, THREAD);
} else {
successful = LazyAOT::compile_methods_by_graal(session_id, file_path, klasses_to_compile,
- methods_to_compile, methods_not_compile, enabling_aot_pgo, THREAD);
+ methods_to_compile, methods_not_compile, enabling_aot_pgo, resolve_extra_klasses, THREAD);
}
if (successful) {
diff --git a/src/hotspot/share/jbooster/server/serverMessageHandler.hpp b/src/hotspot/share/jbooster/server/serverMessageHandler.hpp
index 26926dd41..c761b9c44 100644
--- a/src/hotspot/share/jbooster/server/serverMessageHandler.hpp
+++ b/src/hotspot/share/jbooster/server/serverMessageHandler.hpp
@@ -59,7 +59,8 @@ private:
int try_to_compile_lazy_aot(GrowableArray<InstanceKlass*>* klasses_to_compile,
GrowableArray<Method*>* methods_to_compile,
GrowableArray<Method*>* methods_not_compile,
- bool use_pgo,
+ bool enabling_aot_pgo,
+ bool resolve_extra_klasses,
TRAPS);
public:
ServerMessageHandler(ServerStream* server_stream);
diff --git a/src/hotspot/share/jbooster/utilities/fileUtils.cpp b/src/hotspot/share/jbooster/utilities/fileUtils.cpp
index f19bf8fb3..598013523 100644
--- a/src/hotspot/share/jbooster/utilities/fileUtils.cpp
+++ b/src/hotspot/share/jbooster/utilities/fileUtils.cpp
@@ -75,6 +75,13 @@ bool FileUtils::is_dir(const char* path) {
return S_ISDIR(st.st_mode);
}
+int64_t FileUtils::file_size(const char* path) {
+ struct stat st = {0};
+ if (os::stat(path, &st) != 0) return -1;
+ // We don't care if it is a regular file.
+ return st.st_size;
+}
+
uint64_t FileUtils::modify_time(const char* path) {
struct stat st = {0};
if (os::stat(path, &st) != 0) return 0;
@@ -119,60 +126,3 @@ bool FileUtils::move(const char* path_from, const char* path_to) {
bool FileUtils::remove(const char* path) {
return ::remove(path) == 0;
}
-
-bool FileUtils::is_same(const char* path1, const char* path2) {
- bool res = false;
- char* buf1 = nullptr;
- char* buf2 = nullptr;
- int fd1 = os::open(path1, O_BINARY | O_RDONLY, 0);
- int fd2 = os::open(path2, O_BINARY | O_RDONLY, 0);
- do {
- if (fd1 < 0 || fd2 < 0) break;
- int64_t size1 = os::lseek(fd1, 0, SEEK_END);
- int64_t size2 = os::lseek(fd2, 0, SEEK_END);
- if (size1 != size2) break;
- int64_t size = size1;
- os::lseek(fd1, 0, SEEK_SET);
- os::lseek(fd2, 0, SEEK_SET);
- // We don't use NEW_RESOURCE_ARRAY here as Thread::current() may
- // not be initialized yet.
- buf1 = NEW_C_HEAP_ARRAY(char, (size_t) size, mtJBooster);
- buf2 = NEW_C_HEAP_ARRAY(char, (size_t) size, mtJBooster);
- size1 = (int64_t) os::read(fd1, buf1, size);
- size2 = (int64_t) os::read(fd2, buf2, size);
- guarantee(size1 == size && size2 == size, "sanity");
- res = memcmp(buf1, buf2, size) == 0;
- } while (false);
- if (fd1 >= 0) os::close(fd1);
- if (fd2 >= 0) os::close(fd2);
- if (buf1 != nullptr) {
- FREE_C_HEAP_ARRAY(char, buf1);
- }
- if (buf2 != nullptr) {
- FREE_C_HEAP_ARRAY(char, buf2);
- }
- return res;
-}
-
-bool FileUtils::is_same(const char* path, const char* content, int64_t size) {
- bool res = false;
- char* buf = nullptr;
- int fd = os::open(path, O_BINARY | O_RDONLY, 0);
- do {
- if (fd < 0) break;
- int64_t fsize = os::lseek(fd, 0, SEEK_END);
- if (fsize != size) break;
- os::lseek(fd, 0, SEEK_SET);
- // We don't use NEW_RESOURCE_ARRAY here as Thread::current() may
- // not be initialized yet.
- buf = NEW_C_HEAP_ARRAY(char, (size_t) size, mtJBooster);
- fsize = (int64_t) os::read(fd, buf, size);
- guarantee(fsize == size, "sanity");
- res = memcmp(content, buf, size) == 0;
- } while (false);
- if (fd >= 0) os::close(fd);
- if (buf != nullptr) {
- FREE_C_HEAP_ARRAY(char, buf);
- }
- return res;
-}
diff --git a/src/hotspot/share/jbooster/utilities/fileUtils.hpp b/src/hotspot/share/jbooster/utilities/fileUtils.hpp
index 2b5734754..ccc677af7 100644
--- a/src/hotspot/share/jbooster/utilities/fileUtils.hpp
+++ b/src/hotspot/share/jbooster/utilities/fileUtils.hpp
@@ -44,14 +44,13 @@ public:
static bool exists(const char* path);
static bool is_file(const char* path);
static bool is_dir(const char* path);
+ static int64_t file_size(const char* path);
static uint64_t modify_time(const char* path);
static bool mkdir(const char* path);
static bool mkdirs(const char* path);
static bool rename(const char* path_from, const char* path_to);
static bool move(const char* path_from, const char* path_to);
static bool remove(const char* path);
- static bool is_same(const char* path1, const char* path2);
- static bool is_same(const char* path, const char* content, int64_t size);
class ListDir: public StackObj {
const char* _path;
diff --git a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/jbooster/JBoosterCompilationContext.java b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/jbooster/JBoosterCompilationContext.java
index b26786a52..85c9bf464 100644
--- a/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/jbooster/JBoosterCompilationContext.java
+++ b/src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/jbooster/JBoosterCompilationContext.java
@@ -94,6 +94,11 @@ public interface JBoosterCompilationContext {
*/
boolean usePGO();
+ /**
+ * return true if compilation uses extra-resolved klasses
+ */
+ boolean resolveExtraKlasses();
+
/**
* Get methodCount of CompiledMethodInfo.
* (To support multi-task concurrent compilation of AOT)
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 e429e43e8..01ee855d3 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
@@ -263,6 +263,7 @@ import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.LUDICROU
import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_DURING_PARSING;
import static org.graalvm.compiler.nodes.type.StampTool.isPointerNonNull;
+import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -4386,6 +4387,20 @@ public class BytecodeParser implements GraphBuilderContext {
}
protected void maybeEagerlyResolve(int cpi, int bytecode) {
+ JBoosterCompilationContext ctx = JBoosterCompilationContext.get();
+ if (ctx != null && !ctx.resolveExtraKlasses()) {
+ try{
+ maybeEagerlyResolveBase(cpi, bytecode);
+ } catch (NoClassDefFoundError e) {
+ debug.log("Cannot resolve all elements in constant pool");
+ return;
+ }
+ } else {
+ maybeEagerlyResolveBase(cpi, bytecode);
+ }
+ }
+
+ protected void maybeEagerlyResolveBase(int cpi, int bytecode) {
if (intrinsicContext != null) {
constantPool.loadReferencedType(cpi, bytecode);
} else if (graphBuilderConfig.eagerResolving()) {
@@ -4420,6 +4435,20 @@ public class BytecodeParser implements GraphBuilderContext {
}
protected JavaType maybeEagerlyResolve(JavaType type, ResolvedJavaType accessingClass) {
+ JBoosterCompilationContext ctx = JBoosterCompilationContext.get();
+ if (ctx != null && !ctx.resolveExtraKlasses()) {
+ try{
+ return maybeEagerlyResolveBase(type, accessingClass);
+ } catch (NoClassDefFoundError e) {
+ debug.log("Cannot resolve all elements in constant pool");
+ return type;
+ }
+ } else {
+ return maybeEagerlyResolveBase(type, accessingClass);
+ }
+ }
+
+ protected JavaType maybeEagerlyResolveBase(JavaType type, ResolvedJavaType accessingClass) {
if (graphBuilderConfig.eagerResolving() || parsingIntrinsic()) {
return type.resolve(accessingClass);
}
diff --git a/src/jdk.jbooster/share/classes/jdk/jbooster/JBooster.java b/src/jdk.jbooster/share/classes/jdk/jbooster/JBooster.java
index db5d916ac..76d62e9b2 100644
--- a/src/jdk.jbooster/share/classes/jdk/jbooster/JBooster.java
+++ b/src/jdk.jbooster/share/classes/jdk/jbooster/JBooster.java
@@ -175,15 +175,15 @@ public final class JBooster {
/**
* This method is invoked only in C++.
*/
- private static boolean compileClasses(int sessionId, String filePath, Set<Class<?>> classes, boolean usePGO) {
- return compileMethods(sessionId, filePath, classes, null, null, usePGO);
+ private static boolean compileClasses(int sessionId, String filePath, Set<Class<?>> classes, boolean usePGO, boolean resolveExtraKlasses) {
+ return compileMethods(sessionId, filePath, classes, null, null, usePGO, resolveExtraKlasses);
}
/**
* This method is invoked only in C++.
*/
private static boolean compileMethods(int sessionId, String filePath, Set<Class<?>> classes,
- Set<String> methodsToCompile, Set<String> methodsNotToCompile, boolean usePGO) {
+ Set<String> methodsToCompile, Set<String> methodsNotToCompile, boolean usePGO, boolean resolveExtraKlasses) {
LOGGER.log(INFO, "Compilation task received: classes_to_compile={0}, methods_to_compile={1}, methods_not_compile={2}, session_id={3}.",
classes.size(),
(methodsToCompile == null ? "all" : String.valueOf(methodsToCompile.size())),
@@ -191,7 +191,7 @@ public final class JBooster {
sessionId);
try {
JBoosterCompilationContextImpl ctx = new JBoosterCompilationContextImpl(
- sessionId, filePath, classes, methodsToCompile, methodsNotToCompile, usePGO);
+ sessionId, filePath, classes, methodsToCompile, methodsNotToCompile, usePGO, resolveExtraKlasses);
return new Main(ctx).compileForJBooster();
} catch (Exception e) {
e.printStackTrace();
diff --git a/src/jdk.jbooster/share/classes/jdk/jbooster/JBoosterCompilationContextImpl.java b/src/jdk.jbooster/share/classes/jdk/jbooster/JBoosterCompilationContextImpl.java
index 4918f8552..efdeee9e5 100644
--- a/src/jdk.jbooster/share/classes/jdk/jbooster/JBoosterCompilationContextImpl.java
+++ b/src/jdk.jbooster/share/classes/jdk/jbooster/JBoosterCompilationContextImpl.java
@@ -43,6 +43,7 @@ public class JBoosterCompilationContextImpl implements JBoosterCompilationContex
private final Set<String> methodsToCompile;
private final Set<String> methodsNotToCompile;
private final boolean usePGO;
+ private final boolean resolveExtraKlasses;
// These values are used to replace the static values in AOT classes.
private final AtomicInteger compiledMethodInfoMethodsCount = new AtomicInteger(0);
@@ -63,13 +64,15 @@ public class JBoosterCompilationContextImpl implements JBoosterCompilationContex
Set<Class<?>> classesToCompile,
Set<String> methodsToCompile,
Set<String> methodsNotCompile,
- boolean usePGO) {
+ boolean usePGO,
+ boolean resolveExtraKlasses) {
this.sessionId = sessionId;
this.filePath = filePath;
this.classesToCompile = classesToCompile;
this.methodsToCompile = methodsToCompile;
this.methodsNotToCompile = methodsNotCompile;
this.usePGO = usePGO;
+ this.resolveExtraKlasses = resolveExtraKlasses;
}
@Override
@@ -102,6 +105,11 @@ public class JBoosterCompilationContextImpl implements JBoosterCompilationContex
return usePGO;
}
+ @Override
+ public boolean resolveExtraKlasses() {
+ return resolveExtraKlasses;
+ }
+
@Override
public AtomicInteger getCompiledMethodInfoMethodsCount() {
return compiledMethodInfoMethodsCount;
diff --git a/test/hotspot/gtest/jbooster/common.hpp b/test/hotspot/gtest/jbooster/common.hpp
new file mode 100644
index 000000000..15b773786
--- /dev/null
+++ b/test/hotspot/gtest/jbooster/common.hpp
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. 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 GTEST_JBOOSTER_COMMON
+#define GTEST_JBOOSTER_COMMON
+
+#if INCLUDE_JBOOSTER
+
+// @see src/hotspot/share/memory/filemap.cpp
+#ifndef O_BINARY // if defined (Win32) use binary files.
+#define O_BINARY 0 // otherwise do nothing.
+#endif
+
+class TestUtils {
+public:
+ static bool is_same(const char* path1, const char* path2) {
+ bool res = false;
+ char* buf1 = nullptr;
+ char* buf2 = nullptr;
+ int fd1 = os::open(path1, O_BINARY | O_RDONLY, 0);
+ int fd2 = os::open(path2, O_BINARY | O_RDONLY, 0);
+ do {
+ if (fd1 < 0 || fd2 < 0) break;
+ int64_t size1 = os::lseek(fd1, 0, SEEK_END);
+ int64_t size2 = os::lseek(fd2, 0, SEEK_END);
+ if (size1 != size2) break;
+ int64_t size = size1;
+ os::lseek(fd1, 0, SEEK_SET);
+ os::lseek(fd2, 0, SEEK_SET);
+ // We don't use NEW_RESOURCE_ARRAY here as Thread::current() may
+ // not be initialized yet.
+ buf1 = NEW_C_HEAP_ARRAY(char, (size_t) size, mtJBooster);
+ buf2 = NEW_C_HEAP_ARRAY(char, (size_t) size, mtJBooster);
+ size1 = (int64_t) os::read(fd1, buf1, size);
+ size2 = (int64_t) os::read(fd2, buf2, size);
+ guarantee(size1 == size && size2 == size, "sanity");
+ res = memcmp(buf1, buf2, size) == 0;
+ } while (false);
+ if (fd1 >= 0) os::close(fd1);
+ if (fd2 >= 0) os::close(fd2);
+ if (buf1 != nullptr) {
+ FREE_C_HEAP_ARRAY(char, buf1);
+ }
+ if (buf2 != nullptr) {
+ FREE_C_HEAP_ARRAY(char, buf2);
+ }
+ return res;
+ }
+
+ static bool is_same(const char* path, const char* content, int64_t size) {
+ bool res = false;
+ char* buf = nullptr;
+ int fd = os::open(path, O_BINARY | O_RDONLY, 0);
+ do {
+ if (fd < 0) break;
+ int64_t fsize = os::lseek(fd, 0, SEEK_END);
+ if (fsize != size) break;
+ os::lseek(fd, 0, SEEK_SET);
+ // We don't use NEW_RESOURCE_ARRAY here as Thread::current() may
+ // not be initialized yet.
+ buf = NEW_C_HEAP_ARRAY(char, (size_t) size, mtJBooster);
+ fsize = (int64_t) os::read(fd, buf, size);
+ guarantee(fsize == size, "sanity");
+ res = memcmp(content, buf, size) == 0;
+ } while (false);
+ if (fd >= 0) os::close(fd);
+ if (buf != nullptr) {
+ FREE_C_HEAP_ARRAY(char, buf);
+ }
+ return res;
+ }
+};
+
+#endif // INCLUDE_JBOOSTER
+
+#endif // GTEST_JBOOSTER_COMMON
\ No newline at end of file
diff --git a/test/hotspot/gtest/jbooster/test_net.cpp b/test/hotspot/gtest/jbooster/test_net.cpp
index bf20b0aa3..dd45dd65a 100644
--- a/test/hotspot/gtest/jbooster/test_net.cpp
+++ b/test/hotspot/gtest/jbooster/test_net.cpp
@@ -26,6 +26,8 @@
#if INCLUDE_JBOOSTER
+#include "common.hpp"
+
#include "jbooster/jClientArguments.hpp"
#include "jbooster/net/message.inline.hpp"
#include "jbooster/net/messageBuffer.inline.hpp"
@@ -431,7 +433,7 @@ TEST(JBoosterNet, serializationn_file_wrapper) {
}
EXPECT_EQ(times, 3);
}
- EXPECT_TRUE(FileUtils::is_same(file_name1, file_name2));
+ EXPECT_TRUE(TestUtils::is_same(file_name1, file_name2));
FileUtils::remove(file_name1);
FileUtils::remove(file_name2);
}
diff --git a/test/hotspot/gtest/jbooster/test_util.cpp b/test/hotspot/gtest/jbooster/test_util.cpp
index cd65804be..461e3faa7 100644
--- a/test/hotspot/gtest/jbooster/test_util.cpp
+++ b/test/hotspot/gtest/jbooster/test_util.cpp
@@ -26,6 +26,8 @@
#if INCLUDE_JBOOSTER
+#include "common.hpp"
+
#include "classfile/symbolTable.hpp"
#include "jbooster/utilities/concurrentHashMap.inline.hpp"
#include "jbooster/utilities/debugUtils.inline.hpp"
@@ -95,13 +97,13 @@ TEST(JBoosterUtil, file) {
write_file("gtest-jbooster-tmp5", "12345");
write_file("gtest-jbooster-tmp6", "12345");
- EXPECT_TRUE(FileUtils::is_same("gtest-jbooster-tmp5", "gtest-jbooster-tmp6"));
+ EXPECT_TRUE(TestUtils::is_same("gtest-jbooster-tmp5", "gtest-jbooster-tmp6"));
write_file("gtest-jbooster-tmp6", "123456");
- EXPECT_FALSE(FileUtils::is_same("gtest-jbooster-tmp5", "gtest-jbooster-tmp6"));
+ EXPECT_FALSE(TestUtils::is_same("gtest-jbooster-tmp5", "gtest-jbooster-tmp6"));
- EXPECT_TRUE(FileUtils::is_same("gtest-jbooster-tmp5", "12345", 6));
- EXPECT_FALSE(FileUtils::is_same("gtest-jbooster-tmp5", "12346", 6));
- EXPECT_FALSE(FileUtils::is_same("gtest-jbooster-tmp5", "123456", 7));
+ EXPECT_TRUE(TestUtils::is_same("gtest-jbooster-tmp5", "12345", 6));
+ EXPECT_FALSE(TestUtils::is_same("gtest-jbooster-tmp5", "12346", 6));
+ EXPECT_FALSE(TestUtils::is_same("gtest-jbooster-tmp5", "123456", 7));
EXPECT_FALSE(FileUtils::is_file("gtest-jbooster-tmp4"));
EXPECT_TRUE(FileUtils::is_dir("gtest-jbooster-tmp4"));
diff --git a/test/jdk/tools/jbooster/JBoosterTestBase.java b/test/jdk/tools/jbooster/JBoosterTestBase.java
index 08792a77b..4c1dcbd4a 100644
--- a/test/jdk/tools/jbooster/JBoosterTestBase.java
+++ b/test/jdk/tools/jbooster/JBoosterTestBase.java
@@ -44,11 +44,12 @@ import jdk.test.lib.Utils;
* @see JcmdBase
*/
public class JBoosterTestBase {
- public static final int WAIT_START_TIME = 2;
+ public static final int WAIT_START_TIME = 128;
public static final int WAIT_SHORT_TIME = 8;
public static final int WAIT_EXIT_TIME = 64;
public static final int SERVER_PORT = 41567;
+ public static final int SERVER_CONNECTION_TIMEOUT = 256 * 1000;
public static final String SERVER_PORT_STR = "41567";
public static final String CLIENT_CACHE_PATH = "jbooster-cache-client";
@@ -80,7 +81,8 @@ public class JBoosterTestBase {
public static final List<String> SERVER_STANDARD_ARGS = List.of(
"--server-port=" + SERVER_PORT_STR,
- "--cache-path=" + SERVER_CACHE_PATH
+ "--cache-path=" + SERVER_CACHE_PATH,
+ "--connection-timeout=" + SERVER_CONNECTION_TIMEOUT
);
private static final ProcessBuilder processBuilder = new ProcessBuilder();
--
2.22.0

View File

@ -0,0 +1,623 @@
From fcf500b87f0ddcd1fff0b9a0040b1be1b8a37321 Mon Sep 17 00:00:00 2001
Date: Fri, 29 Nov 2024 15:36:57 +0800
Subject: SA redact support password
---
src/hotspot/share/runtime/arguments.cpp | 16 ++--
src/hotspot/share/runtime/arguments.hpp | 5 -
src/hotspot/share/runtime/globals.hpp | 2 +-
src/hotspot/share/services/heapRedactor.cpp | 7 +-
src/hotspot/share/services/heapRedactor.hpp | 1 +
.../classes/sun/jvm/hotspot/SALauncher.java | 10 +-
.../classes/sun/jvm/hotspot/tools/JMap.java | 36 +++++++
.../hotspot/utilities/HeapHprofBinWriter.java | 75 ++++++++++++++-
.../jvm/hotspot/utilities/HeapRedactor.java | 30 +++---
.../share/classes/sun/tools/jmap/JMap.java | 96 +++++++++++++++----
10 files changed, 227 insertions(+), 51 deletions(-)
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
index 42b4f90f1..f24cabb11 100644
--- a/src/hotspot/share/runtime/arguments.cpp
+++ b/src/hotspot/share/runtime/arguments.cpp
@@ -121,8 +121,6 @@ bool Arguments::_has_jimage = false;
char* Arguments::_ext_dirs = NULL;
-char* Arguments::_heap_dump_redact_auth = NULL;
-
bool PathString::set_value(const char *value) {
if (_value != NULL) {
FreeHeap(_value);
@@ -3743,23 +3741,23 @@ jint Arguments::match_special_option_and_act(const JavaVMInitArgs* args,
warning("Heap dump redacting did not setup properly, using wrong argument?");
vm_exit_during_initialization("Syntax error, expecting -XX:HeapDumpRedact=[off|names|basic|full|diyrules|annotation]",NULL);
}
+ continue;
}
// heapDump redact password
if(match_option(option, "-XX:RedactPassword=", &tail)) {
if(tail == NULL || strlen(tail) == 0) {
VerifyRedactPassword = false;
- jio_fprintf(defaultStream::output_stream(), "redact password is null, disable verify heap dump authority.\n");
} else {
- VerifyRedactPassword = true;
- size_t redact_password_len = strlen(tail);
- _heap_dump_redact_auth = NEW_C_HEAP_ARRAY(char, redact_password_len+1, mtArguments);
- memcpy(_heap_dump_redact_auth, tail, redact_password_len);
- _heap_dump_redact_auth[redact_password_len] = '\0';
- memset((void*)tail, '0', redact_password_len);
+ char* split_char = strstr(const_cast<char*>(tail), ",");
+ VerifyRedactPassword = !(split_char == NULL || strlen(split_char) < SALT_LEN);
+ }
+ if(!VerifyRedactPassword) {
+ jio_fprintf(defaultStream::output_stream(), "redact password is null or with bad format, disable verify heap dump authority.\n");
}
}
+
#ifndef PRODUCT
if (match_option(option, "-XX:+PrintFlagsWithComments")) {
JVMFlag::printFlags(tty, true);
diff --git a/src/hotspot/share/runtime/arguments.hpp b/src/hotspot/share/runtime/arguments.hpp
index 6b9759906..cb2a04a2d 100644
--- a/src/hotspot/share/runtime/arguments.hpp
+++ b/src/hotspot/share/runtime/arguments.hpp
@@ -468,8 +468,6 @@ class Arguments : AllStatic {
char** base_archive_path,
char** top_archive_path) NOT_CDS_RETURN;
- static char* _heap_dump_redact_auth;
-
public:
// Parses the arguments, first phase
static jint parse(const JavaVMInitArgs* args);
@@ -555,9 +553,6 @@ class Arguments : AllStatic {
// Java launcher properties
static void process_sun_java_launcher_properties(JavaVMInitArgs* args);
- // heap dump redact password
- static const char* get_heap_dump_redact_auth() { return _heap_dump_redact_auth; }
-
// System properties
static void init_system_properties();
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
index b51e50ddf..680e78c04 100644
--- a/src/hotspot/share/runtime/globals.hpp
+++ b/src/hotspot/share/runtime/globals.hpp
@@ -568,7 +568,7 @@ const intx ObjectAlignmentInBytes = 8;
"verify authority for operating heapDump redact feature") \
\
product(ccstr, RedactPassword, NULL, \
- "authority for operating heapDump redact feature") \
+ "authority for operating heapDump redact feature, format {password,salt}, salt length >= 8") \
\
product(ccstr, NativeMemoryTracking, DEBUG_ONLY("summary") NOT_DEBUG("off"), \
"Native memory tracking options") \
diff --git a/src/hotspot/share/services/heapRedactor.cpp b/src/hotspot/share/services/heapRedactor.cpp
index 0e7b0a97c..cfb5b3f82 100644
--- a/src/hotspot/share/services/heapRedactor.cpp
+++ b/src/hotspot/share/services/heapRedactor.cpp
@@ -170,12 +170,15 @@ void HeapRedactor::init(outputStream* out) {
* if HeapDumpRedact is NULL , jmap operation can not open redact feature without password
* if HeapDumpRedact is not NULL, jmap operation can not change redact level without password
**/
- if(Arguments::get_heap_dump_redact_auth() == NULL) {
+ char* split_char = NULL;
+ if(RedactPassword == NULL || (split_char = strstr(const_cast<char*>(RedactPassword), ",")) == NULL || strlen(split_char) < SALT_LEN) {
VerifyRedactPassword = false;
}
if(VerifyRedactPassword && !_use_sys_params) {
+ size_t auth_len = strlen(RedactPassword);
+ size_t suffix_len = strlen(split_char);
if(_redact_params.redact_password == NULL ||
- strcmp(_redact_params.redact_password, Arguments::get_heap_dump_redact_auth()) ) {
+ strncmp(_redact_params.redact_password, RedactPassword, auth_len-suffix_len) ) {
// no password or wrong password
_use_sys_params = true;
if(out != NULL) {
diff --git a/src/hotspot/share/services/heapRedactor.hpp b/src/hotspot/share/services/heapRedactor.hpp
index 790430507..e5a5bf440 100644
--- a/src/hotspot/share/services/heapRedactor.hpp
+++ b/src/hotspot/share/services/heapRedactor.hpp
@@ -32,6 +32,7 @@
#endif
#define MAX_MAP_FILE_LENGTH 1024
+#define SALT_LEN 9
enum HeapDumpRedactLevel {
REDACT_UNKNOWN,
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
index 291e483e0..91a432574 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
@@ -322,7 +322,8 @@ public class SALauncher {
Map.entry("HeapDumpRedact=", "HeapDumpRedact"),
Map.entry("RedactMap=", "RedactMap"),
Map.entry("RedactMapFile=", "RedactMapFile"),
- Map.entry("RedactClassPath=", "RedactClassPath"));
+ Map.entry("RedactClassPath=", "RedactClassPath"),
+ Map.entry("RedactPassword", "RedactPassword"));
}
private static void runJMAP(String[] oldArgs) {
@@ -337,6 +338,7 @@ public class SALauncher {
String redactMap = newArgMap.get("RedactMap");
String redactMapFile = newArgMap.get("RedactMapFile");
String redactClassPath = newArgMap.get("RedactClassPath");
+ boolean hasRedactPassword = newArgMap.containsKey("RedactPassword");
if (!requestHeapdump && (dumpfile != null)) {
throw new IllegalArgumentException("Unexpected argument: dumpfile");
}
@@ -359,6 +361,9 @@ public class SALauncher {
if (redactClassPath != null) {
command += ",RedactClassPath=" + redactClassPath;
}
+ if(hasRedactPassword) {
+ command += ",RedactPassword";
+ }
newArgMap.put(command, null);
}
@@ -369,9 +374,12 @@ public class SALauncher {
newArgMap.remove("RedactMap");
newArgMap.remove("RedactMapFile");
newArgMap.remove("RedactClassPath");
+ newArgMap.remove("RedactPassword");
JMap.main(buildAttachArgs(newArgMap, false));
}
+
+
private static void runJINFO(String[] oldArgs) {
Map<String, String> longOptsMap = Map.of("exe=", "exe",
"core=", "core",
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/JMap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/JMap.java
index e52cd1fb1..fbead3ce4 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/JMap.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/JMap.java
@@ -25,6 +25,9 @@
package sun.jvm.hotspot.tools;
import java.io.*;
+import java.nio.CharBuffer;
+import java.util.regex.Pattern;
+
import sun.jvm.hotspot.debugger.JVMDebugger;
import sun.jvm.hotspot.utilities.*;
@@ -189,6 +192,9 @@ public class JMap extends Tool {
redactParams.setRedactMapFile(keyValue[1]);
} else if (keyValue[0].equals("RedactClassPath")) {
redactParams.setRedactClassPath(keyValue[1]);
+ } else if (keyValue[0].equals("RedactPassword")) {
+ redactParams.setRedactPassword(getRedactPassword());
+
} else {
System.err.println("unknown option:" + keyValue[0]);
@@ -226,6 +232,36 @@ public class JMap extends Tool {
jmap.execute(args);
}
+ private static CharBuffer getRedactPassword() {
+ CharBuffer redactPassword = CharBuffer.wrap("");
+ // heap dump may need a password
+ Console console = System.console();
+ char[] passwords = null;
+ if (console == null) {
+ return redactPassword;
+ }
+
+ try {
+ passwords = console.readPassword("redact authority password:");
+ } catch (Exception e) {
+ }
+ if(passwords == null) {
+ return redactPassword;
+ }
+
+ try {
+ CharBuffer cb = CharBuffer.wrap(passwords);
+ String passwordPattern = "^[0-9a-zA-Z!@#$]{1,9}$";
+ if(!Pattern.matches(passwordPattern, cb)) {
+ return redactPassword;
+ }
+ redactPassword = cb;
+ } catch (Exception e) {
+ }
+
+ return redactPassword;
+ }
+
public boolean writeHeapHprofBin(String fileName, int gzLevel) {
try {
HeapHprofBinWriter hgw;
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
index e73b6f9a3..566d88646 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java
@@ -28,6 +28,10 @@ import java.io.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.*;
+import java.nio.CharBuffer;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.KeySpec;
import java.util.*;
import java.util.zip.*;
import sun.jvm.hotspot.debugger.*;
@@ -37,6 +41,10 @@ import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.classfile.*;
import sun.jvm.hotspot.gc.z.ZCollectedHeap;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+
/*
* This class writes Java heap in hprof binary format. This format is
* used by Heap Analysis Tool (HAT). The class is heavily influenced
@@ -386,6 +394,11 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
private static final long MAX_U4_VALUE = 0xFFFFFFFFL;
int serialNum = 1;
+ // encrypt
+ private static int SALT_MIN_LENGTH = 8;
+ private static int HASH_BIT_SIZE = 256;
+ private static int HASH_ITERATIONS_COUNT = 10000;
+
// Heap Redact
private HeapRedactor heapRedactor;
@@ -404,6 +417,10 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
return heapRedactor.getHeapDumpRedactLevel();
}
+ public Optional<CharBuffer> getHeapDumpRedactPassword() {
+ return heapRedactor == null ? Optional.empty() : Optional.ofNullable(heapRedactor.getRedactPassword());
+ }
+
private Optional<String> lookupRedactName(String name){
return heapRedactor == null ? Optional.empty() : heapRedactor.lookupRedactName(name);
}
@@ -454,10 +471,66 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
this.gzLevel = gzLevel;
}
+ private boolean checkPassword() {
+ Optional<String> redactAuthOption = getVMRedactParameter("RedactPassword");
+ String redactAuth = redactAuthOption.isPresent() ? redactAuthOption.get() : null;
+ boolean redactAuthFlag = true;
+ if(redactAuth != null) {
+ String[] auths = redactAuth.split(",");
+ if(auths.length != 2) {
+ return redactAuthFlag;
+ }
+
+ Optional<CharBuffer> passwordOption = getHeapDumpRedactPassword();
+ CharBuffer password = passwordOption.isPresent() ? passwordOption.get() : CharBuffer.wrap("");
+ char[] passwordChars = null;
+ try {
+ passwordChars = password.array();
+
+ byte[] saltBytes = auths[1].getBytes("UTF-8");
+ if(saltBytes.length < SALT_MIN_LENGTH) {
+ return redactAuthFlag;
+ }
+
+ String digestStr = getEncryptValue(passwordChars, saltBytes);
+ redactAuthFlag = auths[0].equals(digestStr);
+ } catch (Exception e) {
+ // ignore
+ redactAuthFlag = false;
+ } finally {
+ // clear all password
+ if(passwordChars != null) {
+ Arrays.fill(passwordChars, '0');
+ }
+ }
+ }
+
+ return redactAuthFlag;
+ }
+
+ private String getEncryptValue(char[] passwordValue, byte[] saltBytes) throws InvalidKeySpecException, NoSuchAlgorithmException {
+ StringBuilder digestStrBuilder = new StringBuilder();
+
+ KeySpec spec = new PBEKeySpec(passwordValue, saltBytes, HASH_ITERATIONS_COUNT, HASH_BIT_SIZE);
+ SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
+ SecretKey secretKey = secretKeyFactory.generateSecret(spec);
+ byte[] digestBytes = secretKey.getEncoded();
+ for (byte b : digestBytes) {
+ String hex = Integer.toHexString(0xff & b);
+ if (hex.length() == 1) {
+ digestStrBuilder.append('0');
+ }
+ digestStrBuilder.append(hex);
+ }
+ String digestStr = digestStrBuilder.toString();
+
+ return digestStr;
+ }
+
public synchronized void write(String fileName) throws IOException {
VM vm = VM.getVM();
- if(getHeapDumpRedactLevel() == HeapRedactor.HeapDumpRedactLevel.REDACT_UNKNOWN) {
+ if(getHeapDumpRedactLevel() == HeapRedactor.HeapDumpRedactLevel.REDACT_UNKNOWN || !checkPassword()) {
resetRedactParams();
}
diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapRedactor.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapRedactor.java
index c2a916617..5c442b2bb 100644
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapRedactor.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapRedactor.java
@@ -30,6 +30,7 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
+import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -51,7 +52,7 @@ public class HeapRedactor {
private HeapDumpRedactLevel redactLevel;
private Map<String, String> redactNameTable;
private Map<String, Map<String, String>> redactClassTable;
- private String redactClassFullName = null;
+ private String redactClassFullName = null;
private Map<Long, String> redactValueTable;
private RedactVectorNode headerNode;
private RedactVectorNode currentNode;
@@ -62,6 +63,7 @@ public class HeapRedactor {
public static final String REDACT_MAP_PREFIX = "RedactMap=";
public static final String REDACT_MAP_FILE_PREFIX = "RedactMapFile=";
public static final String REDACT_CLASS_PATH_PREFIX = "RedactClassPath=";
+ public static final String REDACT_PASSWORD_PREFIX = "RedactPassword=";
public static final String REDACT_UNKNOWN_STR = "UNKNOWN";
public static final String REDACT_OFF_STR = "OFF";
@@ -82,14 +84,6 @@ public class HeapRedactor {
public static final int PATH_MAX = 4096;
public static final int REDACT_VECTOR_SIZE = 1024;
- public HeapRedactor(String options) {
- redactLevel = HeapDumpRedactLevel.REDACT_UNKNOWN;
- redactNameTable = null;
- redactClassTable = null;
- redactValueTable = null;
- init(options);
- }
-
public HeapRedactor(RedactParams redactParams) {
this.redactParams = redactParams;
redactLevel = HeapDumpRedactLevel.REDACT_UNKNOWN;
@@ -167,6 +161,10 @@ public class HeapRedactor {
return redactParams.getRedactClassPath();
}
+ public CharBuffer getRedactPassword(){
+ return redactParams.getRedactPassword();
+ }
+
public Optional<Map<String, String>> getRedactRulesTable(String key) {
return Optional.ofNullable(redactClassTable == null ? null: redactClassTable.get(key));
}
@@ -218,7 +216,7 @@ public class HeapRedactor {
}
private RedactParams parseRedactOptions(String optionStr) {
- RedactParams params = new RedactParams(REDACT_OFF_OPTION, null, null, null);
+ RedactParams params = new RedactParams(REDACT_OFF_OPTION, null, null, null, null);
if (optionStr != null) {
String[] options = optionStr.split(",");
for (String option : options) {
@@ -321,16 +319,18 @@ public class HeapRedactor {
private String redactMap;
private String redactMapFile;
private String redactClassPath;
+ private CharBuffer redactPassword;
private boolean enableRedact = false;
public RedactParams() {
}
- public RedactParams(String heapDumpRedact, String redactMap, String redactMapFile, String redactClassPath) {
+ public RedactParams(String heapDumpRedact, String redactMap, String redactMapFile, String redactClassPath, CharBuffer redactPassword) {
this.heapDumpRedact = heapDumpRedact;
this.redactMap = redactMap;
this.redactMapFile = redactMapFile;
this.redactClassPath = redactClassPath;
+ this.redactPassword = redactPassword;
}
@Override
@@ -395,6 +395,14 @@ public class HeapRedactor {
this.redactClassPath = redactClassPath;
}
+ public CharBuffer getRedactPassword() {
+ return redactPassword;
+ }
+
+ public void setRedactPassword(CharBuffer redactPassword) {
+ this.redactPassword = redactPassword;
+ }
+
public static boolean checkLauncherHeapdumpRedactSupport(String value) {
String[] validValues = {REDACT_BASIC_OPTION, REDACT_NAME_OPTION, REDACT_FULL_OPTION, REDACT_DIYRULES_OPTION, REDACT_ANNOTATION_OPTION, REDACT_OFF_OPTION};
for (String validValue : validValues) {
diff --git a/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java b/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java
index ef4ea7152..6479863a6 100644
--- a/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java
+++ b/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java
@@ -25,14 +25,17 @@
package sun.tools.jmap;
+import java.io.BufferedInputStream;
import java.io.Console;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Collection;
import java.util.regex.Pattern;
@@ -43,6 +46,10 @@ import com.sun.tools.attach.AttachNotSupportedException;
import sun.tools.attach.HotSpotVirtualMachine;
import sun.tools.common.ProcessArgumentMatcher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+
/*
* This class is the main class for the JMap utility. It parses its arguments
* and decides if the command should be satisfied using the VM attach mechanism
@@ -51,6 +58,10 @@ import sun.tools.common.ProcessArgumentMatcher;
* options are mapped to SA tools.
*/
public class JMap {
+ // encrypt
+ private static int SALT_MIN_LENGTH = 8;
+ private static int HASH_BIT_SIZE = 256;
+ private static int HASH_ITERATIONS_COUNT = 10000;
public static void main(String[] args) throws Exception {
if (args.length == 0) {
@@ -250,7 +261,7 @@ public class JMap {
} else if (subopt.startsWith("RedactClassPath")) {
redactParams.setRedactClassPath(subopt.substring("RedactClassPath=".length()));
} else if (subopt.startsWith("RedactPassword")) {
- redactPassword = getRedactPassword();
+ redactPassword = getRedactPassword(pid);
} else {
System.err.println("Fail: invalid option: '" + subopt + "'");
usage(1);
@@ -282,7 +293,7 @@ public class JMap {
}
}
- private static String getRedactPassword() {
+ private static String getRedactPassword(String pid) {
String redactPassword = ",RedactPassword=";
// heap dump may need a password
Console console = System.console();
@@ -300,42 +311,85 @@ public class JMap {
}
String digestStr = null;
- byte[] passwordBytes = null;
try {
CharBuffer cb = CharBuffer.wrap(passwords);
String passwordPattern = "^[0-9a-zA-Z!@#$]{1,9}$";
if(!Pattern.matches(passwordPattern, cb)) {
return redactPassword;
}
- Charset cs = Charset.forName("UTF-8");
- passwordBytes= cs.encode(cb).array();
-
- StringBuilder digestStrBuilder = new StringBuilder();
- MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
- byte[] digestBytes = messageDigest.digest(passwordBytes);
- for(byte b : digestBytes) {
- String hex = Integer.toHexString(0xff & b);
- if(hex.length() == 1) {
- digestStrBuilder.append('0');
- }
- digestStrBuilder.append(hex);
+
+ String salt = getSalt(pid);
+ if(salt == null) {
+ return redactPassword;
+ }
+ byte[] saltBytes = salt.getBytes("UTF-8");
+ if(saltBytes.length < SALT_MIN_LENGTH) {
+ return redactPassword;
}
- digestStr = digestStrBuilder.toString();
+ digestStr = getEncryptValue(passwords, saltBytes);
} catch (Exception e) {
}finally {
// clear all password
if(passwords != null) {
Arrays.fill(passwords, '0');
}
- if(passwordBytes != null) {
- Arrays.fill(passwordBytes, (byte) 0);
- }
}
redactPassword += (digestStr == null ? "" : digestStr);
return redactPassword;
}
+ private static String getSalt(String pid) throws Exception {
+ String salt = null;
+ StringBuilder redactAuth = new StringBuilder();
+
+ VirtualMachine vm = VirtualMachine.attach(pid);
+ HotSpotVirtualMachine hvm = (HotSpotVirtualMachine) vm;
+ String flag = "RedactPassword";
+ try (InputStream in = hvm.printFlag(flag); BufferedInputStream bis = new BufferedInputStream(in);
+ InputStreamReader isr = new InputStreamReader(bis, "UTF-8")) {
+ char c[] = new char[256];
+ int n;
+ do {
+ n = isr.read(c);
+
+ if (n > 0) {
+ redactAuth.append(n == c.length ? c : Arrays.copyOf(c, n));
+ }
+ } while (n > 0);
+ }
+ vm.detach();
+
+ if(redactAuth.length() > 0) {
+ String[] auths = redactAuth.toString().split(",");
+ if(auths.length != 2) {
+ return salt;
+ }
+ return auths[1].trim();
+ }
+
+ return salt;
+ }
+
+ private static String getEncryptValue(char[] passwordValue, byte[] saltBytes) throws InvalidKeySpecException, NoSuchAlgorithmException {
+ StringBuilder digestStrBuilder = new StringBuilder();
+
+ KeySpec spec = new PBEKeySpec(passwordValue, saltBytes, HASH_ITERATIONS_COUNT, HASH_BIT_SIZE);
+ SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
+ SecretKey secretKey = secretKeyFactory.generateSecret(spec);
+ byte[] digestBytes = secretKey.getEncoded();
+ for (byte b : digestBytes) {
+ String hex = Integer.toHexString(0xff & b);
+ if (hex.length() == 1) {
+ digestStrBuilder.append('0');
+ }
+ digestStrBuilder.append(hex);
+ }
+ String digestStr = digestStrBuilder.toString();
+
+ return digestStr;
+ }
+
private static void checkForUnsupportedOptions(String[] args) {
// Check arguments for -F, -m, and non-numeric value
// and warn the user that SA is not supported anymore
--
2.22.0

View File

@ -1,20 +1,20 @@
From 2e5e3cc58933e166cba5a3f0e3c59d0ca3849196 Mon Sep 17 00:00:00 2001
Date: Thu, 24 Mar 2022 11:12:46 +0800
Subject: [PATCH] downgrade the glibc symver of memcpy
From 9771982512066b47e42084ac61f714a6d8da5d6d Mon Sep 17 00:00:00 2001
Date: Sat, 30 Nov 2024 17:25:24 +0800
Subject: downgrade the glibc symver of memcpy
---
make/common/NativeCompilation.gmk | 9 +++++++++
make/hotspot/lib/CompileJvm.gmk | 8 ++++++++
src/hotspot/share/runtime/memcpy.cpp | 20 ++++++++++++++++++++
.../linux/native/applauncher/LinuxPackage.c | 3 +++
4 files changed, 40 insertions(+)
make/common/NativeCompilation.gmk | 9 +++++++++
make/hotspot/lib/CompileJvm.gmk | 15 ++++++++++++++
src/hotspot/share/runtime/memcpy.cpp | 20 +++++++++++++++++++
.../linux/native/applauncher/LinuxPackage.c | 3 +++
4 files changed, 47 insertions(+)
create mode 100644 src/hotspot/share/runtime/memcpy.cpp
diff --git a/make/common/NativeCompilation.gmk b/make/common/NativeCompilation.gmk
index 1e2b170..4f22e2d 100644
index 215d90d17..01c47dbb0 100644
--- a/make/common/NativeCompilation.gmk
+++ b/make/common/NativeCompilation.gmk
@@ -1102,6 +1102,15 @@ define SetupNativeCompilationBody
@@ -1133,6 +1133,15 @@ define SetupNativeCompilationBody
endif
endif
@ -31,10 +31,24 @@ index 1e2b170..4f22e2d 100644
$$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_MT) \
$$($1_CREATE_DEBUGINFO_CMDS) $$($1_MANIFEST_VERSION) \
diff --git a/make/hotspot/lib/CompileJvm.gmk b/make/hotspot/lib/CompileJvm.gmk
index 65edd04..d5b689e 100644
index 230aa54f7..93af36d93 100644
--- a/make/hotspot/lib/CompileJvm.gmk
+++ b/make/hotspot/lib/CompileJvm.gmk
@@ -167,6 +167,14 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJVM, \
@@ -83,6 +83,13 @@ DISABLED_WARNINGS_gcc := parentheses comment unknown-pragmas address \
empty-body strict-overflow sequence-point maybe-uninitialized \
misleading-indentation cast-function-type shift-negative-value
+ifeq ($(DEBUG_LEVEL), fastdebug)
+ ifeq ($(call And, $(call isTargetOs, linux) $(call isTargetCpu, aarch64)), true)
+ # False positive warnings for atomic_linux_aarch64.hpp on GCC >= 12
+ DISABLED_WARNINGS_gcc += stringop-overflow
+ endif
+endif
+
ifeq ($(call check-jvm-feature, zero), true)
DISABLED_WARNINGS_gcc += return-type switch clobbered
endif
@@ -169,6 +176,14 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJVM, \
PRECOMPILED_HEADER_EXCLUDE := $(JVM_PRECOMPILED_HEADER_EXCLUDE), \
))
@ -51,7 +65,7 @@ index 65edd04..d5b689e 100644
# macros.
diff --git a/src/hotspot/share/runtime/memcpy.cpp b/src/hotspot/share/runtime/memcpy.cpp
new file mode 100644
index 0000000..6ab4ddb
index 000000000..6ab4ddb64
--- /dev/null
+++ b/src/hotspot/share/runtime/memcpy.cpp
@@ -0,0 +1,20 @@
@ -76,10 +90,10 @@ index 0000000..6ab4ddb
+#endif
+#endif
diff --git a/src/jdk.jpackage/linux/native/applauncher/LinuxPackage.c b/src/jdk.jpackage/linux/native/applauncher/LinuxPackage.c
index 5e3ef36..55a7e9c 100644
index 26d65f806..b7b114ac3 100644
--- a/src/jdk.jpackage/linux/native/applauncher/LinuxPackage.c
+++ b/src/jdk.jpackage/linux/native/applauncher/LinuxPackage.c
@@ -33,6 +33,9 @@
@@ -34,6 +34,9 @@
#include "JvmLauncher.h"
#include "LinuxPackage.h"
@ -90,5 +104,5 @@ index 5e3ef36..55a7e9c 100644
static char* getModulePath(void) {
char modulePath[PATH_MAX] = { 0 };
--
1.8.3.1
2.33.0

View File

@ -74,6 +74,7 @@
%global aarch64 aarch64 arm64 armv8
%global jit_arches x86_64 %{aarch64} loongarch64 riscv64
%global aot_arches x86_64 %{aarch64}
%global linux_x64_aarch64 aarch64 x86_64
# Set of architectures for which java has short vector math library (libsvml.so)
%global svml_arches x86_64
@ -565,6 +566,9 @@ exit 0
%ifarch %{aarch64}
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libj2kae.so
%endif
%ifarch %{linux_x64_aarch64}
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libjbooster.so
%endif
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libsyslookup.so
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libverify.so
%{_jvmdir}/%{sdkdir -- %{?1}}/lib/libzip.so
@ -645,6 +649,10 @@ exit 0
%{_jvmdir}/%{sdkdir -- %{?1}}/bin/jdeps
%{_jvmdir}/%{sdkdir -- %{?1}}/bin/jdeprscan
%{_jvmdir}/%{sdkdir -- %{?1}}/bin/jimage
%ifarch %{linux_x64_aarch64}
%{_jvmdir}/%{sdkdir -- %{?1}}/bin/jaotc
%{_jvmdir}/%{sdkdir -- %{?1}}/bin/jbooster
%endif
%ifarch %{jit_arches}
%{_jvmdir}/%{sdkdir -- %{?1}}/bin/jhsdb
%{_mandir}/man1/jhsdb-%{uniquesuffix -- %{?1}}.1.gz
@ -690,6 +698,7 @@ exit 0
%{_mandir}/man1/jmod-%{uniquesuffix -- %{?1}}.1.gz
%{_mandir}/man1/jshell-%{uniquesuffix -- %{?1}}.1.gz
%{_mandir}/man1/jfr-%{uniquesuffix -- %{?1}}.1.gz
%{_mandir}/man1/jaotc-%{uniquesuffix -- %{?1}}.1.gz
%if %{with_systemtap}
%dir %{tapsetroot}
@ -903,7 +912,7 @@ Provides: java-src%{?1} = %{epoch}:%{version}-%{release}
Name: java-%{javaver}-%{origin}
Version: %{newjavaver}.%{buildver}
Release: 2
Release: 3
# java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons
# and this change was brought into RHEL-4. java-1.5.0-ibm packages
@ -1040,6 +1049,15 @@ Patch66: Backport-of-8337712-Wrong-javadoc-in-java.util.Date-.patch
#17.0.13
Patch67: Huawei-Fix-JBooster-file-issue-caused-by-os-write-change.patch
Patch68: downgrade-fcntl64-to-fcntl-on-linux.patch
Patch69: Add-jbolt-feature.patch
Patch70: Enable-TLS-to-communciation-between-JBooster-Server-.patch
Patch71: SA-redact-support-password.patch
Patch72: Add-specialized-hashmap-version-of-the-long-type.patch
Patch73: Implement-JBooster-RPC-byte-alignment.patch
Patch74: Optimize-LazyAOT-klasses-sending-strategy.patch
Patch75: Add-KAE-zip-GzipKAEBenchmark-Benchmark.patch
Patch76: Add-Fix-clear-mark-for-NativeGotJump.patch
Patch77: 8323066-TestSkipRebuildRemsetPhase.java-fails-with-S.patch
############################################
#
# LoongArch64 specific patches
@ -1323,6 +1341,15 @@ pushd %{top_level_dir_name}
%patch66 -p1
%patch67 -p1
%patch68 -p1
%patch69 -p1
%patch70 -p1
%patch71 -p1
%patch72 -p1
%patch73 -p1
%patch74 -p1
%patch75 -p1
%patch76 -p1
%patch77 -p1
popd # openjdk
%endif
@ -1462,6 +1489,9 @@ bash ../configure \
--with-debug-level=$debugbuild \
--with-native-debug-symbols=internal \
--enable-unlimited-crypto \
%ifarch %{linux_x64_aarch64}
--enable-jvm-feature-jbooster \
%endif
--with-zlib=system \
--with-libjpeg=system \
--with-giflib=system \
@ -1889,6 +1919,19 @@ cjc.mainProgram(args) -- the returns from copy_jdk_configs.lua should not affect
%changelog
* Fri Nov 29 2024 kuenking111 <wangkun49@huawei.com.cn> - 1:17.0.13.11-3
- add Add-jbolt-feature.patch
- add Enable-TLS-to-communciation-between-JBooster-Server-.patch
- add SA-redact-support-password.patch
- add Add-specialized-hashmap-version-of-the-long-type.patch
- add Implement-JBooster-RPC-byte-alignment.patch
- add Optimize-LazyAOT-klasses-sending-strategy.patch
- add Add-KAE-zip-GzipKAEBenchmark-Benchmark.patch
- add Add-Fix-clear-mark-for-NativeGotJump.patch
- add 8323066-TestSkipRebuildRemsetPhase.java-fails-with-S.patch
- modify downgrade-the-glibc-symver-of-memcpy.patch
* Wed Nov 6 2024 Pan Xuefeng <panxuefeng@loongson.cn> - 1:17.0.13.11-2
- upgrade LoongArch64 port to 17.0.13